Rename worker clusters to tags #104223

Manually merged
Sybren A. Stüvel merged 8 commits from Evelinealy/flamenco:worker-tag-rename into main 2023-07-10 11:13:35 +02:00
71 changed files with 2529 additions and 2522 deletions

View File

@ -8,7 +8,7 @@ bugs in actually-released versions.
- Improve speed of queueing up >100 simultaneous job deletions. - Improve speed of queueing up >100 simultaneous job deletions.
- Improve logging of job deletion. - Improve logging of job deletion.
- Add Worker Cluster support. Workers can be members of any number of clusters. Workers will only work on jobs that are assigned to that cluster. Jobs that do not have a cluster will be available to all workers, regardless of their cluster assignment. As a result, clusterless workers will only work on clusterless jobs. - Add Worker Tag support. Workers can be members of any number of tags. Workers will only work on jobs that are assigned to that tag. Jobs that do not have a tag will be available to all workers, regardless of their tag assignment. As a result, tagless workers will only work on tagless jobs.
- Fix limitation where a job could have no more than 1000 tasks ([#104201](https://projects.blender.org/studio/flamenco/issues/104201)) - Fix limitation where a job could have no more than 1000 tasks ([#104201](https://projects.blender.org/studio/flamenco/issues/104201))
- Add support for finding the top-level 'project' directory. When submitting files to Flamenco, the add-on will try to retain the directory structure of your Blender project as precisely as possible. This new feature allows the add-on to find the top-level directory of your project by finding a `.blender_project`, `.git`, or `.subversion` directory. This can be configured in the add-on preferences. - Add support for finding the top-level 'project' directory. When submitting files to Flamenco, the add-on will try to retain the directory structure of your Blender project as precisely as possible. This new feature allows the add-on to find the top-level directory of your project by finding a `.blender_project`, `.git`, or `.subversion` directory. This can be configured in the add-on preferences.
- Worker status is remembered when they sign off, so that workers when they come back online do so to the same state ([#99549](https://projects.blender.org/studio/flamenco/issues/99549)). - Worker status is remembered when they sign off, so that workers when they come back online do so to the same state ([#99549](https://projects.blender.org/studio/flamenco/issues/99549)).

View File

@ -26,7 +26,7 @@ if __is_first_load:
comms, comms,
preferences, preferences,
projects, projects,
worker_clusters, worker_tags,
) )
else: else:
import importlib import importlib
@ -37,7 +37,7 @@ else:
comms = importlib.reload(comms) comms = importlib.reload(comms)
preferences = importlib.reload(preferences) preferences = importlib.reload(preferences)
projects = importlib.reload(projects) projects = importlib.reload(projects)
worker_clusters = importlib.reload(worker_clusters) worker_tags = importlib.reload(worker_tags)
import bpy import bpy
@ -155,7 +155,7 @@ def register() -> None:
) )
preferences.register() preferences.register()
worker_clusters.register() worker_tags.register()
operators.register() operators.register()
gui.register() gui.register()
job_types.register() job_types.register()
@ -173,5 +173,5 @@ def unregister() -> None:
job_types.unregister() job_types.unregister()
gui.unregister() gui.unregister()
operators.unregister() operators.unregister()
worker_clusters.unregister() worker_tags.unregister()
preferences.unregister() preferences.unregister()

View File

@ -43,10 +43,10 @@ class FLAMENCO_PT_job_submission(bpy.types.Panel):
col.prop(context.scene, "flamenco_job_name", text="Job Name") col.prop(context.scene, "flamenco_job_name", text="Job Name")
col.prop(context.scene, "flamenco_job_priority", text="Priority") col.prop(context.scene, "flamenco_job_priority", text="Priority")
# Worker cluster: # Worker tag:
row = col.row(align=True) row = col.row(align=True)
row.prop(context.scene, "flamenco_worker_cluster", text="Cluster") row.prop(context.scene, "flamenco_worker_tag", text="Tag")
row.operator("flamenco.fetch_worker_clusters", text="", icon="FILE_REFRESH") row.operator("flamenco.fetch_worker_tags", text="", icon="FILE_REFRESH")
layout.separator() layout.separator()

View File

@ -54,9 +54,9 @@ def job_for_scene(scene: bpy.types.Scene) -> Optional[_SubmittedJob]:
type_etag=propgroup.job_type.etag, type_etag=propgroup.job_type.etag,
) )
worker_cluster: str = getattr(scene, "flamenco_worker_cluster", "") worker_tag: str = getattr(scene, "flamenco_worker_tag", "")
if worker_cluster and worker_cluster != "-": if worker_tag and worker_tag != "-":
job.worker_cluster = worker_cluster job.worker_tag = worker_tag
return job return job

File diff suppressed because it is too large Load Diff

View File

@ -17,7 +17,7 @@ Name | Type | Description | Notes
**settings** | [**JobSettings**](JobSettings.md) | | [optional] **settings** | [**JobSettings**](JobSettings.md) | | [optional]
**metadata** | [**JobMetadata**](JobMetadata.md) | | [optional] **metadata** | [**JobMetadata**](JobMetadata.md) | | [optional]
**storage** | [**JobStorageInfo**](JobStorageInfo.md) | | [optional] **storage** | [**JobStorageInfo**](JobStorageInfo.md) | | [optional]
**worker_cluster** | **str** | Worker Cluster that should execute this job. When a cluster ID is given, only Workers in that cluster will be scheduled to work on it. If empty or ommitted, all workers can work on this job. | [optional] **worker_tag** | **str** | Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job. | [optional]
**delete_requested_at** | **datetime** | If job deletion was requested, this is the timestamp at which that request was stored on Flamenco Manager. | [optional] **delete_requested_at** | **datetime** | If job deletion was requested, this is the timestamp at which that request was stored on Flamenco Manager. | [optional]
**any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional]

View File

@ -1225,7 +1225,7 @@ with flamenco.manager.ApiClient() as api_client:
storage=JobStorageInfo( storage=JobStorageInfo(
shaman_checkout_id="shaman_checkout_id_example", shaman_checkout_id="shaman_checkout_id_example",
), ),
worker_cluster="worker_cluster_example", worker_tag="worker_tag_example",
) # SubmittedJob | Job to submit ) # SubmittedJob | Job to submit
# example passing only required values which don't have defaults set # example passing only required values which don't have defaults set
@ -1307,7 +1307,7 @@ with flamenco.manager.ApiClient() as api_client:
storage=JobStorageInfo( storage=JobStorageInfo(
shaman_checkout_id="shaman_checkout_id_example", shaman_checkout_id="shaman_checkout_id_example",
), ),
worker_cluster="worker_cluster_example", worker_tag="worker_tag_example",
) # SubmittedJob | Job to check ) # SubmittedJob | Job to check
# example passing only required values which don't have defaults set # example passing only required values which don't have defaults set

View File

