Expand and upload local wheel libraries for all task types (#1649)

## Changes
Fixes #1553 

## Tests
Added regression test
This commit is contained in:
Andrew Nester 2024-08-05 16:44:23 +02:00 committed by GitHub
parent ed4411f1a6
commit 809c67b675
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 89 additions and 18 deletions

View File

@ -27,9 +27,9 @@ func (m *detectPkg) Name() string {
} }
func (m *detectPkg) Apply(ctx context.Context, b *bundle.Bundle) diag.Diagnostics { func (m *detectPkg) Apply(ctx context.Context, b *bundle.Bundle) diag.Diagnostics {
wheelTasks := libraries.FindAllWheelTasksWithLocalLibraries(b) tasks := libraries.FindTasksWithLocalLibraries(b)
if len(wheelTasks) == 0 { if len(tasks) == 0 {
log.Infof(ctx, "No local wheel tasks in databricks.yml config, skipping auto detect") log.Infof(ctx, "No local tasks in databricks.yml config, skipping auto detect")
return nil return nil
} }
log.Infof(ctx, "Detecting Python wheel project...") log.Infof(ctx, "Detecting Python wheel project...")

View File

@ -27,8 +27,13 @@ func (*fromLibraries) Apply(ctx context.Context, b *bundle.Bundle) diag.Diagnost
return nil return nil
} }
tasks := libraries.FindAllWheelTasksWithLocalLibraries(b) tasks := libraries.FindTasksWithLocalLibraries(b)
for _, task := range tasks { for _, task := range tasks {
// Skip tasks that are not PythonWheelTasks for now, we can later support Jars too
if task.PythonWheelTask == nil {
continue
}
for _, lib := range task.Libraries { for _, lib := range task.Libraries {
matchAndAdd(ctx, lib.Whl, b) matchAndAdd(ctx, lib.Whl, b)
} }

View File

@ -44,29 +44,25 @@ func isEnvsWithLocalLibraries(envs []jobs.JobEnvironment) bool {
return false return false
} }
func FindAllWheelTasksWithLocalLibraries(b *bundle.Bundle) []*jobs.Task { func FindTasksWithLocalLibraries(b *bundle.Bundle) []jobs.Task {
tasks := findAllTasks(b) tasks := findAllTasks(b)
envs := FindAllEnvironments(b) envs := FindAllEnvironments(b)
wheelTasks := make([]*jobs.Task, 0) allTasks := make([]jobs.Task, 0)
for k, jobTasks := range tasks { for k, jobTasks := range tasks {
for i := range jobTasks { for i := range jobTasks {
task := &jobTasks[i] task := jobTasks[i]
if task.PythonWheelTask == nil { if isTaskWithLocalLibraries(task) {
continue allTasks = append(allTasks, task)
} }
}
if isTaskWithLocalLibraries(*task) { if envs[k] != nil && isEnvsWithLocalLibraries(envs[k]) {
wheelTasks = append(wheelTasks, task) allTasks = append(allTasks, jobTasks...)
}
if envs[k] != nil && isEnvsWithLocalLibraries(envs[k]) {
wheelTasks = append(wheelTasks, task)
}
} }
} }
return wheelTasks return allTasks
} }
func isTaskWithLocalLibraries(task jobs.Task) bool { func isTaskWithLocalLibraries(task jobs.Task) bool {

View File

@ -35,7 +35,7 @@ func isPythonWheelWrapperOn(b *bundle.Bundle) bool {
} }
func hasIncompatibleWheelTasks(ctx context.Context, b *bundle.Bundle) bool { func hasIncompatibleWheelTasks(ctx context.Context, b *bundle.Bundle) bool {
tasks := libraries.FindAllWheelTasksWithLocalLibraries(b) tasks := libraries.FindTasksWithLocalLibraries(b)
for _, task := range tasks { for _, task := range tasks {
if task.NewCluster != nil { if task.NewCluster != nil {
if lowerThanExpectedVersion(ctx, task.NewCluster.SparkVersion) { if lowerThanExpectedVersion(ctx, task.NewCluster.SparkVersion) {

View File

@ -0,0 +1,3 @@
build/
*.egg-info
.databricks

View File

@ -0,0 +1,14 @@
bundle:
name: python-wheel-notebook
resources:
jobs:
test_job:
name: "[${bundle.environment}] My Wheel Job"
tasks:
- task_key: TestTask
existing_cluster_id: "0717-aaaaa-bbbbbb"
notebook_task:
notebook_path: "/notebook.py"
libraries:
- whl: ./dist/*.whl

View File

@ -0,0 +1,2 @@
__version__ = "0.0.1"
__author__ = "Databricks"

View File

@ -0,0 +1,16 @@
"""
The entry point of the Python Wheel
"""
import sys
def main():
# This method will print the provided arguments
print('Hello from my func')
print('Got arguments:')
print(sys.argv)
if __name__ == '__main__':
main()

View File

@ -0,0 +1,3 @@
# Databricks notebook source
print("Hello, World!")

View File

@ -0,0 +1,15 @@
from setuptools import setup, find_packages
import my_test_code
setup(
name="my_test_code",
version=my_test_code.__version__,
author=my_test_code.__author__,
url="https://databricks.com",
author_email="john.doe@databricks.com",
description="my test wheel",
packages=find_packages(include=["my_test_code"]),
entry_points={"group_1": "run=my_test_code.__main__:main"},
install_requires=["setuptools"],
)

View File

@ -45,6 +45,23 @@ func TestPythonWheelBuildAutoDetect(t *testing.T) {
require.NoError(t, diags.Error()) require.NoError(t, diags.Error())
} }
func TestPythonWheelBuildAutoDetectWithNotebookTask(t *testing.T) {
ctx := context.Background()
b, err := bundle.Load(ctx, "./python_wheel/python_wheel_no_artifact_notebook")
require.NoError(t, err)
diags := bundle.Apply(ctx, b, bundle.Seq(phases.Load(), phases.Build()))
require.NoError(t, diags.Error())
matches, err := filepath.Glob("./python_wheel/python_wheel_no_artifact_notebook/dist/my_test_code-*.whl")
require.NoError(t, err)
require.Equal(t, 1, len(matches))
match := libraries.ValidateLocalLibrariesExist()
diags = bundle.Apply(ctx, b, match)
require.NoError(t, diags.Error())
}
func TestPythonWheelWithDBFSLib(t *testing.T) { func TestPythonWheelWithDBFSLib(t *testing.T) {
ctx := context.Background() ctx := context.Background()
b, err := bundle.Load(ctx, "./python_wheel/python_wheel_dbfs_lib") b, err := bundle.Load(ctx, "./python_wheel/python_wheel_dbfs_lib")