Skip to content

feat(trainer): Support namespaced TrainingRuntime in the SDK#130

Merged
google-oss-prow[bot] merged 24 commits into
kubeflow:mainfrom
shaikmoeed:fix/namespace-trainingruntime-list
Feb 18, 2026
Merged

feat(trainer): Support namespaced TrainingRuntime in the SDK#130
google-oss-prow[bot] merged 24 commits into
kubeflow:mainfrom
shaikmoeed:fix/namespace-trainingruntime-list

Conversation

@shaikmoeed

Copy link
Copy Markdown
Contributor

What this PR does / why we need it:
Add support to list/get namespaced TrainingRuntime.

Which issue(s) this PR fixes:

Fixes #88

Checklist:

  • Docs included if any changes are user facing

@shaikmoeed shaikmoeed force-pushed the fix/namespace-trainingruntime-list branch from 24f00a7 to 1740535 Compare October 29, 2025 07:36
@shaikmoeed shaikmoeed changed the title feat(backend): Support namespaced TrainingRuntime in the SDK feat(trainer): Support namespaced TrainingRuntime in the SDK Oct 29, 2025
@kramaranya

Copy link
Copy Markdown
Contributor

/ok-to-test

@shaikmoeed shaikmoeed force-pushed the fix/namespace-trainingruntime-list branch from 8f0b6d5 to de2ad1b Compare November 3, 2025 13:51
@abhijeet-dhumal

abhijeet-dhumal commented Nov 3, 2025

Copy link
Copy Markdown
Member

Thank you @shaikmoeed for this!
Left some nit-picks..

Comment thread kubeflow/trainer/backends/kubernetes/backend.py Outdated
Comment thread kubeflow/trainer/backends/kubernetes/backend.py Outdated
Comment on lines +503 to +533
def create_training_runtime(
name: str,
namespace: str = "default",
) -> models.TrainerV1alpha1TrainingRuntime:
"""Create a mock namespaced TrainingRuntime object (not cluster-scoped)."""
return models.TrainerV1alpha1TrainingRuntime(
apiVersion=constants.API_VERSION,
kind="TrainingRuntime",
metadata=models.IoK8sApimachineryPkgApisMetaV1ObjectMeta(
name=name,
namespace=namespace,
labels={constants.RUNTIME_FRAMEWORK_LABEL: name},
),
spec=models.TrainerV1alpha1TrainingRuntimeSpec(
mlPolicy=models.TrainerV1alpha1MLPolicy(
torch=models.TrainerV1alpha1TorchMLPolicySource(
numProcPerNode=models.IoK8sApimachineryPkgUtilIntstrIntOrString(2)
),
numNodes=2,
),
template=models.TrainerV1alpha1JobSetTemplateSpec(
metadata=models.IoK8sApimachineryPkgApisMetaV1ObjectMeta(
name=name,
namespace=namespace,
),
spec=models.JobsetV1alpha2JobSetSpec(replicatedJobs=[get_replicated_job()]),
),
),
)


Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

did you mean to create this in kubernetes/backend_test.py?
this is not a test function and I believe it should be added to the TrainerClient and propagated to the different backends.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Similar to create_train_job, I thought to use create_training_runtime to pass here instead of empty list. Please correct me, if this was not intended?

@shaikmoeed shaikmoeed force-pushed the fix/namespace-trainingruntime-list branch from d1ca707 to 32b18fd Compare November 19, 2025 17:56
@coveralls

coveralls commented Nov 19, 2025

Copy link
Copy Markdown

Pull Request Test Coverage Report for Build 22127337630

Warning: This coverage report may be inaccurate.

This pull request's base commit is no longer the HEAD commit of its target branch. This means it includes changes from outside the original pull request, including, potentially, unrelated coverage changes.

Details

  • 68 of 86 (79.07%) changed or added relevant lines in 4 files are covered.
  • 16 unchanged lines in 2 files lost coverage.
  • Overall coverage decreased (-0.2%) to 76.436%

Changes Missing Coverage Covered Lines Changed/Added Lines %
kubeflow/trainer/types/types.py 6 7 85.71%
kubeflow/trainer/backends/kubernetes/backend_test.py 28 34 82.35%
kubeflow/trainer/backends/kubernetes/backend.py 32 43 74.42%
Files with Coverage Reduction New Missed Lines %
kubeflow/trainer/backends/kubernetes/backend.py 8 77.89%
kubeflow/trainer/backends/kubernetes/backend_test.py 8 93.27%
Totals Coverage Status
Change from base Build 22048455236: -0.2%
Covered Lines: 4337
Relevant Lines: 5674

💛 - Coveralls

@shaikmoeed

Copy link
Copy Markdown
Contributor Author

@abhijeet-dhumal, can you review it again during your free time?

@kramaranya kramaranya left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thank you @shaikmoeed!
I'd like all of us to spend more time on designing this properly, since there are a lot of items to consider
/assign @kubeflow/kubeflow-sdk-team

Comment on lines 89 to +112
except multiprocessing.TimeoutError as e:
raise TimeoutError(f"Timeout to list {constants.CLUSTER_TRAINING_RUNTIME_KIND}s") from e
raise TimeoutError(
"Timeout to list "
f"{constants.CLUSTER_TRAINING_RUNTIME_KIND}s/{constants.TRAINING_RUNTIME_KIND}s "
f"in namespace: {self.namespace}"
) from e
except Exception as e:
raise RuntimeError(f"Failed to list {constants.CLUSTER_TRAINING_RUNTIME_KIND}s") from e
raise RuntimeError(
"Failed to list "
f"{constants.CLUSTER_TRAINING_RUNTIME_KIND}s/{constants.TRAINING_RUNTIME_KIND}s "
f"in namespace: {self.namespace}"
) from e

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

What If only cluster runtimes exist (no TrainingRuntime CRD)? The entire list_runtimes will fail with RuntimeError, which we don't want, right?