@ -13,7 +13,7 @@ Name | Type | Description | Notes
**settings** | [**JobSettings**](JobSettings.md) | | [optional] **settings** | [**JobSettings**](JobSettings.md) | | [optional]
**metadata** | [**JobMetadata**](JobMetadata.md) | | [optional] **metadata** | [**JobMetadata**](JobMetadata.md) | | [optional]
**storage** | [**JobStorageInfo**](JobStorageInfo.md) | | [optional] **storage** | [**JobStorageInfo**](JobStorageInfo.md) | | [optional]
**worker_cluster** | **str** | Worker Cluster that should execute this job. When a cluster ID is given, only Workers in that cluster will be scheduled to work on it. If empty or ommitted, all workers can work on this job. | [optional] **worker_tag** | **str** | Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job. | [optional]
**any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional]
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@ -15,7 +15,7 @@ Name | Type | Description | Notes
**status_change** | [**WorkerStatusChangeRequest**](WorkerStatusChangeRequest.md) | | [optional] **status_change** | [**WorkerStatusChangeRequest**](WorkerStatusChangeRequest.md) | | [optional]
**last_seen** | **datetime** | Last time this worker was seen by the Manager. | [optional] **last_seen** | **datetime** | Last time this worker was seen by the Manager. | [optional]
**task** | [**WorkerTask**](WorkerTask.md) | | [optional] **task** | [**WorkerTask**](WorkerTask.md) | | [optional]
**clusters** | [**[WorkerCluster]**](WorkerCluster.md) | Clusters of which this Worker is a member. | [optional] **tags** | [**[WorkerTag]**](WorkerTag.md) | Tags of which this Worker is a member. | [optional]
**any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional]
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@ -8,7 +8,7 @@ Name | Type | Description | Notes
**platform** | **str** | Operating system of the Worker | **platform** | **str** | Operating system of the Worker |
**supported_task_types** | **[str]** | | **supported_task_types** | **[str]** | |
**task** | [**WorkerTask**](WorkerTask.md) | | [optional] **task** | [**WorkerTask**](WorkerTask.md) | | [optional]
**clusters** | [**[WorkerCluster]**](WorkerCluster.md) | Clusters of which this Worker is a member. | [optional] **tags** | [**[WorkerTag]**](WorkerTag.md) | Tags of which this Worker is a member. | [optional]
**any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional]
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@ -4,24 +4,24 @@ All URIs are relative to *http://localhost*
Method | HTTP request | Description Method | HTTP request | Description
------------- | ------------- | ------------- ------------- | ------------- | -------------
[**create_worker_cluster**](WorkerMgtApi.md#create_worker_cluster) | **POST** /api/v3/worker-mgt/clusters | Create a new worker cluster. [**create_worker_tag**](WorkerMgtApi.md#create_worker_tag) | **POST** /api/v3/worker-mgt/tags | Create a new worker tag.
[**delete_worker**](WorkerMgtApi.md#delete_worker) | **DELETE** /api/v3/worker-mgt/workers/{worker_id} | Remove the given worker. It is recommended to only call this function when the worker is in `offline` state. If the worker is still running, stop it first. Any task still assigned to the worker will be requeued. [**delete_worker**](WorkerMgtApi.md#delete_worker) | **DELETE** /api/v3/worker-mgt/workers/{worker_id} | Remove the given worker. It is recommended to only call this function when the worker is in `offline` state. If the worker is still running, stop it first. Any task still assigned to the worker will be requeued.
[**delete_worker_cluster**](WorkerMgtApi.md#delete_worker_cluster) | **DELETE** /api/v3/worker-mgt/cluster/{cluster_id} | Remove this worker cluster. This unassigns all workers from the cluster and removes it. [**delete_worker_tag**](WorkerMgtApi.md#delete_worker_tag) | **DELETE** /api/v3/worker-mgt/tag/{tag_id} | Remove this worker tag. This unassigns all workers from the tag and removes it.
[**fetch_worker**](WorkerMgtApi.md#fetch_worker) | **GET** /api/v3/worker-mgt/workers/{worker_id} | Fetch info about the worker. [**fetch_worker**](WorkerMgtApi.md#fetch_worker) | **GET** /api/v3/worker-mgt/workers/{worker_id} | Fetch info about the worker.
[**fetch_worker_cluster**](WorkerMgtApi.md#fetch_worker_cluster) | **GET** /api/v3/worker-mgt/cluster/{cluster_id} | Get a single worker cluster.
[**fetch_worker_clusters**](WorkerMgtApi.md#fetch_worker_clusters) | **GET** /api/v3/worker-mgt/clusters | Get list of worker clusters.
[**fetch_worker_sleep_schedule**](WorkerMgtApi.md#fetch_worker_sleep_schedule) | **GET** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule | [**fetch_worker_sleep_schedule**](WorkerMgtApi.md#fetch_worker_sleep_schedule) | **GET** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule |
[**fetch_worker_tag**](WorkerMgtApi.md#fetch_worker_tag) | **GET** /api/v3/worker-mgt/tag/{tag_id} | Get a single worker tag.
[**fetch_worker_tags**](WorkerMgtApi.md#fetch_worker_tags) | **GET** /api/v3/worker-mgt/tags | Get list of worker tags.
[**fetch_workers**](WorkerMgtApi.md#fetch_workers) | **GET** /api/v3/worker-mgt/workers | Get list of workers. [**fetch_workers**](WorkerMgtApi.md#fetch_workers) | **GET** /api/v3/worker-mgt/workers | Get list of workers.
[**request_worker_status_change**](WorkerMgtApi.md#request_worker_status_change) | **POST** /api/v3/worker-mgt/workers/{worker_id}/setstatus | [**request_worker_status_change**](WorkerMgtApi.md#request_worker_status_change) | **POST** /api/v3/worker-mgt/workers/{worker_id}/setstatus |
[**set_worker_clusters**](WorkerMgtApi.md#set_worker_clusters) | **POST** /api/v3/worker-mgt/workers/{worker_id}/setclusters |
[**set_worker_sleep_schedule**](WorkerMgtApi.md#set_worker_sleep_schedule) | **POST** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule | [**set_worker_sleep_schedule**](WorkerMgtApi.md#set_worker_sleep_schedule) | **POST** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule |
[**update_worker_cluster**](WorkerMgtApi.md#update_worker_cluster) | **PUT** /api/v3/worker-mgt/cluster/{cluster_id} | Update an existing worker cluster. [**set_worker_tags**](WorkerMgtApi.md#set_worker_tags) | **POST** /api/v3/worker-mgt/workers/{worker_id}/settags |
[**update_worker_tag**](WorkerMgtApi.md#update_worker_tag) | **PUT** /api/v3/worker-mgt/tag/{tag_id} | Update an existing worker tag.
# **create_worker_cluster** # **create_worker_tag**
> WorkerCluster create_worker_cluster(worker_cluster) > WorkerTag create_worker_tag(worker_tag)
Create a new worker cluster. Create a new worker tag.
### Example ### Example
@ -31,7 +31,7 @@ import time
import flamenco.manager import flamenco.manager
from flamenco.manager.api import worker_mgt_api from flamenco.manager.api import worker_mgt_api
from flamenco.manager.model.error import Error from flamenco.manager.model.error import Error
from flamenco.manager.model.worker_cluster import WorkerCluster from flamenco.manager.model.worker_tag import WorkerTag
from pprint import pprint from pprint import pprint
# Defining the host is optional and defaults to http://localhost # Defining the host is optional and defaults to http://localhost
# See configuration.py for a list of all supported configuration parameters. # See configuration.py for a list of all supported configuration parameters.
@ -44,19 +44,19 @@ configuration = flamenco.manager.Configuration(
with flamenco.manager.ApiClient() as api_client: with flamenco.manager.ApiClient() as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = worker_mgt_api.WorkerMgtApi(api_client) api_instance = worker_mgt_api.WorkerMgtApi(api_client)
worker_cluster = WorkerCluster( worker_tag = WorkerTag(
id="id_example", id="id_example",
name="name_example", name="name_example",
description="description_example", description="description_example",
) # WorkerCluster | The worker cluster. ) # WorkerTag | The worker tag.
# example passing only required values which don't have defaults set # example passing only required values which don't have defaults set
try: try:
# Create a new worker cluster. # Create a new worker tag.
api_response = api_instance.create_worker_cluster(worker_cluster) api_response = api_instance.create_worker_tag(worker_tag)
pprint(api_response) pprint(api_response)
except flamenco.manager.ApiException as e: except flamenco.manager.ApiException as e:
print("Exception when calling WorkerMgtApi->create_worker_cluster: %s\n" % e) print("Exception when calling WorkerMgtApi->create_worker_tag: %s\n" % e)
``` ```
@ -64,11 +64,11 @@ with flamenco.manager.ApiClient() as api_client:
Name | Type | Description | Notes Name | Type | Description | Notes
------------- | ------------- | ------------- | ------------- ------------- | ------------- | ------------- | -------------
**worker_cluster** | [**WorkerCluster**](WorkerCluster.md)| The worker cluster. | **worker_tag** | [**WorkerTag**](WorkerTag.md)| The worker tag. |
### Return type ### Return type
[**WorkerCluster**](WorkerCluster.md) [**WorkerTag**](WorkerTag.md)
### Authorization ### Authorization
@ -84,7 +84,7 @@ No authorization required
| Status code | Description | Response headers | | Status code | Description | Response headers |
|-------------|-------------|------------------| |-------------|-------------|------------------|
**200** | The cluster was created. The created cluster is returned, so that the caller can know its UUID. | - | **200** | The tag was created. The created tag is returned, so that the caller can know its UUID. | - |
**0** | Error message | - | **0** | Error message | - |
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
@ -154,10 +154,10 @@ No authorization required
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **delete_worker_cluster** # **delete_worker_tag**
> delete_worker_cluster(cluster_id) > delete_worker_tag(tag_id)
Remove this worker cluster. This unassigns all workers from the cluster and removes it. Remove this worker tag. This unassigns all workers from the tag and removes it.
### Example ### Example
@ -179,14 +179,14 @@ configuration = flamenco.manager.Configuration(
with flamenco.manager.ApiClient() as api_client: with flamenco.manager.ApiClient() as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = worker_mgt_api.WorkerMgtApi(api_client) api_instance = worker_mgt_api.WorkerMgtApi(api_client)
cluster_id = "cluster_id_example" # str | tag_id = "tag_id_example" # str |
# example passing only required values which don't have defaults set # example passing only required values which don't have defaults set
try: try:
# Remove this worker cluster. This unassigns all workers from the cluster and removes it. # Remove this worker tag. This unassigns all workers from the tag and removes it.
api_instance.delete_worker_cluster(cluster_id) api_instance.delete_worker_tag(tag_id)
except flamenco.manager.ApiException as e: except flamenco.manager.ApiException as e:
print("Exception when calling WorkerMgtApi->delete_worker_cluster: %s\n" % e) print("Exception when calling WorkerMgtApi->delete_worker_tag: %s\n" % e)
``` ```
@ -194,7 +194,7 @@ with flamenco.manager.ApiClient() as api_client:
Name | Type | Description | Notes Name | Type | Description | Notes
------------- | ------------- | ------------- | ------------- ------------- | ------------- | ------------- | -------------
**cluster_id** | **str**| | **tag_id** | **str**| |
### Return type ### Return type
@ -214,7 +214,7 @@ No authorization required
| Status code | Description | Response headers | | Status code | Description | Response headers |
|-------------|-------------|------------------| |-------------|-------------|------------------|
**204** | The cluster has been removed. | - | **204** | The tag has been removed. | - |
**0** | Unexpected error. | - | **0** | Unexpected error. | - |
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
@ -284,132 +284,6 @@ No authorization required
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **fetch_worker_cluster**
> WorkerCluster fetch_worker_cluster(cluster_id)
Get a single worker cluster.
### Example
```python
import time
import flamenco.manager
from flamenco.manager.api import worker_mgt_api
from flamenco.manager.model.worker_cluster import WorkerCluster
from pprint import pprint
# Defining the host is optional and defaults to http://localhost
# See configuration.py for a list of all supported configuration parameters.
configuration = flamenco.manager.Configuration(
host = "http://localhost"
)
# Enter a context with an instance of the API client
with flamenco.manager.ApiClient() as api_client:
# Create an instance of the API class
api_instance = worker_mgt_api.WorkerMgtApi(api_client)
cluster_id = "cluster_id_example" # str |
# example passing only required values which don't have defaults set
try:
# Get a single worker cluster.
api_response = api_instance.fetch_worker_cluster(cluster_id)
pprint(api_response)
except flamenco.manager.ApiException as e:
print("Exception when calling WorkerMgtApi->fetch_worker_cluster: %s\n" % e)
```
### Parameters
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**cluster_id** | **str**| |
### Return type
[**WorkerCluster**](WorkerCluster.md)
### Authorization
No authorization required
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: application/json
### HTTP response details
| Status code | Description | Response headers |
|-------------|-------------|------------------|
**200** | The worker cluster. | - |
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **fetch_worker_clusters**
> WorkerClusterList fetch_worker_clusters()
Get list of worker clusters.
### Example
```python
import time
import flamenco.manager
from flamenco.manager.api import worker_mgt_api
from flamenco.manager.model.worker_cluster_list import WorkerClusterList
from pprint import pprint
# Defining the host is optional and defaults to http://localhost
# See configuration.py for a list of all supported configuration parameters.
configuration = flamenco.manager.Configuration(
host = "http://localhost"
)
# Enter a context with an instance of the API client
with flamenco.manager.ApiClient() as api_client:
# Create an instance of the API class
api_instance = worker_mgt_api.WorkerMgtApi(api_client)
# example, this endpoint has no required or optional parameters
try:
# Get list of worker clusters.
api_response = api_instance.fetch_worker_clusters()
pprint(api_response)
except flamenco.manager.ApiException as e:
print("Exception when calling WorkerMgtApi->fetch_worker_clusters: %s\n" % e)
```
### Parameters
This endpoint does not need any parameter.
### Return type
[**WorkerClusterList**](WorkerClusterList.md)
### Authorization
No authorization required
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: application/json
### HTTP response details
| Status code | Description | Response headers |
|-------------|-------------|------------------|
**200** | Worker clusters. | - |
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **fetch_worker_sleep_schedule** # **fetch_worker_sleep_schedule**
> WorkerSleepSchedule fetch_worker_sleep_schedule(worker_id) > WorkerSleepSchedule fetch_worker_sleep_schedule(worker_id)
@ -477,6 +351,132 @@ No authorization required
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **fetch_worker_tag**
> WorkerTag fetch_worker_tag(tag_id)
Get a single worker tag.
### Example
```python
import time
import flamenco.manager
from flamenco.manager.api import worker_mgt_api
from flamenco.manager.model.worker_tag import WorkerTag
from pprint import pprint
# Defining the host is optional and defaults to http://localhost
# See configuration.py for a list of all supported configuration parameters.
configuration = flamenco.manager.Configuration(
host = "http://localhost"
)
# Enter a context with an instance of the API client
with flamenco.manager.ApiClient() as api_client:
# Create an instance of the API class
api_instance = worker_mgt_api.WorkerMgtApi(api_client)
tag_id = "tag_id_example" # str |
# example passing only required values which don't have defaults set
try:
# Get a single worker tag.
api_response = api_instance.fetch_worker_tag(tag_id)
pprint(api_response)
except flamenco.manager.ApiException as e:
print("Exception when calling WorkerMgtApi->fetch_worker_tag: %s\n" % e)
```
### Parameters
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**tag_id** | **str**| |
### Return type
[**WorkerTag**](WorkerTag.md)
### Authorization
No authorization required
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: application/json
### HTTP response details
| Status code | Description | Response headers |
|-------------|-------------|------------------|
**200** | The worker tag. | - |
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **fetch_worker_tags**
> WorkerTagList fetch_worker_tags()
Get list of worker tags.
### Example
```python
import time
import flamenco.manager
from flamenco.manager.api import worker_mgt_api
from flamenco.manager.model.worker_tag_list import WorkerTagList
from pprint import pprint
# Defining the host is optional and defaults to http://localhost
# See configuration.py for a list of all supported configuration parameters.
configuration = flamenco.manager.Configuration(
host = "http://localhost"
)
# Enter a context with an instance of the API client
with flamenco.manager.ApiClient() as api_client:
# Create an instance of the API class
api_instance = worker_mgt_api.WorkerMgtApi(api_client)
# example, this endpoint has no required or optional parameters
try:
# Get list of worker tags.
api_response = api_instance.fetch_worker_tags()
pprint(api_response)
except flamenco.manager.ApiException as e:
print("Exception when calling WorkerMgtApi->fetch_worker_tags: %s\n" % e)
```
### Parameters
This endpoint does not need any parameter.
### Return type
[**WorkerTagList**](WorkerTagList.md)
### Authorization
No authorization required
### HTTP request headers
- **Content-Type**: Not defined
- **Accept**: application/json
### HTTP response details
| Status code | Description | Response headers |
|-------------|-------------|------------------|
**200** | Worker tags. | - |
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **fetch_workers** # **fetch_workers**
> WorkerList fetch_workers() > WorkerList fetch_workers()
@ -599,77 +599,6 @@ No authorization required
- **Accept**: application/json - **Accept**: application/json
### HTTP response details
| Status code | Description | Response headers |
|-------------|-------------|------------------|
**204** | Status change was accepted. | - |
**0** | Unexpected error. | - |
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **set_worker_clusters**
> set_worker_clusters(worker_id, worker_cluster_change_request)
### Example
```python
import time
import flamenco.manager
from flamenco.manager.api import worker_mgt_api
from flamenco.manager.model.error import Error
from flamenco.manager.model.worker_cluster_change_request import WorkerClusterChangeRequest
from pprint import pprint
# Defining the host is optional and defaults to http://localhost
# See configuration.py for a list of all supported configuration parameters.
configuration = flamenco.manager.Configuration(
host = "http://localhost"
)
# Enter a context with an instance of the API client
with flamenco.manager.ApiClient() as api_client:
# Create an instance of the API class
api_instance = worker_mgt_api.WorkerMgtApi(api_client)
worker_id = "worker_id_example" # str |
worker_cluster_change_request = WorkerClusterChangeRequest(
cluster_ids=[
"cluster_ids_example",
],
) # WorkerClusterChangeRequest | The list of cluster IDs this worker should be a member of.
# example passing only required values which don't have defaults set
try:
api_instance.set_worker_clusters(worker_id, worker_cluster_change_request)
except flamenco.manager.ApiException as e:
print("Exception when calling WorkerMgtApi->set_worker_clusters: %s\n" % e)
```
### Parameters
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**worker_id** | **str**| |
**worker_cluster_change_request** | [**WorkerClusterChangeRequest**](WorkerClusterChangeRequest.md)| The list of cluster IDs this worker should be a member of. |
### Return type
void (empty response body)
### Authorization
No authorization required
### HTTP request headers
- **Content-Type**: application/json
- **Accept**: application/json
### HTTP response details ### HTTP response details
| Status code | Description | Response headers | | Status code | Description | Response headers |
@ -751,10 +680,10 @@ No authorization required
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **update_worker_cluster** # **set_worker_tags**
> update_worker_cluster(cluster_id, worker_cluster) > set_worker_tags(worker_id, worker_tag_change_request)
Update an existing worker cluster.
### Example ### Example
@ -764,7 +693,7 @@ import time
import flamenco.manager import flamenco.manager
from flamenco.manager.api import worker_mgt_api from flamenco.manager.api import worker_mgt_api
from flamenco.manager.model.error import Error from flamenco.manager.model.error import Error
from flamenco.manager.model.worker_cluster import WorkerCluster from flamenco.manager.model.worker_tag_change_request import WorkerTagChangeRequest
from pprint import pprint from pprint import pprint
# Defining the host is optional and defaults to http://localhost # Defining the host is optional and defaults to http://localhost
# See configuration.py for a list of all supported configuration parameters. # See configuration.py for a list of all supported configuration parameters.
@ -777,19 +706,18 @@ configuration = flamenco.manager.Configuration(
with flamenco.manager.ApiClient() as api_client: with flamenco.manager.ApiClient() as api_client:
# Create an instance of the API class # Create an instance of the API class
api_instance = worker_mgt_api.WorkerMgtApi(api_client) api_instance = worker_mgt_api.WorkerMgtApi(api_client)
cluster_id = "cluster_id_example" # str | worker_id = "worker_id_example" # str |
worker_cluster = WorkerCluster( worker_tag_change_request = WorkerTagChangeRequest(
id="id_example", tag_ids=[
name="name_example", "tag_ids_example",
description="description_example", ],
) # WorkerCluster | The updated worker cluster. ) # WorkerTagChangeRequest | The list of worker tag IDs this worker should be a member of.
# example passing only required values which don't have defaults set # example passing only required values which don't have defaults set
try: try:
# Update an existing worker cluster. api_instance.set_worker_tags(worker_id, worker_tag_change_request)
api_instance.update_worker_cluster(cluster_id, worker_cluster)
except flamenco.manager.ApiException as e: except flamenco.manager.ApiException as e:
print("Exception when calling WorkerMgtApi->update_worker_cluster: %s\n" % e) print("Exception when calling WorkerMgtApi->set_worker_tags: %s\n" % e)
``` ```
@ -797,8 +725,8 @@ with flamenco.manager.ApiClient() as api_client:
Name | Type | Description | Notes Name | Type | Description | Notes
------------- | ------------- | ------------- | ------------- ------------- | ------------- | ------------- | -------------
**cluster_id** | **str**| | **worker_id** | **str**| |
**worker_cluster** | [**WorkerCluster**](WorkerCluster.md)| The updated worker cluster. | **worker_tag_change_request** | [**WorkerTagChangeRequest**](WorkerTagChangeRequest.md)| The list of worker tag IDs this worker should be a member of. |
### Return type ### Return type
@ -818,7 +746,79 @@ No authorization required
| Status code | Description | Response headers | | Status code | Description | Response headers |
|-------------|-------------|------------------| |-------------|-------------|------------------|
**204** | The cluster update has been stored. | - | **204** | Status change was accepted. | - |
**0** | Unexpected error. | - |
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)
# **update_worker_tag**
> update_worker_tag(tag_id, worker_tag)
Update an existing worker tag.
### Example
```python
import time
import flamenco.manager
from flamenco.manager.api import worker_mgt_api
from flamenco.manager.model.error import Error
from flamenco.manager.model.worker_tag import WorkerTag
from pprint import pprint
# Defining the host is optional and defaults to http://localhost
# See configuration.py for a list of all supported configuration parameters.
configuration = flamenco.manager.Configuration(
host = "http://localhost"
)
# Enter a context with an instance of the API client
with flamenco.manager.ApiClient() as api_client:
# Create an instance of the API class
api_instance = worker_mgt_api.WorkerMgtApi(api_client)
tag_id = "tag_id_example" # str |
worker_tag = WorkerTag(
id="id_example",
name="name_example",
description="description_example",
) # WorkerTag | The updated worker tag.
# example passing only required values which don't have defaults set
try:
# Update an existing worker tag.
api_instance.update_worker_tag(tag_id, worker_tag)
except flamenco.manager.ApiException as e:
print("Exception when calling WorkerMgtApi->update_worker_tag: %s\n" % e)
```
### Parameters
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**tag_id** | **str**| |
**worker_tag** | [**WorkerTag**](WorkerTag.md)| The updated worker tag. |
### Return type
void (empty response body)
### Authorization
No authorization required
### HTTP request headers
- **Content-Type**: application/json
- **Accept**: application/json
### HTTP response details
| Status code | Description | Response headers |
|-------------|-------------|------------------|
**204** | The tag update has been stored. | - |
**0** | Error message | - | **0** | Error message | - |
[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md)

View File

@ -1,12 +1,12 @@
# WorkerCluster # WorkerTag
Cluster of workers. A job can optionally specify which cluster it should be limited to. Workers can be part of multiple clusters simultaneously. Tag of workers. A job can optionally specify which tag it should be limited to. Workers can be part of multiple tags simultaneously.
## Properties ## Properties
Name | Type | Description | Notes Name | Type | Description | Notes
------------ | ------------- | ------------- | ------------- ------------ | ------------- | ------------- | -------------
**name** | **str** | | **name** | **str** | |
**id** | **str** | UUID of the cluster. Can be ommitted when creating a new cluster, in which case a random UUID will be assigned. | [optional] **id** | **str** | UUID of the tag. Can be ommitted when creating a new tag, in which case a random UUID will be assigned. | [optional]
**description** | **str** | | [optional] **description** | **str** | | [optional]
**any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional]

View File

@ -1,11 +1,11 @@
# WorkerClusterChangeRequest # WorkerTagChangeRequest
Request to change which clusters this Worker is assigned to. Request to change which tags this Worker is assigned to.
## Properties ## Properties
Name | Type | Description | Notes Name | Type | Description | Notes
------------ | ------------- | ------------- | ------------- ------------ | ------------- | ------------- | -------------
**cluster_ids** | **[str]** | | **tag_ids** | **[str]** | |
**any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional]
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@ -1,10 +1,10 @@
# WorkerClusterList # WorkerTagList
## Properties ## Properties
Name | Type | Description | Notes Name | Type | Description | Notes
------------ | ------------- | ------------- | ------------- ------------ | ------------- | ------------- | -------------
**clusters** | [**[WorkerCluster]**](WorkerCluster.md) | | [optional] **tags** | [**[WorkerTag]**](WorkerTag.md) | | [optional]
**any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional]
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)

View File

@ -110,7 +110,7 @@ class Job(ModelComposed):
'settings': (JobSettings,), # noqa: E501 'settings': (JobSettings,), # noqa: E501
'metadata': (JobMetadata,), # noqa: E501 'metadata': (JobMetadata,), # noqa: E501
'storage': (JobStorageInfo,), # noqa: E501 'storage': (JobStorageInfo,), # noqa: E501
'worker_cluster': (str,), # noqa: E501 'worker_tag': (str,), # noqa: E501
'delete_requested_at': (datetime,), # noqa: E501 'delete_requested_at': (datetime,), # noqa: E501
} }
@ -133,7 +133,7 @@ class Job(ModelComposed):
'settings': 'settings', # noqa: E501 'settings': 'settings', # noqa: E501
'metadata': 'metadata', # noqa: E501 'metadata': 'metadata', # noqa: E501
'storage': 'storage', # noqa: E501 'storage': 'storage', # noqa: E501
'worker_cluster': 'worker_cluster', # noqa: E501 'worker_tag': 'worker_tag', # noqa: E501
'delete_requested_at': 'delete_requested_at', # noqa: E501 'delete_requested_at': 'delete_requested_at', # noqa: E501
} }
@ -189,7 +189,7 @@ class Job(ModelComposed):
settings (JobSettings): [optional] # noqa: E501 settings (JobSettings): [optional] # noqa: E501
metadata (JobMetadata): [optional] # noqa: E501 metadata (JobMetadata): [optional] # noqa: E501
storage (JobStorageInfo): [optional] # noqa: E501 storage (JobStorageInfo): [optional] # noqa: E501
worker_cluster (str): Worker Cluster that should execute this job. When a cluster ID is given, only Workers in that cluster will be scheduled to work on it. If empty or ommitted, all workers can work on this job. . [optional] # noqa: E501 worker_tag (str): Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job. . [optional] # noqa: E501
delete_requested_at (datetime): If job deletion was requested, this is the timestamp at which that request was stored on Flamenco Manager. . [optional] # noqa: E501 delete_requested_at (datetime): If job deletion was requested, this is the timestamp at which that request was stored on Flamenco Manager. . [optional] # noqa: E501
""" """
@ -304,7 +304,7 @@ class Job(ModelComposed):
settings (JobSettings): [optional] # noqa: E501 settings (JobSettings): [optional] # noqa: E501
metadata (JobMetadata): [optional] # noqa: E501 metadata (JobMetadata): [optional] # noqa: E501
storage (JobStorageInfo): [optional] # noqa: E501 storage (JobStorageInfo): [optional] # noqa: E501
worker_cluster (str): Worker Cluster that should execute this job. When a cluster ID is given, only Workers in that cluster will be scheduled to work on it. If empty or ommitted, all workers can work on this job. . [optional] # noqa: E501 worker_tag (str): Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job. . [optional] # noqa: E501
delete_requested_at (datetime): If job deletion was requested, this is the timestamp at which that request was stored on Flamenco Manager. . [optional] # noqa: E501 delete_requested_at (datetime): If job deletion was requested, this is the timestamp at which that request was stored on Flamenco Manager. . [optional] # noqa: E501
""" """

View File

@ -99,7 +99,7 @@ class SubmittedJob(ModelNormal):
'settings': (JobSettings,), # noqa: E501 'settings': (JobSettings,), # noqa: E501
'metadata': (JobMetadata,), # noqa: E501 'metadata': (JobMetadata,), # noqa: E501
'storage': (JobStorageInfo,), # noqa: E501 'storage': (JobStorageInfo,), # noqa: E501
'worker_cluster': (str,), # noqa: E501 'worker_tag': (str,), # noqa: E501
} }
@cached_property @cached_property
@ -116,7 +116,7 @@ class SubmittedJob(ModelNormal):
'settings': 'settings', # noqa: E501 'settings': 'settings', # noqa: E501
'metadata': 'metadata', # noqa: E501 'metadata': 'metadata', # noqa: E501
'storage': 'storage', # noqa: E501 'storage': 'storage', # noqa: E501
'worker_cluster': 'worker_cluster', # noqa: E501 'worker_tag': 'worker_tag', # noqa: E501
} }
read_only_vars = { read_only_vars = {
@ -170,7 +170,7 @@ class SubmittedJob(ModelNormal):
settings (JobSettings): [optional] # noqa: E501 settings (JobSettings): [optional] # noqa: E501
metadata (JobMetadata): [optional] # noqa: E501 metadata (JobMetadata): [optional] # noqa: E501
storage (JobStorageInfo): [optional] # noqa: E501 storage (JobStorageInfo): [optional] # noqa: E501
worker_cluster (str): Worker Cluster that should execute this job. When a cluster ID is given, only Workers in that cluster will be scheduled to work on it. If empty or ommitted, all workers can work on this job. . [optional] # noqa: E501 worker_tag (str): Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job. . [optional] # noqa: E501
""" """
priority = kwargs.get('priority', 50) priority = kwargs.get('priority', 50)
@ -267,7 +267,7 @@ class SubmittedJob(ModelNormal):
settings (JobSettings): [optional] # noqa: E501 settings (JobSettings): [optional] # noqa: E501
metadata (JobMetadata): [optional] # noqa: E501 metadata (JobMetadata): [optional] # noqa: E501
storage (JobStorageInfo): [optional] # noqa: E501 storage (JobStorageInfo): [optional] # noqa: E501
worker_cluster (str): Worker Cluster that should execute this job. When a cluster ID is given, only Workers in that cluster will be scheduled to work on it. If empty or ommitted, all workers can work on this job. . [optional] # noqa: E501 worker_tag (str): Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job. . [optional] # noqa: E501
""" """
priority = kwargs.get('priority', 50) priority = kwargs.get('priority', 50)

View File

@ -31,16 +31,16 @@ from flamenco.manager.exceptions import ApiAttributeError
def lazy_import(): def lazy_import():
from flamenco.manager.model.worker_all_of import WorkerAllOf from flamenco.manager.model.worker_all_of import WorkerAllOf
from flamenco.manager.model.worker_cluster import WorkerCluster
from flamenco.manager.model.worker_status import WorkerStatus from flamenco.manager.model.worker_status import WorkerStatus
from flamenco.manager.model.worker_status_change_request import WorkerStatusChangeRequest from flamenco.manager.model.worker_status_change_request import WorkerStatusChangeRequest
from flamenco.manager.model.worker_summary import WorkerSummary from flamenco.manager.model.worker_summary import WorkerSummary
from flamenco.manager.model.worker_tag import WorkerTag
from flamenco.manager.model.worker_task import WorkerTask from flamenco.manager.model.worker_task import WorkerTask
globals()['WorkerAllOf'] = WorkerAllOf globals()['WorkerAllOf'] = WorkerAllOf
globals()['WorkerCluster'] = WorkerCluster
globals()['WorkerStatus'] = WorkerStatus globals()['WorkerStatus'] = WorkerStatus
globals()['WorkerStatusChangeRequest'] = WorkerStatusChangeRequest globals()['WorkerStatusChangeRequest'] = WorkerStatusChangeRequest
globals()['WorkerSummary'] = WorkerSummary globals()['WorkerSummary'] = WorkerSummary
globals()['WorkerTag'] = WorkerTag
globals()['WorkerTask'] = WorkerTask globals()['WorkerTask'] = WorkerTask
@ -107,7 +107,7 @@ class Worker(ModelComposed):
'status_change': (WorkerStatusChangeRequest,), # noqa: E501 'status_change': (WorkerStatusChangeRequest,), # noqa: E501
'last_seen': (datetime,), # noqa: E501 'last_seen': (datetime,), # noqa: E501
'task': (WorkerTask,), # noqa: E501 'task': (WorkerTask,), # noqa: E501
'clusters': ([WorkerCluster],), # noqa: E501 'tags': ([WorkerTag],), # noqa: E501
} }
@cached_property @cached_property
@ -126,7 +126,7 @@ class Worker(ModelComposed):
'status_change': 'status_change', # noqa: E501 'status_change': 'status_change', # noqa: E501
'last_seen': 'last_seen', # noqa: E501 'last_seen': 'last_seen', # noqa: E501
'task': 'task', # noqa: E501 'task': 'task', # noqa: E501
'clusters': 'clusters', # noqa: E501 'tags': 'tags', # noqa: E501
} }
read_only_vars = { read_only_vars = {
@ -178,7 +178,7 @@ class Worker(ModelComposed):
status_change (WorkerStatusChangeRequest): [optional] # noqa: E501 status_change (WorkerStatusChangeRequest): [optional] # noqa: E501
last_seen (datetime): Last time this worker was seen by the Manager.. [optional] # noqa: E501 last_seen (datetime): Last time this worker was seen by the Manager.. [optional] # noqa: E501
task (WorkerTask): [optional] # noqa: E501 task (WorkerTask): [optional] # noqa: E501
clusters ([WorkerCluster]): Clusters of which this Worker is a member.. [optional] # noqa: E501 tags ([WorkerTag]): Tags of which this Worker is a member.. [optional] # noqa: E501
""" """
_check_type = kwargs.pop('_check_type', True) _check_type = kwargs.pop('_check_type', True)
@ -288,7 +288,7 @@ class Worker(ModelComposed):
status_change (WorkerStatusChangeRequest): [optional] # noqa: E501 status_change (WorkerStatusChangeRequest): [optional] # noqa: E501
last_seen (datetime): Last time this worker was seen by the Manager.. [optional] # noqa: E501 last_seen (datetime): Last time this worker was seen by the Manager.. [optional] # noqa: E501
task (WorkerTask): [optional] # noqa: E501 task (WorkerTask): [optional] # noqa: E501
clusters ([WorkerCluster]): Clusters of which this Worker is a member.. [optional] # noqa: E501 tags ([WorkerTag]): Tags of which this Worker is a member.. [optional] # noqa: E501
""" """
_check_type = kwargs.pop('_check_type', True) _check_type = kwargs.pop('_check_type', True)

View File

@ -30,9 +30,9 @@ from flamenco.manager.exceptions import ApiAttributeError
def lazy_import(): def lazy_import():
from flamenco.manager.model.worker_cluster import WorkerCluster from flamenco.manager.model.worker_tag import WorkerTag
from flamenco.manager.model.worker_task import WorkerTask from flamenco.manager.model.worker_task import WorkerTask
globals()['WorkerCluster'] = WorkerCluster globals()['WorkerTag'] = WorkerTag
globals()['WorkerTask'] = WorkerTask globals()['WorkerTask'] = WorkerTask
@ -93,7 +93,7 @@ class WorkerAllOf(ModelNormal):
'platform': (str,), # noqa: E501 'platform': (str,), # noqa: E501
'supported_task_types': ([str],), # noqa: E501 'supported_task_types': ([str],), # noqa: E501
'task': (WorkerTask,), # noqa: E501 'task': (WorkerTask,), # noqa: E501
'clusters': ([WorkerCluster],), # noqa: E501 'tags': ([WorkerTag],), # noqa: E501
} }
@cached_property @cached_property
@ -106,7 +106,7 @@ class WorkerAllOf(ModelNormal):
'platform': 'platform', # noqa: E501 'platform': 'platform', # noqa: E501
'supported_task_types': 'supported_task_types', # noqa: E501 'supported_task_types': 'supported_task_types', # noqa: E501
'task': 'task', # noqa: E501 'task': 'task', # noqa: E501
'clusters': 'clusters', # noqa: E501 'tags': 'tags', # noqa: E501
} }
read_only_vars = { read_only_vars = {
@ -156,7 +156,7 @@ class WorkerAllOf(ModelNormal):
through its discriminator because we passed in through its discriminator because we passed in
_visited_composed_classes = (Animal,) _visited_composed_classes = (Animal,)
task (WorkerTask): [optional] # noqa: E501 task (WorkerTask): [optional] # noqa: E501
clusters ([WorkerCluster]): Clusters of which this Worker is a member.. [optional] # noqa: E501 tags ([WorkerTag]): Tags of which this Worker is a member.. [optional] # noqa: E501
""" """
_check_type = kwargs.pop('_check_type', True) _check_type = kwargs.pop('_check_type', True)
@ -247,7 +247,7 @@ class WorkerAllOf(ModelNormal):
through its discriminator because we passed in through its discriminator because we passed in
_visited_composed_classes = (Animal,) _visited_composed_classes = (Animal,)
task (WorkerTask): [optional] # noqa: E501 task (WorkerTask): [optional] # noqa: E501
clusters ([WorkerCluster]): Clusters of which this Worker is a member.. [optional] # noqa: E501 tags ([WorkerTag]): Tags of which this Worker is a member.. [optional] # noqa: E501
""" """
_check_type = kwargs.pop('_check_type', True) _check_type = kwargs.pop('_check_type', True)

View File

@ -30,7 +30,7 @@ from flamenco.manager.exceptions import ApiAttributeError
class WorkerCluster(ModelNormal): class WorkerTag(ModelNormal):
"""NOTE: This class is auto generated by OpenAPI Generator. """NOTE: This class is auto generated by OpenAPI Generator.
Ref: https://openapi-generator.tech Ref: https://openapi-generator.tech
@ -105,7 +105,7 @@ class WorkerCluster(ModelNormal):
@classmethod @classmethod
@convert_js_args_to_python_args @convert_js_args_to_python_args
def _from_openapi_data(cls, name, *args, **kwargs): # noqa: E501 def _from_openapi_data(cls, name, *args, **kwargs): # noqa: E501
"""WorkerCluster - a model defined in OpenAPI """WorkerTag - a model defined in OpenAPI
Args: Args:
name (str): name (str):
@ -141,7 +141,7 @@ class WorkerCluster(ModelNormal):
Animal class but this time we won't travel Animal class but this time we won't travel
through its discriminator because we passed in through its discriminator because we passed in
_visited_composed_classes = (Animal,) _visited_composed_classes = (Animal,)
id (str): UUID of the cluster. Can be ommitted when creating a new cluster, in which case a random UUID will be assigned. . [optional] # noqa: E501 id (str): UUID of the tag. Can be ommitted when creating a new tag, in which case a random UUID will be assigned. . [optional] # noqa: E501
description (str): [optional] # noqa: E501 description (str): [optional] # noqa: E501
""" """
@ -192,7 +192,7 @@ class WorkerCluster(ModelNormal):
@convert_js_args_to_python_args @convert_js_args_to_python_args
def __init__(self, name, *args, **kwargs): # noqa: E501 def __init__(self, name, *args, **kwargs): # noqa: E501
"""WorkerCluster - a model defined in OpenAPI """WorkerTag - a model defined in OpenAPI
Args: Args:
name (str): name (str):
@ -228,7 +228,7 @@ class WorkerCluster(ModelNormal):
Animal class but this time we won't travel Animal class but this time we won't travel
through its discriminator because we passed in through its discriminator because we passed in
_visited_composed_classes = (Animal,) _visited_composed_classes = (Animal,)
id (str): UUID of the cluster. Can be ommitted when creating a new cluster, in which case a random UUID will be assigned. . [optional] # noqa: E501 id (str): UUID of the tag. Can be ommitted when creating a new tag, in which case a random UUID will be assigned. . [optional] # noqa: E501
description (str): [optional] # noqa: E501 description (str): [optional] # noqa: E501
""" """

View File

@ -30,7 +30,7 @@ from flamenco.manager.exceptions import ApiAttributeError
class WorkerClusterChangeRequest(ModelNormal): class WorkerTagChangeRequest(ModelNormal):
"""NOTE: This class is auto generated by OpenAPI Generator. """NOTE: This class is auto generated by OpenAPI Generator.
Ref: https://openapi-generator.tech Ref: https://openapi-generator.tech
@ -81,7 +81,7 @@ class WorkerClusterChangeRequest(ModelNormal):
and the value is attribute type. and the value is attribute type.
""" """
return { return {
'cluster_ids': ([str],), # noqa: E501 'tag_ids': ([str],), # noqa: E501
} }
@cached_property @cached_property
@ -90,7 +90,7 @@ class WorkerClusterChangeRequest(ModelNormal):
attribute_map = { attribute_map = {
'cluster_ids': 'cluster_ids', # noqa: E501 'tag_ids': 'tag_ids', # noqa: E501
} }
read_only_vars = { read_only_vars = {
@ -100,11 +100,11 @@ class WorkerClusterChangeRequest(ModelNormal):
@classmethod @classmethod
@convert_js_args_to_python_args @convert_js_args_to_python_args
def _from_openapi_data(cls, cluster_ids, *args, **kwargs): # noqa: E501 def _from_openapi_data(cls, tag_ids, *args, **kwargs): # noqa: E501
"""WorkerClusterChangeRequest - a model defined in OpenAPI """WorkerTagChangeRequest - a model defined in OpenAPI
Args: Args:
cluster_ids ([str]): tag_ids ([str]):
Keyword Args: Keyword Args:
_check_type (bool): if True, values for parameters in openapi_types _check_type (bool): if True, values for parameters in openapi_types
@ -164,7 +164,7 @@ class WorkerClusterChangeRequest(ModelNormal):
self._configuration = _configuration self._configuration = _configuration
self._visited_composed_classes = _visited_composed_classes + (self.__class__,) self._visited_composed_classes = _visited_composed_classes + (self.__class__,)
self.cluster_ids = cluster_ids self.tag_ids = tag_ids
for var_name, var_value in kwargs.items(): for var_name, var_value in kwargs.items():
if var_name not in self.attribute_map and \ if var_name not in self.attribute_map and \
self._configuration is not None and \ self._configuration is not None and \
@ -185,11 +185,11 @@ class WorkerClusterChangeRequest(ModelNormal):
]) ])
@convert_js_args_to_python_args @convert_js_args_to_python_args
def __init__(self, cluster_ids, *args, **kwargs): # noqa: E501 def __init__(self, tag_ids, *args, **kwargs): # noqa: E501
"""WorkerClusterChangeRequest - a model defined in OpenAPI """WorkerTagChangeRequest - a model defined in OpenAPI
Args: Args:
cluster_ids ([str]): tag_ids ([str]):
Keyword Args: Keyword Args:
_check_type (bool): if True, values for parameters in openapi_types _check_type (bool): if True, values for parameters in openapi_types
@ -247,7 +247,7 @@ class WorkerClusterChangeRequest(ModelNormal):
self._configuration = _configuration self._configuration = _configuration
self._visited_composed_classes = _visited_composed_classes + (self.__class__,) self._visited_composed_classes = _visited_composed_classes + (self.__class__,)
self.cluster_ids = cluster_ids self.tag_ids = tag_ids
for var_name, var_value in kwargs.items(): for var_name, var_value in kwargs.items():
if var_name not in self.attribute_map and \ if var_name not in self.attribute_map and \
self._configuration is not None and \ self._configuration is not None and \

View File

@ -30,11 +30,11 @@ from flamenco.manager.exceptions import ApiAttributeError
def lazy_import(): def lazy_import():
from flamenco.manager.model.worker_cluster import WorkerCluster from flamenco.manager.model.worker_tag import WorkerTag
globals()['WorkerCluster'] = WorkerCluster globals()['WorkerTag'] = WorkerTag
class WorkerClusterList(ModelNormal): class WorkerTagList(ModelNormal):
"""NOTE: This class is auto generated by OpenAPI Generator. """NOTE: This class is auto generated by OpenAPI Generator.
Ref: https://openapi-generator.tech Ref: https://openapi-generator.tech
@ -87,7 +87,7 @@ class WorkerClusterList(ModelNormal):
""" """
lazy_import() lazy_import()
return { return {
'clusters': ([WorkerCluster],), # noqa: E501 'tags': ([WorkerTag],), # noqa: E501
} }
@cached_property @cached_property
@ -96,7 +96,7 @@ class WorkerClusterList(ModelNormal):
attribute_map = { attribute_map = {
'clusters': 'clusters', # noqa: E501 'tags': 'tags', # noqa: E501
} }
read_only_vars = { read_only_vars = {
@ -107,7 +107,7 @@ class WorkerClusterList(ModelNormal):
@classmethod @classmethod
@convert_js_args_to_python_args @convert_js_args_to_python_args
def _from_openapi_data(cls, *args, **kwargs): # noqa: E501 def _from_openapi_data(cls, *args, **kwargs): # noqa: E501
"""WorkerClusterList - a model defined in OpenAPI """WorkerTagList - a model defined in OpenAPI
Keyword Args: Keyword Args:
_check_type (bool): if True, values for parameters in openapi_types _check_type (bool): if True, values for parameters in openapi_types
@ -140,7 +140,7 @@ class WorkerClusterList(ModelNormal):
Animal class but this time we won't travel Animal class but this time we won't travel
through its discriminator because we passed in through its discriminator because we passed in
_visited_composed_classes = (Animal,) _visited_composed_classes = (Animal,)
clusters ([WorkerCluster]): [optional] # noqa: E501 tags ([WorkerTag]): [optional] # noqa: E501
""" """
_check_type = kwargs.pop('_check_type', True) _check_type = kwargs.pop('_check_type', True)
@ -189,7 +189,7 @@ class WorkerClusterList(ModelNormal):
@convert_js_args_to_python_args @convert_js_args_to_python_args
def __init__(self, *args, **kwargs): # noqa: E501 def __init__(self, *args, **kwargs): # noqa: E501
"""WorkerClusterList - a model defined in OpenAPI """WorkerTagList - a model defined in OpenAPI
Keyword Args: Keyword Args:
_check_type (bool): if True, values for parameters in openapi_types _check_type (bool): if True, values for parameters in openapi_types
@ -222,7 +222,7 @@ class WorkerClusterList(ModelNormal):
Animal class but this time we won't travel Animal class but this time we won't travel
through its discriminator because we passed in through its discriminator because we passed in
_visited_composed_classes = (Animal,) _visited_composed_classes = (Animal,)
clusters ([WorkerCluster]): [optional] # noqa: E501 tags ([WorkerTag]): [optional] # noqa: E501
""" """
_check_type = kwargs.pop('_check_type', True) _check_type = kwargs.pop('_check_type', True)

View File

@ -74,9 +74,6 @@ from flamenco.manager.model.task_update import TaskUpdate
from flamenco.manager.model.task_worker import TaskWorker from flamenco.manager.model.task_worker import TaskWorker
from flamenco.manager.model.worker import Worker from flamenco.manager.model.worker import Worker
from flamenco.manager.model.worker_all_of import WorkerAllOf from flamenco.manager.model.worker_all_of import WorkerAllOf
from flamenco.manager.model.worker_cluster import WorkerCluster
from flamenco.manager.model.worker_cluster_change_request import WorkerClusterChangeRequest
from flamenco.manager.model.worker_cluster_list import WorkerClusterList
from flamenco.manager.model.worker_list import WorkerList from flamenco.manager.model.worker_list import WorkerList
from flamenco.manager.model.worker_registration import WorkerRegistration from flamenco.manager.model.worker_registration import WorkerRegistration
from flamenco.manager.model.worker_sign_on import WorkerSignOn from flamenco.manager.model.worker_sign_on import WorkerSignOn
@ -86,5 +83,8 @@ from flamenco.manager.model.worker_state_changed import WorkerStateChanged
from flamenco.manager.model.worker_status import WorkerStatus from flamenco.manager.model.worker_status import WorkerStatus
from flamenco.manager.model.worker_status_change_request import WorkerStatusChangeRequest from flamenco.manager.model.worker_status_change_request import WorkerStatusChangeRequest
from flamenco.manager.model.worker_summary import WorkerSummary from flamenco.manager.model.worker_summary import WorkerSummary
from flamenco.manager.model.worker_tag import WorkerTag
from flamenco.manager.model.worker_tag_change_request import WorkerTagChangeRequest
from flamenco.manager.model.worker_tag_list import WorkerTagList
from flamenco.manager.model.worker_task import WorkerTask from flamenco.manager.model.worker_task import WorkerTask
from flamenco.manager.model.worker_task_all_of import WorkerTaskAllOf from flamenco.manager.model.worker_task_all_of import WorkerTaskAllOf

View File

@ -116,18 +116,18 @@ Class | Method | HTTP request | Description
*WorkerApi* | [**task_update**](flamenco/manager/docs/WorkerApi.md#task_update) | **POST** /api/v3/worker/task/{task_id} | Update the task, typically to indicate progress, completion, or failure. *WorkerApi* | [**task_update**](flamenco/manager/docs/WorkerApi.md#task_update) | **POST** /api/v3/worker/task/{task_id} | Update the task, typically to indicate progress, completion, or failure.
*WorkerApi* | [**worker_state**](flamenco/manager/docs/WorkerApi.md#worker_state) | **GET** /api/v3/worker/state | *WorkerApi* | [**worker_state**](flamenco/manager/docs/WorkerApi.md#worker_state) | **GET** /api/v3/worker/state |
*WorkerApi* | [**worker_state_changed**](flamenco/manager/docs/WorkerApi.md#worker_state_changed) | **POST** /api/v3/worker/state-changed | Worker changed state. This could be as acknowledgement of a Manager-requested state change, or in response to worker-local signals. *WorkerApi* | [**worker_state_changed**](flamenco/manager/docs/WorkerApi.md#worker_state_changed) | **POST** /api/v3/worker/state-changed | Worker changed state. This could be as acknowledgement of a Manager-requested state change, or in response to worker-local signals.
*WorkerMgtApi* | [**create_worker_cluster**](flamenco/manager/docs/WorkerMgtApi.md#create_worker_cluster) | **POST** /api/v3/worker-mgt/clusters | Create a new worker cluster. *WorkerMgtApi* | [**create_worker_tag**](flamenco/manager/docs/WorkerMgtApi.md#create_worker_tag) | **POST** /api/v3/worker-mgt/tags | Create a new worker tag.
*WorkerMgtApi* | [**delete_worker**](flamenco/manager/docs/WorkerMgtApi.md#delete_worker) | **DELETE** /api/v3/worker-mgt/workers/{worker_id} | Remove the given worker. It is recommended to only call this function when the worker is in `offline` state. If the worker is still running, stop it first. Any task still assigned to the worker will be requeued. *WorkerMgtApi* | [**delete_worker**](flamenco/manager/docs/WorkerMgtApi.md#delete_worker) | **DELETE** /api/v3/worker-mgt/workers/{worker_id} | Remove the given worker. It is recommended to only call this function when the worker is in `offline` state. If the worker is still running, stop it first. Any task still assigned to the worker will be requeued.
*WorkerMgtApi* | [**delete_worker_cluster**](flamenco/manager/docs/WorkerMgtApi.md#delete_worker_cluster) | **DELETE** /api/v3/worker-mgt/cluster/{cluster_id} | Remove this worker cluster. This unassigns all workers from the cluster and removes it. *WorkerMgtApi* | [**delete_worker_tag**](flamenco/manager/docs/WorkerMgtApi.md#delete_worker_tag) | **DELETE** /api/v3/worker-mgt/tag/{tag_id} | Remove this worker tag. This unassigns all workers from the tag and removes it.
*WorkerMgtApi* | [**fetch_worker**](flamenco/manager/docs/WorkerMgtApi.md#fetch_worker) | **GET** /api/v3/worker-mgt/workers/{worker_id} | Fetch info about the worker. *WorkerMgtApi* | [**fetch_worker**](flamenco/manager/docs/WorkerMgtApi.md#fetch_worker) | **GET** /api/v3/worker-mgt/workers/{worker_id} | Fetch info about the worker.
*WorkerMgtApi* | [**fetch_worker_cluster**](flamenco/manager/docs/WorkerMgtApi.md#fetch_worker_cluster) | **GET** /api/v3/worker-mgt/cluster/{cluster_id} | Get a single worker cluster.
*WorkerMgtApi* | [**fetch_worker_clusters**](flamenco/manager/docs/WorkerMgtApi.md#fetch_worker_clusters) | **GET** /api/v3/worker-mgt/clusters | Get list of worker clusters.
*WorkerMgtApi* | [**fetch_worker_sleep_schedule**](flamenco/manager/docs/WorkerMgtApi.md#fetch_worker_sleep_schedule) | **GET** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule | *WorkerMgtApi* | [**fetch_worker_sleep_schedule**](flamenco/manager/docs/WorkerMgtApi.md#fetch_worker_sleep_schedule) | **GET** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule |
*WorkerMgtApi* | [**fetch_worker_tag**](flamenco/manager/docs/WorkerMgtApi.md#fetch_worker_tag) | **GET** /api/v3/worker-mgt/tag/{tag_id} | Get a single worker tag.
*WorkerMgtApi* | [**fetch_worker_tags**](flamenco/manager/docs/WorkerMgtApi.md#fetch_worker_tags) | **GET** /api/v3/worker-mgt/tags | Get list of worker tags.
*WorkerMgtApi* | [**fetch_workers**](flamenco/manager/docs/WorkerMgtApi.md#fetch_workers) | **GET** /api/v3/worker-mgt/workers | Get list of workers. *WorkerMgtApi* | [**fetch_workers**](flamenco/manager/docs/WorkerMgtApi.md#fetch_workers) | **GET** /api/v3/worker-mgt/workers | Get list of workers.
*WorkerMgtApi* | [**request_worker_status_change**](flamenco/manager/docs/WorkerMgtApi.md#request_worker_status_change) | **POST** /api/v3/worker-mgt/workers/{worker_id}/setstatus | *WorkerMgtApi* | [**request_worker_status_change**](flamenco/manager/docs/WorkerMgtApi.md#request_worker_status_change) | **POST** /api/v3/worker-mgt/workers/{worker_id}/setstatus |
*WorkerMgtApi* | [**set_worker_clusters**](flamenco/manager/docs/WorkerMgtApi.md#set_worker_clusters) | **POST** /api/v3/worker-mgt/workers/{worker_id}/setclusters |
*WorkerMgtApi* | [**set_worker_sleep_schedule**](flamenco/manager/docs/WorkerMgtApi.md#set_worker_sleep_schedule) | **POST** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule | *WorkerMgtApi* | [**set_worker_sleep_schedule**](flamenco/manager/docs/WorkerMgtApi.md#set_worker_sleep_schedule) | **POST** /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule |
*WorkerMgtApi* | [**update_worker_cluster**](flamenco/manager/docs/WorkerMgtApi.md#update_worker_cluster) | **PUT** /api/v3/worker-mgt/cluster/{cluster_id} | Update an existing worker cluster. *WorkerMgtApi* | [**set_worker_tags**](flamenco/manager/docs/WorkerMgtApi.md#set_worker_tags) | **POST** /api/v3/worker-mgt/workers/{worker_id}/settags |
*WorkerMgtApi* | [**update_worker_tag**](flamenco/manager/docs/WorkerMgtApi.md#update_worker_tag) | **PUT** /api/v3/worker-mgt/tag/{tag_id} | Update an existing worker tag.
## Documentation For Models ## Documentation For Models
@ -197,9 +197,6 @@ Class | Method | HTTP request | Description
- [TaskWorker](flamenco/manager/docs/TaskWorker.md) - [TaskWorker](flamenco/manager/docs/TaskWorker.md)
- [Worker](flamenco/manager/docs/Worker.md) - [Worker](flamenco/manager/docs/Worker.md)
- [WorkerAllOf](flamenco/manager/docs/WorkerAllOf.md) - [WorkerAllOf](flamenco/manager/docs/WorkerAllOf.md)
- [WorkerCluster](flamenco/manager/docs/WorkerCluster.md)
- [WorkerClusterChangeRequest](flamenco/manager/docs/WorkerClusterChangeRequest.md)
- [WorkerClusterList](flamenco/manager/docs/WorkerClusterList.md)
- [WorkerList](flamenco/manager/docs/WorkerList.md) - [WorkerList](flamenco/manager/docs/WorkerList.md)
- [WorkerRegistration](flamenco/manager/docs/WorkerRegistration.md) - [WorkerRegistration](flamenco/manager/docs/WorkerRegistration.md)
- [WorkerSignOn](flamenco/manager/docs/WorkerSignOn.md) - [WorkerSignOn](flamenco/manager/docs/WorkerSignOn.md)
@ -209,6 +206,9 @@ Class | Method | HTTP request | Description
- [WorkerStatus](flamenco/manager/docs/WorkerStatus.md) - [WorkerStatus](flamenco/manager/docs/WorkerStatus.md)
- [WorkerStatusChangeRequest](flamenco/manager/docs/WorkerStatusChangeRequest.md) - [WorkerStatusChangeRequest](flamenco/manager/docs/WorkerStatusChangeRequest.md)
- [WorkerSummary](flamenco/manager/docs/WorkerSummary.md) - [WorkerSummary](flamenco/manager/docs/WorkerSummary.md)
- [WorkerTag](flamenco/manager/docs/WorkerTag.md)
- [WorkerTagChangeRequest](flamenco/manager/docs/WorkerTagChangeRequest.md)
- [WorkerTagList](flamenco/manager/docs/WorkerTagList.md)
- [WorkerTask](flamenco/manager/docs/WorkerTask.md) - [WorkerTask](flamenco/manager/docs/WorkerTask.md)
- [WorkerTaskAllOf](flamenco/manager/docs/WorkerTaskAllOf.md) - [WorkerTaskAllOf](flamenco/manager/docs/WorkerTaskAllOf.md)

View File

@ -10,7 +10,7 @@ from urllib3.exceptions import HTTPError, MaxRetryError
import bpy import bpy
from . import job_types, job_submission, preferences, worker_clusters from . import job_types, job_submission, preferences, worker_tags
from .job_types_propgroup import JobTypePropertyGroup from .job_types_propgroup import JobTypePropertyGroup
from .bat.submodules import bpathlib from .bat.submodules import bpathlib
@ -83,10 +83,10 @@ class FLAMENCO_OT_fetch_job_types(FlamencoOpMixin, bpy.types.Operator):
return {"FINISHED"} return {"FINISHED"}
class FLAMENCO_OT_fetch_worker_clusters(FlamencoOpMixin, bpy.types.Operator): class FLAMENCO_OT_fetch_worker_tags(FlamencoOpMixin, bpy.types.Operator):
bl_idname = "flamenco.fetch_worker_clusters" bl_idname = "flamenco.fetch_worker_tags"
bl_label = "Fetch Worker Clusters" bl_label = "Fetch Worker Tags"
bl_description = "Query Flamenco Manager to obtain the available worker clusters" bl_description = "Query Flamenco Manager to obtain the available worker tags"
def execute(self, context: bpy.types.Context) -> set[str]: def execute(self, context: bpy.types.Context) -> set[str]:
api_client = self.get_api_client(context) api_client = self.get_api_client(context)
@ -94,10 +94,10 @@ class FLAMENCO_OT_fetch_worker_clusters(FlamencoOpMixin, bpy.types.Operator):
from flamenco.manager import ApiException from flamenco.manager import ApiException
scene = context.scene scene = context.scene
old_cluster = getattr(scene, "flamenco_worker_cluster", "") old_tag = getattr(scene, "flamenco_worker_tag", "")
try: try:
worker_clusters.refresh(context, api_client) worker_tags.refresh(context, api_client)
except ApiException as ex: except ApiException as ex:
self.report({"ERROR"}, "Error getting job types: %s" % ex) self.report({"ERROR"}, "Error getting job types: %s" % ex)
return {"CANCELLED"} return {"CANCELLED"}
@ -107,9 +107,9 @@ class FLAMENCO_OT_fetch_worker_clusters(FlamencoOpMixin, bpy.types.Operator):
self.report({"ERROR"}, "Unable to reach Manager") self.report({"ERROR"}, "Unable to reach Manager")
return {"CANCELLED"} return {"CANCELLED"}
if old_cluster: if old_tag:
# TODO: handle cases where the old cluster no longer exists. # TODO: handle cases where the old tag no longer exists.
scene.flamenco_worker_cluster = old_cluster scene.flamenco_worker_tag = old_tag
return {"FINISHED"} return {"FINISHED"}
@ -669,7 +669,7 @@ class FLAMENCO3_OT_explore_file_path(bpy.types.Operator):
classes = ( classes = (
FLAMENCO_OT_fetch_job_types, FLAMENCO_OT_fetch_job_types,
FLAMENCO_OT_fetch_worker_clusters, FLAMENCO_OT_fetch_worker_tags,
FLAMENCO_OT_ping_manager, FLAMENCO_OT_ping_manager,
FLAMENCO_OT_eval_setting, FLAMENCO_OT_eval_setting,
FLAMENCO_OT_submit_job, FLAMENCO_OT_submit_job,

View File

@ -43,7 +43,7 @@ _project_finder_enum_items = [
] ]
class WorkerCluster(bpy.types.PropertyGroup): class WorkerTag(bpy.types.PropertyGroup):
id: bpy.props.StringProperty(name="id") # type: ignore id: bpy.props.StringProperty(name="id") # type: ignore
name: bpy.props.StringProperty(name="Name") # type: ignore name: bpy.props.StringProperty(name="Name") # type: ignore
description: bpy.props.StringProperty(name="Description") # type: ignore description: bpy.props.StringProperty(name="Description") # type: ignore
@ -93,10 +93,10 @@ class FlamencoPreferences(bpy.types.AddonPreferences):
get=lambda prefs: prefs.job_storage, get=lambda prefs: prefs.job_storage,
) )
worker_clusters: bpy.props.CollectionProperty( # type: ignore worker_tags: bpy.props.CollectionProperty( # type: ignore
type=WorkerCluster, type=WorkerTag,
name="Worker Clusters", name="Worker Tags",
description="Cache for the worker clusters available on the configured Manager", description="Cache for the worker tags available on the configured Manager",
options={"HIDDEN"}, options={"HIDDEN"},
) )
@ -169,7 +169,7 @@ def manager_url(context: bpy.types.Context) -> str:
classes = ( classes = (
WorkerCluster, WorkerTag,
FlamencoPreferences, FlamencoPreferences,
) )
_register, _unregister = bpy.utils.register_classes_factory(classes) _register, _unregister = bpy.utils.register_classes_factory(classes)

View File

@ -16,25 +16,25 @@ _enum_items: list[Union[tuple[str, str, str], tuple[str, str, str, int, int]]] =
def refresh(context: bpy.types.Context, api_client: _ApiClient) -> None: def refresh(context: bpy.types.Context, api_client: _ApiClient) -> None:
"""Fetch the available worker clusters from the Manager.""" """Fetch the available worker tags from the Manager."""
from flamenco.manager import ApiClient from flamenco.manager import ApiClient
from flamenco.manager.api import worker_mgt_api from flamenco.manager.api import worker_mgt_api
from flamenco.manager.model.worker_cluster_list import WorkerClusterList from flamenco.manager.model.worker_tag_list import WorkerTagList
assert isinstance(api_client, ApiClient) assert isinstance(api_client, ApiClient)
api = worker_mgt_api.WorkerMgtApi(api_client) api = worker_mgt_api.WorkerMgtApi(api_client)
response: WorkerClusterList = api.fetch_worker_clusters() response: WorkerTagList = api.fetch_worker_tags()
# Store on the preferences, so a cached version persists until the next refresh. # Store on the preferences, so a cached version persists until the next refresh.
prefs = preferences.get(context) prefs = preferences.get(context)
prefs.worker_clusters.clear() prefs.worker_tags.clear()
for cluster in response.clusters: for tag in response.tags:
rna_cluster = prefs.worker_clusters.add() rna_tag = prefs.worker_tags.add()
rna_cluster.id = cluster.id rna_tag.id = tag.id
rna_cluster.name = cluster.name rna_tag.name = tag.name
rna_cluster.description = getattr(cluster, "description", "") rna_tag.description = getattr(tag, "description", "")
# Preferences have changed, so make sure that Blender saves them (assuming # Preferences have changed, so make sure that Blender saves them (assuming
# auto-save here). # auto-save here).
@ -46,25 +46,25 @@ def _get_enum_items(self, context):
prefs = preferences.get(context) prefs = preferences.get(context)
_enum_items = [ _enum_items = [
("-", "All", "No specific cluster assigned, any worker can handle this job"), ("-", "All", "No specific tag assigned, any worker can handle this job"),
] ]
_enum_items.extend( _enum_items.extend(
(cluster.id, cluster.name, cluster.description) (tag.id, tag.name, tag.description)
for cluster in prefs.worker_clusters for tag in prefs.worker_tags
) )
return _enum_items return _enum_items
def register() -> None: def register() -> None:
bpy.types.Scene.flamenco_worker_cluster = bpy.props.EnumProperty( bpy.types.Scene.flamenco_worker_tag = bpy.props.EnumProperty(
name="Worker Cluster", name="Worker Tag",
items=_get_enum_items, items=_get_enum_items,
description="The set of Workers that can handle tasks of this job", description="The set of Workers that can handle tasks of this job",
) )
def unregister() -> None: def unregister() -> None:
to_del = ((bpy.types.Scene, "flamenco_worker_cluster"),) to_del = ((bpy.types.Scene, "flamenco_worker_tag"),)
for ob, attr in to_del: for ob, attr in to_del:
try: try:
delattr(ob, attr) delattr(ob, attr)

View File

@ -65,13 +65,13 @@ type PersistenceService interface {
RemoveFromJobBlocklist(ctx context.Context, jobUUID, workerUUID, taskType string) error RemoveFromJobBlocklist(ctx context.Context, jobUUID, workerUUID, taskType string) error
ClearJobBlocklist(ctx context.Context, job *persistence.Job) error ClearJobBlocklist(ctx context.Context, job *persistence.Job) error
// Worker cluster management. // Worker tag management.
WorkerSetClusters(ctx context.Context, worker *persistence.Worker, clusterUUIDs []string) error WorkerSetTags(ctx context.Context, worker *persistence.Worker, tagUUIDs []string) error
CreateWorkerCluster(ctx context.Context, cluster *persistence.WorkerCluster) error CreateWorkerTag(ctx context.Context, tag *persistence.WorkerTag) error
FetchWorkerCluster(ctx context.Context, uuid string) (*persistence.WorkerCluster, error) FetchWorkerTag(ctx context.Context, uuid string) (*persistence.WorkerTag, error)
FetchWorkerClusters(ctx context.Context) ([]*persistence.WorkerCluster, error) FetchWorkerTags(ctx context.Context) ([]*persistence.WorkerTag, error)
DeleteWorkerCluster(ctx context.Context, uuid string) error DeleteWorkerTag(ctx context.Context, uuid string) error
SaveWorkerCluster(ctx context.Context, cluster *persistence.WorkerCluster) error SaveWorkerTag(ctx context.Context, tag *persistence.WorkerTag) error
// WorkersLeftToRun returns a set of worker UUIDs that can run tasks of the given type on the given job. // WorkersLeftToRun returns a set of worker UUIDs that can run tasks of the given type on the given job.
WorkersLeftToRun(ctx context.Context, job *persistence.Job, taskType string) (map[string]bool, error) WorkersLeftToRun(ctx context.Context, job *persistence.Job, taskType string) (map[string]bool, error)

View File

@ -618,8 +618,8 @@ func jobDBtoAPI(dbJob *persistence.Job) api.Job {
if dbJob.DeleteRequestedAt.Valid { if dbJob.DeleteRequestedAt.Valid {
apiJob.DeleteRequestedAt = &dbJob.DeleteRequestedAt.Time apiJob.DeleteRequestedAt = &dbJob.DeleteRequestedAt.Time
} }
if dbJob.WorkerCluster != nil { if dbJob.WorkerTag != nil {
apiJob.WorkerCluster = &dbJob.WorkerCluster.UUID apiJob.WorkerTag = &dbJob.WorkerTag.UUID
} }
return apiJob return apiJob

View File

@ -320,19 +320,19 @@ func TestSubmitJobWithShamanCheckoutID(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
} }
func TestSubmitJobWithWorkerCluster(t *testing.T) { func TestSubmitJobWithWorkerTag(t *testing.T) {
mockCtrl := gomock.NewController(t) mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish() defer mockCtrl.Finish()
mf := newMockedFlamenco(mockCtrl) mf := newMockedFlamenco(mockCtrl)
worker := testWorker() worker := testWorker()
workerClusterUUID := "04435762-9dc8-4f13-80b7-643a6fa5b6fd" workerTagUUID := "04435762-9dc8-4f13-80b7-643a6fa5b6fd"
cluster := persistence.WorkerCluster{ tag := persistence.WorkerTag{
Model: persistence.Model{ID: 47}, Model: persistence.Model{ID: 47},
UUID: workerClusterUUID, UUID: workerTagUUID,
Name: "first cluster", Name: "first tag",
Description: "my first cluster", Description: "my first tag",
} }
submittedJob := api.SubmittedJob{ submittedJob := api.SubmittedJob{
@ -340,7 +340,7 @@ func TestSubmitJobWithWorkerCluster(t *testing.T) {
Type: "test", Type: "test",
Priority: 50, Priority: 50,
SubmitterPlatform: worker.Platform, SubmitterPlatform: worker.Platform,
WorkerCluster: &workerClusterUUID, WorkerTag: &workerTagUUID,
} }
mf.expectConvertTwoWayVariables(t, mf.expectConvertTwoWayVariables(t,
@ -351,8 +351,8 @@ func TestSubmitJobWithWorkerCluster(t *testing.T) {
// Expect the job compiler to be called. // Expect the job compiler to be called.
authoredJob := job_compilers.AuthoredJob{ authoredJob := job_compilers.AuthoredJob{
JobID: "afc47568-bd9d-4368-8016-e91d945db36d", JobID: "afc47568-bd9d-4368-8016-e91d945db36d",
WorkerClusterUUID: workerClusterUUID, WorkerTagUUID: workerTagUUID,
Name: submittedJob.Name, Name: submittedJob.Name,
JobType: submittedJob.Type, JobType: submittedJob.Type,
@ -382,8 +382,8 @@ func TestSubmitJobWithWorkerCluster(t *testing.T) {
Settings: persistence.StringInterfaceMap{}, Settings: persistence.StringInterfaceMap{},
Metadata: persistence.StringStringMap{}, Metadata: persistence.StringStringMap{},
WorkerClusterID: &cluster.ID, WorkerTagID: &tag.ID,
WorkerCluster: &cluster, WorkerTag: &tag,
} }
mf.persistence.EXPECT().FetchJob(gomock.Any(), queuedJob.JobID).Return(&dbJob, nil) mf.persistence.EXPECT().FetchJob(gomock.Any(), queuedJob.JobID).Return(&dbJob, nil)

View File

@ -141,18 +141,18 @@ func (mr *MockPersistenceServiceMockRecorder) CreateWorker(arg0, arg1 interface{
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateWorker", reflect.TypeOf((*MockPersistenceService)(nil).CreateWorker), arg0, arg1) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateWorker", reflect.TypeOf((*MockPersistenceService)(nil).CreateWorker), arg0, arg1)
} }
// CreateWorkerCluster mocks base method. // CreateWorkerTag mocks base method.
func (m *MockPersistenceService) CreateWorkerCluster(arg0 context.Context, arg1 *persistence.WorkerCluster) error { func (m *MockPersistenceService) CreateWorkerTag(arg0 context.Context, arg1 *persistence.WorkerTag) error {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "CreateWorkerCluster", arg0, arg1) ret := m.ctrl.Call(m, "CreateWorkerTag", arg0, arg1)
ret0, _ := ret[0].(error) ret0, _ := ret[0].(error)
return ret0 return ret0
} }
// CreateWorkerCluster indicates an expected call of CreateWorkerCluster. // CreateWorkerTag indicates an expected call of CreateWorkerTag.
func (mr *MockPersistenceServiceMockRecorder) CreateWorkerCluster(arg0, arg1 interface{}) *gomock.Call { func (mr *MockPersistenceServiceMockRecorder) CreateWorkerTag(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateWorkerCluster", reflect.TypeOf((*MockPersistenceService)(nil).CreateWorkerCluster), arg0, arg1) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateWorkerTag", reflect.TypeOf((*MockPersistenceService)(nil).CreateWorkerTag), arg0, arg1)
} }
// DeleteWorker mocks base method. // DeleteWorker mocks base method.
@ -169,18 +169,18 @@ func (mr *MockPersistenceServiceMockRecorder) DeleteWorker(arg0, arg1 interface{
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteWorker", reflect.TypeOf((*MockPersistenceService)(nil).DeleteWorker), arg0, arg1) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteWorker", reflect.TypeOf((*MockPersistenceService)(nil).DeleteWorker), arg0, arg1)
} }
// DeleteWorkerCluster mocks base method. // DeleteWorkerTag mocks base method.
func (m *MockPersistenceService) DeleteWorkerCluster(arg0 context.Context, arg1 string) error { func (m *MockPersistenceService) DeleteWorkerTag(arg0 context.Context, arg1 string) error {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "DeleteWorkerCluster", arg0, arg1) ret := m.ctrl.Call(m, "DeleteWorkerTag", arg0, arg1)
ret0, _ := ret[0].(error) ret0, _ := ret[0].(error)
return ret0 return ret0
} }
// DeleteWorkerCluster indicates an expected call of DeleteWorkerCluster. // DeleteWorkerTag indicates an expected call of DeleteWorkerTag.
func (mr *MockPersistenceServiceMockRecorder) DeleteWorkerCluster(arg0, arg1 interface{}) *gomock.Call { func (mr *MockPersistenceServiceMockRecorder) DeleteWorkerTag(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteWorkerCluster", reflect.TypeOf((*MockPersistenceService)(nil).DeleteWorkerCluster), arg0, arg1) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteWorkerTag", reflect.TypeOf((*MockPersistenceService)(nil).DeleteWorkerTag), arg0, arg1)
} }
// FetchJob mocks base method. // FetchJob mocks base method.
@ -258,34 +258,34 @@ func (mr *MockPersistenceServiceMockRecorder) FetchWorker(arg0, arg1 interface{}
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWorker", reflect.TypeOf((*MockPersistenceService)(nil).FetchWorker), arg0, arg1) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWorker", reflect.TypeOf((*MockPersistenceService)(nil).FetchWorker), arg0, arg1)
} }
// FetchWorkerCluster mocks base method. // FetchWorkerTag mocks base method.
func (m *MockPersistenceService) FetchWorkerCluster(arg0 context.Context, arg1 string) (*persistence.WorkerCluster, error) { func (m *MockPersistenceService) FetchWorkerTag(arg0 context.Context, arg1 string) (*persistence.WorkerTag, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "FetchWorkerCluster", arg0, arg1) ret := m.ctrl.Call(m, "FetchWorkerTag", arg0, arg1)
ret0, _ := ret[0].(*persistence.WorkerCluster) ret0, _ := ret[0].(*persistence.WorkerTag)
ret1, _ := ret[1].(error) ret1, _ := ret[1].(error)
return ret0, ret1 return ret0, ret1
} }
// FetchWorkerCluster indicates an expected call of FetchWorkerCluster. // FetchWorkerTag indicates an expected call of FetchWorkerTag.
func (mr *MockPersistenceServiceMockRecorder) FetchWorkerCluster(arg0, arg1 interface{}) *gomock.Call { func (mr *MockPersistenceServiceMockRecorder) FetchWorkerTag(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWorkerCluster", reflect.TypeOf((*MockPersistenceService)(nil).FetchWorkerCluster), arg0, arg1) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWorkerTag", reflect.TypeOf((*MockPersistenceService)(nil).FetchWorkerTag), arg0, arg1)
} }
// FetchWorkerClusters mocks base method. // FetchWorkerTags mocks base method.
func (m *MockPersistenceService) FetchWorkerClusters(arg0 context.Context) ([]*persistence.WorkerCluster, error) { func (m *MockPersistenceService) FetchWorkerTags(arg0 context.Context) ([]*persistence.WorkerTag, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "FetchWorkerClusters", arg0) ret := m.ctrl.Call(m, "FetchWorkerTags", arg0)
ret0, _ := ret[0].([]*persistence.WorkerCluster) ret0, _ := ret[0].([]*persistence.WorkerTag)
ret1, _ := ret[1].(error) ret1, _ := ret[1].(error)
return ret0, ret1 return ret0, ret1
} }
// FetchWorkerClusters indicates an expected call of FetchWorkerClusters. // FetchWorkerTags indicates an expected call of FetchWorkerTags.
func (mr *MockPersistenceServiceMockRecorder) FetchWorkerClusters(arg0 interface{}) *gomock.Call { func (mr *MockPersistenceServiceMockRecorder) FetchWorkerTags(arg0 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWorkerClusters", reflect.TypeOf((*MockPersistenceService)(nil).FetchWorkerClusters), arg0) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWorkerTags", reflect.TypeOf((*MockPersistenceService)(nil).FetchWorkerTags), arg0)
} }
// FetchWorkerTask mocks base method. // FetchWorkerTask mocks base method.
@ -433,20 +433,6 @@ func (mr *MockPersistenceServiceMockRecorder) SaveWorker(arg0, arg1 interface{})
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SaveWorker", reflect.TypeOf((*MockPersistenceService)(nil).SaveWorker), arg0, arg1) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SaveWorker", reflect.TypeOf((*MockPersistenceService)(nil).SaveWorker), arg0, arg1)
} }
// SaveWorkerCluster mocks base method.
func (m *MockPersistenceService) SaveWorkerCluster(arg0 context.Context, arg1 *persistence.WorkerCluster) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "SaveWorkerCluster", arg0, arg1)
ret0, _ := ret[0].(error)
return ret0
}
// SaveWorkerCluster indicates an expected call of SaveWorkerCluster.
func (mr *MockPersistenceServiceMockRecorder) SaveWorkerCluster(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SaveWorkerCluster", reflect.TypeOf((*MockPersistenceService)(nil).SaveWorkerCluster), arg0, arg1)
}
// SaveWorkerStatus mocks base method. // SaveWorkerStatus mocks base method.
func (m *MockPersistenceService) SaveWorkerStatus(arg0 context.Context, arg1 *persistence.Worker) error { func (m *MockPersistenceService) SaveWorkerStatus(arg0 context.Context, arg1 *persistence.Worker) error {
m.ctrl.T.Helper() m.ctrl.T.Helper()
@ -461,6 +447,20 @@ func (mr *MockPersistenceServiceMockRecorder) SaveWorkerStatus(arg0, arg1 interf
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SaveWorkerStatus", reflect.TypeOf((*MockPersistenceService)(nil).SaveWorkerStatus), arg0, arg1) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SaveWorkerStatus", reflect.TypeOf((*MockPersistenceService)(nil).SaveWorkerStatus), arg0, arg1)
} }
// SaveWorkerTag mocks base method.
func (m *MockPersistenceService) SaveWorkerTag(arg0 context.Context, arg1 *persistence.WorkerTag) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "SaveWorkerTag", arg0, arg1)
ret0, _ := ret[0].(error)
return ret0
}
// SaveWorkerTag indicates an expected call of SaveWorkerTag.
func (mr *MockPersistenceServiceMockRecorder) SaveWorkerTag(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SaveWorkerTag", reflect.TypeOf((*MockPersistenceService)(nil).SaveWorkerTag), arg0, arg1)
}
// ScheduleTask mocks base method. // ScheduleTask mocks base method.
func (m *MockPersistenceService) ScheduleTask(arg0 context.Context, arg1 *persistence.Worker) (*persistence.Task, error) { func (m *MockPersistenceService) ScheduleTask(arg0 context.Context, arg1 *persistence.Worker) (*persistence.Task, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
@ -532,18 +532,18 @@ func (mr *MockPersistenceServiceMockRecorder) WorkerSeen(arg0, arg1 interface{})
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WorkerSeen", reflect.TypeOf((*MockPersistenceService)(nil).WorkerSeen), arg0, arg1) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WorkerSeen", reflect.TypeOf((*MockPersistenceService)(nil).WorkerSeen), arg0, arg1)
} }
// WorkerSetClusters mocks base method. // WorkerSetTags mocks base method.
func (m *MockPersistenceService) WorkerSetClusters(arg0 context.Context, arg1 *persistence.Worker, arg2 []string) error { func (m *MockPersistenceService) WorkerSetTags(arg0 context.Context, arg1 *persistence.Worker, arg2 []string) error {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "WorkerSetClusters", arg0, arg1, arg2) ret := m.ctrl.Call(m, "WorkerSetTags", arg0, arg1, arg2)
ret0, _ := ret[0].(error) ret0, _ := ret[0].(error)
return ret0 return ret0
} }
// WorkerSetClusters indicates an expected call of WorkerSetClusters. // WorkerSetTags indicates an expected call of WorkerSetTags.
func (mr *MockPersistenceServiceMockRecorder) WorkerSetClusters(arg0, arg1, arg2 interface{}) *gomock.Call { func (mr *MockPersistenceServiceMockRecorder) WorkerSetTags(arg0, arg1, arg2 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WorkerSetClusters", reflect.TypeOf((*MockPersistenceService)(nil).WorkerSetClusters), arg0, arg1, arg2) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WorkerSetTags", reflect.TypeOf((*MockPersistenceService)(nil).WorkerSetTags), arg0, arg1, arg2)
} }
// WorkersLeftToRun mocks base method. // WorkersLeftToRun mocks base method.

View File

@ -182,7 +182,7 @@ func (f *Flamenco) RequestWorkerStatusChange(e echo.Context, workerUUID string)
return e.NoContent(http.StatusNoContent) return e.NoContent(http.StatusNoContent)
} }
func (f *Flamenco) SetWorkerClusters(e echo.Context, workerUUID string) error { func (f *Flamenco) SetWorkerTags(e echo.Context, workerUUID string) error {
ctx := e.Request().Context() ctx := e.Request().Context()
logger := requestLogger(e) logger := requestLogger(e)
logger = logger.With().Str("worker", workerUUID).Logger() logger = logger.With().Str("worker", workerUUID).Logger()
@ -192,7 +192,7 @@ func (f *Flamenco) SetWorkerClusters(e echo.Context, workerUUID string) error {
} }
// Decode the request body. // Decode the request body.
var change api.WorkerClusterChangeRequest var change api.WorkerTagChangeRequest
if err := e.Bind(&change); err != nil { if err := e.Bind(&change); err != nil {
logger.Warn().Err(err).Msg("bad request received") logger.Warn().Err(err).Msg("bad request received")
return sendAPIError(e, http.StatusBadRequest, "invalid format") return sendAPIError(e, http.StatusBadRequest, "invalid format")
@ -210,13 +210,13 @@ func (f *Flamenco) SetWorkerClusters(e echo.Context, workerUUID string) error {
} }
logger = logger.With(). logger = logger.With().
Strs("clusters", change.ClusterIds). Strs("tags", change.TagIds).
Logger() Logger()
logger.Info().Msg("worker cluster change requested") logger.Info().Msg("worker tag change requested")
// Store the new cluster assignment. // Store the new tag assignment.
if err := f.persist.WorkerSetClusters(ctx, dbWorker, change.ClusterIds); err != nil { if err := f.persist.WorkerSetTags(ctx, dbWorker, change.TagIds); err != nil {
logger.Error().Err(err).Msg("saving worker after cluster change request") logger.Error().Err(err).Msg("saving worker after tag change request")
return sendAPIError(e, http.StatusInternalServerError, "error saving worker: %v", err) return sendAPIError(e, http.StatusInternalServerError, "error saving worker: %v", err)
} }
@ -227,155 +227,155 @@ func (f *Flamenco) SetWorkerClusters(e echo.Context, workerUUID string) error {
return e.NoContent(http.StatusNoContent) return e.NoContent(http.StatusNoContent)
} }
func (f *Flamenco) DeleteWorkerCluster(e echo.Context, clusterUUID string) error { func (f *Flamenco) DeleteWorkerTag(e echo.Context, tagUUID string) error {
ctx := e.Request().Context() ctx := e.Request().Context()
logger := requestLogger(e) logger := requestLogger(e)
logger = logger.With().Str("cluster", clusterUUID).Logger() logger = logger.With().Str("tag", tagUUID).Logger()
if !uuid.IsValid(clusterUUID) { if !uuid.IsValid(tagUUID) {
return sendAPIError(e, http.StatusBadRequest, "not a valid UUID") return sendAPIError(e, http.StatusBadRequest, "not a valid UUID")
} }
err := f.persist.DeleteWorkerCluster(ctx, clusterUUID) err := f.persist.DeleteWorkerTag(ctx, tagUUID)
switch { switch {
case errors.Is(err, persistence.ErrWorkerClusterNotFound): case errors.Is(err, persistence.ErrWorkerTagNotFound):
logger.Debug().Msg("non-existent worker cluster requested") logger.Debug().Msg("non-existent worker tag requested")
return sendAPIError(e, http.StatusNotFound, "worker cluster %q not found", clusterUUID) return sendAPIError(e, http.StatusNotFound, "worker tag %q not found", tagUUID)
case err != nil: case err != nil:
logger.Error().Err(err).Msg("deleting worker cluster") logger.Error().Err(err).Msg("deleting worker tag")
return sendAPIError(e, http.StatusInternalServerError, "error deleting worker cluster: %v", err) return sendAPIError(e, http.StatusInternalServerError, "error deleting worker tag: %v", err)
} }
// TODO: SocketIO broadcast of cluster deletion. // TODO: SocketIO broadcast of tag deletion.
logger.Info().Msg("worker cluster deleted") logger.Info().Msg("worker tag deleted")
return e.NoContent(http.StatusNoContent) return e.NoContent(http.StatusNoContent)
} }
func (f *Flamenco) FetchWorkerCluster(e echo.Context, clusterUUID string) error { func (f *Flamenco) FetchWorkerTag(e echo.Context, tagUUID string) error {
ctx := e.Request().Context() ctx := e.Request().Context()
logger := requestLogger(e) logger := requestLogger(e)
logger = logger.With().Str("cluster", clusterUUID).Logger() logger = logger.With().Str("tag", tagUUID).Logger()
if !uuid.IsValid(clusterUUID) { if !uuid.IsValid(tagUUID) {
return sendAPIError(e, http.StatusBadRequest, "not a valid UUID") return sendAPIError(e, http.StatusBadRequest, "not a valid UUID")
} }
cluster, err := f.persist.FetchWorkerCluster(ctx, clusterUUID) tag, err := f.persist.FetchWorkerTag(ctx, tagUUID)
switch { switch {
case errors.Is(err, persistence.ErrWorkerClusterNotFound): case errors.Is(err, persistence.ErrWorkerTagNotFound):
logger.Debug().Msg("non-existent worker cluster requested") logger.Debug().Msg("non-existent worker tag requested")
return sendAPIError(e, http.StatusNotFound, "worker cluster %q not found", clusterUUID) return sendAPIError(e, http.StatusNotFound, "worker tag %q not found", tagUUID)
case err != nil: case err != nil:
logger.Error().Err(err).Msg("fetching worker cluster") logger.Error().Err(err).Msg("fetching worker tag")
return sendAPIError(e, http.StatusInternalServerError, "error fetching worker cluster: %v", err) return sendAPIError(e, http.StatusInternalServerError, "error fetching worker tag: %v", err)
} }
return e.JSON(http.StatusOK, workerClusterDBtoAPI(*cluster)) return e.JSON(http.StatusOK, workerTagDBtoAPI(*tag))
} }
func (f *Flamenco) UpdateWorkerCluster(e echo.Context, clusterUUID string) error { func (f *Flamenco) UpdateWorkerTag(e echo.Context, tagUUID string) error {
ctx := e.Request().Context() ctx := e.Request().Context()
logger := requestLogger(e) logger := requestLogger(e)
logger = logger.With().Str("cluster", clusterUUID).Logger() logger = logger.With().Str("tag", tagUUID).Logger()
if !uuid.IsValid(clusterUUID) { if !uuid.IsValid(tagUUID) {
return sendAPIError(e, http.StatusBadRequest, "not a valid UUID") return sendAPIError(e, http.StatusBadRequest, "not a valid UUID")
} }
// Decode the request body. // Decode the request body.
var update api.UpdateWorkerClusterJSONBody var update api.UpdateWorkerTagJSONBody
if err := e.Bind(&update); err != nil { if err := e.Bind(&update); err != nil {
logger.Warn().Err(err).Msg("bad request received") logger.Warn().Err(err).Msg("bad request received")
return sendAPIError(e, http.StatusBadRequest, "invalid format") return sendAPIError(e, http.StatusBadRequest, "invalid format")
} }
dbCluster, err := f.persist.FetchWorkerCluster(ctx, clusterUUID) dbTag, err := f.persist.FetchWorkerTag(ctx, tagUUID)
switch { switch {
case errors.Is(err, persistence.ErrWorkerClusterNotFound): case errors.Is(err, persistence.ErrWorkerTagNotFound):
logger.Debug().Msg("non-existent worker cluster requested") logger.Debug().Msg("non-existent worker tag requested")
return sendAPIError(e, http.StatusNotFound, "worker cluster %q not found", clusterUUID) return sendAPIError(e, http.StatusNotFound, "worker tag %q not found", tagUUID)
case err != nil: case err != nil:
logger.Error().Err(err).Msg("fetching worker cluster") logger.Error().Err(err).Msg("fetching worker tag")
return sendAPIError(e, http.StatusInternalServerError, "error fetching worker cluster: %v", err) return sendAPIError(e, http.StatusInternalServerError, "error fetching worker tag: %v", err)
} }
// Update the cluster. // Update the tag.
dbCluster.Name = update.Name dbTag.Name = update.Name
if update.Description == nil { if update.Description == nil {
dbCluster.Description = "" dbTag.Description = ""
} else { } else {
dbCluster.Description = *update.Description dbTag.Description = *update.Description
} }
if err := f.persist.SaveWorkerCluster(ctx, dbCluster); err != nil { if err := f.persist.SaveWorkerTag(ctx, dbTag); err != nil {
logger.Error().Err(err).Msg("saving worker cluster") logger.Error().Err(err).Msg("saving worker tag")
return sendAPIError(e, http.StatusInternalServerError, "error saving worker cluster") return sendAPIError(e, http.StatusInternalServerError, "error saving worker tag")
} }
// TODO: SocketIO broadcast of cluster update. // TODO: SocketIO broadcast of tag update.
return e.NoContent(http.StatusNoContent) return e.NoContent(http.StatusNoContent)
} }
func (f *Flamenco) FetchWorkerClusters(e echo.Context) error { func (f *Flamenco) FetchWorkerTags(e echo.Context) error {
ctx := e.Request().Context() ctx := e.Request().Context()
logger := requestLogger(e) logger := requestLogger(e)
dbClusters, err := f.persist.FetchWorkerClusters(ctx) dbTags, err := f.persist.FetchWorkerTags(ctx)
if err != nil { if err != nil {
logger.Error().Err(err).Msg("fetching worker clusters") logger.Error().Err(err).Msg("fetching worker tags")
return sendAPIError(e, http.StatusInternalServerError, "error saving worker cluster") return sendAPIError(e, http.StatusInternalServerError, "error saving worker tag")
} }
apiClusters := []api.WorkerCluster{} apiTags := []api.WorkerTag{}
for _, dbCluster := range dbClusters { for _, dbTag := range dbTags {
apiCluster := workerClusterDBtoAPI(*dbCluster) apiTag := workerTagDBtoAPI(*dbTag)
apiClusters = append(apiClusters, apiCluster) apiTags = append(apiTags, apiTag)
} }
clusterList := api.WorkerClusterList{ tagList := api.WorkerTagList{
Clusters: &apiClusters, Tags: &apiTags,
} }
return e.JSON(http.StatusOK, &clusterList) return e.JSON(http.StatusOK, &tagList)
} }
func (f *Flamenco) CreateWorkerCluster(e echo.Context) error { func (f *Flamenco) CreateWorkerTag(e echo.Context) error {
ctx := e.Request().Context() ctx := e.Request().Context()
logger := requestLogger(e) logger := requestLogger(e)
// Decode the request body. // Decode the request body.
var apiCluster api.CreateWorkerClusterJSONBody var apiTag api.CreateWorkerTagJSONBody
if err := e.Bind(&apiCluster); err != nil { if err := e.Bind(&apiTag); err != nil {
logger.Warn().Err(err).Msg("bad request received") logger.Warn().Err(err).Msg("bad request received")
return sendAPIError(e, http.StatusBadRequest, "invalid format") return sendAPIError(e, http.StatusBadRequest, "invalid format")
} }
// Convert to persistence layer model. // Convert to persistence layer model.
var clusterUUID string var tagUUID string
if apiCluster.Id != nil && *apiCluster.Id != "" { if apiTag.Id != nil && *apiTag.Id != "" {
clusterUUID = *apiCluster.Id tagUUID = *apiTag.Id
} else { } else {
clusterUUID = uuid.New() tagUUID = uuid.New()
} }
dbCluster := persistence.WorkerCluster{ dbTag := persistence.WorkerTag{
UUID: clusterUUID, UUID: tagUUID,
Name: apiCluster.Name, Name: apiTag.Name,
} }
if apiCluster.Description != nil { if apiTag.Description != nil {
dbCluster.Description = *apiCluster.Description dbTag.Description = *apiTag.Description
} }
// Store in the database. // Store in the database.
if err := f.persist.CreateWorkerCluster(ctx, &dbCluster); err != nil { if err := f.persist.CreateWorkerTag(ctx, &dbTag); err != nil {
logger.Error().Err(err).Msg("creating worker cluster") logger.Error().Err(err).Msg("creating worker tag")
return sendAPIError(e, http.StatusInternalServerError, "error creating worker cluster") return sendAPIError(e, http.StatusInternalServerError, "error creating worker tag")
} }
// TODO: SocketIO broadcast of cluster creation. // TODO: SocketIO broadcast of tag creation.
return e.JSON(http.StatusOK, workerClusterDBtoAPI(dbCluster)) return e.JSON(http.StatusOK, workerTagDBtoAPI(dbTag))
} }
func workerSummary(w persistence.Worker) api.WorkerSummary { func workerSummary(w persistence.Worker) api.WorkerSummary {
@ -407,26 +407,26 @@ func workerDBtoAPI(w persistence.Worker) api.Worker {
SupportedTaskTypes: w.TaskTypes(), SupportedTaskTypes: w.TaskTypes(),
} }
if len(w.Clusters) > 0 { if len(w.Tags) > 0 {
clusters := []api.WorkerCluster{} tags := []api.WorkerTag{}
for i := range w.Clusters { for i := range w.Tags {
clusters = append(clusters, workerClusterDBtoAPI(*w.Clusters[i])) tags = append(tags, workerTagDBtoAPI(*w.Tags[i]))
} }
apiWorker.Clusters = &clusters apiWorker.Tags = &tags
} }
return apiWorker return apiWorker
} }
func workerClusterDBtoAPI(wc persistence.WorkerCluster) api.WorkerCluster { func workerTagDBtoAPI(wc persistence.WorkerTag) api.WorkerTag {
uuid := wc.UUID // Take a copy for safety. uuid := wc.UUID // Take a copy for safety.
apiCluster := api.WorkerCluster{ apiTag := api.WorkerTag{
Id: &uuid, Id: &uuid,
Name: wc.Name, Name: wc.Name,
} }
if len(wc.Description) > 0 { if len(wc.Description) > 0 {
apiCluster.Description = &wc.Description apiTag.Description = &wc.Description
} }
return apiCluster return apiTag
} }

View File

@ -262,58 +262,58 @@ func TestRequestWorkerStatusChangeRevert(t *testing.T) {
assertResponseNoContent(t, echo) assertResponseNoContent(t, echo)
} }
func TestWorkerClusterCRUDHappyFlow(t *testing.T) { func TestWorkerTagCRUDHappyFlow(t *testing.T) {
mockCtrl := gomock.NewController(t) mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish() defer mockCtrl.Finish()
mf := newMockedFlamenco(mockCtrl) mf := newMockedFlamenco(mockCtrl)
// Create a cluster. // Create a tag.
UUID := "18d9234e-5135-458f-a1ba-a350c3d4e837" UUID := "18d9234e-5135-458f-a1ba-a350c3d4e837"
apiCluster := api.WorkerCluster{ apiTag := api.WorkerTag{
Id: &UUID, Id: &UUID,
Name: "ʻO nā manu ʻino", Name: "ʻO nā manu ʻino",
Description: ptr("Ke aloha"), Description: ptr("Ke aloha"),
} }
expectDBCluster := persistence.WorkerCluster{ expectDBTag := persistence.WorkerTag{
UUID: UUID, UUID: UUID,
Name: apiCluster.Name, Name: apiTag.Name,
Description: *apiCluster.Description, Description: *apiTag.Description,
} }
mf.persistence.EXPECT().CreateWorkerCluster(gomock.Any(), &expectDBCluster) mf.persistence.EXPECT().CreateWorkerTag(gomock.Any(), &expectDBTag)
// TODO: expect SocketIO broadcast of the cluster creation. // TODO: expect SocketIO broadcast of the tag creation.
echo := mf.prepareMockedJSONRequest(apiCluster) echo := mf.prepareMockedJSONRequest(apiTag)
require.NoError(t, mf.flamenco.CreateWorkerCluster(echo)) require.NoError(t, mf.flamenco.CreateWorkerTag(echo))
assertResponseJSON(t, echo, http.StatusOK, &apiCluster) assertResponseJSON(t, echo, http.StatusOK, &apiTag)
// Fetch the cluster // Fetch the tag
mf.persistence.EXPECT().FetchWorkerCluster(gomock.Any(), UUID).Return(&expectDBCluster, nil) mf.persistence.EXPECT().FetchWorkerTag(gomock.Any(), UUID).Return(&expectDBTag, nil)
echo = mf.prepareMockedRequest(nil) echo = mf.prepareMockedRequest(nil)
require.NoError(t, mf.flamenco.FetchWorkerCluster(echo, UUID)) require.NoError(t, mf.flamenco.FetchWorkerTag(echo, UUID))
assertResponseJSON(t, echo, http.StatusOK, &apiCluster) assertResponseJSON(t, echo, http.StatusOK, &apiTag)
// Update & save. // Update & save.
newUUID := "60442762-83d3-4fc3-bf75-6ab5799cdbaa" newUUID := "60442762-83d3-4fc3-bf75-6ab5799cdbaa"
newAPICluster := api.WorkerCluster{ newAPITag := api.WorkerTag{
Id: &newUUID, // Intentionally change the UUID. This should just be ignored. Id: &newUUID, // Intentionally change the UUID. This should just be ignored.
Name: "updated name", Name: "updated name",
} }
expectNewDBCluster := persistence.WorkerCluster{ expectNewDBTag := persistence.WorkerTag{
UUID: UUID, UUID: UUID,
Name: newAPICluster.Name, Name: newAPITag.Name,
Description: "", Description: "",
} }
// TODO: expect SocketIO broadcast of the cluster update. // TODO: expect SocketIO broadcast of the tag update.
mf.persistence.EXPECT().FetchWorkerCluster(gomock.Any(), UUID).Return(&expectDBCluster, nil) mf.persistence.EXPECT().FetchWorkerTag(gomock.Any(), UUID).Return(&expectDBTag, nil)
mf.persistence.EXPECT().SaveWorkerCluster(gomock.Any(), &expectNewDBCluster) mf.persistence.EXPECT().SaveWorkerTag(gomock.Any(), &expectNewDBTag)
echo = mf.prepareMockedJSONRequest(newAPICluster) echo = mf.prepareMockedJSONRequest(newAPITag)
require.NoError(t, mf.flamenco.UpdateWorkerCluster(echo, UUID)) require.NoError(t, mf.flamenco.UpdateWorkerTag(echo, UUID))
assertResponseNoContent(t, echo) assertResponseNoContent(t, echo)
// Delete. // Delete.
mf.persistence.EXPECT().DeleteWorkerCluster(gomock.Any(), UUID) mf.persistence.EXPECT().DeleteWorkerTag(gomock.Any(), UUID)
// TODO: expect SocketIO broadcast of the cluster deletion. // TODO: expect SocketIO broadcast of the tag deletion.
echo = mf.prepareMockedJSONRequest(newAPICluster) echo = mf.prepareMockedJSONRequest(newAPITag)
require.NoError(t, mf.flamenco.DeleteWorkerCluster(echo, UUID)) require.NoError(t, mf.flamenco.DeleteWorkerTag(echo, UUID))
assertResponseNoContent(t, echo) assertResponseNoContent(t, echo)
} }

View File

@ -20,8 +20,8 @@ type Author struct {
} }
type AuthoredJob struct { type AuthoredJob struct {
JobID string JobID string
WorkerClusterUUID string WorkerTagUUID string
Name string Name string
JobType string JobType string

View File

@ -127,8 +127,8 @@ func (s *Service) Compile(ctx context.Context, sj api.SubmittedJob) (*AuthoredJo
aj.Storage.ShamanCheckoutID = *sj.Storage.ShamanCheckoutId aj.Storage.ShamanCheckoutID = *sj.Storage.ShamanCheckoutId
} }
if sj.WorkerCluster != nil { if sj.WorkerTag != nil {
aj.WorkerClusterUUID = *sj.WorkerCluster aj.WorkerTagUUID = *sj.WorkerTag
} }
compiler, err := vm.getCompileJob() compiler, err := vm.getCompileJob()

View File

@ -45,12 +45,12 @@ func exampleSubmittedJob() api.SubmittedJob {
"user.name": "Sybren Stüvel", "user.name": "Sybren Stüvel",
}} }}
sj := api.SubmittedJob{ sj := api.SubmittedJob{
Name: "3Д рендеринг", Name: "3Д рендеринг",
Priority: 50, Priority: 50,
Type: "simple-blender-render", Type: "simple-blender-render",
Settings: &settings, Settings: &settings,
Metadata: &metadata, Metadata: &metadata,
WorkerCluster: ptr("acce9983-e663-4210-b3cc-f7bfa629cb21"), WorkerTag: ptr("acce9983-e663-4210-b3cc-f7bfa629cb21"),
} }
return sj return sj
} }
@ -80,7 +80,7 @@ func TestSimpleBlenderRenderHappy(t *testing.T) {
// Properties should be copied as-is. // Properties should be copied as-is.
assert.Equal(t, sj.Name, aj.Name) assert.Equal(t, sj.Name, aj.Name)
assert.Equal(t, *sj.WorkerCluster, aj.WorkerClusterUUID) assert.Equal(t, *sj.WorkerTag, aj.WorkerTagUUID)
assert.Equal(t, sj.Type, aj.JobType) assert.Equal(t, sj.Type, aj.JobType)
assert.Equal(t, sj.Priority, aj.Priority) assert.Equal(t, sj.Priority, aj.Priority)
assert.EqualValues(t, sj.Settings.AdditionalProperties, aj.Settings) assert.EqualValues(t, sj.Settings.AdditionalProperties, aj.Settings)
@ -139,7 +139,7 @@ func TestSimpleBlenderRenderHappy(t *testing.T) {
assert.Equal(t, expectDeps, tVideo.Dependencies) assert.Equal(t, expectDeps, tVideo.Dependencies)
} }
func TestJobWithoutCluster(t *testing.T) { func TestJobWithoutTag(t *testing.T) {
c := mockedClock(t) c := mockedClock(t)
s, err := Load(c) s, err := Load(c)
@ -151,20 +151,20 @@ func TestJobWithoutCluster(t *testing.T) {
sj := exampleSubmittedJob() sj := exampleSubmittedJob()
// Try with nil WorkerCluster. // Try with nil WorkerTag.
{ {
sj.WorkerCluster = nil sj.WorkerTag = nil
aj, err := s.Compile(ctx, sj) aj, err := s.Compile(ctx, sj)
require.NoError(t, err) require.NoError(t, err)
assert.Zero(t, aj.WorkerClusterUUID) assert.Zero(t, aj.WorkerTagUUID)
} }
// Try with empty WorkerCluster. // Try with empty WorkerTag.
{ {
sj.WorkerCluster = ptr("") sj.WorkerTag = ptr("")
aj, err := s.Compile(ctx, sj) aj, err := s.Compile(ctx, sj)
require.NoError(t, err) require.NoError(t, err)
assert.Zero(t, aj.WorkerClusterUUID) assert.Zero(t, aj.WorkerTagUUID)
} }
} }

View File

@ -16,7 +16,7 @@ func (db *DB) migrate() error {
&Task{}, &Task{},
&TaskFailure{}, &TaskFailure{},
&Worker{}, &Worker{},
&WorkerCluster{}, &WorkerTag{},
) )
if err != nil { if err != nil {
return fmt.Errorf("failed to automigrate database: %v", err) return fmt.Errorf("failed to automigrate database: %v", err)

View File

@ -9,10 +9,10 @@ import (
) )
var ( var (
ErrJobNotFound = PersistenceError{Message: "job not found", Err: gorm.ErrRecordNotFound} ErrJobNotFound = PersistenceError{Message: "job not found", Err: gorm.ErrRecordNotFound}
ErrTaskNotFound = PersistenceError{Message: "task not found", Err: gorm.ErrRecordNotFound} ErrTaskNotFound = PersistenceError{Message: "task not found", Err: gorm.ErrRecordNotFound}
ErrWorkerNotFound = PersistenceError{Message: "worker not found", Err: gorm.ErrRecordNotFound} ErrWorkerNotFound = PersistenceError{Message: "worker not found", Err: gorm.ErrRecordNotFound}
ErrWorkerClusterNotFound = PersistenceError{Message: "worker cluster not found", Err: gorm.ErrRecordNotFound} ErrWorkerTagNotFound = PersistenceError{Message: "worker tag not found", Err: gorm.ErrRecordNotFound}
) )
type PersistenceError struct { type PersistenceError struct {
@ -40,8 +40,8 @@ func workerError(errorToWrap error, message string, msgArgs ...interface{}) erro
return wrapError(translateGormWorkerError(errorToWrap), message, msgArgs...) return wrapError(translateGormWorkerError(errorToWrap), message, msgArgs...)
} }
func workerClusterError(errorToWrap error, message string, msgArgs ...interface{}) error { func workerTagError(errorToWrap error, message string, msgArgs ...interface{}) error {
return wrapError(translateGormWorkerClusterError(errorToWrap), message, msgArgs...) return wrapError(translateGormWorkerTagError(errorToWrap), message, msgArgs...)
} }
func wrapError(errorToWrap error, message string, format ...interface{}) error { func wrapError(errorToWrap error, message string, format ...interface{}) error {
@ -86,11 +86,11 @@ func translateGormWorkerError(gormError error) error {
return gormError return gormError
} }
// translateGormWorkerClusterError translates a Gorm error to a persistence layer error. // translateGormWorkerTagError translates a Gorm error to a persistence layer error.
// This helps to keep Gorm as "implementation detail" of the persistence layer. // This helps to keep Gorm as "implementation detail" of the persistence layer.
func translateGormWorkerClusterError(gormError error) error { func translateGormWorkerTagError(gormError error) error {
if errors.Is(gormError, gorm.ErrRecordNotFound) { if errors.Is(gormError, gorm.ErrRecordNotFound) {
return ErrWorkerClusterNotFound return ErrWorkerTagNotFound
} }
return gormError return gormError
} }

View File

@ -36,8 +36,8 @@ type Job struct {
Storage JobStorageInfo `gorm:"embedded;embeddedPrefix:storage_"` Storage JobStorageInfo `gorm:"embedded;embeddedPrefix:storage_"`
WorkerClusterID *uint WorkerTagID *uint
WorkerCluster *WorkerCluster `gorm:"foreignkey:WorkerClusterID;references:ID;constraint:OnDelete:SET NULL"` WorkerTag *WorkerTag `gorm:"foreignkey:WorkerTagID;references:ID;constraint:OnDelete:SET NULL"`
} }
type StringInterfaceMap map[string]interface{} type StringInterfaceMap map[string]interface{}
@ -148,14 +148,14 @@ func (db *DB) StoreAuthoredJob(ctx context.Context, authoredJob job_compilers.Au
}, },
} }
// Find and assign the worker cluster. // Find and assign the worker tag.
if authoredJob.WorkerClusterUUID != "" { if authoredJob.WorkerTagUUID != "" {
dbCluster, err := fetchWorkerCluster(tx, authoredJob.WorkerClusterUUID) dbTag, err := fetchWorkerTag(tx, authoredJob.WorkerTagUUID)
if err != nil { if err != nil {
return err return err
} }
dbJob.WorkerClusterID = &dbCluster.ID dbJob.WorkerTagID = &dbTag.ID
dbJob.WorkerCluster = dbCluster dbJob.WorkerTag = dbTag
} }
if err := tx.Create(&dbJob).Error; err != nil { if err := tx.Create(&dbJob).Error; err != nil {
@ -233,7 +233,7 @@ func (db *DB) FetchJob(ctx context.Context, jobUUID string) (*Job, error) {
dbJob := Job{} dbJob := Job{}
findResult := db.gormDB.WithContext(ctx). findResult := db.gormDB.WithContext(ctx).
Limit(1). Limit(1).
Preload("WorkerCluster"). Preload("WorkerTag").
Find(&dbJob, "uuid = ?", jobUUID) Find(&dbJob, "uuid = ?", jobUUID)
if findResult.Error != nil { if findResult.Error != nil {
return nil, jobError(findResult.Error, "fetching job") return nil, jobError(findResult.Error, "fetching job")

View File

@ -108,16 +108,16 @@ func (db *DB) WorkersLeftToRun(ctx context.Context, job *Job, taskType string) (
Select("uuid"). Select("uuid").
Where("id not in (?)", blockedWorkers) Where("id not in (?)", blockedWorkers)
if job.WorkerClusterID == nil { if job.WorkerTagID == nil {
// Count all workers, so no extra restrictions are necessary. // Count all workers, so no extra restrictions are necessary.
} else { } else {
// Only count workers in the job's cluster. // Only count workers in the job's tag.
jobCluster := db.gormDB. jobTag := db.gormDB.
Table("worker_cluster_membership"). Table("worker_tag_membership").
Select("worker_id"). Select("worker_id").
Where("worker_cluster_id = ?", *job.WorkerClusterID) Where("worker_tag_id = ?", *job.WorkerTagID)
query = query. query = query.
Where("id in (?)", jobCluster) Where("id in (?)", jobTag)
} }
// Find the workers NOT blocked. // Find the workers NOT blocked.

View File

@ -126,14 +126,14 @@ func TestWorkersLeftToRun(t *testing.T) {
worker1 := createWorker(ctx, t, db) worker1 := createWorker(ctx, t, db)
worker2 := createWorkerFrom(ctx, t, db, *worker1) worker2 := createWorkerFrom(ctx, t, db, *worker1)
// Create one worker cluster. It will not be used by this job, but one of the // Create one worker tag. It will not be used by this job, but one of the
// workers will be assigned to it. It can get this job's tasks, though. // workers will be assigned to it. It can get this job's tasks, though.
// Because the job is clusterless, it can be run by all. // Because the job is tagless, it can be run by all.
cluster1 := WorkerCluster{UUID: "11157623-4b14-4801-bee2-271dddab6309", Name: "Cluster 1"} tag1 := WorkerTag{UUID: "11157623-4b14-4801-bee2-271dddab6309", Name: "Tag 1"}
require.NoError(t, db.CreateWorkerCluster(ctx, &cluster1)) require.NoError(t, db.CreateWorkerTag(ctx, &tag1))
workerC1 := createWorker(ctx, t, db, func(w *Worker) { workerC1 := createWorker(ctx, t, db, func(w *Worker) {
w.UUID = "c1c1c1c1-0000-1111-2222-333333333333" w.UUID = "c1c1c1c1-0000-1111-2222-333333333333"
w.Clusters = []*WorkerCluster{&cluster1} w.Tags = []*WorkerTag{&tag1}
}) })
uuidMap := func(workers ...*Worker) map[string]bool { uuidMap := func(workers ...*Worker) map[string]bool {
@ -172,43 +172,43 @@ func TestWorkersLeftToRun(t *testing.T) {
} }
} }
func TestWorkersLeftToRunWithClusters(t *testing.T) { func TestWorkersLeftToRunWithTags(t *testing.T) {
ctx, cancel, db := persistenceTestFixtures(t, schedulerTestTimeout) ctx, cancel, db := persistenceTestFixtures(t, schedulerTestTimeout)
defer cancel() defer cancel()
// Create clusters. // Create tags.
cluster1 := WorkerCluster{UUID: "11157623-4b14-4801-bee2-271dddab6309", Name: "Cluster 1"} tag1 := WorkerTag{UUID: "11157623-4b14-4801-bee2-271dddab6309", Name: "Tag 1"}
cluster2 := WorkerCluster{UUID: "22257623-4b14-4801-bee2-271dddab6309", Name: "Cluster 2"} tag2 := WorkerTag{UUID: "22257623-4b14-4801-bee2-271dddab6309", Name: "Tag 2"}
cluster3 := WorkerCluster{UUID: "33357623-4b14-4801-bee2-271dddab6309", Name: "Cluster 3"} tag3 := WorkerTag{UUID: "33357623-4b14-4801-bee2-271dddab6309", Name: "Tag 3"}
require.NoError(t, db.CreateWorkerCluster(ctx, &cluster1)) require.NoError(t, db.CreateWorkerTag(ctx, &tag1))
require.NoError(t, db.CreateWorkerCluster(ctx, &cluster2)) require.NoError(t, db.CreateWorkerTag(ctx, &tag2))
require.NoError(t, db.CreateWorkerCluster(ctx, &cluster3)) require.NoError(t, db.CreateWorkerTag(ctx, &tag3))
// Create a job in cluster1. // Create a job in tag1.
authoredJob := createTestAuthoredJobWithTasks() authoredJob := createTestAuthoredJobWithTasks()
authoredJob.WorkerClusterUUID = cluster1.UUID authoredJob.WorkerTagUUID = tag1.UUID
job := persistAuthoredJob(t, ctx, db, authoredJob) job := persistAuthoredJob(t, ctx, db, authoredJob)
// Clusters 1 + 3 // Tags 1 + 3
workerC13 := createWorker(ctx, t, db, func(w *Worker) { workerC13 := createWorker(ctx, t, db, func(w *Worker) {
w.UUID = "c13c1313-0000-1111-2222-333333333333" w.UUID = "c13c1313-0000-1111-2222-333333333333"
w.Clusters = []*WorkerCluster{&cluster1, &cluster3} w.Tags = []*WorkerTag{&tag1, &tag3}
}) })
// Cluster 1 // Tag 1
workerC1 := createWorker(ctx, t, db, func(w *Worker) { workerC1 := createWorker(ctx, t, db, func(w *Worker) {
w.UUID = "c1c1c1c1-0000-1111-2222-333333333333" w.UUID = "c1c1c1c1-0000-1111-2222-333333333333"
w.Clusters = []*WorkerCluster{&cluster1} w.Tags = []*WorkerTag{&tag1}
}) })
// Cluster 2 worker, this one should never appear. // Tag 2 worker, this one should never appear.
createWorker(ctx, t, db, func(w *Worker) { createWorker(ctx, t, db, func(w *Worker) {
w.UUID = "c2c2c2c2-0000-1111-2222-333333333333" w.UUID = "c2c2c2c2-0000-1111-2222-333333333333"
w.Clusters = []*WorkerCluster{&cluster2} w.Tags = []*WorkerTag{&tag2}
}) })
// No clusters, so should be able to run only clusterless jobs. Which is none // No tags, so should be able to run only tagless jobs. Which is none
// in this test. // in this test.
createWorker(ctx, t, db, func(w *Worker) { createWorker(ctx, t, db, func(w *Worker) {
w.UUID = "00000000-0000-1111-2222-333333333333" w.UUID = "00000000-0000-1111-2222-333333333333"
w.Clusters = nil w.Tags = nil
}) })
uuidMap := func(workers ...*Worker) map[string]bool { uuidMap := func(workers ...*Worker) map[string]bool {
@ -219,7 +219,7 @@ func TestWorkersLeftToRunWithClusters(t *testing.T) {
return theMap return theMap
} }
// All Cluster 1 workers, no blocklist. // All Tag 1 workers, no blocklist.
left, err := db.WorkersLeftToRun(ctx, job, "blender") left, err := db.WorkersLeftToRun(ctx, job, "blender")
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, uuidMap(workerC13, workerC1), left) assert.Equal(t, uuidMap(workerC13, workerC1), left)
@ -230,7 +230,7 @@ func TestWorkersLeftToRunWithClusters(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, uuidMap(workerC13), left) assert.Equal(t, uuidMap(workerC13), left)
// All clustered workers blocked. // All taged workers blocked.
_ = db.AddWorkerToJobBlocklist(ctx, job, workerC13, "blender") _ = db.AddWorkerToJobBlocklist(ctx, job, workerC13, "blender")
left, err = db.WorkersLeftToRun(ctx, job, "blender") left, err = db.WorkersLeftToRun(ctx, job, "blender")
assert.NoError(t, err) assert.NoError(t, err)

View File

@ -64,7 +64,7 @@ func (db *DB) QueryJobs(ctx context.Context, apiQ api.JobsQuery) ([]*Job, error)
} }
} }
q.Preload("Cluster") q.Preload("Tag")
result := []*Job{} result := []*Job{}
tx := q.Scan(&result) tx := q.Scan(&result)

View File

@ -757,7 +757,7 @@ func createWorker(ctx context.Context, t *testing.T, db *DB, updaters ...func(*W
Software: "3.0", Software: "3.0",
Status: api.WorkerStatusAwake, Status: api.WorkerStatusAwake,
SupportedTaskTypes: "blender,ffmpeg,file-management", SupportedTaskTypes: "blender,ffmpeg,file-management",
Clusters: nil, Tags: nil,
} }
for _, updater := range updaters { for _, updater := range updaters {

View File

@ -26,7 +26,7 @@ func (db *DB) ScheduleTask(ctx context.Context, w *Worker) (*Task, error) {
logger := log.With().Str("worker", w.UUID).Logger() logger := log.With().Str("worker", w.UUID).Logger()
logger.Trace().Msg("finding task for worker") logger.Trace().Msg("finding task for worker")
hasWorkerClusters, err := db.HasWorkerClusters(ctx) hasWorkerTags, err := db.HasWorkerTags(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -37,7 +37,7 @@ func (db *DB) ScheduleTask(ctx context.Context, w *Worker) (*Task, error) {
var task *Task var task *Task
txErr := db.gormDB.WithContext(ctx).Transaction(func(tx *gorm.DB) error { txErr := db.gormDB.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
var err error var err error
task, err = findTaskForWorker(tx, w, hasWorkerClusters) task, err = findTaskForWorker(tx, w, hasWorkerTags)
if err != nil { if err != nil {
if isDatabaseBusyError(err) { if isDatabaseBusyError(err) {
logger.Trace().Err(err).Msg("database busy while finding task for worker") logger.Trace().Err(err).Msg("database busy while finding task for worker")
@ -84,7 +84,7 @@ func (db *DB) ScheduleTask(ctx context.Context, w *Worker) (*Task, error) {
return task, nil return task, nil
} }
func findTaskForWorker(tx *gorm.DB, w *Worker, checkWorkerClusters bool) (*Task, error) { func findTaskForWorker(tx *gorm.DB, w *Worker, checkWorkerTags bool) (*Task, error) {
task := Task{} task := Task{}
// If a task is alreay active & assigned to this worker, return just that. // If a task is alreay active & assigned to this worker, return just that.
@ -129,21 +129,21 @@ func findTaskForWorker(tx *gorm.DB, w *Worker, checkWorkerClusters bool) (*Task,
Where("TF.worker_id is NULL"). // Not failed before Where("TF.worker_id is NULL"). // Not failed before
Where("tasks.type not in (?)", blockedTaskTypesQuery) // Non-blocklisted Where("tasks.type not in (?)", blockedTaskTypesQuery) // Non-blocklisted
if checkWorkerClusters { if checkWorkerTags {
// The system has one or more clusters, so limit the available jobs to those // The system has one or more tags, so limit the available jobs to those
// that have no cluster, or overlap with the Worker's clusters. // that have no tag, or overlap with the Worker's tags.
if len(w.Clusters) == 0 { if len(w.Tags) == 0 {
// Clusterless workers only get clusterless jobs. // Tagless workers only get tagless jobs.
findTaskQuery = findTaskQuery. findTaskQuery = findTaskQuery.
Where("jobs.worker_cluster_id is NULL") Where("jobs.worker_tag_id is NULL")
} else { } else {
// Clustered workers get clusterless jobs AND jobs of their own clusters. // Taged workers get tagless jobs AND jobs of their own tags.
clusterIDs := []uint{} tagIDs := []uint{}
for _, cluster := range w.Clusters { for _, tag := range w.Tags {
clusterIDs = append(clusterIDs, cluster.ID) tagIDs = append(tagIDs, tag.ID)
} }
findTaskQuery = findTaskQuery. findTaskQuery = findTaskQuery.
Where("jobs.worker_cluster_id is NULL or worker_cluster_id in ?", clusterIDs) Where("jobs.worker_tag_id is NULL or worker_tag_id in ?", tagIDs)
} }
} }

View File

@ -291,87 +291,87 @@ func TestPreviouslyFailed(t *testing.T) {
assert.Equal(t, att2.Name, task.Name, "the second task should have been chosen") assert.Equal(t, att2.Name, task.Name, "the second task should have been chosen")
} }
func TestWorkerClusterJobWithCluster(t *testing.T) { func TestWorkerTagJobWithTag(t *testing.T) {
ctx, cancel, db := persistenceTestFixtures(t, schedulerTestTimeout) ctx, cancel, db := persistenceTestFixtures(t, schedulerTestTimeout)
defer cancel() defer cancel()
// Create worker clusters: // Create worker tags:
cluster1 := WorkerCluster{UUID: "f0157623-4b14-4801-bee2-271dddab6309", Name: "Cluster 1"} tag1 := WorkerTag{UUID: "f0157623-4b14-4801-bee2-271dddab6309", Name: "Tag 1"}
cluster2 := WorkerCluster{UUID: "2f71dba1-cf92-4752-8386-f5926affabd5", Name: "Cluster 2"} tag2 := WorkerTag{UUID: "2f71dba1-cf92-4752-8386-f5926affabd5", Name: "Tag 2"}
require.NoError(t, db.CreateWorkerCluster(ctx, &cluster1)) require.NoError(t, db.CreateWorkerTag(ctx, &tag1))
require.NoError(t, db.CreateWorkerCluster(ctx, &cluster2)) require.NoError(t, db.CreateWorkerTag(ctx, &tag2))
// Create a worker in cluster1: // Create a worker in tag1:
workerC := linuxWorker(t, db, func(w *Worker) { workerC := linuxWorker(t, db, func(w *Worker) {
w.Clusters = []*WorkerCluster{&cluster1} w.Tags = []*WorkerTag{&tag1}
}) })
// Create a worker without cluster: // Create a worker without tag:
workerNC := linuxWorker(t, db, func(w *Worker) { workerNC := linuxWorker(t, db, func(w *Worker) {
w.UUID = "c53f8f68-4149-4790-991c-ba73a326551e" w.UUID = "c53f8f68-4149-4790-991c-ba73a326551e"
w.Clusters = nil w.Tags = nil
}) })
{ // Test job with different cluster: { // Test job with different tag:
authTask := authorTestTask("the task", "blender") authTask := authorTestTask("the task", "blender")
job := authorTestJob("499cf0f8-e83d-4cb1-837a-df94789d07db", "simple-blender-render", authTask) job := authorTestJob("499cf0f8-e83d-4cb1-837a-df94789d07db", "simple-blender-render", authTask)
job.WorkerClusterUUID = cluster2.UUID job.WorkerTagUUID = tag2.UUID
constructTestJob(ctx, t, db, job) constructTestJob(ctx, t, db, job)
task, err := db.ScheduleTask(ctx, &workerC) task, err := db.ScheduleTask(ctx, &workerC)
require.NoError(t, err) require.NoError(t, err)
assert.Nil(t, task, "job with different cluster should not be scheduled") assert.Nil(t, task, "job with different tag should not be scheduled")
} }
{ // Test job with matching cluster: { // Test job with matching tag:
authTask := authorTestTask("the task", "blender") authTask := authorTestTask("the task", "blender")
job := authorTestJob("5d4c2321-0bb7-4c13-a9dd-32a2c0cd156e", "simple-blender-render", authTask) job := authorTestJob("5d4c2321-0bb7-4c13-a9dd-32a2c0cd156e", "simple-blender-render", authTask)
job.WorkerClusterUUID = cluster1.UUID job.WorkerTagUUID = tag1.UUID
constructTestJob(ctx, t, db, job) constructTestJob(ctx, t, db, job)
task, err := db.ScheduleTask(ctx, &workerC) task, err := db.ScheduleTask(ctx, &workerC)
require.NoError(t, err) require.NoError(t, err)
require.NotNil(t, task, "job with matching cluster should be scheduled") require.NotNil(t, task, "job with matching tag should be scheduled")
assert.Equal(t, authTask.UUID, task.UUID) assert.Equal(t, authTask.UUID, task.UUID)
task, err = db.ScheduleTask(ctx, &workerNC) task, err = db.ScheduleTask(ctx, &workerNC)
require.NoError(t, err) require.NoError(t, err)
assert.Nil(t, task, "job with cluster should not be scheduled for worker without cluster") assert.Nil(t, task, "job with tag should not be scheduled for worker without tag")
} }
} }
func TestWorkerClusterJobWithoutCluster(t *testing.T) { func TestWorkerTagJobWithoutTag(t *testing.T) {
ctx, cancel, db := persistenceTestFixtures(t, schedulerTestTimeout) ctx, cancel, db := persistenceTestFixtures(t, schedulerTestTimeout)
defer cancel() defer cancel()
// Create worker cluster: // Create worker tag:
cluster1 := WorkerCluster{UUID: "f0157623-4b14-4801-bee2-271dddab6309", Name: "Cluster 1"} tag1 := WorkerTag{UUID: "f0157623-4b14-4801-bee2-271dddab6309", Name: "Tag 1"}
require.NoError(t, db.CreateWorkerCluster(ctx, &cluster1)) require.NoError(t, db.CreateWorkerTag(ctx, &tag1))
// Create a worker in cluster1: // Create a worker in tag1:
workerC := linuxWorker(t, db, func(w *Worker) { workerC := linuxWorker(t, db, func(w *Worker) {
w.Clusters = []*WorkerCluster{&cluster1} w.Tags = []*WorkerTag{&tag1}
}) })
// Create a worker without cluster: // Create a worker without tag:
workerNC := linuxWorker(t, db, func(w *Worker) { workerNC := linuxWorker(t, db, func(w *Worker) {
w.UUID = "c53f8f68-4149-4790-991c-ba73a326551e" w.UUID = "c53f8f68-4149-4790-991c-ba73a326551e"
w.Clusters = nil w.Tags = nil
}) })
// Test cluster-less job: // Test tag-less job:
authTask := authorTestTask("the task", "blender") authTask := authorTestTask("the task", "blender")
job := authorTestJob("b6a1d859-122f-4791-8b78-b943329a9989", "simple-blender-render", authTask) job := authorTestJob("b6a1d859-122f-4791-8b78-b943329a9989", "simple-blender-render", authTask)
constructTestJob(ctx, t, db, job) constructTestJob(ctx, t, db, job)
task, err := db.ScheduleTask(ctx, &workerC) task, err := db.ScheduleTask(ctx, &workerC)
require.NoError(t, err) require.NoError(t, err)
require.NotNil(t, task, "job without cluster should always be scheduled to worker in some cluster") require.NotNil(t, task, "job without tag should always be scheduled to worker in some tag")
assert.Equal(t, authTask.UUID, task.UUID) assert.Equal(t, authTask.UUID, task.UUID)
task, err = db.ScheduleTask(ctx, &workerNC) task, err = db.ScheduleTask(ctx, &workerNC)
require.NoError(t, err) require.NoError(t, err)
require.NotNil(t, task, "job without cluster should always be scheduled to worker without cluster") require.NotNil(t, task, "job without tag should always be scheduled to worker without tag")
assert.Equal(t, authTask.UUID, task.UUID) assert.Equal(t, authTask.UUID, task.UUID)
} }

View File

@ -96,8 +96,8 @@ type WorkerTestFixture struct {
ctx context.Context ctx context.Context
done func() done func()
worker *Worker worker *Worker
cluster *WorkerCluster tag *WorkerTag
} }
func workerTestFixtures(t *testing.T, testContextTimeout time.Duration) WorkerTestFixture { func workerTestFixtures(t *testing.T, testContextTimeout time.Duration) WorkerTestFixture {
@ -113,21 +113,21 @@ func workerTestFixtures(t *testing.T, testContextTimeout time.Duration) WorkerTe
SupportedTaskTypes: "blender,ffmpeg,file-management", SupportedTaskTypes: "blender,ffmpeg,file-management",
} }
wc := WorkerCluster{ wc := WorkerTag{
UUID: uuid.New(), UUID: uuid.New(),
Name: "arbejdsklynge", Name: "arbejdsklynge",
Description: "Worker cluster in Danish", Description: "Worker tag in Danish",
} }
require.NoError(t, db.CreateWorker(ctx, &w)) require.NoError(t, db.CreateWorker(ctx, &w))
require.NoError(t, db.CreateWorkerCluster(ctx, &wc)) require.NoError(t, db.CreateWorkerTag(ctx, &wc))
return WorkerTestFixture{ return WorkerTestFixture{
db: db, db: db,
ctx: ctx, ctx: ctx,
done: cancel, done: cancel,
worker: &w, worker: &w,
cluster: &wc, tag: &wc,
} }
} }

View File

@ -1,112 +0,0 @@
package persistence
// SPDX-License-Identifier: GPL-3.0-or-later
import (
"context"
"fmt"
"gorm.io/gorm"
)
type WorkerCluster struct {
Model
UUID string `gorm:"type:char(36);default:'';unique;index"`
Name string `gorm:"type:varchar(64);default:'';unique"`
Description string `gorm:"type:varchar(255);default:''"`
Workers []*Worker `gorm:"many2many:worker_cluster_membership;constraint:OnDelete:CASCADE"`
}
func (db *DB) CreateWorkerCluster(ctx context.Context, wc *WorkerCluster) error {
if err := db.gormDB.WithContext(ctx).Create(wc).Error; err != nil {
return fmt.Errorf("creating new worker cluster: %w", err)
}
return nil
}
// HasWorkerClusters returns whether there are any clusters defined at all.
func (db *DB) HasWorkerClusters(ctx context.Context) (bool, error) {
var count int64
tx := db.gormDB.WithContext(ctx).
Model(&WorkerCluster{}).
Count(&count)
if err := tx.Error; err != nil {
return false, workerClusterError(err, "counting worker clusters")
}
return count > 0, nil
}
func (db *DB) FetchWorkerCluster(ctx context.Context, uuid string) (*WorkerCluster, error) {
tx := db.gormDB.WithContext(ctx)
return fetchWorkerCluster(tx, uuid)
}
// fetchWorkerCluster fetches the worker cluster using the given database instance.
func fetchWorkerCluster(gormDB *gorm.DB, uuid string) (*WorkerCluster, error) {
w := WorkerCluster{}
tx := gormDB.First(&w, "uuid = ?", uuid)
if tx.Error != nil {
return nil, workerClusterError(tx.Error, "fetching worker cluster")
}
return &w, nil
}
func (db *DB) SaveWorkerCluster(ctx context.Context, cluster *WorkerCluster) error {
if err := db.gormDB.WithContext(ctx).Save(cluster).Error; err != nil {
return workerClusterError(err, "saving worker cluster")
}
return nil
}
// DeleteWorkerCluster deletes the given cluster, after unassigning all workers from it.
func (db *DB) DeleteWorkerCluster(ctx context.Context, uuid string) error {
tx := db.gormDB.WithContext(ctx).
Where("uuid = ?", uuid).
Delete(&WorkerCluster{})
if tx.Error != nil {
return workerClusterError(tx.Error, "deleting worker cluster")
}
if tx.RowsAffected == 0 {
return ErrWorkerClusterNotFound
}
return nil
}
func (db *DB) FetchWorkerClusters(ctx context.Context) ([]*WorkerCluster, error) {
clusters := make([]*WorkerCluster, 0)
tx := db.gormDB.WithContext(ctx).Model(&WorkerCluster{}).Scan(&clusters)
if tx.Error != nil {
return nil, workerClusterError(tx.Error, "fetching all worker clusters")
}
return clusters, nil
}
func (db *DB) fetchWorkerClustersWithUUID(ctx context.Context, clusterUUIDs []string) ([]*WorkerCluster, error) {
clusters := make([]*WorkerCluster, 0)
tx := db.gormDB.WithContext(ctx).
Model(&WorkerCluster{}).
Where("uuid in ?", clusterUUIDs).
Scan(&clusters)
if tx.Error != nil {
return nil, workerClusterError(tx.Error, "fetching all worker clusters")
}
return clusters, nil
}
func (db *DB) WorkerSetClusters(ctx context.Context, worker *Worker, clusterUUIDs []string) error {
clusters, err := db.fetchWorkerClustersWithUUID(ctx, clusterUUIDs)
if err != nil {
return workerClusterError(err, "fetching worker clusters")
}
err = db.gormDB.WithContext(ctx).
Model(worker).
Association("Clusters").
Replace(clusters)
if err != nil {
return workerClusterError(err, "updating worker clusters")
}
return nil
}

View File

@ -1,165 +0,0 @@
package persistence
// SPDX-License-Identifier: GPL-3.0-or-later
import (
"testing"
"time"
"git.blender.org/flamenco/internal/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestCreateFetchCluster(t *testing.T) {
f := workerTestFixtures(t, 1*time.Second)
defer f.done()
// Test fetching non-existent cluster
fetchedCluster, err := f.db.FetchWorkerCluster(f.ctx, "7ee21bc8-ff1a-42d2-a6b6-cc4b529b189f")
assert.ErrorIs(t, err, ErrWorkerClusterNotFound)
assert.Nil(t, fetchedCluster)
// New cluster creation is already done in the workerTestFixtures() call.
assert.NotNil(t, f.cluster)
fetchedCluster, err = f.db.FetchWorkerCluster(f.ctx, f.cluster.UUID)
require.NoError(t, err)
assert.NotNil(t, fetchedCluster)
// Test contents of fetched cluster.
assert.Equal(t, f.cluster.UUID, fetchedCluster.UUID)
assert.Equal(t, f.cluster.Name, fetchedCluster.Name)
assert.Equal(t, f.cluster.Description, fetchedCluster.Description)
assert.Zero(t, fetchedCluster.Workers)
}
func TestFetchDeleteClusters(t *testing.T) {
f := workerTestFixtures(t, 1*time.Second)
defer f.done()
// Single cluster was created by fixture.
has, err := f.db.HasWorkerClusters(f.ctx)
require.NoError(t, err)
assert.True(t, has, "expecting HasWorkerClusters to return true")
secondCluster := WorkerCluster{
UUID: uuid.New(),
Name: "arbeiderscluster",
Description: "Worker cluster in Dutch",
}
require.NoError(t, f.db.CreateWorkerCluster(f.ctx, &secondCluster))
allClusters, err := f.db.FetchWorkerClusters(f.ctx)
require.NoError(t, err)
require.Len(t, allClusters, 2)
var allClusterIDs [2]string
for idx := range allClusters {
allClusterIDs[idx] = allClusters[idx].UUID
}
assert.Contains(t, allClusterIDs, f.cluster.UUID)
assert.Contains(t, allClusterIDs, secondCluster.UUID)
has, err = f.db.HasWorkerClusters(f.ctx)
require.NoError(t, err)
assert.True(t, has, "expecting HasWorkerClusters to return true")
// Test deleting the 2nd cluster.
require.NoError(t, f.db.DeleteWorkerCluster(f.ctx, secondCluster.UUID))
allClusters, err = f.db.FetchWorkerClusters(f.ctx)
require.NoError(t, err)
require.Len(t, allClusters, 1)
assert.Equal(t, f.cluster.UUID, allClusters[0].UUID)
// Test deleting the 1st cluster.
require.NoError(t, f.db.DeleteWorkerCluster(f.ctx, f.cluster.UUID))
has, err = f.db.HasWorkerClusters(f.ctx)
require.NoError(t, err)
assert.False(t, has, "expecting HasWorkerClusters to return false")
}
func TestAssignUnassignWorkerClusters(t *testing.T) {
f := workerTestFixtures(t, 1*time.Second)
defer f.done()
assertClusters := func(msgLabel string, clusterUUIDs ...string) {
w, err := f.db.FetchWorker(f.ctx, f.worker.UUID)
require.NoError(t, err)
// Catch doubly-reported clusters, as the maps below would hide those cases.
assert.Len(t, w.Clusters, len(clusterUUIDs), msgLabel)
expectClusters := make(map[string]bool)
for _, cid := range clusterUUIDs {
expectClusters[cid] = true
}
actualClusters := make(map[string]bool)
for _, c := range w.Clusters {
actualClusters[c.UUID] = true
}
assert.Equal(t, expectClusters, actualClusters, msgLabel)
}
secondCluster := WorkerCluster{
UUID: uuid.New(),
Name: "arbeiderscluster",
Description: "Worker cluster in Dutch",
}
require.NoError(t, f.db.CreateWorkerCluster(f.ctx, &secondCluster))
// By default the Worker should not be part of a cluster.
assertClusters("default cluster assignment")
require.NoError(t, f.db.WorkerSetClusters(f.ctx, f.worker, []string{f.cluster.UUID}))
assertClusters("setting one cluster", f.cluster.UUID)
// Double assignments should also just work.
require.NoError(t, f.db.WorkerSetClusters(f.ctx, f.worker, []string{f.cluster.UUID, f.cluster.UUID}))
assertClusters("setting twice the same cluster", f.cluster.UUID)
// Multiple cluster memberships.
require.NoError(t, f.db.WorkerSetClusters(f.ctx, f.worker, []string{f.cluster.UUID, secondCluster.UUID}))
assertClusters("setting two different clusters", f.cluster.UUID, secondCluster.UUID)
// Remove memberships.
require.NoError(t, f.db.WorkerSetClusters(f.ctx, f.worker, []string{secondCluster.UUID}))
assertClusters("unassigning from first cluster", secondCluster.UUID)
require.NoError(t, f.db.WorkerSetClusters(f.ctx, f.worker, []string{}))
assertClusters("unassigning from second cluster")
}
func TestSaveWorkerCluster(t *testing.T) {
f := workerTestFixtures(t, 1*time.Second)
defer f.done()
f.cluster.Name = "übercluster"
f.cluster.Description = "ʻO kēlā hui ma laila"
require.NoError(t, f.db.SaveWorkerCluster(f.ctx, f.cluster))
fetched, err := f.db.FetchWorkerCluster(f.ctx, f.cluster.UUID)
require.NoError(t, err)
assert.Equal(t, f.cluster.Name, fetched.Name)
assert.Equal(t, f.cluster.Description, fetched.Description)
}
func TestDeleteWorkerClusterWithWorkersAssigned(t *testing.T) {
f := workerTestFixtures(t, 1*time.Second)
defer f.done()
// Assign the worker.
require.NoError(t, f.db.WorkerSetClusters(f.ctx, f.worker, []string{f.cluster.UUID}))
// Delete the cluster.
require.NoError(t, f.db.DeleteWorkerCluster(f.ctx, f.cluster.UUID))
// Check the Worker has been unassigned from the cluster.
w, err := f.db.FetchWorker(f.ctx, f.worker.UUID)
require.NoError(t, err)
assert.Empty(t, w.Clusters)
}

View File

@ -0,0 +1,112 @@
package persistence
// SPDX-License-Identifier: GPL-3.0-or-later
import (
"context"
"fmt"
"gorm.io/gorm"
)
type WorkerTag struct {
Model
UUID string `gorm:"type:char(36);default:'';unique;index"`
Name string `gorm:"type:varchar(64);default:'';unique"`
Description string `gorm:"type:varchar(255);default:''"`
Workers []*Worker `gorm:"many2many:worker_tag_membership;constraint:OnDelete:CASCADE"`
}
func (db *DB) CreateWorkerTag(ctx context.Context, wc *WorkerTag) error {
if err := db.gormDB.WithContext(ctx).Create(wc).Error; err != nil {
return fmt.Errorf("creating new worker tag: %w", err)
}
return nil
}
// HasWorkerTags returns whether there are any tags defined at all.
func (db *DB) HasWorkerTags(ctx context.Context) (bool, error) {
var count int64
tx := db.gormDB.WithContext(ctx).
Model(&WorkerTag{}).
Count(&count)
if err := tx.Error; err != nil {
return false, workerTagError(err, "counting worker tags")
}
return count > 0, nil
}
func (db *DB) FetchWorkerTag(ctx context.Context, uuid string) (*WorkerTag, error) {
tx := db.gormDB.WithContext(ctx)
return fetchWorkerTag(tx, uuid)
}
// fetchWorkerTag fetches the worker tag using the given database instance.
func fetchWorkerTag(gormDB *gorm.DB, uuid string) (*WorkerTag, error) {
w := WorkerTag{}
tx := gormDB.First(&w, "uuid = ?", uuid)
if tx.Error != nil {
return nil, workerTagError(tx.Error, "fetching worker tag")
}
return &w, nil
}
func (db *DB) SaveWorkerTag(ctx context.Context, tag *WorkerTag) error {
if err := db.gormDB.WithContext(ctx).Save(tag).Error; err != nil {
return workerTagError(err, "saving worker tag")
}
return nil
}
// DeleteWorkerTag deletes the given tag, after unassigning all workers from it.
func (db *DB) DeleteWorkerTag(ctx context.Context, uuid string) error {
tx := db.gormDB.WithContext(ctx).
Where("uuid = ?", uuid).
Delete(&WorkerTag{})
if tx.Error != nil {
return workerTagError(tx.Error, "deleting worker tag")
}
if tx.RowsAffected == 0 {
return ErrWorkerTagNotFound
}
return nil
}
func (db *DB) FetchWorkerTags(ctx context.Context) ([]*WorkerTag, error) {
tags := make([]*WorkerTag, 0)
tx := db.gormDB.WithContext(ctx).Model(&WorkerTag{}).Scan(&tags)
if tx.Error != nil {
return nil, workerTagError(tx.Error, "fetching all worker tags")
}
return tags, nil
}
func (db *DB) fetchWorkerTagsWithUUID(ctx context.Context, tagUUIDs []string) ([]*WorkerTag, error) {
tags := make([]*WorkerTag, 0)
tx := db.gormDB.WithContext(ctx).
Model(&WorkerTag{}).
Where("uuid in ?", tagUUIDs).
Scan(&tags)
if tx.Error != nil {
return nil, workerTagError(tx.Error, "fetching all worker tags")
}
return tags, nil
}
func (db *DB) WorkerSetTags(ctx context.Context, worker *Worker, tagUUIDs []string) error {
tags, err := db.fetchWorkerTagsWithUUID(ctx, tagUUIDs)
if err != nil {
return workerTagError(err, "fetching worker tags")
}
err = db.gormDB.WithContext(ctx).
Model(worker).
Association("Tags").
Replace(tags)
if err != nil {
return workerTagError(err, "updating worker tags")
}
return nil
}

View File

@ -0,0 +1,165 @@
package persistence
// SPDX-License-Identifier: GPL-3.0-or-later
import (
"testing"
"time"
"git.blender.org/flamenco/internal/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestCreateFetchTag(t *testing.T) {
f := workerTestFixtures(t, 1*time.Second)
defer f.done()
// Test fetching non-existent tag
fetchedTag, err := f.db.FetchWorkerTag(f.ctx, "7ee21bc8-ff1a-42d2-a6b6-cc4b529b189f")
assert.ErrorIs(t, err, ErrWorkerTagNotFound)
assert.Nil(t, fetchedTag)
// New tag creation is already done in the workerTestFixtures() call.
assert.NotNil(t, f.tag)
fetchedTag, err = f.db.FetchWorkerTag(f.ctx, f.tag.UUID)
require.NoError(t, err)
assert.NotNil(t, fetchedTag)
// Test contents of fetched tag.
assert.Equal(t, f.tag.UUID, fetchedTag.UUID)
assert.Equal(t, f.tag.Name, fetchedTag.Name)
assert.Equal(t, f.tag.Description, fetchedTag.Description)
assert.Zero(t, fetchedTag.Workers)
}
func TestFetchDeleteTags(t *testing.T) {
f := workerTestFixtures(t, 1*time.Second)
defer f.done()
// Single tag was created by fixture.
has, err := f.db.HasWorkerTags(f.ctx)
require.NoError(t, err)
assert.True(t, has, "expecting HasWorkerTags to return true")
secondTag := WorkerTag{
UUID: uuid.New(),
Name: "arbeiderstag",
Description: "Worker tag in Dutch",
}
require.NoError(t, f.db.CreateWorkerTag(f.ctx, &secondTag))
allTags, err := f.db.FetchWorkerTags(f.ctx)
require.NoError(t, err)
require.Len(t, allTags, 2)
var allTagIDs [2]string
for idx := range allTags {
allTagIDs[idx] = allTags[idx].UUID
}
assert.Contains(t, allTagIDs, f.tag.UUID)
assert.Contains(t, allTagIDs, secondTag.UUID)
has, err = f.db.HasWorkerTags(f.ctx)
require.NoError(t, err)
assert.True(t, has, "expecting HasWorkerTags to return true")
// Test deleting the 2nd tag.
require.NoError(t, f.db.DeleteWorkerTag(f.ctx, secondTag.UUID))
allTags, err = f.db.FetchWorkerTags(f.ctx)
require.NoError(t, err)
require.Len(t, allTags, 1)
assert.Equal(t, f.tag.UUID, allTags[0].UUID)
// Test deleting the 1st tag.
require.NoError(t, f.db.DeleteWorkerTag(f.ctx, f.tag.UUID))
has, err = f.db.HasWorkerTags(f.ctx)
require.NoError(t, err)
assert.False(t, has, "expecting HasWorkerTags to return false")
}
func TestAssignUnassignWorkerTags(t *testing.T) {
f := workerTestFixtures(t, 1*time.Second)
defer f.done()
assertTags := func(msgLabel string, tagUUIDs ...string) {
w, err := f.db.FetchWorker(f.ctx, f.worker.UUID)
require.NoError(t, err)
// Catch doubly-reported tags, as the maps below would hide those cases.
assert.Len(t, w.Tags, len(tagUUIDs), msgLabel)
expectTags := make(map[string]bool)
for _, cid := range tagUUIDs {
expectTags[cid] = true
}
actualTags := make(map[string]bool)
for _, c := range w.Tags {
actualTags[c.UUID] = true
}
assert.Equal(t, expectTags, actualTags, msgLabel)
}
secondTag := WorkerTag{
UUID: uuid.New(),
Name: "arbeiderstag",
Description: "Worker tag in Dutch",
}
require.NoError(t, f.db.CreateWorkerTag(f.ctx, &secondTag))
// By default the Worker should not be part of a tag.
assertTags("default tag assignment")
require.NoError(t, f.db.WorkerSetTags(f.ctx, f.worker, []string{f.tag.UUID}))
assertTags("setting one tag", f.tag.UUID)
// Double assignments should also just work.
require.NoError(t, f.db.WorkerSetTags(f.ctx, f.worker, []string{f.tag.UUID, f.tag.UUID}))
assertTags("setting twice the same tag", f.tag.UUID)
// Multiple tag memberships.
require.NoError(t, f.db.WorkerSetTags(f.ctx, f.worker, []string{f.tag.UUID, secondTag.UUID}))
assertTags("setting two different tags", f.tag.UUID, secondTag.UUID)
// Remove memberships.
require.NoError(t, f.db.WorkerSetTags(f.ctx, f.worker, []string{secondTag.UUID}))
assertTags("unassigning from first tag", secondTag.UUID)
require.NoError(t, f.db.WorkerSetTags(f.ctx, f.worker, []string{}))
assertTags("unassigning from second tag")
}
func TestSaveWorkerTag(t *testing.T) {
f := workerTestFixtures(t, 1*time.Second)
defer f.done()
f.tag.Name = "übertag"
f.tag.Description = "ʻO kēlā hui ma laila"
require.NoError(t, f.db.SaveWorkerTag(f.ctx, f.tag))
fetched, err := f.db.FetchWorkerTag(f.ctx, f.tag.UUID)
require.NoError(t, err)
assert.Equal(t, f.tag.Name, fetched.Name)
assert.Equal(t, f.tag.Description, fetched.Description)
}
func TestDeleteWorkerTagWithWorkersAssigned(t *testing.T) {
f := workerTestFixtures(t, 1*time.Second)
defer f.done()
// Assign the worker.
require.NoError(t, f.db.WorkerSetTags(f.ctx, f.worker, []string{f.tag.UUID}))
// Delete the tag.
require.NoError(t, f.db.DeleteWorkerTag(f.ctx, f.tag.UUID))
// Check the Worker has been unassigned from the tag.
w, err := f.db.FetchWorker(f.ctx, f.worker.UUID)
require.NoError(t, err)
assert.Empty(t, w.Tags)
}

View File

@ -31,7 +31,7 @@ type Worker struct {
SupportedTaskTypes string `gorm:"type:varchar(255);default:''"` // comma-separated list of task types. SupportedTaskTypes string `gorm:"type:varchar(255);default:''"` // comma-separated list of task types.
Clusters []*WorkerCluster `gorm:"many2many:worker_cluster_membership;constraint:OnDelete:CASCADE"` Tags []*WorkerTag `gorm:"many2many:worker_tag_membership;constraint:OnDelete:CASCADE"`
} }
func (w *Worker) Identifier() string { func (w *Worker) Identifier() string {
@ -73,7 +73,7 @@ func (db *DB) CreateWorker(ctx context.Context, w *Worker) error {
func (db *DB) FetchWorker(ctx context.Context, uuid string) (*Worker, error) { func (db *DB) FetchWorker(ctx context.Context, uuid string) (*Worker, error) {
w := Worker{} w := Worker{}
tx := db.gormDB.WithContext(ctx). tx := db.gormDB.WithContext(ctx).
Preload("Clusters"). Preload("Tags").
First(&w, "uuid = ?", uuid) First(&w, "uuid = ?", uuid)
if tx.Error != nil { if tx.Error != nil {
return nil, workerError(tx.Error, "fetching worker") return nil, workerError(tx.Error, "fetching worker")

View File

@ -319,18 +319,18 @@ func TestDeleteWorker(t *testing.T) {
} }
} }
func TestDeleteWorkerWithClusterAssigned(t *testing.T) { func TestDeleteWorkerWithTagAssigned(t *testing.T) {
f := workerTestFixtures(t, 1*time.Second) f := workerTestFixtures(t, 1*time.Second)
defer f.done() defer f.done()
// Assign the worker. // Assign the worker.
require.NoError(t, f.db.WorkerSetClusters(f.ctx, f.worker, []string{f.cluster.UUID})) require.NoError(t, f.db.WorkerSetTags(f.ctx, f.worker, []string{f.tag.UUID}))
// Delete the Worker. // Delete the Worker.
require.NoError(t, f.db.DeleteWorker(f.ctx, f.worker.UUID)) require.NoError(t, f.db.DeleteWorker(f.ctx, f.worker.UUID))
// Check the Worker has been unassigned from the cluster. // Check the Worker has been unassigned from the tag.
cluster, err := f.db.FetchWorkerCluster(f.ctx, f.cluster.UUID) tag, err := f.db.FetchWorkerTag(f.ctx, f.tag.UUID)
require.NoError(t, err) require.NoError(t, err)
assert.Empty(t, cluster.Workers) assert.Empty(t, tag.Workers)
} }

View File

@ -32,7 +32,7 @@ func NewWorkerUpdate(worker *persistence.Worker) api.SocketIOWorkerUpdate {
workerUpdate.LastSeen = &worker.LastSeenAt workerUpdate.LastSeen = &worker.LastSeenAt
} }
// TODO: add cluster IDs. // TODO: add tag IDs.
return workerUpdate return workerUpdate
} }

View File

@ -116,44 +116,44 @@ func (mr *MockFlamencoClientMockRecorder) CheckSharedStoragePathWithResponse(arg
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckSharedStoragePathWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).CheckSharedStoragePathWithResponse), varargs...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CheckSharedStoragePathWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).CheckSharedStoragePathWithResponse), varargs...)
} }
// CreateWorkerClusterWithBodyWithResponse mocks base method. // CreateWorkerTagWithBodyWithResponse mocks base method.
func (m *MockFlamencoClient) CreateWorkerClusterWithBodyWithResponse(arg0 context.Context, arg1 string, arg2 io.Reader, arg3 ...api.RequestEditorFn) (*api.CreateWorkerClusterResponse, error) { func (m *MockFlamencoClient) CreateWorkerTagWithBodyWithResponse(arg0 context.Context, arg1 string, arg2 io.Reader, arg3 ...api.RequestEditorFn) (*api.CreateWorkerTagResponse, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
varargs := []interface{}{arg0, arg1, arg2} varargs := []interface{}{arg0, arg1, arg2}
for _, a := range arg3 { for _, a := range arg3 {
varargs = append(varargs, a) varargs = append(varargs, a)
} }
ret := m.ctrl.Call(m, "CreateWorkerClusterWithBodyWithResponse", varargs...) ret := m.ctrl.Call(m, "CreateWorkerTagWithBodyWithResponse", varargs...)
ret0, _ := ret[0].(*api.CreateWorkerClusterResponse) ret0, _ := ret[0].(*api.CreateWorkerTagResponse)
ret1, _ := ret[1].(error) ret1, _ := ret[1].(error)
return ret0, ret1 return ret0, ret1
} }
// CreateWorkerClusterWithBodyWithResponse indicates an expected call of CreateWorkerClusterWithBodyWithResponse. // CreateWorkerTagWithBodyWithResponse indicates an expected call of CreateWorkerTagWithBodyWithResponse.
func (mr *MockFlamencoClientMockRecorder) CreateWorkerClusterWithBodyWithResponse(arg0, arg1, arg2 interface{}, arg3 ...interface{}) *gomock.Call { func (mr *MockFlamencoClientMockRecorder) CreateWorkerTagWithBodyWithResponse(arg0, arg1, arg2 interface{}, arg3 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0, arg1, arg2}, arg3...) varargs := append([]interface{}{arg0, arg1, arg2}, arg3...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateWorkerClusterWithBodyWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).CreateWorkerClusterWithBodyWithResponse), varargs...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateWorkerTagWithBodyWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).CreateWorkerTagWithBodyWithResponse), varargs...)
} }
// CreateWorkerClusterWithResponse mocks base method. // CreateWorkerTagWithResponse mocks base method.
func (m *MockFlamencoClient) CreateWorkerClusterWithResponse(arg0 context.Context, arg1 api.CreateWorkerClusterJSONRequestBody, arg2 ...api.RequestEditorFn) (*api.CreateWorkerClusterResponse, error) { func (m *MockFlamencoClient) CreateWorkerTagWithResponse(arg0 context.Context, arg1 api.CreateWorkerTagJSONRequestBody, arg2 ...api.RequestEditorFn) (*api.CreateWorkerTagResponse, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
varargs := []interface{}{arg0, arg1} varargs := []interface{}{arg0, arg1}
for _, a := range arg2 { for _, a := range arg2 {
varargs = append(varargs, a) varargs = append(varargs, a)
} }
ret := m.ctrl.Call(m, "CreateWorkerClusterWithResponse", varargs...) ret := m.ctrl.Call(m, "CreateWorkerTagWithResponse", varargs...)
ret0, _ := ret[0].(*api.CreateWorkerClusterResponse) ret0, _ := ret[0].(*api.CreateWorkerTagResponse)
ret1, _ := ret[1].(error) ret1, _ := ret[1].(error)
return ret0, ret1 return ret0, ret1
} }
// CreateWorkerClusterWithResponse indicates an expected call of CreateWorkerClusterWithResponse. // CreateWorkerTagWithResponse indicates an expected call of CreateWorkerTagWithResponse.
func (mr *MockFlamencoClientMockRecorder) CreateWorkerClusterWithResponse(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { func (mr *MockFlamencoClientMockRecorder) CreateWorkerTagWithResponse(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0, arg1}, arg2...) varargs := append([]interface{}{arg0, arg1}, arg2...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateWorkerClusterWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).CreateWorkerClusterWithResponse), varargs...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateWorkerTagWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).CreateWorkerTagWithResponse), varargs...)
} }
// DeleteJobWhatWouldItDoWithResponse mocks base method. // DeleteJobWhatWouldItDoWithResponse mocks base method.
@ -196,24 +196,24 @@ func (mr *MockFlamencoClientMockRecorder) DeleteJobWithResponse(arg0, arg1 inter
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteJobWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).DeleteJobWithResponse), varargs...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteJobWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).DeleteJobWithResponse), varargs...)
} }
// DeleteWorkerClusterWithResponse mocks base method. // DeleteWorkerTagWithResponse mocks base method.
func (m *MockFlamencoClient) DeleteWorkerClusterWithResponse(arg0 context.Context, arg1 string, arg2 ...api.RequestEditorFn) (*api.DeleteWorkerClusterResponse, error) { func (m *MockFlamencoClient) DeleteWorkerTagWithResponse(arg0 context.Context, arg1 string, arg2 ...api.RequestEditorFn) (*api.DeleteWorkerTagResponse, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
varargs := []interface{}{arg0, arg1} varargs := []interface{}{arg0, arg1}
for _, a := range arg2 { for _, a := range arg2 {
varargs = append(varargs, a) varargs = append(varargs, a)
} }
ret := m.ctrl.Call(m, "DeleteWorkerClusterWithResponse", varargs...) ret := m.ctrl.Call(m, "DeleteWorkerTagWithResponse", varargs...)
ret0, _ := ret[0].(*api.DeleteWorkerClusterResponse) ret0, _ := ret[0].(*api.DeleteWorkerTagResponse)
ret1, _ := ret[1].(error) ret1, _ := ret[1].(error)
return ret0, ret1 return ret0, ret1
} }
// DeleteWorkerClusterWithResponse indicates an expected call of DeleteWorkerClusterWithResponse. // DeleteWorkerTagWithResponse indicates an expected call of DeleteWorkerTagWithResponse.
func (mr *MockFlamencoClientMockRecorder) DeleteWorkerClusterWithResponse(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call { func (mr *MockFlamencoClientMockRecorder) DeleteWorkerTagWithResponse(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0, arg1}, arg2...) varargs := append([]interface{}{arg0, arg1}, arg2...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteWorkerClusterWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).DeleteWorkerClusterWithResponse), varargs...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteWorkerTagWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).DeleteWorkerTagWithResponse), varargs...)
} }
// DeleteWorkerWithResponse mocks base method. // DeleteWorkerWithResponse mocks base method.
@ -396,46 +396,6 @@ func (mr *MockFlamencoClientMockRecorder) FetchTaskWithResponse(arg0, arg1 inter
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchTaskWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchTaskWithResponse), varargs...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchTaskWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchTaskWithResponse), varargs...)
} }
// FetchWorkerClusterWithResponse mocks base method.
func (m *MockFlamencoClient) FetchWorkerClusterWithResponse(arg0 context.Context, arg1 string, arg2 ...api.RequestEditorFn) (*api.FetchWorkerClusterResponse, error) {
m.ctrl.T.Helper()
varargs := []interface{}{arg0, arg1}
for _, a := range arg2 {
varargs = append(varargs, a)
}
ret := m.ctrl.Call(m, "FetchWorkerClusterWithResponse", varargs...)
ret0, _ := ret[0].(*api.FetchWorkerClusterResponse)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// FetchWorkerClusterWithResponse indicates an expected call of FetchWorkerClusterWithResponse.
func (mr *MockFlamencoClientMockRecorder) FetchWorkerClusterWithResponse(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0, arg1}, arg2...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWorkerClusterWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchWorkerClusterWithResponse), varargs...)
}
// FetchWorkerClustersWithResponse mocks base method.
func (m *MockFlamencoClient) FetchWorkerClustersWithResponse(arg0 context.Context, arg1 ...api.RequestEditorFn) (*api.FetchWorkerClustersResponse, error) {
m.ctrl.T.Helper()
varargs := []interface{}{arg0}
for _, a := range arg1 {
varargs = append(varargs, a)
}
ret := m.ctrl.Call(m, "FetchWorkerClustersWithResponse", varargs...)
ret0, _ := ret[0].(*api.FetchWorkerClustersResponse)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// FetchWorkerClustersWithResponse indicates an expected call of FetchWorkerClustersWithResponse.
func (mr *MockFlamencoClientMockRecorder) FetchWorkerClustersWithResponse(arg0 interface{}, arg1 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0}, arg1...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWorkerClustersWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchWorkerClustersWithResponse), varargs...)
}
// FetchWorkerSleepScheduleWithResponse mocks base method. // FetchWorkerSleepScheduleWithResponse mocks base method.
func (m *MockFlamencoClient) FetchWorkerSleepScheduleWithResponse(arg0 context.Context, arg1 string, arg2 ...api.RequestEditorFn) (*api.FetchWorkerSleepScheduleResponse, error) { func (m *MockFlamencoClient) FetchWorkerSleepScheduleWithResponse(arg0 context.Context, arg1 string, arg2 ...api.RequestEditorFn) (*api.FetchWorkerSleepScheduleResponse, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
@ -456,6 +416,46 @@ func (mr *MockFlamencoClientMockRecorder) FetchWorkerSleepScheduleWithResponse(a
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWorkerSleepScheduleWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchWorkerSleepScheduleWithResponse), varargs...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWorkerSleepScheduleWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchWorkerSleepScheduleWithResponse), varargs...)
} }
// FetchWorkerTagWithResponse mocks base method.
func (m *MockFlamencoClient) FetchWorkerTagWithResponse(arg0 context.Context, arg1 string, arg2 ...api.RequestEditorFn) (*api.FetchWorkerTagResponse, error) {
m.ctrl.T.Helper()
varargs := []interface{}{arg0, arg1}
for _, a := range arg2 {
varargs = append(varargs, a)
}
ret := m.ctrl.Call(m, "FetchWorkerTagWithResponse", varargs...)
ret0, _ := ret[0].(*api.FetchWorkerTagResponse)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// FetchWorkerTagWithResponse indicates an expected call of FetchWorkerTagWithResponse.
func (mr *MockFlamencoClientMockRecorder) FetchWorkerTagWithResponse(arg0, arg1 interface{}, arg2 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0, arg1}, arg2...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWorkerTagWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchWorkerTagWithResponse), varargs...)
}
// FetchWorkerTagsWithResponse mocks base method.
func (m *MockFlamencoClient) FetchWorkerTagsWithResponse(arg0 context.Context, arg1 ...api.RequestEditorFn) (*api.FetchWorkerTagsResponse, error) {
m.ctrl.T.Helper()
varargs := []interface{}{arg0}
for _, a := range arg1 {
varargs = append(varargs, a)
}
ret := m.ctrl.Call(m, "FetchWorkerTagsWithResponse", varargs...)
ret0, _ := ret[0].(*api.FetchWorkerTagsResponse)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// FetchWorkerTagsWithResponse indicates an expected call of FetchWorkerTagsWithResponse.
func (mr *MockFlamencoClientMockRecorder) FetchWorkerTagsWithResponse(arg0 interface{}, arg1 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0}, arg1...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchWorkerTagsWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).FetchWorkerTagsWithResponse), varargs...)
}
// FetchWorkerWithResponse mocks base method. // FetchWorkerWithResponse mocks base method.
func (m *MockFlamencoClient) FetchWorkerWithResponse(arg0 context.Context, arg1 string, arg2 ...api.RequestEditorFn) (*api.FetchWorkerResponse, error) { func (m *MockFlamencoClient) FetchWorkerWithResponse(arg0 context.Context, arg1 string, arg2 ...api.RequestEditorFn) (*api.FetchWorkerResponse, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
@ -1016,46 +1016,6 @@ func (mr *MockFlamencoClientMockRecorder) SetTaskStatusWithResponse(arg0, arg1,
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTaskStatusWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).SetTaskStatusWithResponse), varargs...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetTaskStatusWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).SetTaskStatusWithResponse), varargs...)
} }
// SetWorkerClustersWithBodyWithResponse mocks base method.
func (m *MockFlamencoClient) SetWorkerClustersWithBodyWithResponse(arg0 context.Context, arg1, arg2 string, arg3 io.Reader, arg4 ...api.RequestEditorFn) (*api.SetWorkerClustersResponse, error) {
m.ctrl.T.Helper()
varargs := []interface{}{arg0, arg1, arg2, arg3}
for _, a := range arg4 {
varargs = append(varargs, a)
}
ret := m.ctrl.Call(m, "SetWorkerClustersWithBodyWithResponse", varargs...)
ret0, _ := ret[0].(*api.SetWorkerClustersResponse)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// SetWorkerClustersWithBodyWithResponse indicates an expected call of SetWorkerClustersWithBodyWithResponse.
func (mr *MockFlamencoClientMockRecorder) SetWorkerClustersWithBodyWithResponse(arg0, arg1, arg2, arg3 interface{}, arg4 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0, arg1, arg2, arg3}, arg4...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWorkerClustersWithBodyWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).SetWorkerClustersWithBodyWithResponse), varargs...)
}
// SetWorkerClustersWithResponse mocks base method.
func (m *MockFlamencoClient) SetWorkerClustersWithResponse(arg0 context.Context, arg1 string, arg2 api.SetWorkerClustersJSONRequestBody, arg3 ...api.RequestEditorFn) (*api.SetWorkerClustersResponse, error) {
m.ctrl.T.Helper()
varargs := []interface{}{arg0, arg1, arg2}
for _, a := range arg3 {
varargs = append(varargs, a)
}
ret := m.ctrl.Call(m, "SetWorkerClustersWithResponse", varargs...)
ret0, _ := ret[0].(*api.SetWorkerClustersResponse)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// SetWorkerClustersWithResponse indicates an expected call of SetWorkerClustersWithResponse.
func (mr *MockFlamencoClientMockRecorder) SetWorkerClustersWithResponse(arg0, arg1, arg2 interface{}, arg3 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0, arg1, arg2}, arg3...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWorkerClustersWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).SetWorkerClustersWithResponse), varargs...)
}
// SetWorkerSleepScheduleWithBodyWithResponse mocks base method. // SetWorkerSleepScheduleWithBodyWithResponse mocks base method.
func (m *MockFlamencoClient) SetWorkerSleepScheduleWithBodyWithResponse(arg0 context.Context, arg1, arg2 string, arg3 io.Reader, arg4 ...api.RequestEditorFn) (*api.SetWorkerSleepScheduleResponse, error) { func (m *MockFlamencoClient) SetWorkerSleepScheduleWithBodyWithResponse(arg0 context.Context, arg1, arg2 string, arg3 io.Reader, arg4 ...api.RequestEditorFn) (*api.SetWorkerSleepScheduleResponse, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
@ -1096,6 +1056,46 @@ func (mr *MockFlamencoClientMockRecorder) SetWorkerSleepScheduleWithResponse(arg
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWorkerSleepScheduleWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).SetWorkerSleepScheduleWithResponse), varargs...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWorkerSleepScheduleWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).SetWorkerSleepScheduleWithResponse), varargs...)
} }
// SetWorkerTagsWithBodyWithResponse mocks base method.
func (m *MockFlamencoClient) SetWorkerTagsWithBodyWithResponse(arg0 context.Context, arg1, arg2 string, arg3 io.Reader, arg4 ...api.RequestEditorFn) (*api.SetWorkerTagsResponse, error) {
m.ctrl.T.Helper()
varargs := []interface{}{arg0, arg1, arg2, arg3}
for _, a := range arg4 {
varargs = append(varargs, a)
}
ret := m.ctrl.Call(m, "SetWorkerTagsWithBodyWithResponse", varargs...)
ret0, _ := ret[0].(*api.SetWorkerTagsResponse)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// SetWorkerTagsWithBodyWithResponse indicates an expected call of SetWorkerTagsWithBodyWithResponse.
func (mr *MockFlamencoClientMockRecorder) SetWorkerTagsWithBodyWithResponse(arg0, arg1, arg2, arg3 interface{}, arg4 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0, arg1, arg2, arg3}, arg4...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWorkerTagsWithBodyWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).SetWorkerTagsWithBodyWithResponse), varargs...)
}
// SetWorkerTagsWithResponse mocks base method.
func (m *MockFlamencoClient) SetWorkerTagsWithResponse(arg0 context.Context, arg1 string, arg2 api.SetWorkerTagsJSONRequestBody, arg3 ...api.RequestEditorFn) (*api.SetWorkerTagsResponse, error) {
m.ctrl.T.Helper()
varargs := []interface{}{arg0, arg1, arg2}
for _, a := range arg3 {
varargs = append(varargs, a)
}
ret := m.ctrl.Call(m, "SetWorkerTagsWithResponse", varargs...)
ret0, _ := ret[0].(*api.SetWorkerTagsResponse)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// SetWorkerTagsWithResponse indicates an expected call of SetWorkerTagsWithResponse.
func (mr *MockFlamencoClientMockRecorder) SetWorkerTagsWithResponse(arg0, arg1, arg2 interface{}, arg3 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0, arg1, arg2}, arg3...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetWorkerTagsWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).SetWorkerTagsWithResponse), varargs...)
}
// ShamanCheckoutRequirementsWithBodyWithResponse mocks base method. // ShamanCheckoutRequirementsWithBodyWithResponse mocks base method.
func (m *MockFlamencoClient) ShamanCheckoutRequirementsWithBodyWithResponse(arg0 context.Context, arg1 string, arg2 io.Reader, arg3 ...api.RequestEditorFn) (*api.ShamanCheckoutRequirementsResponse, error) { func (m *MockFlamencoClient) ShamanCheckoutRequirementsWithBodyWithResponse(arg0 context.Context, arg1 string, arg2 io.Reader, arg3 ...api.RequestEditorFn) (*api.ShamanCheckoutRequirementsResponse, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
@ -1416,44 +1416,44 @@ func (mr *MockFlamencoClientMockRecorder) TaskUpdateWithResponse(arg0, arg1, arg
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TaskUpdateWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).TaskUpdateWithResponse), varargs...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "TaskUpdateWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).TaskUpdateWithResponse), varargs...)
} }
// UpdateWorkerClusterWithBodyWithResponse mocks base method. // UpdateWorkerTagWithBodyWithResponse mocks base method.
func (m *MockFlamencoClient) UpdateWorkerClusterWithBodyWithResponse(arg0 context.Context, arg1, arg2 string, arg3 io.Reader, arg4 ...api.RequestEditorFn) (*api.UpdateWorkerClusterResponse, error) { func (m *MockFlamencoClient) UpdateWorkerTagWithBodyWithResponse(arg0 context.Context, arg1, arg2 string, arg3 io.Reader, arg4 ...api.RequestEditorFn) (*api.UpdateWorkerTagResponse, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
varargs := []interface{}{arg0, arg1, arg2, arg3} varargs := []interface{}{arg0, arg1, arg2, arg3}
for _, a := range arg4 { for _, a := range arg4 {
varargs = append(varargs, a) varargs = append(varargs, a)
} }
ret := m.ctrl.Call(m, "UpdateWorkerClusterWithBodyWithResponse", varargs...) ret := m.ctrl.Call(m, "UpdateWorkerTagWithBodyWithResponse", varargs...)
ret0, _ := ret[0].(*api.UpdateWorkerClusterResponse) ret0, _ := ret[0].(*api.UpdateWorkerTagResponse)
ret1, _ := ret[1].(error) ret1, _ := ret[1].(error)
return ret0, ret1 return ret0, ret1
} }
// UpdateWorkerClusterWithBodyWithResponse indicates an expected call of UpdateWorkerClusterWithBodyWithResponse. // UpdateWorkerTagWithBodyWithResponse indicates an expected call of UpdateWorkerTagWithBodyWithResponse.
func (mr *MockFlamencoClientMockRecorder) UpdateWorkerClusterWithBodyWithResponse(arg0, arg1, arg2, arg3 interface{}, arg4 ...interface{}) *gomock.Call { func (mr *MockFlamencoClientMockRecorder) UpdateWorkerTagWithBodyWithResponse(arg0, arg1, arg2, arg3 interface{}, arg4 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0, arg1, arg2, arg3}, arg4...) varargs := append([]interface{}{arg0, arg1, arg2, arg3}, arg4...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWorkerClusterWithBodyWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).UpdateWorkerClusterWithBodyWithResponse), varargs...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWorkerTagWithBodyWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).UpdateWorkerTagWithBodyWithResponse), varargs...)
} }
// UpdateWorkerClusterWithResponse mocks base method. // UpdateWorkerTagWithResponse mocks base method.
func (m *MockFlamencoClient) UpdateWorkerClusterWithResponse(arg0 context.Context, arg1 string, arg2 api.UpdateWorkerClusterJSONRequestBody, arg3 ...api.RequestEditorFn) (*api.UpdateWorkerClusterResponse, error) { func (m *MockFlamencoClient) UpdateWorkerTagWithResponse(arg0 context.Context, arg1 string, arg2 api.UpdateWorkerTagJSONRequestBody, arg3 ...api.RequestEditorFn) (*api.UpdateWorkerTagResponse, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
varargs := []interface{}{arg0, arg1, arg2} varargs := []interface{}{arg0, arg1, arg2}
for _, a := range arg3 { for _, a := range arg3 {
varargs = append(varargs, a) varargs = append(varargs, a)
} }
ret := m.ctrl.Call(m, "UpdateWorkerClusterWithResponse", varargs...) ret := m.ctrl.Call(m, "UpdateWorkerTagWithResponse", varargs...)
ret0, _ := ret[0].(*api.UpdateWorkerClusterResponse) ret0, _ := ret[0].(*api.UpdateWorkerTagResponse)
ret1, _ := ret[1].(error) ret1, _ := ret[1].(error)
return ret0, ret1 return ret0, ret1
} }
// UpdateWorkerClusterWithResponse indicates an expected call of UpdateWorkerClusterWithResponse. // UpdateWorkerTagWithResponse indicates an expected call of UpdateWorkerTagWithResponse.
func (mr *MockFlamencoClientMockRecorder) UpdateWorkerClusterWithResponse(arg0, arg1, arg2 interface{}, arg3 ...interface{}) *gomock.Call { func (mr *MockFlamencoClientMockRecorder) UpdateWorkerTagWithResponse(arg0, arg1, arg2 interface{}, arg3 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0, arg1, arg2}, arg3...) varargs := append([]interface{}{arg0, arg1, arg2}, arg3...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWorkerClusterWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).UpdateWorkerClusterWithResponse), varargs...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateWorkerTagWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).UpdateWorkerTagWithResponse), varargs...)
} }
// WorkerStateChangedWithBodyWithResponse mocks base method. // WorkerStateChangedWithBodyWithResponse mocks base method.

