Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DS-12892: Add Workers Analytics Engine binding #1133

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/1133.txt
@@ -0,0 +1,3 @@
```release-note:enhancement
workers: Support for Workers Analytics Engine bindings
```
29 changes: 29 additions & 0 deletions workers.go
Expand Up @@ -111,6 +111,8 @@ const (
WorkerServiceBindingType WorkerBindingType = "service"
// WorkerR2BucketBindingType is the type for R2 bucket bindings.
WorkerR2BucketBindingType WorkerBindingType = "r2_bucket"
// WorkerAnalyticsEngineBindingType is the type for Analytics Engine dataset bindings.
WorkerAnalyticsEngineBindingType WorkerBindingType = "analytics_engine"
)

// WorkerBindingListItem a struct representing an individual binding in a list of bindings.
Expand Down Expand Up @@ -355,6 +357,28 @@ func (b WorkerR2BucketBinding) serialize(bindingName string) (workerBindingMeta,
}, nil, nil
}

// WorkerAnalyticsEngineBinding is a binding to an Analytics Engine dataset.
type WorkerAnalyticsEngineBinding struct {
Dataset string
}

// Type returns the type of the binding.
func (b WorkerAnalyticsEngineBinding) Type() WorkerBindingType {
return WorkerAnalyticsEngineBindingType
}

func (b WorkerAnalyticsEngineBinding) serialize(bindingName string) (workerBindingMeta, workerBindingBodyWriter, error) {
if b.Dataset == "" {
return nil, nil, fmt.Errorf(`Dataset for binding "%s" cannot be empty`, bindingName)
}

return workerBindingMeta{
"name": bindingName,
"type": b.Type(),
"dataset": b.Dataset,
}, nil, nil
}

// Each binding that adds a part to the multipart form body will need
// a unique part name so we just generate a random 128bit hex string.
func getRandomPartName() string {
Expand Down Expand Up @@ -545,6 +569,11 @@ func (api *API) ListWorkerBindings(ctx context.Context, requestParams *WorkerReq
bindingListItem.Binding = WorkerR2BucketBinding{
BucketName: bucketName,
}
case WorkerAnalyticsEngineBindingType:
dataset := jsonBinding["dataset"].(string)
bindingListItem.Binding = WorkerAnalyticsEngineBinding{
Dataset: dataset,
}
default:
bindingListItem.Binding = WorkerInheritBinding{}
}
Expand Down
15 changes: 14 additions & 1 deletion workers_test.go
Expand Up @@ -154,6 +154,11 @@ const (
"name": "MY_BUCKET",
"type": "r2_bucket",
"bucket_name": "bucket"
},
{
"name": "MY_DATASET",
"type": "analytics_engine",
"dataset": "my_dataset"
}
],
"success": true,
Expand Down Expand Up @@ -1216,7 +1221,7 @@ func TestWorkers_ListWorkerBindingsMultiScript(t *testing.T) {
assert.NoError(t, err)

assert.Equal(t, successResponse, res.Response)
assert.Equal(t, 7, len(res.BindingList))
assert.Equal(t, 8, len(res.BindingList))

assert.Equal(t, res.BindingList[0], WorkerBindingListItem{
Name: "MY_KV",
Expand Down Expand Up @@ -1270,6 +1275,14 @@ func TestWorkers_ListWorkerBindingsMultiScript(t *testing.T) {
},
})
assert.Equal(t, WorkerR2BucketBindingType, res.BindingList[6].Binding.Type())

assert.Equal(t, res.BindingList[7], WorkerBindingListItem{
Name: "MY_DATASET",
Binding: WorkerAnalyticsEngineBinding{
Dataset: "my_dataset",
},
})
assert.Equal(t, WorkerAnalyticsEngineBindingType, res.BindingList[7].Binding.Type())
}

func TestWorkers_UpdateWorkerRouteErrorsWhenMixingSingleAndMultiScriptProperties(t *testing.T) {
Expand Down