Skip to content

Commit f99564c

Browse files
[wip] add support for registered_models for direct deployment
1 parent 972db90 commit f99564c

File tree

7 files changed

+151
-0
lines changed

7 files changed

+151
-0
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
bundle:
2+
name: deploy-registered-models-basic-$UNIQUE_NAME
3+
4+
resources:
5+
registered_models:
6+
my_registered_model:
7+
name: $NAME
8+
comment: $COMMENT
9+
catalog_name: $CATALOG_NAME
10+
schema_name: $SCHEMA_NAME
11+
storage_location: $STORAGE_LOCATION

acceptance/bundle/deploy/registered_models/basic/out.test.toml

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
2+
=== create the registered model
3+
>>> export NAME=my-registered-model-[UNIQUE_NAME]
4+
5+
>>> export COMMENT=original comment
6+
7+
>>> export CATALOG_NAME=main
8+
9+
>>> export SCHEMA_NAME=default
10+
11+
>>> export STORAGE_LOCATION=s3://my-bucket/my-path
12+
13+
>>> [CLI] bundle plan
14+
create registered_models.my_registered_model
15+
16+
Plan: 1 to add, 0 to change, 0 to delete, 0 unchanged
17+
18+
>>> [CLI] bundle deploy
19+
Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/deploy-registered-models-basic-[UNIQUE_NAME]/default/files...
20+
Deploying resources...
21+
Updating deployment state...
22+
Deployment complete!
23+
24+
>>> [CLI] registered-models get main.default.my-registered-model-[UNIQUE_NAME]
25+
{
26+
"name": "my-registered-model-[UNIQUE_NAME]",
27+
"comment": "original comment",
28+
"catalog_name": "main",
29+
"schema_name": "default",
30+
"storage_location": "abfss://decotestprod-unity-iso@decotestprodunityiso.dfs.core.windows.net/[UUID]/models/[UUID]"
31+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
title "create the registered model"
2+
3+
trace export NAME="my-registered-model-$UNIQUE_NAME"
4+
trace export COMMENT="original comment"
5+
trace export CATALOG_NAME="main"
6+
trace export SCHEMA_NAME="default"
7+
trace export STORAGE_LOCATION="s3://my-bucket/my-path"
8+
envsubst < databricks.yml.tmpl > databricks.yml
9+
trace $CLI bundle plan
10+
trace $CLI bundle deploy
11+
registered_model_id=$($CLI bundle summary --output json | jq -r '.resources.registered_models.my_registered_model.id')
12+
trace $CLI registered-models get "${registered_model_id}" | jq '{name, comment, catalog_name, schema_name, storage_location}'
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Cloud = true
2+
Local = false

bundle/direct/dresources/all.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ var SupportedResources = map[string]any{
1717
"database_catalogs": (*ResourceDatabaseCatalog)(nil),
1818
"synced_database_tables": (*ResourceSyncedDatabaseTable)(nil),
1919
"alerts": (*ResourceAlert)(nil),
20+
"registered_models": (*ResourceRegisteredModel)(nil),
2021
}
2122

2223
func InitAll(client *databricks.WorkspaceClient) (map[string]*Adapter, error) {
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package dresources
2+
3+
import (
4+
"context"
5+
6+
"github.com/databricks/cli/bundle/config/resources"
7+
"github.com/databricks/cli/bundle/deployplan"
8+
"github.com/databricks/databricks-sdk-go"
9+
"github.com/databricks/databricks-sdk-go/service/catalog"
10+
)
11+
12+
type ResourceRegisteredModel struct {
13+
client *databricks.WorkspaceClient
14+
}
15+
16+
func (*ResourceRegisteredModel) New(client *databricks.WorkspaceClient) *ResourceRegisteredModel {
17+
return &ResourceRegisteredModel{
18+
client: client,
19+
}
20+
}
21+
22+
func (*ResourceRegisteredModel) PrepareState(input *resources.RegisteredModel) *catalog.CreateRegisteredModelRequest {
23+
return &input.CreateRegisteredModelRequest
24+
}
25+
26+
func (*ResourceRegisteredModel) RemapState(model *catalog.RegisteredModelInfo) *catalog.CreateRegisteredModelRequest {
27+
return &catalog.CreateRegisteredModelRequest{
28+
CatalogName: model.CatalogName,
29+
Comment: model.Comment,
30+
Name: model.Name,
31+
SchemaName: model.SchemaName,
32+
StorageLocation: model.StorageLocation,
33+
ForceSendFields: filterFields[catalog.CreateRegisteredModelRequest](model.ForceSendFields),
34+
}
35+
}
36+
37+
func (r *ResourceRegisteredModel) DoRefresh(ctx context.Context, id string) (*catalog.RegisteredModelInfo, error) {
38+
return r.client.RegisteredModels.Get(ctx, catalog.GetRegisteredModelRequest{
39+
FullName: id,
40+
})
41+
}
42+
43+
func (r *ResourceRegisteredModel) DoCreate(ctx context.Context, config *catalog.CreateRegisteredModelRequest) (string, *catalog.RegisteredModelInfo, error) {
44+
response, err := r.client.RegisteredModels.Create(ctx, *config)
45+
if err != nil {
46+
return "", nil, err
47+
}
48+
49+
return response.FullName, response, nil
50+
}
51+
52+
func (r *ResourceRegisteredModel) DoUpdate(ctx context.Context, id string, config *catalog.CreateRegisteredModelRequest) (*catalog.RegisteredModelInfo, error) {
53+
updateRequest := catalog.UpdateRegisteredModelRequest{
54+
FullName: id,
55+
Comment: config.Comment,
56+
ForceSendFields: filterFields[catalog.UpdateRegisteredModelRequest](config.ForceSendFields, "Owner", "NewName"),
57+
58+
// Owner is not part of the configuration tree
59+
Owner: "",
60+
61+
// name updates are not supported yet. Can be added as a follow-up.
62+
NewName: "",
63+
}
64+
65+
response, err := r.client.RegisteredModels.Update(ctx, updateRequest)
66+
if err != nil {
67+
return nil, err
68+
}
69+
70+
return response, nil
71+
}
72+
73+
func (r *ResourceRegisteredModel) DoDelete(ctx context.Context, id string) error {
74+
return r.client.RegisteredModels.Delete(ctx, catalog.DeleteRegisteredModelRequest{
75+
FullName: id,
76+
})
77+
}
78+
79+
func (*ResourceRegisteredModel) FieldTriggers() map[string]deployplan.ActionType {
80+
return map[string]deployplan.ActionType{
81+
// The name can technically be updated without recreated. We recreate for now `though
82+
// to match TF implementation.
83+
"name": deployplan.ActionTypeRecreate,
84+
85+
"catalog_name": deployplan.ActionTypeRecreate,
86+
"schema_name": deployplan.ActionTypeRecreate,
87+
"storage_location": deployplan.ActionTypeRecreate,
88+
}
89+
}

0 commit comments

Comments
 (0)