Comment on lines 89 to +106
except multiprocessing.TimeoutError as e:
raise TimeoutError(f"Timeout to list {constants.CLUSTER_TRAINING_RUNTIME_KIND}s") from e
raise TimeoutError(
"Timeout to list "
f"{constants.CLUSTER_TRAINING_RUNTIME_KIND}s/{constants.TRAINING_RUNTIME_KIND}s "
f"in namespace: {self.namespace}"
) from e

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

What if one type times out and the other succeeds? I think we still should return partial results

Comment on lines +103 to +105
"Timeout to list "
f"{constants.CLUSTER_TRAINING_RUNTIME_KIND}s/{constants.TRAINING_RUNTIME_KIND}s "
f"in namespace: {self.namespace}"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

nit: cluster scoped runtimes are not really in a namespace

Comment on lines +142 to +146
except Exception as e:
logger.warning(
f"Namespaced TrainingRuntime '{self.namespace}/{name}' not found "
f"({type(e).__name__}: {e}); falling back to cluster-scoped runtime."
)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

What if it was for example TimeoutError? We will still silently fallback to cluster scoped runtimes, right? I would suggest only treating not found / missing CRD as fall back.


return result

def get_runtime(self, name: str) -> types.Runtime:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Similar to list_runtimes(), either case will cause a full failure

Comment thread kubeflow/trainer/constants/constants.py Outdated
# The Kind name for the TrainingRuntime.
TRAINING_RUNTIME_KIND = "TrainingRuntime"

# The plural for the ClusterTrainingRuntime.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
# The plural for the ClusterTrainingRuntime.
# The plural for the TrainingRuntime.

return result

for runtime in runtime_list.items:
for runtime in namespace_runtime_list.items + cluster_runtime_list.items:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@shaikmoeed
Quick question : What if runtimes with the same name exists in both cluster and namespace scoped ?
IIUC you have implemented namespace scoped priority in get_runtime() where trainingRuntimes get's first priority..

thinking should it be same case for list_runtimes method too ?
And one more thing, In case of list_runtimes it's just appending both even if duplicates comes in..
So for end user how user will be able to know the kind of runtime via list_runtimes's list items ?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

What if we introduce kind and namespace(optional) params in Runtime dataclass here :

class Runtime:

So that

for runtime in runtimes:
    print(f"{runtime.name} ({runtime.kind}, ns={runtime.namespace})")
    
# Output:
# torch-runtime (TrainingRuntime, ns=team-a)
# torch-runtime (ClusterTrainingRuntime, ns=None)
# custom-runtime (TrainingRuntime, ns=team-a)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I'd be in favor of adding a scope field instead, with values like "project" and "cluster", so we don't expose any k8s terminology to users.
Regarding namespace I don't think AI practitioners need to see it, since they already know they're working in their project context (set at client init time).
cc @andreyvelich @astefanutti

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

+1 for a scope field, though I wonder whether it could be more symmetrical to the resolution logic in the get_runtime and not returning the ClusterTrainingRuntimes that are "overwritten" in the client namespace. This way I don't think any additional field would be needed.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Shall we configure this setting during TrainerClient() initialization?
I am curious if we ever have a use-case when users want to create a single TrainerClient() which can work with TrainingRuntime and ClusterTrainingRuntime ?

@andreyvelich andreyvelich mentioned this pull request Dec 19, 2025
7 tasks
@kramaranya

Copy link
Copy Markdown
Contributor

Hey, @shaikmoeed! Are you still working on this PR? Did you have a chance to address the feedback?

@shaikmoeed

Copy link
Copy Markdown
Contributor Author

Hey, @shaikmoeed! Are you still working on this PR? Did you have a chance to address the feedback?

@kramaranya Haven't got a chance to address the feedback. Will update the PR by next week.

@kramaranya

Copy link
Copy Markdown
Contributor

Hey @shaikmoeed! Are you still working on this PR? It would be great if we could include this feature in 0.3 release (we aim to cut the release this week)

shaikmoeed and others added 4 commits February 17, 2026 07:54
Signed-off-by: Moeed Shaik <[email protected]>
Signed-off-by: Moeed Shaik <[email protected]>
Co-authored-by: Copilot <[email protected]>
Signed-off-by: Moeed <[email protected]>
Comment on lines +96 to +97
cluster_err = None
namespace_err = None

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Can you return errors directly like we do in other places.

Suggested change
cluster_err = None
namespace_err = None

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Could get namespace runtimes time out while get cluster runtimes does not?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't think it matters for users, just run list_namespaced_custom_object and list_cluster_custom_object, and raise Exception if any of it fails.

Comment on lines +142 to +150
if cluster_runtime_list is None and namespace_runtime_list is None:
# If both timed out → timeout
if isinstance(cluster_err, multiprocessing.TimeoutError) and isinstance(
namespace_err, multiprocessing.TimeoutError
):
raise TimeoutError(
f"Timeout while retrieving both cluster and namespace runtimes "
f"(namespace={self.namespace})"
) from cluster_err

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Updated as per the suggestion

Comment thread kubeflow/trainer/backends/kubernetes/backend.py Outdated
Signed-off-by: Moeed Shaik <[email protected]>
Comment on lines +106 to +111
constants.GROUP,
constants.VERSION,
self.namespace,
constants.TRAINING_RUNTIME_PLURAL,
async_req=True,
)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