View File

@ -534,10 +534,10 @@ paths:
schema: schema:
$ref: "#/components/schemas/Error" $ref: "#/components/schemas/Error"
/api/v3/worker-mgt/workers/{worker_id}/setclusters: /api/v3/worker-mgt/workers/{worker_id}/settags:
summary: Update the cluster membership of this Worker. summary: Update the tag membership of this Worker.
post: post:
operationId: setWorkerClusters operationId: setWorkerTags
tags: [worker-mgt] tags: [worker-mgt]
parameters: parameters:
- name: worker_id - name: worker_id
@ -545,12 +545,12 @@ paths:
required: true required: true
schema: { type: string, format: uuid } schema: { type: string, format: uuid }
requestBody: requestBody:
description: The list of cluster IDs this worker should be a member of. description: The list of worker tag IDs this worker should be a member of.
required: true required: true
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/WorkerClusterChangeRequest" $ref: "#/components/schemas/WorkerTagChangeRequest"
responses: responses:
"204": "204":
description: Status change was accepted. description: Status change was accepted.
@ -611,84 +611,84 @@ paths:
schema: schema:
$ref: "#/components/schemas/Error" $ref: "#/components/schemas/Error"
/api/v3/worker-mgt/clusters: /api/v3/worker-mgt/tags:
summary: Manage worker clusters. summary: Manage worker tags.
get: get:
operationId: fetchWorkerClusters operationId: fetchWorkerTags
summary: Get list of worker clusters. summary: Get list of worker tags.
tags: [worker-mgt] tags: [worker-mgt]
responses: responses:
"200": "200":
description: Worker clusters. description: Worker tags.
content: content:
application/json: application/json:
schema: { $ref: "#/components/schemas/WorkerClusterList" } schema: { $ref: "#/components/schemas/WorkerTagList" }
post: post:
operationId: createWorkerCluster operationId: createWorkerTag
summary: Create a new worker cluster. summary: Create a new worker tag.
tags: [worker-mgt] tags: [worker-mgt]
requestBody: requestBody:
description: The worker cluster. description: The worker tag.
required: true required: true
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/WorkerCluster" $ref: "#/components/schemas/WorkerTag"
responses: responses:
"200": "200":
description: The cluster was created. The created cluster is returned, so that the caller can know its UUID. description: The tag was created. The created tag is returned, so that the caller can know its UUID.
content: content:
application/json: application/json:
schema: { $ref: "#/components/schemas/WorkerCluster" } schema: { $ref: "#/components/schemas/WorkerTag" }
default: default:
description: Error message description: Error message
content: content:
application/json: application/json:
schema: { $ref: "#/components/schemas/Error" } schema: { $ref: "#/components/schemas/Error" }
/api/v3/worker-mgt/cluster/{cluster_id}: /api/v3/worker-mgt/tag/{tag_id}:
summary: Get, update, or delete a worker cluster. summary: Get, update, or delete a worker tag.
parameters: parameters:
- name: cluster_id - name: tag_id
in: path in: path
required: true required: true
schema: { type: string, format: uuid } schema: { type: string, format: uuid }
get: get:
operationId: fetchWorkerCluster operationId: fetchWorkerTag
summary: Get a single worker cluster. summary: Get a single worker tag.
tags: [worker-mgt] tags: [worker-mgt]
responses: responses:
"200": "200":
description: The worker cluster. description: The worker tag.
content: content:
application/json: application/json:
schema: { $ref: "#/components/schemas/WorkerCluster" } schema: { $ref: "#/components/schemas/WorkerTag" }
put: put:
operationId: updateWorkerCluster operationId: updateWorkerTag
summary: Update an existing worker cluster. summary: Update an existing worker tag.
tags: [worker-mgt] tags: [worker-mgt]
requestBody: requestBody:
description: The updated worker cluster. description: The updated worker tag.
required: true required: true
content: content:
application/json: application/json:
schema: schema:
$ref: "#/components/schemas/WorkerCluster" $ref: "#/components/schemas/WorkerTag"
responses: responses:
"204": "204":
description: The cluster update has been stored. description: The tag update has been stored.
default: default:
description: Error message description: Error message
content: content:
application/json: application/json:
schema: { $ref: "#/components/schemas/Error" } schema: { $ref: "#/components/schemas/Error" }
delete: delete:
operationId: deleteWorkerCluster operationId: deleteWorkerTag
summary: Remove this worker cluster. This unassigns all workers from the cluster and removes it. summary: Remove this worker tag. This unassigns all workers from the tag and removes it.
tags: [worker-mgt] tags: [worker-mgt]
responses: responses:
"204": "204":
description: The cluster has been removed. description: The tag has been removed.
default: default:
description: Unexpected error. description: Unexpected error.
content: content:
@ -1758,12 +1758,12 @@ components:
test/debug scripts easier, as they can use a static document on all test/debug scripts easier, as they can use a static document on all
platforms. platforms.
"storage": { $ref: "#/components/schemas/JobStorageInfo" } "storage": { $ref: "#/components/schemas/JobStorageInfo" }
"worker_cluster": "worker_tag":
type: string type: string
format: uuid format: uuid
description: > description: >
Worker Cluster that should execute this job. When a cluster ID is Worker tag that should execute this job. When a tag ID is
given, only Workers in that cluster will be scheduled to work on it. given, only Workers in that tag will be scheduled to work on it.
If empty or ommitted, all workers can work on this job. If empty or ommitted, all workers can work on this job.
required: [name, type, priority, submitter_platform] required: [name, type, priority, submitter_platform]
example: example:
@ -2364,10 +2364,10 @@ components:
type: array type: array
items: { type: string } items: { type: string }
"task": { $ref: "#/components/schemas/WorkerTask" } "task": { $ref: "#/components/schemas/WorkerTask" }
"clusters": "tags":
type: array type: array
items: { $ref: "#/components/schemas/WorkerCluster" } items: { $ref: "#/components/schemas/WorkerTag" }
description: Clusters of which this Worker is a member. description: Tags of which this Worker is a member.
required: required:
- id - id
- name - name
@ -2421,17 +2421,17 @@ components:
start_time: "09:00" start_time: "09:00"
end_time: "18:00" end_time: "18:00"
WorkerCluster: WorkerTag:
type: object type: object
description: > description: >
Cluster of workers. A job can optionally specify which cluster it should Tag of workers. A job can optionally specify which tag it should
be limited to. Workers can be part of multiple clusters simultaneously. be limited to. Workers can be part of multiple tags simultaneously.
properties: properties:
"id": "id":
type: string type: string
format: uuid format: uuid
description: > description: >
UUID of the cluster. Can be ommitted when creating a new cluster, in UUID of the tag. Can be ommitted when creating a new tag, in
which case a random UUID will be assigned. which case a random UUID will be assigned.
"name": "name":
type: string type: string
@ -2442,25 +2442,25 @@ components:
name: GPU-EEVEE name: GPU-EEVEE
description: All workers that can do GPU rendering with EEVEE. description: All workers that can do GPU rendering with EEVEE.
WorkerClusterList: WorkerTagList:
type: object type: object
properties: properties:
"clusters": "tags":
type: array type: array
items: { $ref: "#/components/schemas/WorkerCluster" } items: { $ref: "#/components/schemas/WorkerTag" }
WorkerClusterChangeRequest: WorkerTagChangeRequest:
type: object type: object
description: Request to change which clusters this Worker is assigned to. description: Request to change which tags this Worker is assigned to.
properties: properties:
"cluster_ids": "tag_ids":
type: array type: array
items: items:
type: string type: string
format: uuid format: uuid
required: [cluster_ids] required: [tag_ids]
example: example:
"cluster_ids": ["4312d68c-ea6d-4566-9bf6-e9f09be48ceb"] "tag_ids": ["4312d68c-ea6d-4566-9bf6-e9f09be48ceb"]
securitySchemes: securitySchemes:
worker_auth: worker_auth:

