Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions .codegen/service.py.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from dataclasses import dataclass
from datetime import timedelta
from enum import Enum
from typing import Dict, List, Any, Iterator, Type
from typing import Dict, List, Any, Iterator, Type, Callable
import time
import random
import logging
Expand Down Expand Up @@ -52,7 +52,7 @@ class {{.PascalName}}{{if eq "List" .PascalName}}Request{{end}}:{{if .Descriptio
{{- define "as_request_type" -}}
{{- if not .Entity }}None # ERROR: No Type
{{- else if .Entity.ArrayValue }}[{{if .Entity.ArrayValue.IsObject}}v.as_dict(){{else}}v{{end}} for v in self.{{.SnakeName}}]
{{- else if .Entity.IsObject }}self.{{.SnakeName}}.as_dict()
{{- else if or .Entity.IsObject .Entity.IsExternal }}self.{{.SnakeName}}.as_dict()
{{- else if .Entity.Enum }}self.{{.SnakeName}}.value
{{- else}}self.{{.SnakeName}}{{- end -}}
{{- end -}}
Expand Down Expand Up @@ -89,7 +89,8 @@ class {{.Name}}API:{{if .Description}}
def __init__(self, api_client):
self._api = api_client
{{range .Waits}}
def {{.SnakeName}}(self{{range .Binding}}, {{.PollField.SnakeName}}: {{template "type-nq" .PollField.Entity}}{{end}}, timeout=timedelta(minutes={{.Timeout}})) -> {{.Poll.Response.PascalName}}:
def {{.SnakeName}}(self{{range .Binding}}, {{.PollField.SnakeName}}: {{template "type-nq" .PollField.Entity}}{{end}},
timeout=timedelta(minutes={{.Timeout}}), callback: Callable[[{{.Poll.Response.PascalName}}], None] = None) -> {{.Poll.Response.PascalName}}:
deadline = time.time() + timeout.total_seconds()
target_states = ({{range .Success}}{{.Entity.PascalName}}.{{.Content}}, {{end}}){{if .Failure}}
failure_states = ({{range .Failure}}{{.Entity.PascalName}}.{{.Content}}, {{end}}){{end}}
Expand All @@ -109,6 +110,8 @@ class {{.Name}}API:{{if .Description}}
{{- end}}
if status in target_states:
return poll
if callback:
callback(poll)
{{if .Failure -}}
if status in failure_states:
msg = f'failed to reach {{range $i, $e := .Success}}{{if $i}} or {{end}}{{$e.Content}}{{end}}, got {status}: {status_message}'
Expand Down Expand Up @@ -166,8 +169,9 @@ class {{.Name}}API:{{if .Description}}

{{define "method-call-retried" -}}
{{if .Response}}op_response = {{end}}{{template "method-do" .}}
return Wait(self.{{.Wait.SnakeName}}, {{range $i, $b := .Wait.Binding}}{{if $i}}, {{end}}
{{.PollField.SnakeName}}={{if .IsResponseBind}}op_response['{{.Bind.Name}}']{{else}}request.{{.Bind.SnakeName}}{{end}}
return Wait(self.{{.Wait.SnakeName}}
{{if .Response}}, response = {{.Response.PascalName}}.from_dict(op_response){{end}}
{{range .Wait.Binding}}, {{.PollField.SnakeName}}={{if .IsResponseBind}}op_response['{{.Bind.Name}}']{{else}}request.{{.Bind.SnakeName}}{{end}}
{{- end}})
{{- end}}

Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,8 @@ info = w.clusters.create_and_wait(cluster_name='Created cluster',
logging.info(f'Created: {info}')
```

Please look at the `examples/starting_job_and_waiting.py` for a more advanced usage.

## Paginated responses

On the platform side the Databricks APIs have different wait to deal with pagination:
Expand All @@ -240,6 +242,8 @@ for repo in w.repos.list():
logging.info(f'Found repo: {repo.path}')
```

Please look at the `examples/last_job_runs.py` for a more advanced usage.

## Single-Sign-On (SSO) with OAuth

### Authorization Code flow with PKCE
Expand Down
22 changes: 15 additions & 7 deletions databricks/sdk/service/_internal.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,20 @@ def _enum(d: Dict[str, any], field: str, cls: Type) -> any:

class Wait(Generic[ReturnType]):

def __init__(self, waiter: Callable, **kwargs) -> None:
def __init__(self, waiter: Callable, response: any = None, **kwargs) -> None:
self.response = response

self._waiter = waiter
self.arguments = kwargs
self._bind = kwargs

def __getattr__(self, key) -> any:
return self._bind[key]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for adding this!


def bind(self) -> dict:
return self._bind

def result(self, timeout: datetime.timedelta = None) -> ReturnType:
kwargs = self.arguments.copy()
if timeout:
kwargs['timeout'] = timeout
return self._waiter(**kwargs)
def result(self,
timeout: datetime.timedelta = None,
callback: Callable[[ReturnType], None] = None) -> ReturnType:
kwargs = self._bind.copy()
return self._waiter(callback=callback, timeout=timeout, **kwargs)
20 changes: 16 additions & 4 deletions databricks/sdk/service/clusters.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

32 changes: 26 additions & 6 deletions databricks/sdk/service/commands.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 10 additions & 3 deletions databricks/sdk/service/deployment.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 13 additions & 4 deletions databricks/sdk/service/endpoints.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading