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

Adding d1 binding to worker_bindings #1446

Merged
merged 7 commits into from
Nov 22, 2023
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/1446.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
worker_bindings: add support for `d1` bindings
```
55 changes: 42 additions & 13 deletions workers_bindings.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ const (
WorkerQueueBindingType WorkerBindingType = "queue"
// DispatchNamespaceBindingType is the type for WFP namespace bindings.
DispatchNamespaceBindingType WorkerBindingType = "dispatch_namespace"
// WorkerD1DataseBindingType is for D1 databases.
WorkerD1DataseBindingType WorkerBindingType = "d1"
)

type ListWorkerBindingsParams struct {
Expand Down Expand Up @@ -125,7 +127,7 @@ func (b WorkerKvNamespaceBinding) Type() WorkerBindingType {

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

return workerBindingMeta{
Expand Down Expand Up @@ -209,7 +211,7 @@ func (b WorkerPlainTextBinding) Type() WorkerBindingType {

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

return workerBindingMeta{
Expand All @@ -233,7 +235,7 @@ func (b WorkerSecretTextBinding) Type() WorkerBindingType {

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

return workerBindingMeta{
Expand All @@ -254,7 +256,7 @@ func (b WorkerServiceBinding) Type() WorkerBindingType {

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

meta := workerBindingMeta{
Expand Down Expand Up @@ -304,7 +306,7 @@ func (b WorkerAnalyticsEngineBinding) Type() WorkerBindingType {

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 nil, nil, fmt.Errorf(`dataset for binding "%s" cannot be empty`, bindingName)
}

return workerBindingMeta{
Expand All @@ -329,10 +331,10 @@ func (b WorkerQueueBinding) Type() WorkerBindingType {

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

return workerBindingMeta{
Expand Down Expand Up @@ -372,10 +374,10 @@ func (b DispatchNamespaceBinding) Type() WorkerBindingType {

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

meta := workerBindingMeta{
Expand All @@ -386,7 +388,7 @@ func (b DispatchNamespaceBinding) serialize(bindingName string) (workerBindingMe

if b.Outbound != nil {
if b.Outbound.Worker.Service == "" {
return nil, nil, fmt.Errorf(`Outbound options for binding "%s" must have a service name`, bindingName)
return nil, nil, fmt.Errorf(`outbound options for binding "%s" must have a service name`, bindingName)
}

var params []map[string]interface{}
Expand All @@ -408,6 +410,28 @@ func (b DispatchNamespaceBinding) serialize(bindingName string) (workerBindingMe
return meta, nil, nil
}

// WorkerD1DatabaseBinding is a binding to a D1 instance.
type WorkerD1DatabaseBinding struct {
DatabaseID string
}

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

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

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

// UnsafeBinding is for experimental or deprecated bindings, and allows specifying any binding type or property.
type UnsafeBinding map[string]interface{}

Expand All @@ -432,7 +456,7 @@ func getRandomPartName() string {
// ListWorkerBindings returns all the bindings for a particular worker.
func (api *API) ListWorkerBindings(ctx context.Context, rc *ResourceContainer, params ListWorkerBindingsParams) (WorkerBindingListResponse, error) {
if params.ScriptName == "" {
return WorkerBindingListResponse{}, errors.New("ScriptName is required")
return WorkerBindingListResponse{}, errors.New("script name is required")
}

if rc.Level != AccountRouteLevel {
Expand Down Expand Up @@ -466,11 +490,11 @@ func (api *API) ListWorkerBindings(ctx context.Context, rc *ResourceContainer, p
for _, jsonBinding := range jsonRes.Bindings {
name, ok := jsonBinding["name"].(string)
if !ok {
return r, fmt.Errorf("Binding missing name %v", jsonBinding)
return r, fmt.Errorf("binding missing name %v", jsonBinding)
}
bType, ok := jsonBinding["type"].(string)
if !ok {
return r, fmt.Errorf("Binding missing type %v", jsonBinding)
return r, fmt.Errorf("binding missing type %v", jsonBinding)
}
bindingListItem := WorkerBindingListItem{
Name: name,
Expand Down Expand Up @@ -529,6 +553,11 @@ func (api *API) ListWorkerBindings(ctx context.Context, rc *ResourceContainer, p
bindingListItem.Binding = WorkerAnalyticsEngineBinding{
Dataset: dataset,
}
case WorkerD1DataseBindingType:
database_id := jsonBinding["database_id"].(string)
bindingListItem.Binding = WorkerD1DatabaseBinding{
DatabaseID: database_id,
}
default:
bindingListItem.Binding = WorkerInheritBinding{}
}
Expand Down
11 changes: 10 additions & 1 deletion workers_bindings_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ func TestListWorkerBindings(t *testing.T) {
assert.NoError(t, err)

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

assert.Equal(t, res.BindingList[0], WorkerBindingListItem{
Name: "MY_KV",
Expand Down Expand Up @@ -96,7 +96,16 @@ func TestListWorkerBindings(t *testing.T) {
Dataset: "my_dataset",
},
})

assert.Equal(t, WorkerAnalyticsEngineBindingType, res.BindingList[7].Binding.Type())

assert.Equal(t, res.BindingList[8], WorkerBindingListItem{
Name: "MY_DATABASE",
Binding: WorkerD1DatabaseBinding{
DatabaseID: "cef5331f-e5c7-4c8a-a415-7908ae45f92a",
},
})
assert.Equal(t, WorkerD1DataseBindingType, res.BindingList[8].Binding.Type())
}

func ExampleUnsafeBinding() {
Expand Down
5 changes: 5 additions & 0 deletions workers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,11 @@ const (
"name": "MY_DATASET",
"type": "analytics_engine",
"dataset": "my_dataset"
},
{
"name": "MY_DATABASE",
"type": "d1",
"database_id": "cef5331f-e5c7-4c8a-a415-7908ae45f92a"
}
],
"success": true,
Expand Down