diff --git a/CHANGELOG.md b/CHANGELOG.md index ad2d8646..bc29a492 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ bugs in actually-released versions. - While holding shift, the tasks table will not change the ordering of the tasks, to aid in shift-selecting ranges ([#104388](https://projects.blender.org/studio/flamenco/pulls/104388)). - Upgrade Blender Asset Tracer (BAT) to 1.19 to support Blender 5.0 ([BAT#92893](https://projects.blender.org/blender/blender-asset-tracer/pulls/92893)). - Remove the "extra checkout paths" feature from the Shaman system and thus the configuration file ([#104403](https://projects.blender.org/studio/flamenco/issues/104403)). +- Add a new "Worker" column to the Job Task table indicating which worker the task is assigned to. - Update Go & dependencies to fix security vulnerabilities: - https://pkg.go.dev/vuln/GO-2025-3751 - https://pkg.go.dev/vuln/GO-2025-3750 diff --git a/addon/flamenco/manager/docs/TaskSummary.md b/addon/flamenco/manager/docs/TaskSummary.md index d265fdfb..b9cedaca 100644 --- a/addon/flamenco/manager/docs/TaskSummary.md +++ b/addon/flamenco/manager/docs/TaskSummary.md @@ -12,6 +12,7 @@ Name | Type | Description | Notes **priority** | **int** | | **task_type** | **str** | | **updated** | **datetime** | | +**worker** | [**TaskWorker**](TaskWorker.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] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/addon/flamenco/manager/docs/WorkerTask.md b/addon/flamenco/manager/docs/WorkerTask.md index 8daa8348..eb989118 100644 --- a/addon/flamenco/manager/docs/WorkerTask.md +++ b/addon/flamenco/manager/docs/WorkerTask.md @@ -13,6 +13,7 @@ Name | Type | Description | Notes **task_type** | **str** | | **updated** | **datetime** | | **job_id** | **str** | | +**worker** | [**TaskWorker**](TaskWorker.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] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/addon/flamenco/manager/model/task_summary.py b/addon/flamenco/manager/model/task_summary.py index 5daeb1c7..ab9d7bcb 100644 --- a/addon/flamenco/manager/model/task_summary.py +++ b/addon/flamenco/manager/model/task_summary.py @@ -31,7 +31,9 @@ from flamenco.manager.exceptions import ApiAttributeError def lazy_import(): from flamenco.manager.model.task_status import TaskStatus + from flamenco.manager.model.task_worker import TaskWorker globals()['TaskStatus'] = TaskStatus + globals()['TaskWorker'] = TaskWorker class TaskSummary(ModelNormal): @@ -94,6 +96,7 @@ class TaskSummary(ModelNormal): 'priority': (int,), # noqa: E501 'task_type': (str,), # noqa: E501 'updated': (datetime,), # noqa: E501 + 'worker': (TaskWorker,), # noqa: E501 } @cached_property @@ -109,6 +112,7 @@ class TaskSummary(ModelNormal): 'priority': 'priority', # noqa: E501 'task_type': 'task_type', # noqa: E501 'updated': 'updated', # noqa: E501 + 'worker': 'worker', # noqa: E501 } read_only_vars = { @@ -161,6 +165,7 @@ class TaskSummary(ModelNormal): Animal class but this time we won't travel through its discriminator because we passed in _visited_composed_classes = (Animal,) + worker (TaskWorker): [optional] # noqa: E501 """ _check_type = kwargs.pop('_check_type', True) @@ -258,6 +263,7 @@ class TaskSummary(ModelNormal): Animal class but this time we won't travel through its discriminator because we passed in _visited_composed_classes = (Animal,) + worker (TaskWorker): [optional] # noqa: E501 """ _check_type = kwargs.pop('_check_type', True) diff --git a/addon/flamenco/manager/model/worker_task.py b/addon/flamenco/manager/model/worker_task.py index b5641abc..528b7902 100644 --- a/addon/flamenco/manager/model/worker_task.py +++ b/addon/flamenco/manager/model/worker_task.py @@ -32,9 +32,11 @@ from flamenco.manager.exceptions import ApiAttributeError def lazy_import(): from flamenco.manager.model.task_status import TaskStatus from flamenco.manager.model.task_summary import TaskSummary + from flamenco.manager.model.task_worker import TaskWorker from flamenco.manager.model.worker_task_all_of import WorkerTaskAllOf globals()['TaskStatus'] = TaskStatus globals()['TaskSummary'] = TaskSummary + globals()['TaskWorker'] = TaskWorker globals()['WorkerTaskAllOf'] = WorkerTaskAllOf @@ -99,6 +101,7 @@ class WorkerTask(ModelComposed): 'task_type': (str,), # noqa: E501 'updated': (datetime,), # noqa: E501 'job_id': (str,), # noqa: E501 + 'worker': (TaskWorker,), # noqa: E501 } @cached_property @@ -115,6 +118,7 @@ class WorkerTask(ModelComposed): 'task_type': 'task_type', # noqa: E501 'updated': 'updated', # noqa: E501 'job_id': 'job_id', # noqa: E501 + 'worker': 'worker', # noqa: E501 } read_only_vars = { @@ -164,6 +168,7 @@ class WorkerTask(ModelComposed): Animal class but this time we won't travel through its discriminator because we passed in _visited_composed_classes = (Animal,) + worker (TaskWorker): [optional] # noqa: E501 """ _check_type = kwargs.pop('_check_type', True) @@ -271,6 +276,7 @@ class WorkerTask(ModelComposed): Animal class but this time we won't travel through its discriminator because we passed in _visited_composed_classes = (Animal,) + worker (TaskWorker): [optional] # noqa: E501 """ _check_type = kwargs.pop('_check_type', True) diff --git a/internal/manager/api_impl/jobs_query.go b/internal/manager/api_impl/jobs_query.go index 1979b89f..47c54b88 100644 --- a/internal/manager/api_impl/jobs_query.go +++ b/internal/manager/api_impl/jobs_query.go @@ -108,6 +108,20 @@ func (f *Flamenco) FetchJobTasks(e echo.Context, jobID string) error { apiSummaries := make([]api.TaskSummary, len(dbSummaries)) for i, dbSummary := range dbSummaries { apiSummaries[i] = taskSummaryDBtoAPI(dbSummary) + + // We only have the Worker UUID at this point, fetch the full worker information + worker, err := f.persist.FetchWorker(ctx, apiSummaries[i].Worker.Id) + + switch { + case errors.Is(err, persistence.ErrWorkerNotFound): + // This is fine, workers can be soft-deleted from the database, and then + // the above FetchWorker call will not return it. + case err != nil: + logger.Warn().Err(err).Str("worker", apiSummaries[i].Worker.Id).Msg("error fetching task worker") + return sendAPIError(e, http.StatusInternalServerError, "error fetching task worker") + default: + apiSummaries[i].Worker = workerToTaskWorker(worker) + } } result := api.JobTasksSummary{ Tasks: &apiSummaries, @@ -179,10 +193,11 @@ func taskSummaryDBtoAPI(task persistence.TaskSummary) api.TaskSummary { Status: task.Status, TaskType: task.Type, Updated: task.UpdatedAt.Time, + Worker: &api.TaskWorker{Id: task.WorkerUUID.String}, } } -func taskDBtoSummaryAPI(task persistence.Task) api.TaskSummary { +func taskDBtoSummaryAPI(task persistence.Task, worker *persistence.Worker) api.TaskSummary { return api.TaskSummary{ Id: task.UUID, Name: task.Name, @@ -191,5 +206,6 @@ func taskDBtoSummaryAPI(task persistence.Task) api.TaskSummary { Status: task.Status, TaskType: task.Type, Updated: task.UpdatedAt.Time, + Worker: workerToTaskWorker(worker), } } diff --git a/internal/manager/api_impl/worker_mgt.go b/internal/manager/api_impl/worker_mgt.go index 8882bbd9..e7910371 100644 --- a/internal/manager/api_impl/worker_mgt.go +++ b/internal/manager/api_impl/worker_mgt.go @@ -80,7 +80,7 @@ func (f *Flamenco) FetchWorker(e echo.Context, workerUUID string) error { if taskJob != nil { apiWorkerTask := api.WorkerTask{ - TaskSummary: taskDBtoSummaryAPI(taskJob.Task), + TaskSummary: taskDBtoSummaryAPI(taskJob.Task, dbWorker), JobId: taskJob.JobUUID, } apiWorker.Task = &apiWorkerTask diff --git a/internal/manager/api_impl/worker_mgt_test.go b/internal/manager/api_impl/worker_mgt_test.go index bbb0d12e..e44c43c6 100644 --- a/internal/manager/api_impl/worker_mgt_test.go +++ b/internal/manager/api_impl/worker_mgt_test.go @@ -132,6 +132,11 @@ func TestFetchWorker(t *testing.T) { Id: assignedTask.UUID, Name: assignedTask.Name, Status: assignedTask.Status, + Worker: &api.TaskWorker{ + Address: "fe80::5054:ff:fede:2ad7", + Id: "e7632d62-c3b8-4af0-9e78-01752928952c", + Name: "дрон", + }, }, JobId: assignedJob.UUID, }, diff --git a/internal/manager/persistence/jobs_query.go b/internal/manager/persistence/jobs_query.go index 75e33cfd..fcd042fa 100644 --- a/internal/manager/persistence/jobs_query.go +++ b/internal/manager/persistence/jobs_query.go @@ -33,7 +33,8 @@ func (db *DB) QueryJobTaskSummaries(ctx context.Context, jobUUID string) ([]Task Type: task.Type, IndexInJob: task.IndexInJob, Priority: task.Priority, - Status: api.TaskStatus(task.Status), + Status: task.Status, + WorkerUUID: task.WorkerUUID, } } diff --git a/internal/manager/persistence/sqlc/query_jobs.sql b/internal/manager/persistence/sqlc/query_jobs.sql index 4e89e838..d02a3efa 100644 --- a/internal/manager/persistence/sqlc/query_jobs.sql +++ b/internal/manager/persistence/sqlc/query_jobs.sql @@ -325,9 +325,10 @@ AND T.type = @task_type; -- name: QueryJobTaskSummaries :many -SELECT tasks.id, tasks.uuid, tasks.name, tasks.index_in_job, tasks.priority, tasks.status, tasks.type, tasks.updated_at +SELECT tasks.id, tasks.uuid, tasks.name, tasks.index_in_job, tasks.priority, tasks.status, tasks.type, tasks.updated_at, workers.UUID as workerUUID FROM tasks LEFT JOIN jobs ON jobs.id = tasks.job_id +LEFT JOIN workers ON workers.id = tasks.worker_id WHERE jobs.uuid=@job_uuid; -- name: SummarizeJobStatuses :many diff --git a/internal/manager/persistence/sqlc/query_jobs.sql.go b/internal/manager/persistence/sqlc/query_jobs.sql.go index 87ef4770..90bddefc 100644 --- a/internal/manager/persistence/sqlc/query_jobs.sql.go +++ b/internal/manager/persistence/sqlc/query_jobs.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.26.0 +// sqlc v1.29.0 // source: query_jobs.sql package sqlc @@ -998,9 +998,10 @@ func (q *Queries) JobCountTasksInStatus(ctx context.Context, arg JobCountTasksIn } const queryJobTaskSummaries = `-- name: QueryJobTaskSummaries :many -SELECT tasks.id, tasks.uuid, tasks.name, tasks.index_in_job, tasks.priority, tasks.status, tasks.type, tasks.updated_at +SELECT tasks.id, tasks.uuid, tasks.name, tasks.index_in_job, tasks.priority, tasks.status, tasks.type, tasks.updated_at, workers.UUID as workerUUID FROM tasks LEFT JOIN jobs ON jobs.id = tasks.job_id +LEFT JOIN workers ON workers.id = tasks.worker_id WHERE jobs.uuid=?1 ` @@ -1013,6 +1014,7 @@ type QueryJobTaskSummariesRow struct { Status api.TaskStatus Type string UpdatedAt sql.NullTime + WorkerUUID sql.NullString } func (q *Queries) QueryJobTaskSummaries(ctx context.Context, jobUuid string) ([]QueryJobTaskSummariesRow, error) { @@ -1033,6 +1035,7 @@ func (q *Queries) QueryJobTaskSummaries(ctx context.Context, jobUuid string) ([] &i.Status, &i.Type, &i.UpdatedAt, + &i.WorkerUUID, ); err != nil { return nil, err } diff --git a/pkg/api/flamenco-openapi.yaml b/pkg/api/flamenco-openapi.yaml index 1f145888..cd12d83d 100644 --- a/pkg/api/flamenco-openapi.yaml +++ b/pkg/api/flamenco-openapi.yaml @@ -2072,6 +2072,7 @@ components: priority: { type: integer } task_type: { type: string } updated: { type: string, format: date-time } + worker: { $ref: "#/components/schemas/TaskWorker" } required: [id, name, status, index_in_job, priority, task_type, updated] TaskLogInfo: diff --git a/pkg/api/openapi_spec.gen.go b/pkg/api/openapi_spec.gen.go index 5f21b7e2..132610b9 100644 --- a/pkg/api/openapi_spec.gen.go +++ b/pkg/api/openapi_spec.gen.go @@ -18,236 +18,236 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "AA==", + "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", + "/qj6WxIBAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/pkg/api/openapi_types.gen.go b/pkg/api/openapi_types.gen.go index 712da0f5..2202f73f 100644 --- a/pkg/api/openapi_types.gen.go +++ b/pkg/api/openapi_types.gen.go @@ -787,6 +787,9 @@ type TaskSummary struct { Status TaskStatus `json:"status"` TaskType string `json:"task_type"` Updated time.Time `json:"updated"` + + // Worker reference, as used in Task objects. + Worker *TaskWorker `json:"worker,omitempty"` } // TaskUpdate is sent by a Worker to update the status & logs of a task it's executing. All properties are optional; omitted properties are ignored (i.e. omitting `activity` will not erase the activity property of the task). diff --git a/web/app/src/components/jobs/TasksTable.vue b/web/app/src/components/jobs/TasksTable.vue index a6b134d8..112cd864 100644 --- a/web/app/src/components/jobs/TasksTable.vue +++ b/web/app/src/components/jobs/TasksTable.vue @@ -82,6 +82,19 @@ export default { return datetime.relativeTime(cellValue); }, }, + { + title: 'Worker', + field: 'worker.name', + sorter: 'string', + sorterParams: { alignEmptyValues: 'bottom' }, + formatter: (cell) => { + const worker = cell.getData().worker; + if (!worker) return ''; + return `${worker.name}`; + }, + minWidth: 100, + widthGrow: 1, + }, ], rowFormatter(row) { const data = row.getData(); diff --git a/web/app/src/manager-api/model/TaskSummary.js b/web/app/src/manager-api/model/TaskSummary.js index a58f3c4a..b11dbdc1 100644 --- a/web/app/src/manager-api/model/TaskSummary.js +++ b/web/app/src/manager-api/model/TaskSummary.js @@ -13,6 +13,7 @@ import ApiClient from '../ApiClient'; import TaskStatus from './TaskStatus'; +import TaskWorker from './TaskWorker'; /** * The TaskSummary model module. @@ -84,6 +85,9 @@ class TaskSummary { if (data.hasOwnProperty('updated')) { obj['updated'] = ApiClient.convertToType(data['updated'], 'Date'); } + if (data.hasOwnProperty('worker')) { + obj['worker'] = TaskWorker.constructFromObject(data['worker']); + } } return obj; } @@ -126,6 +130,11 @@ TaskSummary.prototype['task_type'] = undefined; */ TaskSummary.prototype['updated'] = undefined; +/** + * @member {module:model/TaskWorker} worker + */ +TaskSummary.prototype['worker'] = undefined; + diff --git a/web/app/src/manager-api/model/WorkerTask.js b/web/app/src/manager-api/model/WorkerTask.js index 4b2a85c8..67dbbaff 100644 --- a/web/app/src/manager-api/model/WorkerTask.js +++ b/web/app/src/manager-api/model/WorkerTask.js @@ -14,6 +14,7 @@ import ApiClient from '../ApiClient'; import TaskStatus from './TaskStatus'; import TaskSummary from './TaskSummary'; +import TaskWorker from './TaskWorker'; import WorkerTaskAllOf from './WorkerTaskAllOf'; /** @@ -92,6 +93,9 @@ class WorkerTask { if (data.hasOwnProperty('updated')) { obj['updated'] = ApiClient.convertToType(data['updated'], 'Date'); } + if (data.hasOwnProperty('worker')) { + obj['worker'] = TaskWorker.constructFromObject(data['worker']); + } if (data.hasOwnProperty('job_id')) { obj['job_id'] = ApiClient.convertToType(data['job_id'], 'String'); } @@ -137,6 +141,11 @@ WorkerTask.prototype['task_type'] = undefined; */ WorkerTask.prototype['updated'] = undefined; +/** + * @member {module:model/TaskWorker} worker + */ +WorkerTask.prototype['worker'] = undefined; + /** * @member {String} job_id */ @@ -172,6 +181,10 @@ TaskSummary.prototype['task_type'] = undefined; * @member {Date} updated */ TaskSummary.prototype['updated'] = undefined; +/** + * @member {module:model/TaskWorker} worker + */ +TaskSummary.prototype['worker'] = undefined; // Implement WorkerTaskAllOf interface: /** * @member {String} job_id