You can do something like this to de-duplicate code and keep runtime names in the Map:

      # Fetch both cluster and namespaced runtimes in parallel
        cluster_thread = self.custom_api.list_cluster_custom_object(
            constants.GROUP,
            constants.VERSION,
            constants.CLUSTER_TRAINING_RUNTIME_PLURAL,
            async_req=True,
        )
        namespace_thread = self.custom_api.list_namespaced_custom_object(
            constants.GROUP,
            constants.VERSION,
            self.namespace,
            constants.TRAINING_RUNTIME_PLURAL,
            async_req=True,
        )

        # Helper to fetch and convert runtime list
        def fetch_runtime_list(thread, kind, model_class):
            try:
                return model_class.from_dict(thread.get(common_constants.DEFAULT_TIMEOUT))
            except multiprocessing.TimeoutError as e:
                raise TimeoutError(f"Timeout to list {kind}s") from e
            except Exception as e:
                raise RuntimeError(f"Failed to list {kind}s") from e

        cluster_runtimes = fetch_runtime_list(
            cluster_thread,
            constants.CLUSTER_TRAINING_RUNTIME_KIND,
            models.TrainerV1alpha1ClusterTrainingRuntimeList,
        )
        namespace_runtimes = fetch_runtime_list(
            namespace_thread,
            constants.TRAINING_RUNTIME_KIND,
            models.TrainerV1alpha1TrainingRuntimeList,
        )

        # Collect runtimes in a map, preferring namespaced over cluster-scoped
        runtimes_by_name = {}

        # Add namespaced runtimes first (they have priority)
        if namespace_runtimes:
            for runtime in namespace_runtimes.items:
                if runtime.metadata and runtime.metadata.name:
                    runtimes_by_name[runtime.metadata.name] = runtime

        # Add cluster runtimes only if not already present
        if cluster_runtimes:
            for runtime in cluster_runtimes.items:
                if runtime.metadata and runtime.metadata.name:
                    runtimes_by_name.setdefault(runtime.metadata.name, runtime)

Comment thread kubeflow/trainer/types/types.py Outdated
BUILTIN_TRAINER = BuiltinTrainer.__name__


class RuntimeScope(Enum):

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't think that is needed for now.
As namespace runtime takes priority over cluster-scope runtime, I would suggest we don't show user the scope of the runtime.
In the future, we might want to introduce scope API to the get_runtime() and list_runtimes() APIs if users want it.

@shaikmoeed shaikmoeed Feb 18, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Makes sense for UX. Only question: does hiding scope reduce observability when precedence kicks in? If yes, we might want a future debug hook.

cc: @andreyvelich @kramaranya @abhijeet-dhumal for your thoughts on the same.

@andreyvelich andreyvelich Feb 18, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I would suggest to leave it as future improvement. So we can remove RuntimeScope from this PR.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Noted! Removed RuntimeScope, can you please provide review again? Thank you!

Signed-off-by: Moeed Shaik <[email protected]>

@astefanutti astefanutti left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks @shaikmoeed!

/lgtm

Signed-off-by: Moeed Shaik <[email protected]>
Comment thread kubeflow/trainer/backends/kubernetes/backend.py Outdated
Comment thread kubeflow/trainer/backends/kubernetes/backend.py Outdated
Comment thread kubeflow/trainer/backends/kubernetes/backend.py Outdated
Comment thread kubeflow/trainer/backends/kubernetes/backend.py Outdated
Comment thread kubeflow/trainer/backends/kubernetes/backend.py Outdated
Comment thread kubeflow/trainer/backends/kubernetes/backend.py Outdated
@shaikmoeed

Copy link
Copy Markdown
Contributor Author

@andreyvelich Addressed your comments. Can you please take a look now?

@andreyvelich andreyvelich left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks for this work @shaikmoeed!
/lgtm
/approve

In the followup PR please can you update user-facing docstring for client API which explains that we return namespace runtime first before cluster runtimes ?
https://github.com/shaikmoeed/sdk/blob/1af819e53c6f2a59a0be1bce8b5f055165877e81/kubeflow/trainer/api/trainer_client.py#L66-L69

@google-oss-prow

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: andreyvelich

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@google-oss-prow google-oss-prow Bot merged commit 294a6b2 into kubeflow:main Feb 18, 2026
16 of 17 checks passed
@google-oss-prow google-oss-prow Bot added this to the v0.4 milestone Feb 18, 2026
digvijay-y pushed a commit to digvijay-y/sdk that referenced this pull request Feb 26, 2026
…w#130)

* feat(backend): Support namespaced TrainingRuntime in the SDK

Signed-off-by: Moeed Shaik <[email protected]>

* Fixed bugs and validated current test cases

Signed-off-by: Moeed Shaik <[email protected]>

* Fixed pre-commit test failure

Signed-off-by: Moeed Shaik <[email protected]>

* Addressed comments

Signed-off-by: Moeed Shaik <[email protected]>

* Fixed no attribute 'DEFAULT_TIMEOUT' error

Signed-off-by: Moeed Shaik <[email protected]>

* Added namespace-scoped runtime to test cases

Signed-off-by: Moeed Shaik <[email protected]>

* Addressed fallback logic bugs

Signed-off-by: Moeed Shaik <[email protected]>

* Added scope field to Runtime

Signed-off-by: Moeed Shaik <[email protected]>

* Improved code

Signed-off-by: Moeed Shaik <[email protected]>

* Fixed copilot's comments

Signed-off-by: Moeed Shaik <[email protected]>

* Shadow duplicate runtimes, priority to ns

Signed-off-by: Moeed Shaik <[email protected]>

* Fixed bug

Signed-off-by: Moeed Shaik <[email protected]>

* Fixed copilot comments

Signed-off-by: Moeed Shaik <[email protected]>

* Improved test cases to validate all possible cases

Signed-off-by: Moeed Shaik <[email protected]>

* small fix

Signed-off-by: Moeed Shaik <[email protected]>

* lint fix

Signed-off-by: Moeed Shaik <[email protected]>

* improved error message

Co-authored-by: Copilot <[email protected]>
Signed-off-by: Moeed <[email protected]>

* refactored code

Signed-off-by: Moeed Shaik <[email protected]>

* improve code

Signed-off-by: Moeed Shaik <[email protected]>

* Removed RuntimeScope

Signed-off-by: Moeed Shaik <[email protected]>

* removed scope references and improved error handling as per kubeflow standards

Signed-off-by: Moeed Shaik <[email protected]>

---------

