diff --git a/workers.go b/workers.go index 9eaf6973c9f..3faa39982dc 100644 --- a/workers.go +++ b/workers.go @@ -188,8 +188,8 @@ type WorkerMetaData struct { TailConsumers *[]WorkersTailConsumer `json:"tail_consumers,omitempty"` LastDeployedFrom *string `json:"last_deployed_from,omitempty"` DeploymentId *string `json:"deployment_id,omitempty"` - PlacementMode *PlacementMode `json:"placement_mode,omitempty"` - PipelineHash *string `json:"pipeline_hash,omitempty"` + PlacementFields + PipelineHash *string `json:"pipeline_hash,omitempty"` } // WorkerListResponse wrapper struct for API response to worker script list API call. @@ -228,8 +228,29 @@ const ( PlacementModeSmart PlacementMode = "smart" ) +type PlacementStatus string + +// Placement contains all the worker placement information. type Placement struct { + + // Mode is the placement mode for the worker (e.g. "smart"). Mode PlacementMode `json:"mode"` + + // Status is the status of the placement (readonly). + Status PlacementStatus `json:"status,omitempty"` +} + +// PlacementFields contains all the worker placement fields (deprecated and nested). +// This struct is meant to be embedded, it exists for locality of deprecated and regular fields. +type PlacementFields struct { + + // PlacementMode. + // + // Deprecated: Use Placement.Mode instead. + PlacementMode *PlacementMode `json:"placement_mode,omitempty"` + + // Placement. + Placement *Placement `json:"placement,omitempty"` } // DeleteWorker deletes a single Worker. diff --git a/workers_test.go b/workers_test.go index ef0e09987a6..eef17f91855 100644 --- a/workers_test.go +++ b/workers_test.go @@ -240,7 +240,7 @@ type ( CompatibilityDate *string `json:"compatibility_date,omitempty"` Logpush *bool `json:"logpush,omitempty"` TailConsumers *[]WorkersTailConsumer `json:"tail_consumers,omitempty"` - PlacementMode *string `json:"placement_mode,omitempty"` + PlacementFields } workersTestResponseOpt func(r *WorkersTestScriptResponse) ) @@ -307,8 +307,16 @@ func withWorkerLogpush(logpush *bool) workersTestResponseOpt { } //nolint:unused -func withWorkerPlacementMode(mode *string) workersTestResponseOpt { - return func(r *WorkersTestScriptResponse) { r.PlacementMode = mode } +func withWorkerPlacementMode(mode *PlacementMode) workersTestResponseOpt { + return func(r *WorkersTestScriptResponse) { + if mode == nil { + r.PlacementMode = nil + r.Placement = nil + } else { + r.PlacementMode = mode + r.Placement = &Placement{Mode: *mode} + } + } } //nolint:unused @@ -1268,7 +1276,7 @@ func TestUploadWorker_WithSmartPlacementEnabled(t *testing.T) { defer teardown() placementMode := PlacementModeSmart - response := workersScriptResponse(t, withWorkerScript(expectedWorkersModuleWorkerScript), withWorkerPlacementMode(StringPtr("smart"))) + response := workersScriptResponse(t, withWorkerScript(expectedWorkersModuleWorkerScript), withWorkerPlacementMode(AnyPtr(PlacementModeSmart))) handler := func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodPut, r.Method, "Expected method 'PUT', got %s", r.Method) @@ -1293,6 +1301,8 @@ func TestUploadWorker_WithSmartPlacementEnabled(t *testing.T) { }) assert.NoError(t, err) assert.Equal(t, placementMode, *worker.PlacementMode) + assert.NotNil(t, worker.Placement) + assert.Equal(t, placementMode, worker.Placement.Mode) }) t.Run("Test disabling placement", func(t *testing.T) { @@ -1308,6 +1318,7 @@ func TestUploadWorker_WithSmartPlacementEnabled(t *testing.T) { }) assert.NoError(t, err) assert.Nil(t, worker.PlacementMode) + assert.Nil(t, worker.Placement) }) }