View File

@ -212,24 +212,24 @@ type ClientInterface interface {
// GetVersion request // GetVersion request
GetVersion(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) GetVersion(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)
// DeleteWorkerCluster request // DeleteWorkerTag request
DeleteWorkerCluster(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*http.Response, error) DeleteWorkerTag(ctx context.Context, tagId string, reqEditors ...RequestEditorFn) (*http.Response, error)
// FetchWorkerCluster request // FetchWorkerTag request
FetchWorkerCluster(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*http.Response, error) FetchWorkerTag(ctx context.Context, tagId string, reqEditors ...RequestEditorFn) (*http.Response, error)
// UpdateWorkerCluster request with any body // UpdateWorkerTag request with any body
UpdateWorkerClusterWithBody(ctx context.Context, clusterId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) UpdateWorkerTagWithBody(ctx context.Context, tagId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)
UpdateWorkerCluster(ctx context.Context, clusterId string, body UpdateWorkerClusterJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) UpdateWorkerTag(ctx context.Context, tagId string, body UpdateWorkerTagJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error)
// FetchWorkerClusters request // FetchWorkerTags request
FetchWorkerClusters(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) FetchWorkerTags(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)
// CreateWorkerCluster request with any body // CreateWorkerTag request with any body
CreateWorkerClusterWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) CreateWorkerTagWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)
CreateWorkerCluster(ctx context.Context, body CreateWorkerClusterJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) CreateWorkerTag(ctx context.Context, body CreateWorkerTagJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error)
// FetchWorkers request // FetchWorkers request
FetchWorkers(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) FetchWorkers(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)
@ -240,16 +240,16 @@ type ClientInterface interface {
// FetchWorker request // FetchWorker request
FetchWorker(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*http.Response, error) FetchWorker(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*http.Response, error)
// SetWorkerClusters request with any body
SetWorkerClustersWithBody(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)
SetWorkerClusters(ctx context.Context, workerId string, body SetWorkerClustersJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error)
// RequestWorkerStatusChange request with any body // RequestWorkerStatusChange request with any body
RequestWorkerStatusChangeWithBody(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) RequestWorkerStatusChangeWithBody(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)
RequestWorkerStatusChange(ctx context.Context, workerId string, body RequestWorkerStatusChangeJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) RequestWorkerStatusChange(ctx context.Context, workerId string, body RequestWorkerStatusChangeJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error)
// SetWorkerTags request with any body
SetWorkerTagsWithBody(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)
SetWorkerTags(ctx context.Context, workerId string, body SetWorkerTagsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error)
// FetchWorkerSleepSchedule request // FetchWorkerSleepSchedule request
FetchWorkerSleepSchedule(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*http.Response, error) FetchWorkerSleepSchedule(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*http.Response, error)
@ -822,8 +822,8 @@ func (c *Client) GetVersion(ctx context.Context, reqEditors ...RequestEditorFn)
return c.Client.Do(req) return c.Client.Do(req)
} }
func (c *Client) DeleteWorkerCluster(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*http.Response, error) { func (c *Client) DeleteWorkerTag(ctx context.Context, tagId string, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewDeleteWorkerClusterRequest(c.Server, clusterId) req, err := NewDeleteWorkerTagRequest(c.Server, tagId)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -834,8 +834,8 @@ func (c *Client) DeleteWorkerCluster(ctx context.Context, clusterId string, reqE
return c.Client.Do(req) return c.Client.Do(req)
} }
func (c *Client) FetchWorkerCluster(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*http.Response, error) { func (c *Client) FetchWorkerTag(ctx context.Context, tagId string, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewFetchWorkerClusterRequest(c.Server, clusterId) req, err := NewFetchWorkerTagRequest(c.Server, tagId)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -846,8 +846,8 @@ func (c *Client) FetchWorkerCluster(ctx context.Context, clusterId string, reqEd
return c.Client.Do(req) return c.Client.Do(req)
} }
func (c *Client) UpdateWorkerClusterWithBody(ctx context.Context, clusterId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { func (c *Client) UpdateWorkerTagWithBody(ctx context.Context, tagId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewUpdateWorkerClusterRequestWithBody(c.Server, clusterId, contentType, body) req, err := NewUpdateWorkerTagRequestWithBody(c.Server, tagId, contentType, body)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -858,8 +858,8 @@ func (c *Client) UpdateWorkerClusterWithBody(ctx context.Context, clusterId stri
return c.Client.Do(req) return c.Client.Do(req)
} }
func (c *Client) UpdateWorkerCluster(ctx context.Context, clusterId string, body UpdateWorkerClusterJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { func (c *Client) UpdateWorkerTag(ctx context.Context, tagId string, body UpdateWorkerTagJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewUpdateWorkerClusterRequest(c.Server, clusterId, body) req, err := NewUpdateWorkerTagRequest(c.Server, tagId, body)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -870,8 +870,8 @@ func (c *Client) UpdateWorkerCluster(ctx context.Context, clusterId string, body
return c.Client.Do(req) return c.Client.Do(req)
} }
func (c *Client) FetchWorkerClusters(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { func (c *Client) FetchWorkerTags(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewFetchWorkerClustersRequest(c.Server) req, err := NewFetchWorkerTagsRequest(c.Server)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -882,8 +882,8 @@ func (c *Client) FetchWorkerClusters(ctx context.Context, reqEditors ...RequestE
return c.Client.Do(req) return c.Client.Do(req)
} }
func (c *Client) CreateWorkerClusterWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { func (c *Client) CreateWorkerTagWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewCreateWorkerClusterRequestWithBody(c.Server, contentType, body) req, err := NewCreateWorkerTagRequestWithBody(c.Server, contentType, body)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -894,8 +894,8 @@ func (c *Client) CreateWorkerClusterWithBody(ctx context.Context, contentType st
return c.Client.Do(req) return c.Client.Do(req)
} }
func (c *Client) CreateWorkerCluster(ctx context.Context, body CreateWorkerClusterJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { func (c *Client) CreateWorkerTag(ctx context.Context, body CreateWorkerTagJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewCreateWorkerClusterRequest(c.Server, body) req, err := NewCreateWorkerTagRequest(c.Server, body)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -942,30 +942,6 @@ func (c *Client) FetchWorker(ctx context.Context, workerId string, reqEditors ..
return c.Client.Do(req) return c.Client.Do(req)
} }
func (c *Client) SetWorkerClustersWithBody(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewSetWorkerClustersRequestWithBody(c.Server, workerId, contentType, body)
if err != nil {
return nil, err
}
req = req.WithContext(ctx)
if err := c.applyEditors(ctx, req, reqEditors); err != nil {
return nil, err
}
return c.Client.Do(req)
}
func (c *Client) SetWorkerClusters(ctx context.Context, workerId string, body SetWorkerClustersJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewSetWorkerClustersRequest(c.Server, workerId, body)
if err != nil {
return nil, err
}
req = req.WithContext(ctx)
if err := c.applyEditors(ctx, req, reqEditors); err != nil {
return nil, err
}
return c.Client.Do(req)
}
func (c *Client) RequestWorkerStatusChangeWithBody(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { func (c *Client) RequestWorkerStatusChangeWithBody(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewRequestWorkerStatusChangeRequestWithBody(c.Server, workerId, contentType, body) req, err := NewRequestWorkerStatusChangeRequestWithBody(c.Server, workerId, contentType, body)
if err != nil { if err != nil {
@ -990,6 +966,30 @@ func (c *Client) RequestWorkerStatusChange(ctx context.Context, workerId string,
return c.Client.Do(req) return c.Client.Do(req)
} }
func (c *Client) SetWorkerTagsWithBody(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewSetWorkerTagsRequestWithBody(c.Server, workerId, contentType, body)
if err != nil {
return nil, err
}
req = req.WithContext(ctx)
if err := c.applyEditors(ctx, req, reqEditors); err != nil {
return nil, err
}
return c.Client.Do(req)
}
func (c *Client) SetWorkerTags(ctx context.Context, workerId string, body SetWorkerTagsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewSetWorkerTagsRequest(c.Server, workerId, body)
if err != nil {
return nil, err
}
req = req.WithContext(ctx)
if err := c.applyEditors(ctx, req, reqEditors); err != nil {
return nil, err
}
return c.Client.Do(req)
}
func (c *Client) FetchWorkerSleepSchedule(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*http.Response, error) { func (c *Client) FetchWorkerSleepSchedule(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewFetchWorkerSleepScheduleRequest(c.Server, workerId) req, err := NewFetchWorkerSleepScheduleRequest(c.Server, workerId)
if err != nil { if err != nil {
@ -2380,13 +2380,13 @@ func NewGetVersionRequest(server string) (*http.Request, error) {
return req, nil return req, nil
} }
// NewDeleteWorkerClusterRequest generates requests for DeleteWorkerCluster // NewDeleteWorkerTagRequest generates requests for DeleteWorkerTag
func NewDeleteWorkerClusterRequest(server string, clusterId string) (*http.Request, error) { func NewDeleteWorkerTagRequest(server string, tagId string) (*http.Request, error) {
var err error var err error
var pathParam0 string var pathParam0 string
pathParam0, err = runtime.StyleParamWithLocation("simple", false, "cluster_id", runtime.ParamLocationPath, clusterId) pathParam0, err = runtime.StyleParamWithLocation("simple", false, "tag_id", runtime.ParamLocationPath, tagId)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -2396,7 +2396,7 @@ func NewDeleteWorkerClusterRequest(server string, clusterId string) (*http.Reque
return nil, err return nil, err
} }
operationPath := fmt.Sprintf("/api/v3/worker-mgt/cluster/%s", pathParam0) operationPath := fmt.Sprintf("/api/v3/worker-mgt/tag/%s", pathParam0)
if operationPath[0] == '/' { if operationPath[0] == '/' {
operationPath = "." + operationPath operationPath = "." + operationPath
} }
@ -2414,13 +2414,13 @@ func NewDeleteWorkerClusterRequest(server string, clusterId string) (*http.Reque
return req, nil return req, nil
} }
// NewFetchWorkerClusterRequest generates requests for FetchWorkerCluster // NewFetchWorkerTagRequest generates requests for FetchWorkerTag
func NewFetchWorkerClusterRequest(server string, clusterId string) (*http.Request, error) { func NewFetchWorkerTagRequest(server string, tagId string) (*http.Request, error) {
var err error var err error
var pathParam0 string var pathParam0 string
pathParam0, err = runtime.StyleParamWithLocation("simple", false, "cluster_id", runtime.ParamLocationPath, clusterId) pathParam0, err = runtime.StyleParamWithLocation("simple", false, "tag_id", runtime.ParamLocationPath, tagId)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -2430,7 +2430,7 @@ func NewFetchWorkerClusterRequest(server string, clusterId string) (*http.Reques
return nil, err return nil, err
} }
operationPath := fmt.Sprintf("/api/v3/worker-mgt/cluster/%s", pathParam0) operationPath := fmt.Sprintf("/api/v3/worker-mgt/tag/%s", pathParam0)
if operationPath[0] == '/' { if operationPath[0] == '/' {
operationPath = "." + operationPath operationPath = "." + operationPath
} }
@ -2448,24 +2448,24 @@ func NewFetchWorkerClusterRequest(server string, clusterId string) (*http.Reques
return req, nil return req, nil
} }
// NewUpdateWorkerClusterRequest calls the generic UpdateWorkerCluster builder with application/json body // NewUpdateWorkerTagRequest calls the generic UpdateWorkerTag builder with application/json body
func NewUpdateWorkerClusterRequest(server string, clusterId string, body UpdateWorkerClusterJSONRequestBody) (*http.Request, error) { func NewUpdateWorkerTagRequest(server string, tagId string, body UpdateWorkerTagJSONRequestBody) (*http.Request, error) {
var bodyReader io.Reader var bodyReader io.Reader
buf, err := json.Marshal(body) buf, err := json.Marshal(body)
if err != nil { if err != nil {
return nil, err return nil, err
} }
bodyReader = bytes.NewReader(buf) bodyReader = bytes.NewReader(buf)
return NewUpdateWorkerClusterRequestWithBody(server, clusterId, "application/json", bodyReader) return NewUpdateWorkerTagRequestWithBody(server, tagId, "application/json", bodyReader)
} }
// NewUpdateWorkerClusterRequestWithBody generates requests for UpdateWorkerCluster with any type of body // NewUpdateWorkerTagRequestWithBody generates requests for UpdateWorkerTag with any type of body
func NewUpdateWorkerClusterRequestWithBody(server string, clusterId string, contentType string, body io.Reader) (*http.Request, error) { func NewUpdateWorkerTagRequestWithBody(server string, tagId string, contentType string, body io.Reader) (*http.Request, error) {
var err error var err error
var pathParam0 string var pathParam0 string
pathParam0, err = runtime.StyleParamWithLocation("simple", false, "cluster_id", runtime.ParamLocationPath, clusterId) pathParam0, err = runtime.StyleParamWithLocation("simple", false, "tag_id", runtime.ParamLocationPath, tagId)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -2475,7 +2475,7 @@ func NewUpdateWorkerClusterRequestWithBody(server string, clusterId string, cont
return nil, err return nil, err
} }
operationPath := fmt.Sprintf("/api/v3/worker-mgt/cluster/%s", pathParam0) operationPath := fmt.Sprintf("/api/v3/worker-mgt/tag/%s", pathParam0)
if operationPath[0] == '/' { if operationPath[0] == '/' {
operationPath = "." + operationPath operationPath = "." + operationPath
} }
@ -2495,8 +2495,8 @@ func NewUpdateWorkerClusterRequestWithBody(server string, clusterId string, cont
return req, nil return req, nil
} }
// NewFetchWorkerClustersRequest generates requests for FetchWorkerClusters // NewFetchWorkerTagsRequest generates requests for FetchWorkerTags
func NewFetchWorkerClustersRequest(server string) (*http.Request, error) { func NewFetchWorkerTagsRequest(server string) (*http.Request, error) {
var err error var err error
serverURL, err := url.Parse(server) serverURL, err := url.Parse(server)
@ -2504,7 +2504,7 @@ func NewFetchWorkerClustersRequest(server string) (*http.Request, error) {
return nil, err return nil, err
} }
operationPath := fmt.Sprintf("/api/v3/worker-mgt/clusters") operationPath := fmt.Sprintf("/api/v3/worker-mgt/tags")
if operationPath[0] == '/' { if operationPath[0] == '/' {
operationPath = "." + operationPath operationPath = "." + operationPath
} }
@ -2522,19 +2522,19 @@ func NewFetchWorkerClustersRequest(server string) (*http.Request, error) {
return req, nil return req, nil
} }
// NewCreateWorkerClusterRequest calls the generic CreateWorkerCluster builder with application/json body // NewCreateWorkerTagRequest calls the generic CreateWorkerTag builder with application/json body
func NewCreateWorkerClusterRequest(server string, body CreateWorkerClusterJSONRequestBody) (*http.Request, error) { func NewCreateWorkerTagRequest(server string, body CreateWorkerTagJSONRequestBody) (*http.Request, error) {
var bodyReader io.Reader var bodyReader io.Reader
buf, err := json.Marshal(body) buf, err := json.Marshal(body)
if err != nil { if err != nil {
return nil, err return nil, err
} }
bodyReader = bytes.NewReader(buf) bodyReader = bytes.NewReader(buf)
return NewCreateWorkerClusterRequestWithBody(server, "application/json", bodyReader) return NewCreateWorkerTagRequestWithBody(server, "application/json", bodyReader)
} }
// NewCreateWorkerClusterRequestWithBody generates requests for CreateWorkerCluster with any type of body // NewCreateWorkerTagRequestWithBody generates requests for CreateWorkerTag with any type of body
func NewCreateWorkerClusterRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { func NewCreateWorkerTagRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) {
var err error var err error
serverURL, err := url.Parse(server) serverURL, err := url.Parse(server)
@ -2542,7 +2542,7 @@ func NewCreateWorkerClusterRequestWithBody(server string, contentType string, bo
return nil, err return nil, err
} }
operationPath := fmt.Sprintf("/api/v3/worker-mgt/clusters") operationPath := fmt.Sprintf("/api/v3/worker-mgt/tags")
if operationPath[0] == '/' { if operationPath[0] == '/' {
operationPath = "." + operationPath operationPath = "." + operationPath
} }
@ -2657,53 +2657,6 @@ func NewFetchWorkerRequest(server string, workerId string) (*http.Request, error
return req, nil return req, nil
} }
// NewSetWorkerClustersRequest calls the generic SetWorkerClusters builder with application/json body
func NewSetWorkerClustersRequest(server string, workerId string, body SetWorkerClustersJSONRequestBody) (*http.Request, error) {
var bodyReader io.Reader
buf, err := json.Marshal(body)
if err != nil {
return nil, err
}
bodyReader = bytes.NewReader(buf)
return NewSetWorkerClustersRequestWithBody(server, workerId, "application/json", bodyReader)
}
// NewSetWorkerClustersRequestWithBody generates requests for SetWorkerClusters with any type of body
func NewSetWorkerClustersRequestWithBody(server string, workerId string, contentType string, body io.Reader) (*http.Request, error) {
var err error
var pathParam0 string
pathParam0, err = runtime.StyleParamWithLocation("simple", false, "worker_id", runtime.ParamLocationPath, workerId)
if err != nil {
return nil, err
}
serverURL, err := url.Parse(server)
if err != nil {
return nil, err
}
operationPath := fmt.Sprintf("/api/v3/worker-mgt/workers/%s/setclusters", pathParam0)
if operationPath[0] == '/' {
operationPath = "." + operationPath
}
queryURL, err := serverURL.Parse(operationPath)
if err != nil {
return nil, err
}
req, err := http.NewRequest("POST", queryURL.String(), body)
if err != nil {
return nil, err
}
req.Header.Add("Content-Type", contentType)
return req, nil
}
// NewRequestWorkerStatusChangeRequest calls the generic RequestWorkerStatusChange builder with application/json body // NewRequestWorkerStatusChangeRequest calls the generic RequestWorkerStatusChange builder with application/json body
func NewRequestWorkerStatusChangeRequest(server string, workerId string, body RequestWorkerStatusChangeJSONRequestBody) (*http.Request, error) { func NewRequestWorkerStatusChangeRequest(server string, workerId string, body RequestWorkerStatusChangeJSONRequestBody) (*http.Request, error) {
var bodyReader io.Reader var bodyReader io.Reader
@ -2751,6 +2704,53 @@ func NewRequestWorkerStatusChangeRequestWithBody(server string, workerId string,
return req, nil return req, nil
} }
// NewSetWorkerTagsRequest calls the generic SetWorkerTags builder with application/json body
func NewSetWorkerTagsRequest(server string, workerId string, body SetWorkerTagsJSONRequestBody) (*http.Request, error) {
var bodyReader io.Reader
buf, err := json.Marshal(body)
if err != nil {
return nil, err
}
bodyReader = bytes.NewReader(buf)
return NewSetWorkerTagsRequestWithBody(server, workerId, "application/json", bodyReader)
}
// NewSetWorkerTagsRequestWithBody generates requests for SetWorkerTags with any type of body
func NewSetWorkerTagsRequestWithBody(server string, workerId string, contentType string, body io.Reader) (*http.Request, error) {
var err error
var pathParam0 string
pathParam0, err = runtime.StyleParamWithLocation("simple", false, "worker_id", runtime.ParamLocationPath, workerId)
if err != nil {
return nil, err
}
serverURL, err := url.Parse(server)
if err != nil {
return nil, err
}
operationPath := fmt.Sprintf("/api/v3/worker-mgt/workers/%s/settags", pathParam0)
if operationPath[0] == '/' {
operationPath = "." + operationPath
}
queryURL, err := serverURL.Parse(operationPath)
if err != nil {
return nil, err
}
req, err := http.NewRequest("POST", queryURL.String(), body)
if err != nil {
return nil, err
}
req.Header.Add("Content-Type", contentType)
return req, nil
}
// NewFetchWorkerSleepScheduleRequest generates requests for FetchWorkerSleepSchedule // NewFetchWorkerSleepScheduleRequest generates requests for FetchWorkerSleepSchedule
func NewFetchWorkerSleepScheduleRequest(server string, workerId string) (*http.Request, error) { func NewFetchWorkerSleepScheduleRequest(server string, workerId string) (*http.Request, error) {
var err error var err error
@ -3313,24 +3313,24 @@ type ClientWithResponsesInterface interface {
// GetVersion request // GetVersion request
GetVersionWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetVersionResponse, error) GetVersionWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetVersionResponse, error)
// DeleteWorkerCluster request // DeleteWorkerTag request
DeleteWorkerClusterWithResponse(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*DeleteWorkerClusterResponse, error) DeleteWorkerTagWithResponse(ctx context.Context, tagId string, reqEditors ...RequestEditorFn) (*DeleteWorkerTagResponse, error)
// FetchWorkerCluster request // FetchWorkerTag request
FetchWorkerClusterWithResponse(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*FetchWorkerClusterResponse, error) FetchWorkerTagWithResponse(ctx context.Context, tagId string, reqEditors ...RequestEditorFn) (*FetchWorkerTagResponse, error)
// UpdateWorkerCluster request with any body // UpdateWorkerTag request with any body
UpdateWorkerClusterWithBodyWithResponse(ctx context.Context, clusterId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateWorkerClusterResponse, error) UpdateWorkerTagWithBodyWithResponse(ctx context.Context, tagId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateWorkerTagResponse, error)
UpdateWorkerClusterWithResponse(ctx context.Context, clusterId string, body UpdateWorkerClusterJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateWorkerClusterResponse, error) UpdateWorkerTagWithResponse(ctx context.Context, tagId string, body UpdateWorkerTagJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateWorkerTagResponse, error)
// FetchWorkerClusters request // FetchWorkerTags request
FetchWorkerClustersWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*FetchWorkerClustersResponse, error) FetchWorkerTagsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*FetchWorkerTagsResponse, error)
// CreateWorkerCluster request with any body // CreateWorkerTag request with any body
CreateWorkerClusterWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateWorkerClusterResponse, error) CreateWorkerTagWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateWorkerTagResponse, error)
CreateWorkerClusterWithResponse(ctx context.Context, body CreateWorkerClusterJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateWorkerClusterResponse, error) CreateWorkerTagWithResponse(ctx context.Context, body CreateWorkerTagJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateWorkerTagResponse, error)
// FetchWorkers request // FetchWorkers request
FetchWorkersWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*FetchWorkersResponse, error) FetchWorkersWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*FetchWorkersResponse, error)
@ -3341,16 +3341,16 @@ type ClientWithResponsesInterface interface {
// FetchWorker request // FetchWorker request
FetchWorkerWithResponse(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*FetchWorkerResponse, error) FetchWorkerWithResponse(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*FetchWorkerResponse, error)
// SetWorkerClusters request with any body
SetWorkerClustersWithBodyWithResponse(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SetWorkerClustersResponse, error)
SetWorkerClustersWithResponse(ctx context.Context, workerId string, body SetWorkerClustersJSONRequestBody, reqEditors ...RequestEditorFn) (*SetWorkerClustersResponse, error)
// RequestWorkerStatusChange request with any body // RequestWorkerStatusChange request with any body
RequestWorkerStatusChangeWithBodyWithResponse(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*RequestWorkerStatusChangeResponse, error) RequestWorkerStatusChangeWithBodyWithResponse(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*RequestWorkerStatusChangeResponse, error)
RequestWorkerStatusChangeWithResponse(ctx context.Context, workerId string, body RequestWorkerStatusChangeJSONRequestBody, reqEditors ...RequestEditorFn) (*RequestWorkerStatusChangeResponse, error) RequestWorkerStatusChangeWithResponse(ctx context.Context, workerId string, body RequestWorkerStatusChangeJSONRequestBody, reqEditors ...RequestEditorFn) (*RequestWorkerStatusChangeResponse, error)
// SetWorkerTags request with any body
SetWorkerTagsWithBodyWithResponse(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SetWorkerTagsResponse, error)
SetWorkerTagsWithResponse(ctx context.Context, workerId string, body SetWorkerTagsJSONRequestBody, reqEditors ...RequestEditorFn) (*SetWorkerTagsResponse, error)
// FetchWorkerSleepSchedule request // FetchWorkerSleepSchedule request
FetchWorkerSleepScheduleWithResponse(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*FetchWorkerSleepScheduleResponse, error) FetchWorkerSleepScheduleWithResponse(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*FetchWorkerSleepScheduleResponse, error)
@ -4118,14 +4118,14 @@ func (r GetVersionResponse) StatusCode() int {
return 0 return 0
} }
type DeleteWorkerClusterResponse struct { type DeleteWorkerTagResponse struct {
Body []byte Body []byte
HTTPResponse *http.Response HTTPResponse *http.Response
JSONDefault *Error JSONDefault *Error
} }
// Status returns HTTPResponse.Status // Status returns HTTPResponse.Status
func (r DeleteWorkerClusterResponse) Status() string { func (r DeleteWorkerTagResponse) Status() string {
if r.HTTPResponse != nil { if r.HTTPResponse != nil {
return r.HTTPResponse.Status return r.HTTPResponse.Status
} }
@ -4133,21 +4133,21 @@ func (r DeleteWorkerClusterResponse) Status() string {
} }
// StatusCode returns HTTPResponse.StatusCode // StatusCode returns HTTPResponse.StatusCode
func (r DeleteWorkerClusterResponse) StatusCode() int { func (r DeleteWorkerTagResponse) StatusCode() int {
if r.HTTPResponse != nil { if r.HTTPResponse != nil {
return r.HTTPResponse.StatusCode return r.HTTPResponse.StatusCode
} }
return 0 return 0
} }
type FetchWorkerClusterResponse struct { type FetchWorkerTagResponse struct {
Body []byte Body []byte
HTTPResponse *http.Response HTTPResponse *http.Response
JSON200 *WorkerCluster JSON200 *WorkerTag
} }
// Status returns HTTPResponse.Status // Status returns HTTPResponse.Status
func (r FetchWorkerClusterResponse) Status() string { func (r FetchWorkerTagResponse) Status() string {
if r.HTTPResponse != nil { if r.HTTPResponse != nil {
return r.HTTPResponse.Status return r.HTTPResponse.Status
} }
@ -4155,21 +4155,21 @@ func (r FetchWorkerClusterResponse) Status() string {
} }
// StatusCode returns HTTPResponse.StatusCode // StatusCode returns HTTPResponse.StatusCode
func (r FetchWorkerClusterResponse) StatusCode() int { func (r FetchWorkerTagResponse) StatusCode() int {
if r.HTTPResponse != nil { if r.HTTPResponse != nil {
return r.HTTPResponse.StatusCode return r.HTTPResponse.StatusCode
} }
return 0 return 0
} }
type UpdateWorkerClusterResponse struct { type UpdateWorkerTagResponse struct {
Body []byte Body []byte
HTTPResponse *http.Response HTTPResponse *http.Response
JSONDefault *Error JSONDefault *Error
} }
// Status returns HTTPResponse.Status // Status returns HTTPResponse.Status
func (r UpdateWorkerClusterResponse) Status() string { func (r UpdateWorkerTagResponse) Status() string {
if r.HTTPResponse != nil { if r.HTTPResponse != nil {
return r.HTTPResponse.Status return r.HTTPResponse.Status
} }
@ -4177,21 +4177,21 @@ func (r UpdateWorkerClusterResponse) Status() string {
} }
// StatusCode returns HTTPResponse.StatusCode // StatusCode returns HTTPResponse.StatusCode
func (r UpdateWorkerClusterResponse) StatusCode() int { func (r UpdateWorkerTagResponse) StatusCode() int {
if r.HTTPResponse != nil { if r.HTTPResponse != nil {
return r.HTTPResponse.StatusCode return r.HTTPResponse.StatusCode
} }
return 0 return 0
} }
type FetchWorkerClustersResponse struct { type FetchWorkerTagsResponse struct {
Body []byte Body []byte
HTTPResponse *http.Response HTTPResponse *http.Response
JSON200 *WorkerClusterList JSON200 *WorkerTagList
} }
// Status returns HTTPResponse.Status // Status returns HTTPResponse.Status
func (r FetchWorkerClustersResponse) Status() string { func (r FetchWorkerTagsResponse) Status() string {
if r.HTTPResponse != nil { if r.HTTPResponse != nil {
return r.HTTPResponse.Status return r.HTTPResponse.Status
} }
@ -4199,22 +4199,22 @@ func (r FetchWorkerClustersResponse) Status() string {
} }
// StatusCode returns HTTPResponse.StatusCode // StatusCode returns HTTPResponse.StatusCode
func (r FetchWorkerClustersResponse) StatusCode() int { func (r FetchWorkerTagsResponse) StatusCode() int {
if r.HTTPResponse != nil { if r.HTTPResponse != nil {
return r.HTTPResponse.StatusCode return r.HTTPResponse.StatusCode
} }
return 0 return 0
} }
type CreateWorkerClusterResponse struct { type CreateWorkerTagResponse struct {
Body []byte Body []byte
HTTPResponse *http.Response HTTPResponse *http.Response
JSON200 *WorkerCluster JSON200 *WorkerTag
JSONDefault *Error JSONDefault *Error
} }
// Status returns HTTPResponse.Status // Status returns HTTPResponse.Status
func (r CreateWorkerClusterResponse) Status() string { func (r CreateWorkerTagResponse) Status() string {
if r.HTTPResponse != nil { if r.HTTPResponse != nil {
return r.HTTPResponse.Status return r.HTTPResponse.Status
} }
@ -4222,7 +4222,7 @@ func (r CreateWorkerClusterResponse) Status() string {
} }
// StatusCode returns HTTPResponse.StatusCode // StatusCode returns HTTPResponse.StatusCode
func (r CreateWorkerClusterResponse) StatusCode() int { func (r CreateWorkerTagResponse) StatusCode() int {
if r.HTTPResponse != nil { if r.HTTPResponse != nil {
return r.HTTPResponse.StatusCode return r.HTTPResponse.StatusCode
} }
@ -4295,28 +4295,6 @@ func (r FetchWorkerResponse) StatusCode() int {
return 0 return 0
} }
type SetWorkerClustersResponse struct {
Body []byte
HTTPResponse *http.Response
JSONDefault *Error
}
// Status returns HTTPResponse.Status
func (r SetWorkerClustersResponse) Status() string {
if r.HTTPResponse != nil {
return r.HTTPResponse.Status
}
return http.StatusText(0)
}
// StatusCode returns HTTPResponse.StatusCode
func (r SetWorkerClustersResponse) StatusCode() int {
if r.HTTPResponse != nil {
return r.HTTPResponse.StatusCode
}
return 0
}
type RequestWorkerStatusChangeResponse struct { type RequestWorkerStatusChangeResponse struct {
Body []byte Body []byte
HTTPResponse *http.Response HTTPResponse *http.Response
@ -4339,6 +4317,28 @@ func (r RequestWorkerStatusChangeResponse) StatusCode() int {
return 0 return 0
} }
type SetWorkerTagsResponse struct {
Body []byte
HTTPResponse *http.Response
JSONDefault *Error
}
// Status returns HTTPResponse.Status
func (r SetWorkerTagsResponse) Status() string {
if r.HTTPResponse != nil {
return r.HTTPResponse.Status
}
return http.StatusText(0)
}
// StatusCode returns HTTPResponse.StatusCode
func (r SetWorkerTagsResponse) StatusCode() int {
if r.HTTPResponse != nil {
return r.HTTPResponse.StatusCode
}
return 0
}
type FetchWorkerSleepScheduleResponse struct { type FetchWorkerSleepScheduleResponse struct {
Body []byte Body []byte
HTTPResponse *http.Response HTTPResponse *http.Response
@ -4976,65 +4976,65 @@ func (c *ClientWithResponses) GetVersionWithResponse(ctx context.Context, reqEdi
return ParseGetVersionResponse(rsp) return ParseGetVersionResponse(rsp)
} }
// DeleteWorkerClusterWithResponse request returning *DeleteWorkerClusterResponse // DeleteWorkerTagWithResponse request returning *DeleteWorkerTagResponse
func (c *ClientWithResponses) DeleteWorkerClusterWithResponse(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*DeleteWorkerClusterResponse, error) { func (c *ClientWithResponses) DeleteWorkerTagWithResponse(ctx context.Context, tagId string, reqEditors ...RequestEditorFn) (*DeleteWorkerTagResponse, error) {
rsp, err := c.DeleteWorkerCluster(ctx, clusterId, reqEditors...) rsp, err := c.DeleteWorkerTag(ctx, tagId, reqEditors...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return ParseDeleteWorkerClusterResponse(rsp) return ParseDeleteWorkerTagResponse(rsp)
} }
// FetchWorkerClusterWithResponse request returning *FetchWorkerClusterResponse // FetchWorkerTagWithResponse request returning *FetchWorkerTagResponse
func (c *ClientWithResponses) FetchWorkerClusterWithResponse(ctx context.Context, clusterId string, reqEditors ...RequestEditorFn) (*FetchWorkerClusterResponse, error) { func (c *ClientWithResponses) FetchWorkerTagWithResponse(ctx context.Context, tagId string, reqEditors ...RequestEditorFn) (*FetchWorkerTagResponse, error) {
rsp, err := c.FetchWorkerCluster(ctx, clusterId, reqEditors...) rsp, err := c.FetchWorkerTag(ctx, tagId, reqEditors...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return ParseFetchWorkerClusterResponse(rsp) return ParseFetchWorkerTagResponse(rsp)
} }
// UpdateWorkerClusterWithBodyWithResponse request with arbitrary body returning *UpdateWorkerClusterResponse // UpdateWorkerTagWithBodyWithResponse request with arbitrary body returning *UpdateWorkerTagResponse
func (c *ClientWithResponses) UpdateWorkerClusterWithBodyWithResponse(ctx context.Context, clusterId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateWorkerClusterResponse, error) { func (c *ClientWithResponses) UpdateWorkerTagWithBodyWithResponse(ctx context.Context, tagId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateWorkerTagResponse, error) {
rsp, err := c.UpdateWorkerClusterWithBody(ctx, clusterId, contentType, body, reqEditors...) rsp, err := c.UpdateWorkerTagWithBody(ctx, tagId, contentType, body, reqEditors...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return ParseUpdateWorkerClusterResponse(rsp) return ParseUpdateWorkerTagResponse(rsp)
} }
func (c *ClientWithResponses) UpdateWorkerClusterWithResponse(ctx context.Context, clusterId string, body UpdateWorkerClusterJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateWorkerClusterResponse, error) { func (c *ClientWithResponses) UpdateWorkerTagWithResponse(ctx context.Context, tagId string, body UpdateWorkerTagJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateWorkerTagResponse, error) {
rsp, err := c.UpdateWorkerCluster(ctx, clusterId, body, reqEditors...) rsp, err := c.UpdateWorkerTag(ctx, tagId, body, reqEditors...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return ParseUpdateWorkerClusterResponse(rsp) return ParseUpdateWorkerTagResponse(rsp)
} }
// FetchWorkerClustersWithResponse request returning *FetchWorkerClustersResponse // FetchWorkerTagsWithResponse request returning *FetchWorkerTagsResponse
func (c *ClientWithResponses) FetchWorkerClustersWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*FetchWorkerClustersResponse, error) { func (c *ClientWithResponses) FetchWorkerTagsWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*FetchWorkerTagsResponse, error) {
rsp, err := c.FetchWorkerClusters(ctx, reqEditors...) rsp, err := c.FetchWorkerTags(ctx, reqEditors...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return ParseFetchWorkerClustersResponse(rsp) return ParseFetchWorkerTagsResponse(rsp)
} }
// CreateWorkerClusterWithBodyWithResponse request with arbitrary body returning *CreateWorkerClusterResponse // CreateWorkerTagWithBodyWithResponse request with arbitrary body returning *CreateWorkerTagResponse
func (c *ClientWithResponses) CreateWorkerClusterWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateWorkerClusterResponse, error) { func (c *ClientWithResponses) CreateWorkerTagWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateWorkerTagResponse, error) {
rsp, err := c.CreateWorkerClusterWithBody(ctx, contentType, body, reqEditors...) rsp, err := c.CreateWorkerTagWithBody(ctx, contentType, body, reqEditors...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return ParseCreateWorkerClusterResponse(rsp) return ParseCreateWorkerTagResponse(rsp)
} }
func (c *ClientWithResponses) CreateWorkerClusterWithResponse(ctx context.Context, body CreateWorkerClusterJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateWorkerClusterResponse, error) { func (c *ClientWithResponses) CreateWorkerTagWithResponse(ctx context.Context, body CreateWorkerTagJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateWorkerTagResponse, error) {
rsp, err := c.CreateWorkerCluster(ctx, body, reqEditors...) rsp, err := c.CreateWorkerTag(ctx, body, reqEditors...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return ParseCreateWorkerClusterResponse(rsp) return ParseCreateWorkerTagResponse(rsp)
} }
// FetchWorkersWithResponse request returning *FetchWorkersResponse // FetchWorkersWithResponse request returning *FetchWorkersResponse
@ -5064,23 +5064,6 @@ func (c *ClientWithResponses) FetchWorkerWithResponse(ctx context.Context, worke
return ParseFetchWorkerResponse(rsp) return ParseFetchWorkerResponse(rsp)
} }
// SetWorkerClustersWithBodyWithResponse request with arbitrary body returning *SetWorkerClustersResponse
func (c *ClientWithResponses) SetWorkerClustersWithBodyWithResponse(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SetWorkerClustersResponse, error) {
rsp, err := c.SetWorkerClustersWithBody(ctx, workerId, contentType, body, reqEditors...)
if err != nil {
return nil, err
}
return ParseSetWorkerClustersResponse(rsp)
}
func (c *ClientWithResponses) SetWorkerClustersWithResponse(ctx context.Context, workerId string, body SetWorkerClustersJSONRequestBody, reqEditors ...RequestEditorFn) (*SetWorkerClustersResponse, error) {
rsp, err := c.SetWorkerClusters(ctx, workerId, body, reqEditors...)
if err != nil {
return nil, err
}
return ParseSetWorkerClustersResponse(rsp)
}
// RequestWorkerStatusChangeWithBodyWithResponse request with arbitrary body returning *RequestWorkerStatusChangeResponse // RequestWorkerStatusChangeWithBodyWithResponse request with arbitrary body returning *RequestWorkerStatusChangeResponse
func (c *ClientWithResponses) RequestWorkerStatusChangeWithBodyWithResponse(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*RequestWorkerStatusChangeResponse, error) { func (c *ClientWithResponses) RequestWorkerStatusChangeWithBodyWithResponse(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*RequestWorkerStatusChangeResponse, error) {
rsp, err := c.RequestWorkerStatusChangeWithBody(ctx, workerId, contentType, body, reqEditors...) rsp, err := c.RequestWorkerStatusChangeWithBody(ctx, workerId, contentType, body, reqEditors...)
@ -5098,6 +5081,23 @@ func (c *ClientWithResponses) RequestWorkerStatusChangeWithResponse(ctx context.
return ParseRequestWorkerStatusChangeResponse(rsp) return ParseRequestWorkerStatusChangeResponse(rsp)
} }
// SetWorkerTagsWithBodyWithResponse request with arbitrary body returning *SetWorkerTagsResponse
func (c *ClientWithResponses) SetWorkerTagsWithBodyWithResponse(ctx context.Context, workerId string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*SetWorkerTagsResponse, error) {
rsp, err := c.SetWorkerTagsWithBody(ctx, workerId, contentType, body, reqEditors...)
if err != nil {
return nil, err
}
return ParseSetWorkerTagsResponse(rsp)
}
func (c *ClientWithResponses) SetWorkerTagsWithResponse(ctx context.Context, workerId string, body SetWorkerTagsJSONRequestBody, reqEditors ...RequestEditorFn) (*SetWorkerTagsResponse, error) {
rsp, err := c.SetWorkerTags(ctx, workerId, body, reqEditors...)
if err != nil {
return nil, err
}
return ParseSetWorkerTagsResponse(rsp)
}
// FetchWorkerSleepScheduleWithResponse request returning *FetchWorkerSleepScheduleResponse // FetchWorkerSleepScheduleWithResponse request returning *FetchWorkerSleepScheduleResponse
func (c *ClientWithResponses) FetchWorkerSleepScheduleWithResponse(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*FetchWorkerSleepScheduleResponse, error) { func (c *ClientWithResponses) FetchWorkerSleepScheduleWithResponse(ctx context.Context, workerId string, reqEditors ...RequestEditorFn) (*FetchWorkerSleepScheduleResponse, error) {
rsp, err := c.FetchWorkerSleepSchedule(ctx, workerId, reqEditors...) rsp, err := c.FetchWorkerSleepSchedule(ctx, workerId, reqEditors...)
@ -6190,15 +6190,15 @@ func ParseGetVersionResponse(rsp *http.Response) (*GetVersionResponse, error) {
return response, nil return response, nil
} }
// ParseDeleteWorkerClusterResponse parses an HTTP response from a DeleteWorkerClusterWithResponse call // ParseDeleteWorkerTagResponse parses an HTTP response from a DeleteWorkerTagWithResponse call
func ParseDeleteWorkerClusterResponse(rsp *http.Response) (*DeleteWorkerClusterResponse, error) { func ParseDeleteWorkerTagResponse(rsp *http.Response) (*DeleteWorkerTagResponse, error) {
bodyBytes, err := ioutil.ReadAll(rsp.Body) bodyBytes, err := ioutil.ReadAll(rsp.Body)
defer func() { _ = rsp.Body.Close() }() defer func() { _ = rsp.Body.Close() }()
if err != nil { if err != nil {
return nil, err return nil, err
} }
response := &DeleteWorkerClusterResponse{ response := &DeleteWorkerTagResponse{
Body: bodyBytes, Body: bodyBytes,
HTTPResponse: rsp, HTTPResponse: rsp,
} }
@ -6216,22 +6216,22 @@ func ParseDeleteWorkerClusterResponse(rsp *http.Response) (*DeleteWorkerClusterR
return response, nil return response, nil
} }
// ParseFetchWorkerClusterResponse parses an HTTP response from a FetchWorkerClusterWithResponse call // ParseFetchWorkerTagResponse parses an HTTP response from a FetchWorkerTagWithResponse call
func ParseFetchWorkerClusterResponse(rsp *http.Response) (*FetchWorkerClusterResponse, error) { func ParseFetchWorkerTagResponse(rsp *http.Response) (*FetchWorkerTagResponse, error) {
bodyBytes, err := ioutil.ReadAll(rsp.Body) bodyBytes, err := ioutil.ReadAll(rsp.Body)
defer func() { _ = rsp.Body.Close() }() defer func() { _ = rsp.Body.Close() }()
if err != nil { if err != nil {
return nil, err return nil, err
} }
response := &FetchWorkerClusterResponse{ response := &FetchWorkerTagResponse{
Body: bodyBytes, Body: bodyBytes,
HTTPResponse: rsp, HTTPResponse: rsp,
} }
switch { switch {
case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200:
var dest WorkerCluster var dest WorkerTag
if err := json.Unmarshal(bodyBytes, &dest); err != nil { if err := json.Unmarshal(bodyBytes, &dest); err != nil {
return nil, err return nil, err
} }
@ -6242,15 +6242,15 @@ func ParseFetchWorkerClusterResponse(rsp *http.Response) (*FetchWorkerClusterRes
return response, nil return response, nil
} }
// ParseUpdateWorkerClusterResponse parses an HTTP response from a UpdateWorkerClusterWithResponse call // ParseUpdateWorkerTagResponse parses an HTTP response from a UpdateWorkerTagWithResponse call
func ParseUpdateWorkerClusterResponse(rsp *http.Response) (*UpdateWorkerClusterResponse, error) { func ParseUpdateWorkerTagResponse(rsp *http.Response) (*UpdateWorkerTagResponse, error) {
bodyBytes, err := ioutil.ReadAll(rsp.Body) bodyBytes, err := ioutil.ReadAll(rsp.Body)
defer func() { _ = rsp.Body.Close() }() defer func() { _ = rsp.Body.Close() }()
if err != nil { if err != nil {
return nil, err return nil, err
} }
response := &UpdateWorkerClusterResponse{ response := &UpdateWorkerTagResponse{
Body: bodyBytes, Body: bodyBytes,
HTTPResponse: rsp, HTTPResponse: rsp,
} }
@ -6268,22 +6268,22 @@ func ParseUpdateWorkerClusterResponse(rsp *http.Response) (*UpdateWorkerClusterR
return response, nil return response, nil
} }
// ParseFetchWorkerClustersResponse parses an HTTP response from a FetchWorkerClustersWithResponse call // ParseFetchWorkerTagsResponse parses an HTTP response from a FetchWorkerTagsWithResponse call
func ParseFetchWorkerClustersResponse(rsp *http.Response) (*FetchWorkerClustersResponse, error) { func ParseFetchWorkerTagsResponse(rsp *http.Response) (*FetchWorkerTagsResponse, error) {
bodyBytes, err := ioutil.ReadAll(rsp.Body) bodyBytes, err := ioutil.ReadAll(rsp.Body)
defer func() { _ = rsp.Body.Close() }() defer func() { _ = rsp.Body.Close() }()
if err != nil { if err != nil {
return nil, err return nil, err
} }
response := &FetchWorkerClustersResponse{ response := &FetchWorkerTagsResponse{
Body: bodyBytes, Body: bodyBytes,
HTTPResponse: rsp, HTTPResponse: rsp,
} }
switch { switch {
case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200:
var dest WorkerClusterList var dest WorkerTagList
if err := json.Unmarshal(bodyBytes, &dest); err != nil { if err := json.Unmarshal(bodyBytes, &dest); err != nil {
return nil, err return nil, err
} }
@ -6294,22 +6294,22 @@ func ParseFetchWorkerClustersResponse(rsp *http.Response) (*FetchWorkerClustersR
return response, nil return response, nil
} }
// ParseCreateWorkerClusterResponse parses an HTTP response from a CreateWorkerClusterWithResponse call // ParseCreateWorkerTagResponse parses an HTTP response from a CreateWorkerTagWithResponse call
func ParseCreateWorkerClusterResponse(rsp *http.Response) (*CreateWorkerClusterResponse, error) { func ParseCreateWorkerTagResponse(rsp *http.Response) (*CreateWorkerTagResponse, error) {
bodyBytes, err := ioutil.ReadAll(rsp.Body) bodyBytes, err := ioutil.ReadAll(rsp.Body)
defer func() { _ = rsp.Body.Close() }() defer func() { _ = rsp.Body.Close() }()
if err != nil { if err != nil {
return nil, err return nil, err
} }
response := &CreateWorkerClusterResponse{ response := &CreateWorkerTagResponse{
Body: bodyBytes, Body: bodyBytes,
HTTPResponse: rsp, HTTPResponse: rsp,
} }
switch { switch {
case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200:
var dest WorkerCluster var dest WorkerTag
if err := json.Unmarshal(bodyBytes, &dest); err != nil { if err := json.Unmarshal(bodyBytes, &dest); err != nil {
return nil, err return nil, err
} }
@ -6405,15 +6405,15 @@ func ParseFetchWorkerResponse(rsp *http.Response) (*FetchWorkerResponse, error)
return response, nil return response, nil
} }
// ParseSetWorkerClustersResponse parses an HTTP response from a SetWorkerClustersWithResponse call // ParseRequestWorkerStatusChangeResponse parses an HTTP response from a RequestWorkerStatusChangeWithResponse call
func ParseSetWorkerClustersResponse(rsp *http.Response) (*SetWorkerClustersResponse, error) { func ParseRequestWorkerStatusChangeResponse(rsp *http.Response) (*RequestWorkerStatusChangeResponse, error) {
bodyBytes, err := ioutil.ReadAll(rsp.Body) bodyBytes, err := ioutil.ReadAll(rsp.Body)
defer func() { _ = rsp.Body.Close() }() defer func() { _ = rsp.Body.Close() }()
if err != nil { if err != nil {
return nil, err return nil, err
} }
response := &SetWorkerClustersResponse{ response := &RequestWorkerStatusChangeResponse{
Body: bodyBytes, Body: bodyBytes,
HTTPResponse: rsp, HTTPResponse: rsp,
} }
@ -6431,15 +6431,15 @@ func ParseSetWorkerClustersResponse(rsp *http.Response) (*SetWorkerClustersRespo
return response, nil return response, nil
} }
// ParseRequestWorkerStatusChangeResponse parses an HTTP response from a RequestWorkerStatusChangeWithResponse call // ParseSetWorkerTagsResponse parses an HTTP response from a SetWorkerTagsWithResponse call
func ParseRequestWorkerStatusChangeResponse(rsp *http.Response) (*RequestWorkerStatusChangeResponse, error) { func ParseSetWorkerTagsResponse(rsp *http.Response) (*SetWorkerTagsResponse, error) {
bodyBytes, err := ioutil.ReadAll(rsp.Body) bodyBytes, err := ioutil.ReadAll(rsp.Body)
defer func() { _ = rsp.Body.Close() }() defer func() { _ = rsp.Body.Close() }()
if err != nil { if err != nil {
return nil, err return nil, err
} }
response := &RequestWorkerStatusChangeResponse{ response := &SetWorkerTagsResponse{
Body: bodyBytes, Body: bodyBytes,
HTTPResponse: rsp, HTTPResponse: rsp,
} }

View File

@ -110,21 +110,21 @@ type ServerInterface interface {
// Get the Flamenco version of this Manager // Get the Flamenco version of this Manager
// (GET /api/v3/version) // (GET /api/v3/version)
GetVersion(ctx echo.Context) error GetVersion(ctx echo.Context) error
// Remove this worker cluster. This unassigns all workers from the cluster and removes it. // Remove this worker tag. This unassigns all workers from the tag and removes it.
// (DELETE /api/v3/worker-mgt/cluster/{cluster_id}) // (DELETE /api/v3/worker-mgt/tag/{tag_id})
DeleteWorkerCluster(ctx echo.Context, clusterId string) error DeleteWorkerTag(ctx echo.Context, tagId string) error
// Get a single worker cluster. // Get a single worker tag.
// (GET /api/v3/worker-mgt/cluster/{cluster_id}) // (GET /api/v3/worker-mgt/tag/{tag_id})
FetchWorkerCluster(ctx echo.Context, clusterId string) error FetchWorkerTag(ctx echo.Context, tagId string) error
// Update an existing worker cluster. // Update an existing worker tag.
// (PUT /api/v3/worker-mgt/cluster/{cluster_id}) // (PUT /api/v3/worker-mgt/tag/{tag_id})
UpdateWorkerCluster(ctx echo.Context, clusterId string) error UpdateWorkerTag(ctx echo.Context, tagId string) error
// Get list of worker clusters. // Get list of worker tags.
// (GET /api/v3/worker-mgt/clusters) // (GET /api/v3/worker-mgt/tags)
FetchWorkerClusters(ctx echo.Context) error FetchWorkerTags(ctx echo.Context) error
// Create a new worker cluster. // Create a new worker tag.
// (POST /api/v3/worker-mgt/clusters) // (POST /api/v3/worker-mgt/tags)
CreateWorkerCluster(ctx echo.Context) error CreateWorkerTag(ctx echo.Context) error
// Get list of workers. // Get list of workers.
// (GET /api/v3/worker-mgt/workers) // (GET /api/v3/worker-mgt/workers)
FetchWorkers(ctx echo.Context) error FetchWorkers(ctx echo.Context) error
@ -135,12 +135,12 @@ type ServerInterface interface {
// (GET /api/v3/worker-mgt/workers/{worker_id}) // (GET /api/v3/worker-mgt/workers/{worker_id})
FetchWorker(ctx echo.Context, workerId string) error FetchWorker(ctx echo.Context, workerId string) error
// (POST /api/v3/worker-mgt/workers/{worker_id}/setclusters)
SetWorkerClusters(ctx echo.Context, workerId string) error
// (POST /api/v3/worker-mgt/workers/{worker_id}/setstatus) // (POST /api/v3/worker-mgt/workers/{worker_id}/setstatus)
RequestWorkerStatusChange(ctx echo.Context, workerId string) error RequestWorkerStatusChange(ctx echo.Context, workerId string) error
// (POST /api/v3/worker-mgt/workers/{worker_id}/settags)
SetWorkerTags(ctx echo.Context, workerId string) error
// (GET /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule) // (GET /api/v3/worker-mgt/workers/{worker_id}/sleep-schedule)
FetchWorkerSleepSchedule(ctx echo.Context, workerId string) error FetchWorkerSleepSchedule(ctx echo.Context, workerId string) error
@ -661,69 +661,69 @@ func (w *ServerInterfaceWrapper) GetVersion(ctx echo.Context) error {
return err return err
} }
// DeleteWorkerCluster converts echo context to params. // DeleteWorkerTag converts echo context to params.
func (w *ServerInterfaceWrapper) DeleteWorkerCluster(ctx echo.Context) error { func (w *ServerInterfaceWrapper) DeleteWorkerTag(ctx echo.Context) error {
var err error var err error
// ------------- Path parameter "cluster_id" ------------- // ------------- Path parameter "tag_id" -------------
var clusterId string var tagId string
err = runtime.BindStyledParameterWithLocation("simple", false, "cluster_id", runtime.ParamLocationPath, ctx.Param("cluster_id"), &clusterId) err = runtime.BindStyledParameterWithLocation("simple", false, "tag_id", runtime.ParamLocationPath, ctx.Param("tag_id"), &tagId)
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter cluster_id: %s", err)) return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter tag_id: %s", err))
} }
// Invoke the callback with all the unmarshalled arguments // Invoke the callback with all the unmarshalled arguments
err = w.Handler.DeleteWorkerCluster(ctx, clusterId) err = w.Handler.DeleteWorkerTag(ctx, tagId)
return err return err
} }
// FetchWorkerCluster converts echo context to params. // FetchWorkerTag converts echo context to params.
func (w *ServerInterfaceWrapper) FetchWorkerCluster(ctx echo.Context) error { func (w *ServerInterfaceWrapper) FetchWorkerTag(ctx echo.Context) error {
var err error var err error
// ------------- Path parameter "cluster_id" ------------- // ------------- Path parameter "tag_id" -------------
var clusterId string var tagId string
err = runtime.BindStyledParameterWithLocation("simple", false, "cluster_id", runtime.ParamLocationPath, ctx.Param("cluster_id"), &clusterId) err = runtime.BindStyledParameterWithLocation("simple", false, "tag_id", runtime.ParamLocationPath, ctx.Param("tag_id"), &tagId)
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter cluster_id: %s", err)) return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter tag_id: %s", err))
} }
// Invoke the callback with all the unmarshalled arguments // Invoke the callback with all the unmarshalled arguments
err = w.Handler.FetchWorkerCluster(ctx, clusterId) err = w.Handler.FetchWorkerTag(ctx, tagId)
return err return err
} }
// UpdateWorkerCluster converts echo context to params. // UpdateWorkerTag converts echo context to params.
func (w *ServerInterfaceWrapper) UpdateWorkerCluster(ctx echo.Context) error { func (w *ServerInterfaceWrapper) UpdateWorkerTag(ctx echo.Context) error {
var err error var err error
// ------------- Path parameter "cluster_id" ------------- // ------------- Path parameter "tag_id" -------------
var clusterId string var tagId string
err = runtime.BindStyledParameterWithLocation("simple", false, "cluster_id", runtime.ParamLocationPath, ctx.Param("cluster_id"), &clusterId) err = runtime.BindStyledParameterWithLocation("simple", false, "tag_id", runtime.ParamLocationPath, ctx.Param("tag_id"), &tagId)
if err != nil { if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter cluster_id: %s", err)) return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter tag_id: %s", err))
} }
// Invoke the callback with all the unmarshalled arguments // Invoke the callback with all the unmarshalled arguments
err = w.Handler.UpdateWorkerCluster(ctx, clusterId) err = w.Handler.UpdateWorkerTag(ctx, tagId)
return err return err
} }
// FetchWorkerClusters converts echo context to params. // FetchWorkerTags converts echo context to params.
func (w *ServerInterfaceWrapper) FetchWorkerClusters(ctx echo.Context) error { func (w *ServerInterfaceWrapper) FetchWorkerTags(ctx echo.Context) error {
var err error var err error
// Invoke the callback with all the unmarshalled arguments // Invoke the callback with all the unmarshalled arguments
err = w.Handler.FetchWorkerClusters(ctx) err = w.Handler.FetchWorkerTags(ctx)
return err return err
} }
// CreateWorkerCluster converts echo context to params. // CreateWorkerTag converts echo context to params.
func (w *ServerInterfaceWrapper) CreateWorkerCluster(ctx echo.Context) error { func (w *ServerInterfaceWrapper) CreateWorkerTag(ctx echo.Context) error {
var err error var err error
// Invoke the callback with all the unmarshalled arguments // Invoke the callback with all the unmarshalled arguments
err = w.Handler.CreateWorkerCluster(ctx) err = w.Handler.CreateWorkerTag(ctx)
return err return err
} }
@ -768,22 +768,6 @@ func (w *ServerInterfaceWrapper) FetchWorker(ctx echo.Context) error {
return err return err
} }
// SetWorkerClusters converts echo context to params.
func (w *ServerInterfaceWrapper) SetWorkerClusters(ctx echo.Context) error {
var err error
// ------------- Path parameter "worker_id" -------------
var workerId string
err = runtime.BindStyledParameterWithLocation("simple", false, "worker_id", runtime.ParamLocationPath, ctx.Param("worker_id"), &workerId)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter worker_id: %s", err))
}
// Invoke the callback with all the unmarshalled arguments
err = w.Handler.SetWorkerClusters(ctx, workerId)
return err
}
// RequestWorkerStatusChange converts echo context to params. // RequestWorkerStatusChange converts echo context to params.
func (w *ServerInterfaceWrapper) RequestWorkerStatusChange(ctx echo.Context) error { func (w *ServerInterfaceWrapper) RequestWorkerStatusChange(ctx echo.Context) error {
var err error var err error
@ -800,6 +784,22 @@ func (w *ServerInterfaceWrapper) RequestWorkerStatusChange(ctx echo.Context) err
return err return err
} }
// SetWorkerTags converts echo context to params.
func (w *ServerInterfaceWrapper) SetWorkerTags(ctx echo.Context) error {
var err error
// ------------- Path parameter "worker_id" -------------
var workerId string
err = runtime.BindStyledParameterWithLocation("simple", false, "worker_id", runtime.ParamLocationPath, ctx.Param("worker_id"), &workerId)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter worker_id: %s", err))
}
// Invoke the callback with all the unmarshalled arguments
err = w.Handler.SetWorkerTags(ctx, workerId)
return err
}
// FetchWorkerSleepSchedule converts echo context to params. // FetchWorkerSleepSchedule converts echo context to params.
func (w *ServerInterfaceWrapper) FetchWorkerSleepSchedule(ctx echo.Context) error { func (w *ServerInterfaceWrapper) FetchWorkerSleepSchedule(ctx echo.Context) error {
var err error var err error
@ -1010,16 +1010,16 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
router.GET(baseURL+"/api/v3/tasks/:task_id/logtail", wrapper.FetchTaskLogTail) router.GET(baseURL+"/api/v3/tasks/:task_id/logtail", wrapper.FetchTaskLogTail)
router.POST(baseURL+"/api/v3/tasks/:task_id/setstatus", wrapper.SetTaskStatus) router.POST(baseURL+"/api/v3/tasks/:task_id/setstatus", wrapper.SetTaskStatus)
router.GET(baseURL+"/api/v3/version", wrapper.GetVersion) router.GET(baseURL+"/api/v3/version", wrapper.GetVersion)
router.DELETE(baseURL+"/api/v3/worker-mgt/cluster/:cluster_id", wrapper.DeleteWorkerCluster) router.DELETE(baseURL+"/api/v3/worker-mgt/tag/:tag_id", wrapper.DeleteWorkerTag)
router.GET(baseURL+"/api/v3/worker-mgt/cluster/:cluster_id", wrapper.FetchWorkerCluster) router.GET(baseURL+"/api/v3/worker-mgt/tag/:tag_id", wrapper.FetchWorkerTag)
router.PUT(baseURL+"/api/v3/worker-mgt/cluster/:cluster_id", wrapper.UpdateWorkerCluster) router.PUT(baseURL+"/api/v3/worker-mgt/tag/:tag_id", wrapper.UpdateWorkerTag)
router.GET(baseURL+"/api/v3/worker-mgt/clusters", wrapper.FetchWorkerClusters) router.GET(baseURL+"/api/v3/worker-mgt/tags", wrapper.FetchWorkerTags)
router.POST(baseURL+"/api/v3/worker-mgt/clusters", wrapper.CreateWorkerCluster) router.POST(baseURL+"/api/v3/worker-mgt/tags", wrapper.CreateWorkerTag)
router.GET(baseURL+"/api/v3/worker-mgt/workers", wrapper.FetchWorkers) router.GET(baseURL+"/api/v3/worker-mgt/workers", wrapper.FetchWorkers)
router.DELETE(baseURL+"/api/v3/worker-mgt/workers/:worker_id", wrapper.DeleteWorker) router.DELETE(baseURL+"/api/v3/worker-mgt/workers/:worker_id", wrapper.DeleteWorker)
router.GET(baseURL+"/api/v3/worker-mgt/workers/:worker_id", wrapper.FetchWorker) router.GET(baseURL+"/api/v3/worker-mgt/workers/:worker_id", wrapper.FetchWorker)
router.POST(baseURL+"/api/v3/worker-mgt/workers/:worker_id/setclusters", wrapper.SetWorkerClusters)
router.POST(baseURL+"/api/v3/worker-mgt/workers/:worker_id/setstatus", wrapper.RequestWorkerStatusChange) router.POST(baseURL+"/api/v3/worker-mgt/workers/:worker_id/setstatus", wrapper.RequestWorkerStatusChange)
router.POST(baseURL+"/api/v3/worker-mgt/workers/:worker_id/settags", wrapper.SetWorkerTags)
router.GET(baseURL+"/api/v3/worker-mgt/workers/:worker_id/sleep-schedule", wrapper.FetchWorkerSleepSchedule) router.GET(baseURL+"/api/v3/worker-mgt/workers/:worker_id/sleep-schedule", wrapper.FetchWorkerSleepSchedule)
router.POST(baseURL+"/api/v3/worker-mgt/workers/:worker_id/sleep-schedule", wrapper.SetWorkerSleepSchedule) router.POST(baseURL+"/api/v3/worker-mgt/workers/:worker_id/sleep-schedule", wrapper.SetWorkerSleepSchedule)
router.POST(baseURL+"/api/v3/worker/register-worker", wrapper.RegisterWorker) router.POST(baseURL+"/api/v3/worker/register-worker", wrapper.RegisterWorker)

View File

@ -18,218 +18,218 @@ import (
// Base64 encoded, gzipped, json marshaled Swagger object // Base64 encoded, gzipped, json marshaled Swagger object
var swaggerSpec = []string{ var swaggerSpec = []string{
"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", "XwAAAP//X9irkUUBAQA=",
} }
// GetSwagger returns the content of the embedded swagger specification file // GetSwagger returns the content of the embedded swagger specification file

View File

@ -636,8 +636,8 @@ type SubmittedJob struct {
// If this field is ommitted, the check is bypassed. // If this field is ommitted, the check is bypassed.
TypeEtag *string `json:"type_etag,omitempty"` TypeEtag *string `json:"type_etag,omitempty"`
// Worker Cluster that should execute this job. When a cluster ID is given, only Workers in that cluster will be scheduled to work on it. If empty or ommitted, all workers can work on this job. // Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job.
WorkerCluster *string `json:"worker_cluster,omitempty"` WorkerTag *string `json:"worker_tag,omitempty"`
} }
// The task as it exists in the Manager database, i.e. before variable replacement. // The task as it exists in the Manager database, i.e. before variable replacement.
@ -719,9 +719,6 @@ type Worker struct {
// Embedded struct due to allOf(#/components/schemas/WorkerSummary) // Embedded struct due to allOf(#/components/schemas/WorkerSummary)
WorkerSummary `yaml:",inline"` WorkerSummary `yaml:",inline"`
// Embedded fields due to inline allOf schema // Embedded fields due to inline allOf schema
// Clusters of which this Worker is a member.
Clusters *[]WorkerCluster `json:"clusters,omitempty"`
// IP address of the Worker // IP address of the Worker
IpAddress string `json:"ip_address"` IpAddress string `json:"ip_address"`
@ -729,29 +726,13 @@ type Worker struct {
Platform string `json:"platform"` Platform string `json:"platform"`
SupportedTaskTypes []string `json:"supported_task_types"` SupportedTaskTypes []string `json:"supported_task_types"`
// Tags of which this Worker is a member.
Tags *[]WorkerTag `json:"tags,omitempty"`
// Task assigned to a Worker. // Task assigned to a Worker.
Task *WorkerTask `json:"task,omitempty"` Task *WorkerTask `json:"task,omitempty"`
} }
// Cluster of workers. A job can optionally specify which cluster it should be limited to. Workers can be part of multiple clusters simultaneously.
type WorkerCluster struct {
Description *string `json:"description,omitempty"`
// UUID of the cluster. Can be ommitted when creating a new cluster, in which case a random UUID will be assigned.
Id *string `json:"id,omitempty"`
Name string `json:"name"`
}
// Request to change which clusters this Worker is assigned to.
type WorkerClusterChangeRequest struct {
ClusterIds []string `json:"cluster_ids"`
}
// WorkerClusterList defines model for WorkerClusterList.
type WorkerClusterList struct {
Clusters *[]WorkerCluster `json:"clusters,omitempty"`
}
// List of workers. // List of workers.
type WorkerList struct { type WorkerList struct {
Workers []WorkerSummary `json:"workers"` Workers []WorkerSummary `json:"workers"`
@ -818,6 +799,25 @@ type WorkerSummary struct {
Version string `json:"version"` Version string `json:"version"`
} }
// Tag of workers. A job can optionally specify which tag it should be limited to. Workers can be part of multiple tags simultaneously.
type WorkerTag struct {
Description *string `json:"description,omitempty"`
// UUID of the tag. Can be ommitted when creating a new tag, in which case a random UUID will be assigned.
Id *string `json:"id,omitempty"`
Name string `json:"name"`
}
// Request to change which tags this Worker is assigned to.
type WorkerTagChangeRequest struct {
TagIds []string `json:"tag_ids"`
}
// WorkerTagList defines model for WorkerTagList.
type WorkerTagList struct {
Tags *[]WorkerTag `json:"tags,omitempty"`
}
// WorkerTask defines model for WorkerTask. // WorkerTask defines model for WorkerTask.
type WorkerTask struct { type WorkerTask struct {
// Embedded struct due to allOf(#/components/schemas/TaskSummary) // Embedded struct due to allOf(#/components/schemas/TaskSummary)
@ -871,18 +871,18 @@ type ShamanFileStoreParams struct {
// SetTaskStatusJSONBody defines parameters for SetTaskStatus. // SetTaskStatusJSONBody defines parameters for SetTaskStatus.
type SetTaskStatusJSONBody TaskStatusChange type SetTaskStatusJSONBody TaskStatusChange
// UpdateWorkerClusterJSONBody defines parameters for UpdateWorkerCluster. // UpdateWorkerTagJSONBody defines parameters for UpdateWorkerTag.
type UpdateWorkerClusterJSONBody WorkerCluster type UpdateWorkerTagJSONBody WorkerTag
// CreateWorkerClusterJSONBody defines parameters for CreateWorkerCluster. // CreateWorkerTagJSONBody defines parameters for CreateWorkerTag.
type CreateWorkerClusterJSONBody WorkerCluster type CreateWorkerTagJSONBody WorkerTag
// SetWorkerClustersJSONBody defines parameters for SetWorkerClusters.
type SetWorkerClustersJSONBody WorkerClusterChangeRequest
// RequestWorkerStatusChangeJSONBody defines parameters for RequestWorkerStatusChange. // RequestWorkerStatusChangeJSONBody defines parameters for RequestWorkerStatusChange.
type RequestWorkerStatusChangeJSONBody WorkerStatusChangeRequest type RequestWorkerStatusChangeJSONBody WorkerStatusChangeRequest
// SetWorkerTagsJSONBody defines parameters for SetWorkerTags.
type SetWorkerTagsJSONBody WorkerTagChangeRequest
// SetWorkerSleepScheduleJSONBody defines parameters for SetWorkerSleepSchedule. // SetWorkerSleepScheduleJSONBody defines parameters for SetWorkerSleepSchedule.
type SetWorkerSleepScheduleJSONBody WorkerSleepSchedule type SetWorkerSleepScheduleJSONBody WorkerSleepSchedule
@ -934,18 +934,18 @@ type ShamanCheckoutRequirementsJSONRequestBody ShamanCheckoutRequirementsJSONBod
// SetTaskStatusJSONRequestBody defines body for SetTaskStatus for application/json ContentType. // SetTaskStatusJSONRequestBody defines body for SetTaskStatus for application/json ContentType.
type SetTaskStatusJSONRequestBody SetTaskStatusJSONBody type SetTaskStatusJSONRequestBody SetTaskStatusJSONBody
// UpdateWorkerClusterJSONRequestBody defines body for UpdateWorkerCluster for application/json ContentType. // UpdateWorkerTagJSONRequestBody defines body for UpdateWorkerTag for application/json ContentType.
type UpdateWorkerClusterJSONRequestBody UpdateWorkerClusterJSONBody type UpdateWorkerTagJSONRequestBody UpdateWorkerTagJSONBody
// CreateWorkerClusterJSONRequestBody defines body for CreateWorkerCluster for application/json ContentType. // CreateWorkerTagJSONRequestBody defines body for CreateWorkerTag for application/json ContentType.
type CreateWorkerClusterJSONRequestBody CreateWorkerClusterJSONBody type CreateWorkerTagJSONRequestBody CreateWorkerTagJSONBody
// SetWorkerClustersJSONRequestBody defines body for SetWorkerClusters for application/json ContentType.
type SetWorkerClustersJSONRequestBody SetWorkerClustersJSONBody
// RequestWorkerStatusChangeJSONRequestBody defines body for RequestWorkerStatusChange for application/json ContentType. // RequestWorkerStatusChangeJSONRequestBody defines body for RequestWorkerStatusChange for application/json ContentType.
type RequestWorkerStatusChangeJSONRequestBody RequestWorkerStatusChangeJSONBody type RequestWorkerStatusChangeJSONRequestBody RequestWorkerStatusChangeJSONBody
// SetWorkerTagsJSONRequestBody defines body for SetWorkerTags for application/json ContentType.
type SetWorkerTagsJSONRequestBody SetWorkerTagsJSONBody
// SetWorkerSleepScheduleJSONRequestBody defines body for SetWorkerSleepSchedule for application/json ContentType. // SetWorkerSleepScheduleJSONRequestBody defines body for SetWorkerSleepSchedule for application/json ContentType.
type SetWorkerSleepScheduleJSONRequestBody SetWorkerSleepScheduleJSONBody type SetWorkerSleepScheduleJSONRequestBody SetWorkerSleepScheduleJSONBody

View File

@ -32,12 +32,17 @@
<dt class="field-name" title="ID">ID</dt> <dt class="field-name" title="ID">ID</dt>
<dd><span @click="copyElementText" class="click-to-copy">{{ jobData.id }}</span></dd> <dd><span @click="copyElementText" class="click-to-copy">{{ jobData.id }}</span></dd>
<template v-if="workerCluster"> <template v-if="workerTag">
<!-- TODO: fetch cluster name and show that instead, and allow editing of the cluster. --> <!-- TODO: fetch tag name and show that instead, and allow editing of the tag. -->
<dt class="field-name" title="Worker Cluster">Cluster</dt> <dt class="field-name" title="Worker Tag">Tag</dt>
<dd :title="workerCluster.description"><span @click="copyElementData" class="click-to-copy" <dd :title="workerTag.description">
:data-clipboard="workerCluster.id">{{ <span
workerCluster.name }}</span></dd> @click="copyElementData"
class="click-to-copy"
:data-clipboard="workerTag.id"
>{{ workerTag.name }}</span
>
</dd>
</template> </template>
<dt class="field-name" title="Name">Name</dt> <dt class="field-name" title="Name">Name</dt>
@ -128,11 +133,10 @@ export default {
this._refreshJobSettings(this.jobData); this._refreshJobSettings(this.jobData);
} }
this.workers.refreshClusters() this.workers.refreshTags().catch((error) => {
.catch((error) => { const errorMsg = JSON.stringify(error); // TODO: handle API errors better.
const errorMsg = JSON.stringify(error); // TODO: handle API errors better. this.notifs.add(`Error: ${errorMsg}`);
this.notifs.add(`Error: ${errorMsg}`); });
});
}, },
computed: { computed: {
hasJobData() { hasJobData() {
@ -156,9 +160,9 @@ export default {
} }
return this.jobData.settings; return this.jobData.settings;
}, },
workerCluster() { workerTag() {
if (!this.jobData.worker_cluster) return undefined; if (!this.jobData.worker_tag) return undefined;
return this.workers.clustersByID[this.jobData.worker_cluster]; return this.workers.tagsByID[this.jobData.worker_tag];
}, },
}, },
watch: { watch: {

View File

@ -34,21 +34,24 @@
</dd> </dd>
</dl> </dl>
<section class="worker-clusters" v-if="workers.clusters && workers.clusters.length"> <section class="worker-tags" v-if="workers.tags && workers.tags.length">
<h3 class="sub-title">Clusters</h3> <h3 class="sub-title">Tags</h3>
<ul> <ul>
<li v-for="cluster in workers.clusters"> <li v-for="tag in workers.tags">
<switch-checkbox :isChecked="thisWorkerClusters[cluster.id]" :label="cluster.name" :title="cluster.description" <switch-checkbox
@switch-toggle="toggleWorkerCluster(cluster.id)"> :isChecked="thisWorkerTags[tag.id]"
:label="tag.name"
:title="tag.description"
@switch-toggle="toggleWorkerTag(tag.id)"
>
</switch-checkbox> </switch-checkbox>
</li> </li>
</ul> </ul>
<p class="hint" v-if="hasClustersAssigned"> <p class="hint" v-if="hasTagsAssigned">
This worker will only pick up jobs assigned to one of its clusters, and clusterless jobs. This worker will only pick up jobs assigned to one of its tags, and
</p> tagless jobs.
<p class="hint" v-else>
This worker will only pick up clusterless jobs.
</p> </p>
<p class="hint" v-else>This worker will only pick up tagless jobs.</p>
</section> </section>
<section class="sleep-schedule" :class="{ 'is-schedule-active': workerSleepSchedule.is_active }"> <section class="sleep-schedule" :class="{ 'is-schedule-active': workerSleepSchedule.is_active }">
@ -140,7 +143,7 @@ import { useNotifs } from '@/stores/notifications'
import { useWorkers } from '@/stores/workers' import { useWorkers } from '@/stores/workers'
import * as datetime from "@/datetime"; import * as datetime from "@/datetime";
import { WorkerMgtApi, WorkerSleepSchedule, WorkerClusterChangeRequest } from '@/manager-api'; import { WorkerMgtApi, WorkerSleepSchedule, WorkerTagChangeRequest } from "@/manager-api";
import { getAPIClient } from "@/api-client"; import { getAPIClient } from "@/api-client";
import { workerStatus } from "../../statusindicator"; import { workerStatus } from "../../statusindicator";
import LinkWorkerTask from '@/components/LinkWorkerTask.vue'; import LinkWorkerTask from '@/components/LinkWorkerTask.vue';
@ -165,18 +168,17 @@ export default {
notifs: useNotifs(), notifs: useNotifs(),
copyElementText: copyElementText, copyElementText: copyElementText,
workers: useWorkers(), workers: useWorkers(),
thisWorkerClusters: {}, // Mapping from UUID to 'isAssigned' boolean. thisWorkerTags: {}, // Mapping from UUID to 'isAssigned' boolean.
}; };
}, },
mounted() { mounted() {
// Allow testing from the JS console: // Allow testing from the JS console:
window.workerDetailsVue = this; window.workerDetailsVue = this;
this.workers.refreshClusters() this.workers.refreshTags().catch((error) => {
.catch((error) => { const errorMsg = JSON.stringify(error); // TODO: handle API errors better.
const errorMsg = JSON.stringify(error); // TODO: handle API errors better. this.notifs.add(`Error: ${errorMsg}`);
this.notifs.add(`Error: ${errorMsg}`); });
});
}, },
watch: { watch: {
workerData(newData, oldData) { workerData(newData, oldData) {
@ -191,7 +193,7 @@ export default {
this.fetchWorkerSleepSchedule(); this.fetchWorkerSleepSchedule();
} }
this.updateThisWorkerClusters(newData); this.updateThisWorkerTags(newData);
}, },
}, },
computed: { computed: {
@ -210,10 +212,10 @@ export default {
workerSleepScheduleStatusLabel() { workerSleepScheduleStatusLabel() {
return this.workerSleepSchedule.is_active ? 'Enabled' : 'Disabled'; return this.workerSleepSchedule.is_active ? 'Enabled' : 'Disabled';
}, },
hasClustersAssigned() { hasTagsAssigned() {
const clusterIDs = this.getAssignedClusterIDs(); const tagIDs = this.getAssignedTagIDs();
return clusterIDs && clusterIDs.length > 0; return tagIDs && tagIDs.length > 0;
} },
}, },
methods: { methods: {
fetchWorkerSleepSchedule() { fetchWorkerSleepSchedule() {
@ -262,46 +264,48 @@ export default {
} }
this.api.deleteWorker(this.workerData.id); this.api.deleteWorker(this.workerData.id);
}, },
updateThisWorkerClusters(newWorkerData) { updateThisWorkerTags(newWorkerData) {
if (!newWorkerData || !newWorkerData.clusters) { if (!newWorkerData || !newWorkerData.tags) {
this.thisWorkerClusters = {}; this.thisWorkerTags = {};
return; return;
} }
const assignedClusters = newWorkerData.clusters.reduce( const assignedTags = newWorkerData.tags.reduce((accu, tag) => {
(accu, cluster) => { accu[cluster.id] = true; return accu; }, accu[tag.id] = true;
{}); return accu;
this.thisWorkerClusters = assignedClusters; }, {});
this.thisWorkerTags = assignedTags;
}, },
toggleWorkerCluster(clusterID) { toggleWorkerTag(tagID) {
console.log("Toggled", clusterID); console.log("Toggled", tagID);
this.thisWorkerClusters[clusterID] = !this.thisWorkerClusters[clusterID]; this.thisWorkerTags[tagID] = !this.thisWorkerTags[tagID];
console.log("New assignment:", plain(this.thisWorkerClusters)) console.log("New assignment:", plain(this.thisWorkerTags));
// Construct cluster change request. // Construct tag change request.
const clusterIDs = this.getAssignedClusterIDs(); const tagIDs = this.getAssignedTagIDs();
const changeRequest = new WorkerClusterChangeRequest(clusterIDs); const changeRequest = new WorkerTagChangeRequest(tagIDs);
// Send to the Manager. // Send to the Manager.
this.api.setWorkerClusters(this.workerData.id, changeRequest) this.api
.setWorkerTags(this.workerData.id, changeRequest)
.then(() => { .then(() => {
this.notifs.add('Cluster assignment updated'); this.notifs.add("Tag assignment updated");
}) })
.catch((error) => { .catch((error) => {
const errorMsg = JSON.stringify(error); // TODO: handle API errors better. const errorMsg = JSON.stringify(error); // TODO: handle API errors better.
this.notifs.add(`Error: ${errorMsg}`); this.notifs.add(`Error: ${errorMsg}`);
}); });
}, },
getAssignedClusterIDs() { getAssignedTagIDs() {
const clusterIDs = []; const tagIDs = [];
for (let clusterID in this.thisWorkerClusters) { for (let tagID in this.thisWorkerTags) {
// Values can exist and be set to 'false'. // Values can exist and be set to 'false'.
const isAssigned = this.thisWorkerClusters[clusterID]; const isAssigned = this.thisWorkerTags[tagID];
if (isAssigned) clusterIDs.push(clusterID); if (isAssigned) tagIDs.push(tagID);
} }
return clusterIDs; return tagIDs;
} },
} },
}; };
</script> </script>
@ -377,11 +381,11 @@ export default {
white-space: nowrap; white-space: nowrap;
} }
.worker-clusters ul { .worker-tags ul {
list-style: none; list-style: none;
} }
.worker-clusters ul li { .worker-tags ul li {
margin-bottom: 0.25rem; margin-bottom: 0.25rem;
} }
</style> </style>

View File

@ -73,9 +73,6 @@ import TaskUpdate from './model/TaskUpdate';
import TaskWorker from './model/TaskWorker'; import TaskWorker from './model/TaskWorker';
import Worker from './model/Worker'; import Worker from './model/Worker';
import WorkerAllOf from './model/WorkerAllOf'; import WorkerAllOf from './model/WorkerAllOf';
import WorkerCluster from './model/WorkerCluster';
import WorkerClusterChangeRequest from './model/WorkerClusterChangeRequest';
import WorkerClusterList from './model/WorkerClusterList';
import WorkerList from './model/WorkerList'; import WorkerList from './model/WorkerList';
import WorkerRegistration from './model/WorkerRegistration'; import WorkerRegistration from './model/WorkerRegistration';
import WorkerSignOn from './model/WorkerSignOn'; import WorkerSignOn from './model/WorkerSignOn';
@ -85,6 +82,9 @@ import WorkerStateChanged from './model/WorkerStateChanged';
import WorkerStatus from './model/WorkerStatus'; import WorkerStatus from './model/WorkerStatus';
import WorkerStatusChangeRequest from './model/WorkerStatusChangeRequest'; import WorkerStatusChangeRequest from './model/WorkerStatusChangeRequest';
import WorkerSummary from './model/WorkerSummary'; import WorkerSummary from './model/WorkerSummary';
import WorkerTag from './model/WorkerTag';
import WorkerTagChangeRequest from './model/WorkerTagChangeRequest';
import WorkerTagList from './model/WorkerTagList';
import WorkerTask from './model/WorkerTask'; import WorkerTask from './model/WorkerTask';
import WorkerTaskAllOf from './model/WorkerTaskAllOf'; import WorkerTaskAllOf from './model/WorkerTaskAllOf';
import JobsApi from './manager/JobsApi'; import JobsApi from './manager/JobsApi';
@ -492,24 +492,6 @@ export {
*/ */
WorkerAllOf, WorkerAllOf,
/**
* The WorkerCluster model constructor.
* @property {module:model/WorkerCluster}
*/
WorkerCluster,
/**
* The WorkerClusterChangeRequest model constructor.
* @property {module:model/WorkerClusterChangeRequest}
*/
WorkerClusterChangeRequest,
/**
* The WorkerClusterList model constructor.
* @property {module:model/WorkerClusterList}
*/
WorkerClusterList,
/** /**
* The WorkerList model constructor. * The WorkerList model constructor.
* @property {module:model/WorkerList} * @property {module:model/WorkerList}
@ -564,6 +546,24 @@ export {
*/ */
WorkerSummary, WorkerSummary,
/**
* The WorkerTag model constructor.
* @property {module:model/WorkerTag}
*/
WorkerTag,
/**
* The WorkerTagChangeRequest model constructor.
* @property {module:model/WorkerTagChangeRequest}
*/
WorkerTagChangeRequest,
/**
* The WorkerTagList model constructor.
* @property {module:model/WorkerTagList}
*/
WorkerTagList,
/** /**
* The WorkerTask model constructor. * The WorkerTask model constructor.
* @property {module:model/WorkerTask} * @property {module:model/WorkerTask}

View File

@ -15,12 +15,12 @@
import ApiClient from "../ApiClient"; import ApiClient from "../ApiClient";
import Error from '../model/Error'; import Error from '../model/Error';
import Worker from '../model/Worker'; import Worker from '../model/Worker';
import WorkerCluster from '../model/WorkerCluster';
import WorkerClusterChangeRequest from '../model/WorkerClusterChangeRequest';
import WorkerClusterList from '../model/WorkerClusterList';
import WorkerList from '../model/WorkerList'; import WorkerList from '../model/WorkerList';
import WorkerSleepSchedule from '../model/WorkerSleepSchedule'; import WorkerSleepSchedule from '../model/WorkerSleepSchedule';
import WorkerStatusChangeRequest from '../model/WorkerStatusChangeRequest'; import WorkerStatusChangeRequest from '../model/WorkerStatusChangeRequest';
import WorkerTag from '../model/WorkerTag';
import WorkerTagChangeRequest from '../model/WorkerTagChangeRequest';
import WorkerTagList from '../model/WorkerTagList';
/** /**
* WorkerMgt service. * WorkerMgt service.
@ -43,15 +43,15 @@ export default class WorkerMgtApi {
/** /**
* Create a new worker cluster. * Create a new worker tag.
* @param {module:model/WorkerCluster} workerCluster The worker cluster. * @param {module:model/WorkerTag} workerTag The worker tag.
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/WorkerCluster} and HTTP response * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/WorkerTag} and HTTP response
*/ */
createWorkerClusterWithHttpInfo(workerCluster) { createWorkerTagWithHttpInfo(workerTag) {
let postBody = workerCluster; let postBody = workerTag;
// verify the required parameter 'workerCluster' is set // verify the required parameter 'workerTag' is set
if (workerCluster === undefined || workerCluster === null) { if (workerTag === undefined || workerTag === null) {
throw new Error("Missing the required parameter 'workerCluster' when calling createWorkerCluster"); throw new Error("Missing the required parameter 'workerTag' when calling createWorkerTag");
} }
let pathParams = { let pathParams = {
@ -66,21 +66,21 @@ export default class WorkerMgtApi {
let authNames = []; let authNames = [];
let contentTypes = ['application/json']; let contentTypes = ['application/json'];
let accepts = ['application/json']; let accepts = ['application/json'];
let returnType = WorkerCluster; let returnType = WorkerTag;
return this.apiClient.callApi( return this.apiClient.callApi(
'/api/v3/worker-mgt/clusters', 'POST', '/api/v3/worker-mgt/tags', 'POST',
pathParams, queryParams, headerParams, formParams, postBody, pathParams, queryParams, headerParams, formParams, postBody,
authNames, contentTypes, accepts, returnType, null authNames, contentTypes, accepts, returnType, null
); );
} }
/** /**
* Create a new worker cluster. * Create a new worker tag.
* @param {module:model/WorkerCluster} workerCluster The worker cluster. * @param {module:model/WorkerTag} workerTag The worker tag.
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/WorkerCluster} * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/WorkerTag}
*/ */
createWorkerCluster(workerCluster) { createWorkerTag(workerTag) {
return this.createWorkerClusterWithHttpInfo(workerCluster) return this.createWorkerTagWithHttpInfo(workerTag)
.then(function(response_and_data) { .then(function(response_and_data) {
return response_and_data.data; return response_and_data.data;
}); });
@ -134,19 +134,19 @@ export default class WorkerMgtApi {
/** /**
* Remove this worker cluster. This unassigns all workers from the cluster and removes it. * Remove this worker tag. This unassigns all workers from the tag and removes it.
* @param {String} clusterId * @param {String} tagId
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response
*/ */
deleteWorkerClusterWithHttpInfo(clusterId) { deleteWorkerTagWithHttpInfo(tagId) {
let postBody = null; let postBody = null;
// verify the required parameter 'clusterId' is set // verify the required parameter 'tagId' is set
if (clusterId === undefined || clusterId === null) { if (tagId === undefined || tagId === null) {
throw new Error("Missing the required parameter 'clusterId' when calling deleteWorkerCluster"); throw new Error("Missing the required parameter 'tagId' when calling deleteWorkerTag");
} }
let pathParams = { let pathParams = {
'cluster_id': clusterId 'tag_id': tagId
}; };
let queryParams = { let queryParams = {
}; };
@ -160,19 +160,19 @@ export default class WorkerMgtApi {
let accepts = ['application/json']; let accepts = ['application/json'];
let returnType = null; let returnType = null;
return this.apiClient.callApi( return this.apiClient.callApi(
'/api/v3/worker-mgt/cluster/{cluster_id}', 'DELETE', '/api/v3/worker-mgt/tag/{tag_id}', 'DELETE',
pathParams, queryParams, headerParams, formParams, postBody, pathParams, queryParams, headerParams, formParams, postBody,
authNames, contentTypes, accepts, returnType, null authNames, contentTypes, accepts, returnType, null
); );
} }
/** /**
* Remove this worker cluster. This unassigns all workers from the cluster and removes it. * Remove this worker tag. This unassigns all workers from the tag and removes it.
* @param {String} clusterId * @param {String} tagId
* @return {Promise} a {@link https://www.promisejs.org/|Promise} * @return {Promise} a {@link https://www.promisejs.org/|Promise}
*/ */
deleteWorkerCluster(clusterId) { deleteWorkerTag(tagId) {
return this.deleteWorkerClusterWithHttpInfo(clusterId) return this.deleteWorkerTagWithHttpInfo(tagId)
.then(function(response_and_data) { .then(function(response_and_data) {
return response_and_data.data; return response_and_data.data;
}); });
@ -225,91 +225,6 @@ export default class WorkerMgtApi {
} }
/**
* Get a single worker cluster.
* @param {String} clusterId
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/WorkerCluster} and HTTP response
*/
fetchWorkerClusterWithHttpInfo(clusterId) {
let postBody = null;
// verify the required parameter 'clusterId' is set
if (clusterId === undefined || clusterId === null) {
throw new Error("Missing the required parameter 'clusterId' when calling fetchWorkerCluster");
}
let pathParams = {
'cluster_id': clusterId
};
let queryParams = {
};
let headerParams = {
};
let formParams = {
};
let authNames = [];
let contentTypes = [];
let accepts = ['application/json'];
let returnType = WorkerCluster;
return this.apiClient.callApi(
'/api/v3/worker-mgt/cluster/{cluster_id}', 'GET',
pathParams, queryParams, headerParams, formParams, postBody,
authNames, contentTypes, accepts, returnType, null
);
}
/**
* Get a single worker cluster.
* @param {String} clusterId
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/WorkerCluster}
*/
fetchWorkerCluster(clusterId) {
return this.fetchWorkerClusterWithHttpInfo(clusterId)
.then(function(response_and_data) {
return response_and_data.data;
});
}
/**
* Get list of worker clusters.
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/WorkerClusterList} and HTTP response
*/
fetchWorkerClustersWithHttpInfo() {
let postBody = null;
let pathParams = {
};
let queryParams = {
};
let headerParams = {
};
let formParams = {
};
let authNames = [];
let contentTypes = [];
let accepts = ['application/json'];
let returnType = WorkerClusterList;
return this.apiClient.callApi(
'/api/v3/worker-mgt/clusters', 'GET',
pathParams, queryParams, headerParams, formParams, postBody,
authNames, contentTypes, accepts, returnType, null
);
}
/**
* Get list of worker clusters.
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/WorkerClusterList}
*/
fetchWorkerClusters() {
return this.fetchWorkerClustersWithHttpInfo()
.then(function(response_and_data) {
return response_and_data.data;
});
}
/** /**
* @param {String} workerId * @param {String} workerId
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/WorkerSleepSchedule} and HTTP response * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/WorkerSleepSchedule} and HTTP response
@ -354,6 +269,91 @@ export default class WorkerMgtApi {
} }
/**
* Get a single worker tag.
* @param {String} tagId
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/WorkerTag} and HTTP response
*/
fetchWorkerTagWithHttpInfo(tagId) {
let postBody = null;
// verify the required parameter 'tagId' is set
if (tagId === undefined || tagId === null) {
throw new Error("Missing the required parameter 'tagId' when calling fetchWorkerTag");
}
let pathParams = {
'tag_id': tagId
};
let queryParams = {
};
let headerParams = {
};
let formParams = {
};
let authNames = [];
let contentTypes = [];
let accepts = ['application/json'];
let returnType = WorkerTag;
return this.apiClient.callApi(
'/api/v3/worker-mgt/tag/{tag_id}', 'GET',
pathParams, queryParams, headerParams, formParams, postBody,
authNames, contentTypes, accepts, returnType, null
);
}
/**
* Get a single worker tag.
* @param {String} tagId
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/WorkerTag}
*/
fetchWorkerTag(tagId) {
return this.fetchWorkerTagWithHttpInfo(tagId)
.then(function(response_and_data) {
return response_and_data.data;
});
}
/**
* Get list of worker tags.
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/WorkerTagList} and HTTP response
*/
fetchWorkerTagsWithHttpInfo() {
let postBody = null;
let pathParams = {
};
let queryParams = {
};
let headerParams = {
};
let formParams = {
};
let authNames = [];
let contentTypes = [];
let accepts = ['application/json'];
let returnType = WorkerTagList;
return this.apiClient.callApi(
'/api/v3/worker-mgt/tags', 'GET',
pathParams, queryParams, headerParams, formParams, postBody,
authNames, contentTypes, accepts, returnType, null
);
}
/**
* Get list of worker tags.
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with data of type {@link module:model/WorkerTagList}
*/
fetchWorkerTags() {
return this.fetchWorkerTagsWithHttpInfo()
.then(function(response_and_data) {
return response_and_data.data;
});
}
/** /**
* Get list of workers. * Get list of workers.
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/WorkerList} and HTTP response * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing data of type {@link module:model/WorkerList} and HTTP response
@ -443,56 +443,6 @@ export default class WorkerMgtApi {
} }
/**
* @param {String} workerId
* @param {module:model/WorkerClusterChangeRequest} workerClusterChangeRequest The list of cluster IDs this worker should be a member of.
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response
*/
setWorkerClustersWithHttpInfo(workerId, workerClusterChangeRequest) {
let postBody = workerClusterChangeRequest;
// verify the required parameter 'workerId' is set
if (workerId === undefined || workerId === null) {
throw new Error("Missing the required parameter 'workerId' when calling setWorkerClusters");
}
// verify the required parameter 'workerClusterChangeRequest' is set
if (workerClusterChangeRequest === undefined || workerClusterChangeRequest === null) {
throw new Error("Missing the required parameter 'workerClusterChangeRequest' when calling setWorkerClusters");
}
let pathParams = {
'worker_id': workerId
};
let queryParams = {
};
let headerParams = {
};
let formParams = {
};
let authNames = [];
let contentTypes = ['application/json'];
let accepts = ['application/json'];
let returnType = null;
return this.apiClient.callApi(
'/api/v3/worker-mgt/workers/{worker_id}/setclusters', 'POST',
pathParams, queryParams, headerParams, formParams, postBody,
authNames, contentTypes, accepts, returnType, null
);
}
/**
* @param {String} workerId
* @param {module:model/WorkerClusterChangeRequest} workerClusterChangeRequest The list of cluster IDs this worker should be a member of.
* @return {Promise} a {@link https://www.promisejs.org/|Promise}
*/
setWorkerClusters(workerId, workerClusterChangeRequest) {
return this.setWorkerClustersWithHttpInfo(workerId, workerClusterChangeRequest)
.then(function(response_and_data) {
return response_and_data.data;
});
}
/** /**
* @param {String} workerId * @param {String} workerId
* @param {module:model/WorkerSleepSchedule} workerSleepSchedule The new sleep schedule. * @param {module:model/WorkerSleepSchedule} workerSleepSchedule The new sleep schedule.
@ -544,24 +494,23 @@ export default class WorkerMgtApi {
/** /**
* Update an existing worker cluster. * @param {String} workerId
* @param {String} clusterId * @param {module:model/WorkerTagChangeRequest} workerTagChangeRequest The list of worker tag IDs this worker should be a member of.
* @param {module:model/WorkerCluster} workerCluster The updated worker cluster.
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response * @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response
*/ */
updateWorkerClusterWithHttpInfo(clusterId, workerCluster) { setWorkerTagsWithHttpInfo(workerId, workerTagChangeRequest) {
let postBody = workerCluster; let postBody = workerTagChangeRequest;
// verify the required parameter 'clusterId' is set // verify the required parameter 'workerId' is set
if (clusterId === undefined || clusterId === null) { if (workerId === undefined || workerId === null) {
throw new Error("Missing the required parameter 'clusterId' when calling updateWorkerCluster"); throw new Error("Missing the required parameter 'workerId' when calling setWorkerTags");
} }
// verify the required parameter 'workerCluster' is set // verify the required parameter 'workerTagChangeRequest' is set
if (workerCluster === undefined || workerCluster === null) { if (workerTagChangeRequest === undefined || workerTagChangeRequest === null) {
throw new Error("Missing the required parameter 'workerCluster' when calling updateWorkerCluster"); throw new Error("Missing the required parameter 'workerTagChangeRequest' when calling setWorkerTags");
} }
let pathParams = { let pathParams = {
'cluster_id': clusterId 'worker_id': workerId
}; };
let queryParams = { let queryParams = {
}; };
@ -575,20 +524,71 @@ export default class WorkerMgtApi {
let accepts = ['application/json']; let accepts = ['application/json'];
let returnType = null; let returnType = null;
return this.apiClient.callApi( return this.apiClient.callApi(
'/api/v3/worker-mgt/cluster/{cluster_id}', 'PUT', '/api/v3/worker-mgt/workers/{worker_id}/settags', 'POST',
pathParams, queryParams, headerParams, formParams, postBody, pathParams, queryParams, headerParams, formParams, postBody,
authNames, contentTypes, accepts, returnType, null authNames, contentTypes, accepts, returnType, null
); );
} }
/** /**
* Update an existing worker cluster. * @param {String} workerId
* @param {String} clusterId * @param {module:model/WorkerTagChangeRequest} workerTagChangeRequest The list of worker tag IDs this worker should be a member of.
* @param {module:model/WorkerCluster} workerCluster The updated worker cluster.
* @return {Promise} a {@link https://www.promisejs.org/|Promise} * @return {Promise} a {@link https://www.promisejs.org/|Promise}
*/ */
updateWorkerCluster(clusterId, workerCluster) { setWorkerTags(workerId, workerTagChangeRequest) {
return this.updateWorkerClusterWithHttpInfo(clusterId, workerCluster) return this.setWorkerTagsWithHttpInfo(workerId, workerTagChangeRequest)
.then(function(response_and_data) {
return response_and_data.data;
});
}
/**
* Update an existing worker tag.
* @param {String} tagId
* @param {module:model/WorkerTag} workerTag The updated worker tag.
* @return {Promise} a {@link https://www.promisejs.org/|Promise}, with an object containing HTTP response
*/
updateWorkerTagWithHttpInfo(tagId, workerTag) {
let postBody = workerTag;
// verify the required parameter 'tagId' is set
if (tagId === undefined || tagId === null) {
throw new Error("Missing the required parameter 'tagId' when calling updateWorkerTag");
}
// verify the required parameter 'workerTag' is set
if (workerTag === undefined || workerTag === null) {
throw new Error("Missing the required parameter 'workerTag' when calling updateWorkerTag");
}
let pathParams = {
'tag_id': tagId
};
let queryParams = {
};
let headerParams = {
};
let formParams = {
};
let authNames = [];
let contentTypes = ['application/json'];
let accepts = ['application/json'];
let returnType = null;
return this.apiClient.callApi(
'/api/v3/worker-mgt/tag/{tag_id}', 'PUT',
pathParams, queryParams, headerParams, formParams, postBody,
authNames, contentTypes, accepts, returnType, null
);
}
/**
* Update an existing worker tag.
* @param {String} tagId
* @param {module:model/WorkerTag} workerTag The updated worker tag.
* @return {Promise} a {@link https://www.promisejs.org/|Promise}
*/
updateWorkerTag(tagId, workerTag) {
return this.updateWorkerTagWithHttpInfo(tagId, workerTag)
.then(function(response_and_data) { .then(function(response_and_data) {
return response_and_data.data; return response_and_data.data;
}); });

View File

@ -97,8 +97,8 @@ class Job {
if (data.hasOwnProperty('storage')) { if (data.hasOwnProperty('storage')) {
obj['storage'] = JobStorageInfo.constructFromObject(data['storage']); obj['storage'] = JobStorageInfo.constructFromObject(data['storage']);
} }
if (data.hasOwnProperty('worker_cluster')) { if (data.hasOwnProperty('worker_tag')) {
obj['worker_cluster'] = ApiClient.convertToType(data['worker_cluster'], 'String'); obj['worker_tag'] = ApiClient.convertToType(data['worker_tag'], 'String');
} }
if (data.hasOwnProperty('id')) { if (data.hasOwnProperty('id')) {
obj['id'] = ApiClient.convertToType(data['id'], 'String'); obj['id'] = ApiClient.convertToType(data['id'], 'String');
@ -170,10 +170,10 @@ Job.prototype['submitter_platform'] = undefined;
Job.prototype['storage'] = undefined; Job.prototype['storage'] = undefined;
/** /**
* Worker Cluster that should execute this job. When a cluster ID is given, only Workers in that cluster will be scheduled to work on it. If empty or ommitted, all workers can work on this job. * Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job.
* @member {String} worker_cluster * @member {String} worker_tag
*/ */
Job.prototype['worker_cluster'] = undefined; Job.prototype['worker_tag'] = undefined;
/** /**
* UUID of the Job * UUID of the Job
@ -249,10 +249,10 @@ SubmittedJob.prototype['submitter_platform'] = undefined;
*/ */
SubmittedJob.prototype['storage'] = undefined; SubmittedJob.prototype['storage'] = undefined;
/** /**
* Worker Cluster that should execute this job. When a cluster ID is given, only Workers in that cluster will be scheduled to work on it. If empty or ommitted, all workers can work on this job. * Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job.
* @member {String} worker_cluster * @member {String} worker_tag
*/ */
SubmittedJob.prototype['worker_cluster'] = undefined; SubmittedJob.prototype['worker_tag'] = undefined;
// Implement JobAllOf interface: // Implement JobAllOf interface:
/** /**
* UUID of the Job * UUID of the Job

View File

@ -81,8 +81,8 @@ class SubmittedJob {
if (data.hasOwnProperty('storage')) { if (data.hasOwnProperty('storage')) {
obj['storage'] = JobStorageInfo.constructFromObject(data['storage']); obj['storage'] = JobStorageInfo.constructFromObject(data['storage']);
} }
if (data.hasOwnProperty('worker_cluster')) { if (data.hasOwnProperty('worker_tag')) {
obj['worker_cluster'] = ApiClient.convertToType(data['worker_cluster'], 'String'); obj['worker_tag'] = ApiClient.convertToType(data['worker_tag'], 'String');
} }
} }
return obj; return obj;
@ -136,10 +136,10 @@ SubmittedJob.prototype['submitter_platform'] = undefined;
SubmittedJob.prototype['storage'] = undefined; SubmittedJob.prototype['storage'] = undefined;
/** /**
* Worker Cluster that should execute this job. When a cluster ID is given, only Workers in that cluster will be scheduled to work on it. If empty or ommitted, all workers can work on this job. * Worker tag that should execute this job. When a tag ID is given, only Workers in that tag will be scheduled to work on it. If empty or ommitted, all workers can work on this job.
* @member {String} worker_cluster * @member {String} worker_tag
*/ */
SubmittedJob.prototype['worker_cluster'] = undefined; SubmittedJob.prototype['worker_tag'] = undefined;

View File

@ -13,10 +13,10 @@
import ApiClient from '../ApiClient'; import ApiClient from '../ApiClient';
import WorkerAllOf from './WorkerAllOf'; import WorkerAllOf from './WorkerAllOf';
import WorkerCluster from './WorkerCluster';
import WorkerStatus from './WorkerStatus'; import WorkerStatus from './WorkerStatus';
import WorkerStatusChangeRequest from './WorkerStatusChangeRequest'; import WorkerStatusChangeRequest from './WorkerStatusChangeRequest';
import WorkerSummary from './WorkerSummary'; import WorkerSummary from './WorkerSummary';
import WorkerTag from './WorkerTag';
import WorkerTask from './WorkerTask'; import WorkerTask from './WorkerTask';
/** /**
@ -102,8 +102,8 @@ class Worker {
if (data.hasOwnProperty('task')) { if (data.hasOwnProperty('task')) {
obj['task'] = WorkerTask.constructFromObject(data['task']); obj['task'] = WorkerTask.constructFromObject(data['task']);
} }
if (data.hasOwnProperty('clusters')) { if (data.hasOwnProperty('tags')) {
obj['clusters'] = ApiClient.convertToType(data['clusters'], [WorkerCluster]); obj['tags'] = ApiClient.convertToType(data['tags'], [WorkerTag]);
} }
} }
return obj; return obj;
@ -167,10 +167,10 @@ Worker.prototype['supported_task_types'] = undefined;
Worker.prototype['task'] = undefined; Worker.prototype['task'] = undefined;
/** /**
* Clusters of which this Worker is a member. * Tags of which this Worker is a member.
* @member {Array.<module:model/WorkerCluster>} clusters * @member {Array.<module:model/WorkerTag>} tags
*/ */
Worker.prototype['clusters'] = undefined; Worker.prototype['tags'] = undefined;
// Implement WorkerSummary interface: // Implement WorkerSummary interface:
@ -220,10 +220,10 @@ WorkerAllOf.prototype['supported_task_types'] = undefined;
*/ */
WorkerAllOf.prototype['task'] = undefined; WorkerAllOf.prototype['task'] = undefined;
/** /**
* Clusters of which this Worker is a member. * Tags of which this Worker is a member.
* @member {Array.<module:model/WorkerCluster>} clusters * @member {Array.<module:model/WorkerTag>} tags
*/ */
WorkerAllOf.prototype['clusters'] = undefined; WorkerAllOf.prototype['tags'] = undefined;

View File

@ -12,7 +12,7 @@
*/ */
import ApiClient from '../ApiClient'; import ApiClient from '../ApiClient';
import WorkerCluster from './WorkerCluster'; import WorkerTag from './WorkerTag';
import WorkerTask from './WorkerTask'; import WorkerTask from './WorkerTask';
/** /**
@ -67,8 +67,8 @@ class WorkerAllOf {
if (data.hasOwnProperty('task')) { if (data.hasOwnProperty('task')) {
obj['task'] = WorkerTask.constructFromObject(data['task']); obj['task'] = WorkerTask.constructFromObject(data['task']);
} }
if (data.hasOwnProperty('clusters')) { if (data.hasOwnProperty('tags')) {
obj['clusters'] = ApiClient.convertToType(data['clusters'], [WorkerCluster]); obj['tags'] = ApiClient.convertToType(data['tags'], [WorkerTag]);
} }
} }
return obj; return obj;
@ -100,10 +100,10 @@ WorkerAllOf.prototype['supported_task_types'] = undefined;
WorkerAllOf.prototype['task'] = undefined; WorkerAllOf.prototype['task'] = undefined;
/** /**
* Clusters of which this Worker is a member. * Tags of which this Worker is a member.
* @member {Array.<module:model/WorkerCluster>} clusters * @member {Array.<module:model/WorkerTag>} tags
*/ */
WorkerAllOf.prototype['clusters'] = undefined; WorkerAllOf.prototype['tags'] = undefined;

View File

@ -1,74 +0,0 @@
/**
* Flamenco manager
* Render Farm manager API
*
* The version of the OpenAPI document: 1.0.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*
*/
import ApiClient from '../ApiClient';
/**
* The WorkerClusterChangeRequest model module.
* @module model/WorkerClusterChangeRequest
* @version 0.0.0
*/
class WorkerClusterChangeRequest {
/**
* Constructs a new <code>WorkerClusterChangeRequest</code>.
* Request to change which clusters this Worker is assigned to.
* @alias module:model/WorkerClusterChangeRequest
* @param clusterIds {Array.<String>}
*/
constructor(clusterIds) {
WorkerClusterChangeRequest.initialize(this, clusterIds);
}
/**
* Initializes the fields of this object.
* This method is used by the constructors of any subclasses, in order to implement multiple inheritance (mix-ins).
* Only for internal use.
*/
static initialize(obj, clusterIds) {
obj['cluster_ids'] = clusterIds;
}
/**
* Constructs a <code>WorkerClusterChangeRequest</code> from a plain JavaScript object, optionally creating a new instance.
* Copies all relevant properties from <code>data</code> to <code>obj</code> if supplied or a new instance if not.
* @param {Object} data The plain JavaScript object bearing properties of interest.
* @param {module:model/WorkerClusterChangeRequest} obj Optional instance to populate.
* @return {module:model/WorkerClusterChangeRequest} The populated <code>WorkerClusterChangeRequest</code> instance.
*/
static constructFromObject(data, obj) {
if (data) {
obj = obj || new WorkerClusterChangeRequest();
if (data.hasOwnProperty('cluster_ids')) {
obj['cluster_ids'] = ApiClient.convertToType(data['cluster_ids'], ['String']);
}
}
return obj;
}
}
/**
* @member {Array.<String>} cluster_ids
*/
WorkerClusterChangeRequest.prototype['cluster_ids'] = undefined;
export default WorkerClusterChangeRequest;

View File

@ -14,20 +14,20 @@
import ApiClient from '../ApiClient'; import ApiClient from '../ApiClient';
/** /**
* The WorkerCluster model module. * The WorkerTag model module.
* @module model/WorkerCluster * @module model/WorkerTag
* @version 0.0.0 * @version 0.0.0
*/ */
class WorkerCluster { class WorkerTag {
/** /**
* Constructs a new <code>WorkerCluster</code>. * Constructs a new <code>WorkerTag</code>.
* Cluster of workers. A job can optionally specify which cluster it should be limited to. Workers can be part of multiple clusters simultaneously. * Tag of workers. A job can optionally specify which tag it should be limited to. Workers can be part of multiple tags simultaneously.
* @alias module:model/WorkerCluster * @alias module:model/WorkerTag
* @param name {String} * @param name {String}
*/ */
constructor(name) { constructor(name) {
WorkerCluster.initialize(this, name); WorkerTag.initialize(this, name);
} }
/** /**
@ -40,15 +40,15 @@ class WorkerCluster {
} }
/** /**
* Constructs a <code>WorkerCluster</code> from a plain JavaScript object, optionally creating a new instance. * Constructs a <code>WorkerTag</code> from a plain JavaScript object, optionally creating a new instance.
* Copies all relevant properties from <code>data</code> to <code>obj</code> if supplied or a new instance if not. * Copies all relevant properties from <code>data</code> to <code>obj</code> if supplied or a new instance if not.
* @param {Object} data The plain JavaScript object bearing properties of interest. * @param {Object} data The plain JavaScript object bearing properties of interest.
* @param {module:model/WorkerCluster} obj Optional instance to populate. * @param {module:model/WorkerTag} obj Optional instance to populate.
* @return {module:model/WorkerCluster} The populated <code>WorkerCluster</code> instance. * @return {module:model/WorkerTag} The populated <code>WorkerTag</code> instance.
*/ */
static constructFromObject(data, obj) { static constructFromObject(data, obj) {
if (data) { if (data) {
obj = obj || new WorkerCluster(); obj = obj || new WorkerTag();
if (data.hasOwnProperty('id')) { if (data.hasOwnProperty('id')) {
obj['id'] = ApiClient.convertToType(data['id'], 'String'); obj['id'] = ApiClient.convertToType(data['id'], 'String');
@ -67,25 +67,25 @@ class WorkerCluster {
} }
/** /**
* UUID of the cluster. Can be ommitted when creating a new cluster, in which case a random UUID will be assigned. * UUID of the tag. Can be ommitted when creating a new tag, in which case a random UUID will be assigned.
* @member {String} id * @member {String} id
*/ */
WorkerCluster.prototype['id'] = undefined; WorkerTag.prototype['id'] = undefined;
/** /**
* @member {String} name * @member {String} name
*/ */
WorkerCluster.prototype['name'] = undefined; WorkerTag.prototype['name'] = undefined;
/** /**
* @member {String} description * @member {String} description
*/ */
WorkerCluster.prototype['description'] = undefined; WorkerTag.prototype['description'] = undefined;
export default WorkerCluster; export default WorkerTag;

View File

@ -0,0 +1,74 @@
/**
* Flamenco manager
* Render Farm manager API
*
* The version of the OpenAPI document: 1.0.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*
*/
import ApiClient from '../ApiClient';
/**
* The WorkerTagChangeRequest model module.
* @module model/WorkerTagChangeRequest
* @version 0.0.0
*/
class WorkerTagChangeRequest {
/**
* Constructs a new <code>WorkerTagChangeRequest</code>.
* Request to change which tags this Worker is assigned to.
* @alias module:model/WorkerTagChangeRequest
* @param tagIds {Array.<String>}
*/
constructor(tagIds) {
WorkerTagChangeRequest.initialize(this, tagIds);
}
/**
* Initializes the fields of this object.
* This method is used by the constructors of any subclasses, in order to implement multiple inheritance (mix-ins).
* Only for internal use.
*/
static initialize(obj, tagIds) {
obj['tag_ids'] = tagIds;
}
/**
* Constructs a <code>WorkerTagChangeRequest</code> from a plain JavaScript object, optionally creating a new instance.
* Copies all relevant properties from <code>data</code> to <code>obj</code> if supplied or a new instance if not.
* @param {Object} data The plain JavaScript object bearing properties of interest.
* @param {module:model/WorkerTagChangeRequest} obj Optional instance to populate.
* @return {module:model/WorkerTagChangeRequest} The populated <code>WorkerTagChangeRequest</code> instance.
*/
static constructFromObject(data, obj) {
if (data) {
obj = obj || new WorkerTagChangeRequest();
if (data.hasOwnProperty('tag_ids')) {
obj['tag_ids'] = ApiClient.convertToType(data['tag_ids'], ['String']);
}
}
return obj;
}
}
/**
* @member {Array.<String>} tag_ids
*/
WorkerTagChangeRequest.prototype['tag_ids'] = undefined;
export default WorkerTagChangeRequest;

View File

@ -12,21 +12,21 @@
*/ */
import ApiClient from '../ApiClient'; import ApiClient from '../ApiClient';
import WorkerCluster from './WorkerCluster'; import WorkerTag from './WorkerTag';
/** /**
* The WorkerClusterList model module. * The WorkerTagList model module.
* @module model/WorkerClusterList * @module model/WorkerTagList
* @version 0.0.0 * @version 0.0.0
*/ */
class WorkerClusterList { class WorkerTagList {
/** /**
* Constructs a new <code>WorkerClusterList</code>. * Constructs a new <code>WorkerTagList</code>.
* @alias module:model/WorkerClusterList * @alias module:model/WorkerTagList
*/ */
constructor() { constructor() {
WorkerClusterList.initialize(this); WorkerTagList.initialize(this);
} }
/** /**
@ -38,18 +38,18 @@ class WorkerClusterList {
} }
/** /**
* Constructs a <code>WorkerClusterList</code> from a plain JavaScript object, optionally creating a new instance. * Constructs a <code>WorkerTagList</code> from a plain JavaScript object, optionally creating a new instance.
* Copies all relevant properties from <code>data</code> to <code>obj</code> if supplied or a new instance if not. * Copies all relevant properties from <code>data</code> to <code>obj</code> if supplied or a new instance if not.
* @param {Object} data The plain JavaScript object bearing properties of interest. * @param {Object} data The plain JavaScript object bearing properties of interest.
* @param {module:model/WorkerClusterList} obj Optional instance to populate. * @param {module:model/WorkerTagList} obj Optional instance to populate.
* @return {module:model/WorkerClusterList} The populated <code>WorkerClusterList</code> instance. * @return {module:model/WorkerTagList} The populated <code>WorkerTagList</code> instance.
*/ */
static constructFromObject(data, obj) { static constructFromObject(data, obj) {
if (data) { if (data) {
obj = obj || new WorkerClusterList(); obj = obj || new WorkerTagList();
if (data.hasOwnProperty('clusters')) { if (data.hasOwnProperty('tags')) {
obj['clusters'] = ApiClient.convertToType(data['clusters'], [WorkerCluster]); obj['tags'] = ApiClient.convertToType(data['tags'], [WorkerTag]);
} }
} }
return obj; return obj;
@ -59,14 +59,14 @@ class WorkerClusterList {
} }
/** /**
* @member {Array.<module:model/WorkerCluster>} clusters * @member {Array.<module:model/WorkerTag>} tags
*/ */
WorkerClusterList.prototype['clusters'] = undefined; WorkerTagList.prototype['tags'] = undefined;
export default WorkerClusterList; export default WorkerTagList;

View File

@ -15,16 +15,16 @@ export const useWorkers = defineStore('workers', {
*/ */
activeWorkerID: "", activeWorkerID: "",
/** @type {API.WorkerCluster[]} */ /** @type {API.WorkerTag[]} */
clusters: [], tags: [],
/* Mapping from cluster UUID to API.WorkerCluster. */ /* Mapping from tag UUID to API.WorkerTag. */
clustersByID: {}, tagsByID: {},
}), }),
actions: { actions: {
setActiveWorkerID(workerID) { setActiveWorkerID(workerID) {
this.$patch({ this.$patch({
activeWorker: {id: workerID, settings: {}, metadata: {}}, activeWorker: { id: workerID, settings: {}, metadata: {} },
activeWorkerID: workerID, activeWorkerID: workerID,
}); });
}, },
@ -47,22 +47,21 @@ export const useWorkers = defineStore('workers', {
}); });
}, },
/** /**
* Fetch the available worker clusters from the Manager. * Fetch the available worker tags from the Manager.
* *
* @returns a promise. * @returns a promise.
*/ */
refreshClusters() { refreshTags() {
const api = new WorkerMgtApi(getAPIClient()); const api = new WorkerMgtApi(getAPIClient());
return api.fetchWorkerClusters() return api.fetchWorkerTags().then((resp) => {
.then((resp) => { this.tags = resp.tags;
this.clusters = resp.clusters;
let clustersByID = {}; let tagsByID = {};
for (let cluster of this.clusters) { for (let tag of this.tags) {
clustersByID[cluster.id] = cluster; tagsByID[tag.id] = tag;
} }
this.clustersByID = clustersByID; this.tagsByID = tagsByID;
}) });
}, },
}, },
}) });