Signed-off-by: Moeed Shaik <[email protected]>
Signed-off-by: Moeed <[email protected]>
Co-authored-by: Copilot <[email protected]>
Signed-off-by: digvijay-y <[email protected]>
openshift-merge-bot Bot pushed a commit to opendatahub-io/kubeflow-sdk that referenced this pull request Mar 11, 2026
* chore!: upgrade to Python 3.10 (kubeflow#282)

This upgrades the minimum Python version for the project from 3.9 to
3.10. Python 3.9 is past end-of-life and dependencies will likely
require a supported version soon.

Signed-off-by: Jon Burdo <[email protected]>

* chore: Confirm that a public ConfigMap exists to check version (kubeflow#250)

* Confirm that a public ConfigMap exists to check version

Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>

* python 3.9 fix

Co-authored-by: Copilot <[email protected]>
Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>

* Exceptiom handling better

Co-authored-by: Copilot <[email protected]>
Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>

* Addressing comments

Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>

* Update kubeflow/trainer/backends/kubernetes/backend.py

Co-authored-by: Andrey Velichkevich <[email protected]>
Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>

* Refactored tests into a single function and followed agents.md

Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>

* CI friendly edit

Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>

* pre-commit format checked

Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>

* Modified according to new updates

Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>

* Ran pre-commit locally to fix formatting

Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>

* unix2dos CLAUDE.md

Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>

* Revert CLAUDE.md

Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>

---------

Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>
Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>
Co-authored-by: Copilot <[email protected]>
Co-authored-by: Andrey Velichkevich <[email protected]>

* chore: added sdk docs website to readme (kubeflow#284)

* docs: added sdk docs website to readme

Signed-off-by: Akash Jaiswal <[email protected]>

* format: order of sdk docs

Signed-off-by: Akash Jaiswal <[email protected]>

---------

Signed-off-by: Akash Jaiswal <[email protected]>

* feat(trainer): add dataset and model initializer support to container backend (kubeflow#188)

* feat(trainer): add dataset and model initializer support to container backend

Add support for dataset and model initializers in the container backend
to bring it to feature parity with the Kubernetes backend.

Changes:
- Add utility functions for building initializer commands and environment variables
- Implement _run_initializers() and _run_single_initializer() methods in ContainerBackend
- Run initializers sequentially before training containers start
- Download datasets to /workspace/dataset and models to /workspace/model
- Track initializer containers as separate steps in TrainJob
- Support all initializer types: HuggingFace, S3, and DataCache
- Add comprehensive unit tests for all initializer configurations
- Handle initializer failures with proper cleanup and error messages

Fixes kubeflow#171

Signed-off-by: HKanoje <[email protected]>

* feat(trainer): address reviewer feedback for initializer support

- Make initializer image configurable via ContainerBackendConfig
- Make initializer timeout configurable (default 600 seconds)
- Implement wait API in adapters instead of polling
- Clean up successful initializer containers after completion
- Clean up network on initializer failure
- Raise ValueError for unsupported initializer types (no datacache fallback)

All tests passing (173/173). Addresses all feedback from PR kubeflow#188.

Signed-off-by: HKanoje <[email protected]>

* chore(trainer): add cleanup helper to reduce duplication

Add _cleanup_container_resources() helper method to consolidate
duplicated cleanup logic for stopping/removing containers and
deleting networks. Refactor 5 locations across train(), initializer
handlers, and delete_job() to use this helper.

Signed-off-by: HKanoje <[email protected]>

* fix(trainer): use correct initializer images and working directory

Address feedback for initializer support in container backend:

- Use separate images for dataset/model initializers:
  - kubeflow/dataset-initializer:latest for datasets
  - kubeflow/model-initializer:latest for models
  (instead of kubeflow/training-operator:latest)

- Update python commands to use pkg.initializers module:
  - python -m pkg.initializers.dataset (for dataset)
  - python -m pkg.initializers.model (for model)

- Change initializer working_dir from /workspace to /app
  per Dockerfile convention

Refs: https://github.com/kubeflow/trainer/tree/master/cmd/initializers
Signed-off-by: HKanoje <[email protected]>

* fix(container): address PR review comments for initializer support

- Use GHCR images as default for dataset/model initializers
- Replace suppress with try-except blocks
- Refactor initializer utils with ContainerInitializer dataclass
- Add get_dataset_initializer and get_model_initializer functions
- Remove DataCache support (unsupported in container backend)
- Merge initializer tests into test_train() and test_get_job_logs()
- Remove duplicate test functions

Signed-off-by: HKanoje <[email protected]>

* fix(container): add name field to ContainerInitializer and remove init_type

- Add name field to ContainerInitializer dataclass
- Set name='dataset-initializer' and name='model-initializer' in utils
- Remove init_type parameter from _run_single_initializer()
- Use container_init.name for labels and log messages

Signed-off-by: HKanoje <[email protected]>

---------

Signed-off-by: HKanoje <[email protected]>

* feat: add SparkClient API for SparkConnect session management (kubeflow#225)

* feat(spark): add core types, dataclasses, and constants

- Add SparkConnectInfo, SparkConnectState, Driver, Executor types
- Add type tests for validation
- Add Kubernetes backend constants (CRD group, version, defaults)

Signed-off-by: Shekhar Rajak <[email protected]>

* feat(spark): add backend base class and options pattern

- Add RuntimeBackend abstract base class with session lifecycle methods
- Add options pattern (Name, Image, Timeout, etc.) aligned with trainer SDK
- Add validation utilities for connect parameters
- Add comprehensive option tests

Signed-off-by: Shekhar Rajak <[email protected]>

* feat(spark): add KubernetesBackend for SparkConnect CRD operations

- Implement KubernetesBackend with create/get/list/delete session methods
- Add port-forward support for out-of-cluster connections
- Add CRD builder utilities and URL validation
- Add comprehensive backend and utils tests with parametrized patterns

Signed-off-by: Shekhar Rajak <[email protected]>

* feat(spark): add SparkClient API with KEP-107 compliant connect method

- Implement SparkClient as main user interface for SparkConnect sessions
- Support connect to existing server (base_url) or auto-create new session
- Add public exports for SparkClient, Driver, Executor, options
- Add SparkClient unit tests

Signed-off-by: Shekhar Rajak <[email protected]>

* chore(spark): add test infrastructure and package init files

- Add test common utilities and fixtures
- Add package __init__ files for test directories
- Setup test/e2e/spark structure

Signed-off-by: Shekhar Rajak <[email protected]>

* feat(spark): add example scripts demonstrating SparkClient usage

- Add spark_connect_simple.py with 3 usage levels (minimal, simple, advanced)
- Add spark_advanced_options.py with full configuration examples
- Add connect_existing_session.py for connecting to existing servers
- Add demo and test scripts for local development

Signed-off-by: Shekhar Rajak <[email protected]>

* docs(spark): add documentation for SparkClient and E2E testing

- Add examples/spark/README.md with usage guide
- Add local Spark Connect testing documentation
- Add E2E test README with CI/CD integration guide
- Update KEP-107 proposal documentation

Signed-off-by: Shekhar Rajak <[email protected]>

* test(spark): add E2E test framework with cluster watcher

- Add test_spark_examples.py with example validation tests
- Add cluster_watcher.py for monitoring SparkConnect and pods during tests
- Add run_in_cluster.py for executing examples as K8s Jobs

Signed-off-by: Shekhar Rajak <[email protected]>

* ci(spark): add GitHub Actions workflow and E2E cluster setup

- Add test-spark-examples.yaml workflow for E2E validation
- Add e2e-setup-cluster.sh for Kind cluster with Spark Operator
- Add SparkConnect CRD, Kind config, and E2E runner Dockerfile
- Update Makefile with E2E setup target
- Update PR title check for spark prefix

Signed-off-by: Shekhar Rajak <[email protected]>

* chore(spark): add pyspark[connect] dependency and update lock file

- Add spark extra with pyspark[connect]==3.4.1 for grpcio, pandas, pyarrow
- Update uv.lock with resolved dependencies
- Update .gitignore for spark-related files

Signed-off-by: Shekhar Rajak <[email protected]>

* Update kubeflow/spark/backends/base.py

Co-authored-by: Andrey Velichkevich <[email protected]>
Signed-off-by: Shekhar Prasad Rajak <[email protected]>

* refactor(spark): rename backend.connect_session() to connect()

Signed-off-by: Shekhar Rajak <[email protected]>

* refactor: move session creation flow from SparkClient to backend.create_and_connect()

Signed-off-by: Shekhar Rajak <[email protected]>

---------

Signed-off-by: Shekhar Rajak <[email protected]>
Signed-off-by: Shekhar Prasad Rajak <[email protected]>
Co-authored-by: Andrey Velichkevich <[email protected]>

* chore: bump minimum model-registry version to 0.3.6 (kubeflow#289)

Signed-off-by: Jon Burdo <[email protected]>

* fix: Improve CVE workflow (kubeflow#267)

* fix: Improve CVE workflow

Signed-off-by: Fiona-Waters <[email protected]>

* fix: fix issue with bash compare

Signed-off-by: Fiona-Waters <[email protected]>

* feat: Add workflow to cleanup overrides in pyproject.toml

Signed-off-by: Fiona-Waters <[email protected]>

* fix: address review comments

Signed-off-by: Fiona-Waters <[email protected]>

* chore: refactor to reduce size of cve related workflows

Signed-off-by: Fiona-Waters <[email protected]>

---------

Signed-off-by: Fiona-Waters <[email protected]>

* chore: upgrade code style for python3.10 (kubeflow#288)

* chore: update code style for Python 3.10

This disables a couple ruff rules in pyproject.toml:
```
"UP007", # Use X | Y instead of Union[X, Y] (requires Python 3.10+)
"UP045", # Use X | None instead of Optional[X] (requires Python 3.10+)
```

Then the code changes are made with:
```
uv run ruff check --fix
uv run ruff format
```

Signed-off-by: Jon Burdo <[email protected]>

* fix: handle unions, bools in convert_value

The convert_value function didn't seems to be handling union types
properly and also needs to handle `T | None` similarly to
`Optional[None]` after the upgrade to Python 3.10. This fixes union
types, an issue with bool conversion, and adds tests for this function.

Signed-off-by: Jon Burdo <[email protected]>

---------

Signed-off-by: Jon Burdo <[email protected]>

* chore(ci): bump astral-sh/setup-uv from 5 to 7 (kubeflow#276)

Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 5 to 7.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](astral-sh/setup-uv@v5...v7)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump the python-minor group across 1 directory with 4 updates (kubeflow#291)

Bumps the python-minor group with 4 updates in the / directory: [coverage](https://github.com/coveragepy/coveragepy), [ruff](https://github.com/astral-sh/ruff), [pre-commit](https://github.com/pre-commit/pre-commit) and [ty](https://github.com/astral-sh/ty).


Updates `coverage` from 7.10.7 to 7.13.4
- [Release notes](https://github.com/coveragepy/coveragepy/releases)
- [Changelog](https://github.com/coveragepy/coveragepy/blob/main/CHANGES.rst)
- [Commits](coveragepy/coveragepy@7.10.7...7.13.4)

Updates `ruff` from 0.14.14 to 0.15.0
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](astral-sh/ruff@0.14.14...0.15.0)

Updates `pre-commit` from 4.3.0 to 4.5.1
- [Release notes](https://github.com/pre-commit/pre-commit/releases)
- [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md)
- [Commits](pre-commit/pre-commit@v4.3.0...v4.5.1)

Updates `ty` from 0.0.14 to 0.0.16
- [Release notes](https://github.com/astral-sh/ty/releases)
- [Changelog](https://github.com/astral-sh/ty/blob/main/CHANGELOG.md)
- [Commits](astral-sh/ty@0.0.14...0.0.16)

---
updated-dependencies:
- dependency-name: coverage
  dependency-version: 7.13.4
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python-minor
- dependency-name: ruff
  dependency-version: 0.15.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python-minor
- dependency-name: pre-commit
  dependency-version: 4.5.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python-minor
- dependency-name: ty
  dependency-version: 0.0.16
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat: Added examples to the documentation demonstrating different ways to handle ports (kubeflow#243)

* update docs and add test cases.

Signed-off-by: osamaahmed17 <[email protected]>

* pre-commit error solved

Signed-off-by: osamaahmed17 <[email protected]>

* Update kubeflow/hub/api/model_registry_client.py

Co-authored-by: Jon Burdo <[email protected]>
Signed-off-by: Osama Tahir <[email protected]>

* readme updated

Signed-off-by: Osama Tahir <[email protected]>

* Refactor model registry client test cases for clarity

Signed-off-by: Osama Tahir <[email protected]>

---------

Signed-off-by: osamaahmed17 <[email protected]>
Signed-off-by: Osama Tahir <[email protected]>
Co-authored-by: Jon Burdo <[email protected]>

* chore(ci): bump peter-evans/create-pull-request from 6 to 8 (kubeflow#277)

Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 6 to 8.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](peter-evans/create-pull-request@v6...v8)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-version: '8'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(ci): bump actions/checkout from 4 to 6 (kubeflow#278)

Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v4...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat: Adds a GitHub Actions workflow to check kubeflow/hub/OWNERS. (kubeflow#280)

* Add OWNERS validation

Signed-off-by: muhammadjunaid8047 <[email protected]>

* Update .github/workflows/check-owners.yaml

Co-authored-by: Jon Burdo <[email protected]>
Signed-off-by: Muhammad Junaid <[email protected]>

* Update OWNERS file check in workflow

Signed-off-by: Muhammad Junaid <[email protected]>

* Update paths in check-owners workflow

Signed-off-by: Muhammad Junaid <[email protected]>

---------

Signed-off-by: muhammadjunaid8047 <[email protected]>
Signed-off-by: Muhammad Junaid <[email protected]>
Co-authored-by: Jon Burdo <[email protected]>

* fix: nightly security dependency updates (kubeflow#296)

Co-authored-by: google-oss-prow <[email protected]>

* chore(ci): bump aquasecurity/trivy-action from 0.33.1 to 0.34.0 in the actions group (kubeflow#297)

Bumps the actions group with 1 update: [aquasecurity/trivy-action](https://github.com/aquasecurity/trivy-action).


Updates `aquasecurity/trivy-action` from 0.33.1 to 0.34.0
- [Release notes](https://github.com/aquasecurity/trivy-action/releases)
- [Commits](aquasecurity/trivy-action@0.33.1...0.34.0)

---
updated-dependencies:
- dependency-name: aquasecurity/trivy-action
  dependency-version: 0.34.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump pytest from 8.4.2 to 9.0.2 (kubeflow#301)

Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.4.2 to 9.0.2.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](pytest-dev/pytest@8.4.2...9.0.2)

---
updated-dependencies:
- dependency-name: pytest
  dependency-version: 9.0.2
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* feat(trainer): Support namespaced TrainingRuntime in the SDK (kubeflow#130)

* feat(backend): Support namespaced TrainingRuntime in the SDK

Signed-off-by: Moeed Shaik <[email protected]>

* Fixed bugs and validated current test cases

Signed-off-by: Moeed Shaik <[email protected]>

* Fixed pre-commit test failure

Signed-off-by: Moeed Shaik <[email protected]>

* Addressed comments

Signed-off-by: Moeed Shaik <[email protected]>

* Fixed no attribute 'DEFAULT_TIMEOUT' error

Signed-off-by: Moeed Shaik <[email protected]>

* Added namespace-scoped runtime to test cases

Signed-off-by: Moeed Shaik <[email protected]>

* Addressed fallback logic bugs

Signed-off-by: Moeed Shaik <[email protected]>

* Added scope field to Runtime

Signed-off-by: Moeed Shaik <[email protected]>

* Improved code

Signed-off-by: Moeed Shaik <[email protected]>

* Fixed copilot's comments

Signed-off-by: Moeed Shaik <[email protected]>

* Shadow duplicate runtimes, priority to ns

Signed-off-by: Moeed Shaik <[email protected]>

* Fixed bug

Signed-off-by: Moeed Shaik <[email protected]>

* Fixed copilot comments

Signed-off-by: Moeed Shaik <[email protected]>

* Improved test cases to validate all possible cases

Signed-off-by: Moeed Shaik <[email protected]>

* small fix

Signed-off-by: Moeed Shaik <[email protected]>

* lint fix

Signed-off-by: Moeed Shaik <[email protected]>

* improved error message

Co-authored-by: Copilot <[email protected]>
Signed-off-by: Moeed <[email protected]>

* refactored code

Signed-off-by: Moeed Shaik <[email protected]>

* improve code

Signed-off-by: Moeed Shaik <[email protected]>

* Removed RuntimeScope

Signed-off-by: Moeed Shaik <[email protected]>

* removed scope references and improved error handling as per kubeflow standards

Signed-off-by: Moeed Shaik <[email protected]>

---------

Signed-off-by: Moeed Shaik <[email protected]>
Signed-off-by: Moeed <[email protected]>
Co-authored-by: Copilot <[email protected]>

* fix: Fix runtime lookup fallback and test local SDK in E2E (kubeflow#307)

* fix: Install SDK locally in E2E workflow and improve error handling for runtime fetching in Kubernetes backend.

Signed-off-by: XploY04 <[email protected]>

* refactor: Explicitly return errors from  and refine exception handling in .

Signed-off-by: XploY04 <[email protected]>

* docs: update comment to clarify Kubeflow SDK installation from source in e2e workflow.

Signed-off-by: XploY04 <[email protected]>

* feat: Enhance runtime retrieval tests to cover Kubernetes API 404/403 errors and partial success for list operations on timeout.

Signed-off-by: XploY04 <[email protected]>

* refactor: Update runtime listing to immediately raise exceptions on failure instead of collecting partial results.

Signed-off-by: XploY04 <[email protected]>

---------

Signed-off-by: XploY04 <[email protected]>

* chore(ci): bump actions/setup-python from 5 to 6 (kubeflow#298)

Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](actions/setup-python@v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump the python-minor group with 2 updates (kubeflow#299)

Bumps the python-minor group with 2 updates: [ruff](https://github.com/astral-sh/ruff) and [ty](https://github.com/astral-sh/ty).


Updates `ruff` from 0.15.0 to 0.15.1
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](astral-sh/ruff@0.15.0...0.15.1)

Updates `ty` from 0.0.16 to 0.0.17
- [Release notes](https://github.com/astral-sh/ty/releases)
- [Changelog](https://github.com/astral-sh/ty/blob/main/CHANGELOG.md)
- [Commits](astral-sh/ty@0.0.16...0.0.17)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.15.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python-minor
- dependency-name: ty
  dependency-version: 0.0.17
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* fix: improve logging around packages_to_install (kubeflow#269)

* improve logging around packages_to_install

Signed-off-by: Brian Gallagher <[email protected]>

* exit when pip install fails, append errors from both attempts

Signed-off-by: Brian Gallagher <[email protected]>

* Add shlex to address command injection vulnerabilities. Write pip install logfile to cwd

Signed-off-by: Brian Gallagher <[email protected]>

---------

Signed-off-by: Brian Gallagher <[email protected]>

* feat: Add validate lockfile workflow to complement CVE scanning (kubeflow#306)

* feat: Add validate lockfile workflow to complement CVE scanning

Signed-off-by: Fiona-Waters <[email protected]>

* fix: make cve fix pr branch static

Signed-off-by: Fiona-Waters <[email protected]>

---------

Signed-off-by: Fiona-Waters <[email protected]>

* fix(trainer): handle falsy values in get_args_from_peft_config (kubeflow#328)

* fix(trainer): handle falsy values in get_args_from_peft_config

Signed-off-by: krishdef7 <[email protected]>

* fix: apply pre-commit formatting

Signed-off-by: krishdef7 <[email protected]>

* fix: also handle falsy train_on_input in dataset_preprocess_config

Signed-off-by: krishdef7 <[email protected]>

* fix: add missing newline at end of utils_test.py

Signed-off-by: krishdef7 <[email protected]>

* fix: pre-commit formatting

Signed-off-by: krishdef7 <[email protected]>

---------

Signed-off-by: krishdef7 <[email protected]>

* fix(optimizer): prevent input mutation in optimize() (kubeflow#322)

* fix(optimizer): prevent input mutation in optimize()

Signed-off-by: ruskaruma <[email protected]>

* remove unnecessary things

Signed-off-by: ruskaruma <[email protected]>

* rename test

Signed-off-by: ruskaruma <[email protected]>

---------

Signed-off-by: ruskaruma <[email protected]>

* feat: add TrainerClient examples for local PyTorch distributed training (kubeflow#312)

* docs: add TrainerClient examples for local PyTorch distributed training

- Add examples/trainer/pytorch_distributed_simple.py
- Add examples/trainer/README.md
- Demonstrates LocalProcessBackend usage without Kubernetes
- Fixes kubeflow#218

Signed-off-by: Mansi Singh <[email protected]>

* docs: add training examples table to SDK website

Signed-off-by: Mansi Singh <[email protected]>

* docs: expand examples table with PyTorch, MLX, DeepSpeed, and TorchTune examples grouped by framework

Signed-off-by: Mansi Singh <[email protected]>

---------

Signed-off-by: Mansi Singh <[email protected]>

* chore: fix docstrings in TrainerClient (kubeflow#333)

Signed-off-by: Transcendental-Programmer <[email protected]>

* feat(spark): Refactor unit tests to sdk coding standards  (kubeflow#293)

* Refactored unit test

Signed-off-by: digvijay-y <[email protected]>

* Changes made

Signed-off-by: digvijay-y <[email protected]>

* Version

Signed-off-by: digvijay-y <[email protected]>

* Restructured clien_test

Signed-off-by: digvijay-y <[email protected]>

* reformated backend_test.py

Signed-off-by: digvijay-y <[email protected]>

* revert pyproject.toml and uv.lock changes

Signed-off-by: digvijay-y <[email protected]>

* Standarized spark backend tests

Signed-off-by: digvijay-y <[email protected]>

* backend_tests

Signed-off-by: digvijay-y <[email protected]>

---------

Signed-off-by: digvijay-y <[email protected]>

* fix(optimizer): add missing get_job_events() to RuntimeBackend base c… (kubeflow#325)

* fix(optimizer): add missing get_job_events() to RuntimeBackend base class

Signed-off-by: ruskaruma <[email protected]>

* Update kubeflow/optimizer/backends/base.py

Co-authored-by: Copilot <[email protected]>
Signed-off-by: Ruskaruma <[email protected]>

* Update kubeflow/optimizer/backends/base.py

Co-authored-by: Andrey Velichkevich <[email protected]>
Signed-off-by: Ruskaruma <[email protected]>

* fix: add abstractmethod, remove docstrings

Signed-off-by: ruskaruma <[email protected]>

* make get_job_events abstract in RuntimeBackend

Signed-off-by: ruskaruma <[email protected]>

* Update kubeflow/trainer/backends/localprocess/backend.py

Co-authored-by: Andrey Velichkevich <[email protected]>
Signed-off-by: Ruskaruma <[email protected]>

* fix

Signed-off-by: ruskaruma <[email protected]>

---------

Signed-off-by: ruskaruma <[email protected]>
Signed-off-by: Ruskaruma <[email protected]>
Co-authored-by: Copilot <[email protected]>
Co-authored-by: Andrey Velichkevich <[email protected]>

* chore(spark): migrate SDK to kubeflow_spark_api Pydantic models (kubeflow#295)

* chore(spark): add kubeflow-spark-api dependency

Signed-off-by: tariq-hasan <[email protected]>

* chore(spark): migrate options to typed Pydantic models

Signed-off-by: tariq-hasan <[email protected]>

* chore(spark): migrate utils to typed Pydantic models

Signed-off-by: tariq-hasan <[email protected]>

* chore(spark): migrate backend to typed Pydantic models

Signed-off-by: tariq-hasan <[email protected]>

* chore(spark): refactor tests to use typed models and cleanup

Signed-off-by: tariq-hasan <[email protected]>

* chore(spark): rename build_spark_connect_crd to build_spark_connect_cr

Signed-off-by: tariq-hasan <[email protected]>

* fix(spark): use typed model helpers in mock handlers

Signed-off-by: tariq-hasan <[email protected]>

* chore(spark): bump kubeflow-spark-api to 2.4.0

Signed-off-by: tariq-hasan <[email protected]>

---------

Signed-off-by: tariq-hasan <[email protected]>

* feat(docs): Update README with Spark Support  (kubeflow#349)

Signed-off-by: Andrey Velichkevich <[email protected]>

* fix(trainer): return TRAINJOB_COMPLETE when all steps are done (kubeflow#340)

* fix(local): return TRAINJOB_COMPLETE when all steps are done (kubeflow#338)

Signed-off-by: priyank <[email protected]>

* test(trainer): add test case for __get_job_status

Signed-off-by: priyank <[email protected]>

* fix(trainer): early return TRAINJOB_CREATED when job has no steps

Signed-off-by: priyank <[email protected]>

* test(trainer): refactor test_get_job_status with TestCase fixture

Signed-off-by: priyank <[email protected]>

---------

Signed-off-by: priyank <[email protected]>

* fix(trainer): adapt SDK to removal of numProcPerNode from TorchMLPolicySource (kubeflow#360)

Signed-off-by: tariq-hasan <[email protected]>

* fix: Make validate-lockfile action non-blocking (kubeflow#361)

Signed-off-by: Fiona-Waters <[email protected]>

* chore(spark): change pyspark[connect] dependency (kubeflow#357)

Change pyspark[connect] 3.4.1 dependency to pyspark-connect 4.0.1.

This matches the version of Spark in the spark-operator container image
(https://github.com/kubeflow/spark-operator/blob/master/Dockerfile#L17).

Signed-off-by: Ali Maredia <[email protected]>

* chore(spark): remove SDK-side validation from SparkClient (kubeflow#345)

Remove all SDK-side input validation from the spark module.
Validation will be handled server-side by the Spark Operator
admission webhooks (spark-operator#2862).

- Remove validation.py and validation_test.py
- Remove isinstance checks from _create_session()
- Remove ValidationError from public API

Closes: kubeflow#272

Signed-off-by: Yassin Nouh <[email protected]>
Signed-off-by: yassinnouh21 <[email protected]>

* chore: Merge upstream/main (preserving downstream config)

Signed-off-by: Brian Gallagher <[email protected]>

* update workflow to skip requirements generation on merge conflict

Signed-off-by: Brian Gallagher <[email protected]>

* remove compatibility with python 3.9 and udpated tests

Signed-off-by: Brian Gallagher <[email protected]>

* fix tests

Signed-off-by: Brian Gallagher <[email protected]>

---------

Signed-off-by: Jon Burdo <[email protected]>
Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>
Signed-off-by: Surya Sameer Datta Vaddadi <[email protected]>
Signed-off-by: Akash Jaiswal <[email protected]>
Signed-off-by: HKanoje <[email protected]>
Signed-off-by: Shekhar Rajak <[email protected]>
Signed-off-by: Shekhar Prasad Rajak <[email protected]>
Signed-off-by: Fiona-Waters <[email protected]>
Signed-off-by: dependabot[bot] <[email protected]>
Signed-off-by: osamaahmed17 <[email protected]>
Signed-off-by: Osama Tahir <[email protected]>
Signed-off-by: muhammadjunaid8047 <[email protected]>
Signed-off-by: Muhammad Junaid <[email protected]>
Signed-off-by: Moeed Shaik <[email protected]>
Signed-off-by: Moeed <[email protected]>
Signed-off-by: XploY04 <[email protected]>
Signed-off-by: Brian Gallagher <[email protected]>
Signed-off-by: krishdef7 <[email protected]>
Signed-off-by: ruskaruma <[email protected]>
Signed-off-by: Mansi Singh <[email protected]>
Signed-off-by: Transcendental-Programmer <[email protected]>
Signed-off-by: digvijay-y <[email protected]>
Signed-off-by: Ruskaruma <[email protected]>
Signed-off-by: tariq-hasan <[email protected]>
Signed-off-by: Andrey Velichkevich <[email protected]>
Signed-off-by: priyank <[email protected]>
Signed-off-by: Ali Maredia <[email protected]>
Signed-off-by: Yassin Nouh <[email protected]>
Signed-off-by: yassinnouh21 <[email protected]>
Co-authored-by: Jon Burdo <[email protected]>
Co-authored-by: Surya Sameer Datta Vaddadi <[email protected]>
Co-authored-by: Copilot <[email protected]>
Co-authored-by: Andrey Velichkevich <[email protected]>
Co-authored-by: Akash Jaiswal <[email protected]>
Co-authored-by: Hrithik Kanoje <[email protected]>
Co-authored-by: Shekhar Prasad Rajak <[email protected]>
Co-authored-by: Fiona Waters <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Osama Tahir <[email protected]>
Co-authored-by: Muhammad Junaid <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: google-oss-prow <[email protected]>
Co-authored-by: Moeed <[email protected]>
Co-authored-by: Yash Agarwal <[email protected]>
Co-authored-by: krishdef7 <[email protected]>
Co-authored-by: Ruskaruma <[email protected]>
Co-authored-by: Mansi Singh <[email protected]>
Co-authored-by: Priyansh Saxena <[email protected]>
Co-authored-by: DIGVIJAY <[email protected]>
Co-authored-by: Tariq Hasan <[email protected]>
Co-authored-by: Priyank Patel <[email protected]>
Co-authored-by: Ali Maredia <[email protected]>
Co-authored-by: Yassin Nouh <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support namespaced TrainingRuntime in the SDK

8 participants