diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index b74c630ea..2a3a485a7 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Bug Report description: Tell us about a problem you are experiencing with Kubeflow SDK labels: ["kind/bug", "needs-triage"] diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 7bb252d0b..0d2f5b02b 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + blank_issues_enabled: true contact_links: diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index a5a39dffd..d0deb6b9e 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Feature Request description: Suggest an idea for Kubeflow SDK labels: ["kind/feature", "needs-triage"] diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 8cb243948..3de8267dd 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + version: 2 updates: # Python dependencies from pyproject.toml diff --git a/.github/scripts/compare_versions.py b/.github/scripts/compare_versions.py index 5ed19eb86..7797a4aed 100755 --- a/.github/scripts/compare_versions.py +++ b/.github/scripts/compare_versions.py @@ -1,4 +1,18 @@ #!/usr/bin/env python3 +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """ Compare PEP 440 versions. diff --git a/.github/scripts/extract_version.py b/.github/scripts/extract_version.py index 82a518f7e..50a949a72 100755 --- a/.github/scripts/extract_version.py +++ b/.github/scripts/extract_version.py @@ -1,4 +1,18 @@ #!/usr/bin/env python3 +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """ Extract package version from uv tree output. diff --git a/.github/scripts/test_scripts.py b/.github/scripts/test_scripts.py index 2e46ed7db..082283354 100644 --- a/.github/scripts/test_scripts.py +++ b/.github/scripts/test_scripts.py @@ -1,4 +1,18 @@ #!/usr/bin/env python3 +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """ Unit tests for GitHub Actions scripts. diff --git a/.github/scripts/update_overrides.py b/.github/scripts/update_overrides.py index 0f51691b1..f2f456e2c 100755 --- a/.github/scripts/update_overrides.py +++ b/.github/scripts/update_overrides.py @@ -1,4 +1,18 @@ #!/usr/bin/env python3 +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """ Update override-dependencies in pyproject.toml. diff --git a/.github/workflows/check-owners.yaml b/.github/workflows/check-owners.yaml index 1e237d202..e4ae136da 100644 --- a/.github/workflows/check-owners.yaml +++ b/.github/workflows/check-owners.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: "Check OWNERS" on: diff --git a/.github/workflows/check-pr-title.yaml b/.github/workflows/check-pr-title.yaml index 4b557c3a9..72a2124dc 100644 --- a/.github/workflows/check-pr-title.yaml +++ b/.github/workflows/check-pr-title.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Check PR Title on: diff --git a/.github/workflows/cleanup-overrides.yaml b/.github/workflows/cleanup-overrides.yaml index 519ab32e5..4ab49a04f 100644 --- a/.github/workflows/cleanup-overrides.yaml +++ b/.github/workflows/cleanup-overrides.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Cleanup Dependency Overrides on: diff --git a/.github/workflows/code-quality-check.yaml b/.github/workflows/code-quality-check.yaml new file mode 100644 index 000000000..7965b009f --- /dev/null +++ b/.github/workflows/code-quality-check.yaml @@ -0,0 +1,41 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: Code Quality Checks + +on: + push: + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + boilerplate: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + fetch-depth: 0 + + - name: Setup Python + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: "3.12" + + - name: Check boilerplate headers + run: make verify-boilerplate TARGET_BRANCH=${{ github.base_ref }} diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml index 4faa68c99..c87fc5660 100644 --- a/.github/workflows/docs.yaml +++ b/.github/workflows/docs.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Documentation on: diff --git a/.github/workflows/gh-workflow-approve.yaml b/.github/workflows/gh-workflow-approve.yaml index 191dd0504..6d3601899 100644 --- a/.github/workflows/gh-workflow-approve.yaml +++ b/.github/workflows/gh-workflow-approve.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Approve Workflow Runs permissions: diff --git a/.github/workflows/github-stale.yaml b/.github/workflows/github-stale.yaml index 4448f2f42..a245f7e6e 100644 --- a/.github/workflows/github-stale.yaml +++ b/.github/workflows/github-stale.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + # This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time. # # You can adjust the behavior by modifying this file. diff --git a/.github/workflows/osv-scanner.yaml b/.github/workflows/osv-scanner.yaml index eff3371d8..8cc295386 100644 --- a/.github/workflows/osv-scanner.yaml +++ b/.github/workflows/osv-scanner.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: OSV-Scanner Vulnerability Scan on: diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 537fc26f3..93c534a12 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Release on: diff --git a/.github/workflows/test-e2e.yaml b/.github/workflows/test-e2e.yaml index f5ffe46f5..185ad06d0 100644 --- a/.github/workflows/test-e2e.yaml +++ b/.github/workflows/test-e2e.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: E2E Test on: pull_request diff --git a/.github/workflows/test-python.yaml b/.github/workflows/test-python.yaml index 64d492124..721031421 100644 --- a/.github/workflows/test-python.yaml +++ b/.github/workflows/test-python.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Unit Test - Python on: diff --git a/.github/workflows/test-spark-examples.yaml b/.github/workflows/test-spark-examples.yaml index 8a1251717..b2f5d2664 100644 --- a/.github/workflows/test-spark-examples.yaml +++ b/.github/workflows/test-spark-examples.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Spark Examples E2E Test on: diff --git a/.github/workflows/validate-lockfile.yaml b/.github/workflows/validate-lockfile.yaml index b9b00caa4..b8840cb10 100644 --- a/.github/workflows/validate-lockfile.yaml +++ b/.github/workflows/validate-lockfile.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Validate Lockfile Security on: diff --git a/.github/workflows/welcome-new-contributors.yaml b/.github/workflows/welcome-new-contributors.yaml index 374acdad0..f6dd75918 100644 --- a/.github/workflows/welcome-new-contributors.yaml +++ b/.github/workflows/welcome-new-contributors.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + name: Welcome new contributors on: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 624132316..6e83bc836 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 diff --git a/.readthedocs.yaml b/.readthedocs.yaml index e7bef0296..23f053215 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details diff --git a/Makefile b/Makefile index 57d0d16ee..98cee6d58 100644 --- a/Makefile +++ b/Makefile @@ -145,6 +145,9 @@ test-scripts: uv-venv ## Run GitHub Actions script tests @uv sync @uv run pytest .github/scripts/test_scripts.py -v +.PHONY: verify-boilerplate +verify-boilerplate: ## Verify copyright boilerplate headers in source files. + @python3 hack/boilerplate/boilerplate.py --base-ref "$${TARGET_BRANCH:-main}" .PHONY: install-dev install-dev: uv uv-venv ## Install uv, create .venv, sync deps. Accepts extras="..." and groups="...". diff --git a/docs/source/conf.py b/docs/source/conf.py index b80e72978..c7d4ee1c7 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + # Configuration file for the Sphinx documentation builder. # # For the full list of built-in configuration values, see the documentation: diff --git a/examples/spark/spark_advanced_options.py b/examples/spark/spark_advanced_options.py index 09125b658..dab30c358 100644 --- a/examples/spark/spark_advanced_options.py +++ b/examples/spark/spark_advanced_options.py @@ -1,4 +1,18 @@ #!/usr/bin/env python3 +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """ Advanced SparkClient Options Examples (KEP-107 Options Pattern) diff --git a/examples/spark/spark_connect_simple.py b/examples/spark/spark_connect_simple.py index 84695898f..32a64f0c6 100644 --- a/examples/spark/spark_connect_simple.py +++ b/examples/spark/spark_connect_simple.py @@ -1,4 +1,18 @@ #!/usr/bin/env python3 +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + """ SparkClient Examples - KEP-107 Three-Level API Pattern diff --git a/hack/Dockerfile.spark-e2e-runner b/hack/Dockerfile.spark-e2e-runner index 65a3569b0..356e5cc34 100644 --- a/hack/Dockerfile.spark-e2e-runner +++ b/hack/Dockerfile.spark-e2e-runner @@ -1,4 +1,17 @@ # Copyright 2025 The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + # In-cluster E2E runner: runs Spark example scripts inside the cluster so # SparkClient uses the in-cluster URL (sc://...svc.cluster.local) and no port-forward. FROM python:3.11-slim diff --git a/hack/boilerplate/boilerplate.py b/hack/boilerplate/boilerplate.py new file mode 100644 index 000000000..fe35a4809 --- /dev/null +++ b/hack/boilerplate/boilerplate.py @@ -0,0 +1,335 @@ +#!/usr/bin/env python3 + +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Downloaded from kubeflow/testing @ 60573e4fc680d947fc66d4128eb8c0f81fd7e4e3 + +"""Verify boilerplate copyright headers in source files. + +Two checks are applied: + + 1. All files: the header must match the boilerplate template once any + copyright year is normalized out, so a year-bearing header and a + year-less header both validate against the single year-less template. + 2. New files (added relative to the base branch): the header must + additionally be year-less; a hardcoded copyright year is rejected. + +New-file detection compares against the base branch (--base-ref, default +$TARGET_BRANCH or master), resolved as origin/ then . If the base +cannot be resolved, or files cannot be listed, the run fails rather than +passing vacuously. + +Reference: https://github.com/kubernetes/steering/issues/299 +""" + +from __future__ import annotations + +import argparse +import glob +import os +import re +import subprocess +import sys + +# Maps file extension (or special basename) to the boilerplate template +# stem on disk (boilerplate..txt). The "sh" stem is reused for every +# hash-comment language (bash, py, Dockerfile, yaml, yml). "helm" (also used +# for gotmpl) maps to boilerplate.helm.txt for Go-template comments, and +# go / rs have their own templates. +EXTENSION_TEMPLATES = { + "go": "go", + "helm": "helm", + "gotmpl": "helm", + "rs": "rs", + "sh": "sh", + "bash": "sh", + "py": "sh", + "Dockerfile": "sh", + "yaml": "sh", + "yml": "sh", +} + +# Template used for code-generated Go files (DO NOT EDIT). Loaded from +# disk but only activated when a Go file is detected as generated. +GENERATED_GO_TEMPLATE = "generatego" + +# Regex patterns +_RE_ANY_YEAR = re.compile(r"Copyright \d{4}") +_RE_YEAR_STRIP = re.compile(r"(Copyright )\d{4}(?:-\d{4})? ") +_RE_GO_BUILD_CONSTRAINTS = re.compile(r"^(//(go:build| \+build).*\n)+\n", re.MULTILINE) +_RE_SHEBANG = re.compile(r"^(#!.*\n)\n*") +_RE_GENERATED = re.compile(r"DO NOT EDIT", re.MULTILINE) +_RE_HELM_TEMPLATE = re.compile(r"(?:^|/)charts/[^/]+/templates/.*\.(?:ya?ml|tpl)$") + + +def find_root_dir() -> str: + """Resolve the repo root via git, falling back to the cwd.""" + try: + result = subprocess.run( + ["git", "rev-parse", "--show-toplevel"], + capture_output=True, + text=True, + check=True, + ) + return result.stdout.strip() + except (subprocess.CalledProcessError, FileNotFoundError): + return os.getcwd() + + +def base_tree_files(base_ref: str, rootdir: str) -> set[str] | None: + """Repo-relative paths at the merge-base of the base branch and HEAD. + + Tries origin/ then . Returns None if neither + resolves, so the caller can fail rather than skip the new-file check. + """ + for ref in (f"origin/{base_ref}", base_ref): + try: + base = subprocess.run( + ["git", "-C", rootdir, "merge-base", ref, "HEAD"], + capture_output=True, + text=True, + check=True, + ).stdout.strip() + tree = subprocess.run( + ["git", "-C", rootdir, "ls-tree", "-r", "--name-only", base], + capture_output=True, + text=True, + check=True, + ) + except (subprocess.CalledProcessError, FileNotFoundError): + continue + return {line for line in tree.stdout.splitlines() if line} + return None + + +def load_templates(boilerplate_dir: str) -> dict[str, list[str]]: + """Load boilerplate templates as {stem: [line, ...]}.""" + templates: dict[str, list[str]] = {} + for path in glob.glob(os.path.join(boilerplate_dir, "boilerplate.*.txt")): + stem = os.path.basename(path).replace("boilerplate.", "").replace(".txt", "") + with open(path, encoding="utf-8") as f: + templates[stem] = f.read().splitlines() + return templates + + +def template_stem_for(filename: str) -> str | None: + """Return the template stem for filename, or None to skip.""" + normalized = filename.replace(os.sep, "/") + if _RE_HELM_TEMPLATE.search(normalized): + return "helm" + basename = os.path.basename(filename) + if basename == "Dockerfile" or basename.startswith("Dockerfile."): + return EXTENSION_TEMPLATES.get("Dockerfile") + ext = os.path.splitext(filename)[1].lstrip(".").lower() + return EXTENSION_TEMPLATES.get(ext) + + +def list_git_files(rootdir: str) -> list[str] | None: + """List files git considers part of the working tree. + + Includes tracked files plus untracked-not-ignored files, so newly + added files are checked but build artifacts and __pycache__ are not. + Returns None if git fails, so the caller can fail rather than treat a + broken listing as "no files". + """ + try: + result = subprocess.run( + [ + "git", + "-C", + rootdir, + "ls-files", + "--cached", + "--others", + "--exclude-standard", + ], + capture_output=True, + text=True, + check=True, + ) + except (subprocess.CalledProcessError, FileNotFoundError) as e: + print(f"ERROR: 'git ls-files' failed: {e}", file=sys.stderr) + return None + return [os.path.join(rootdir, line) for line in result.stdout.splitlines() if line] + + +def collect_files(rootdir: str, filenames: list[str] | None) -> list[str] | None: + """Return the files to check, or None if the git listing failed.""" + if filenames: + candidates: list[str] = [] + for f in filenames: + if os.path.isfile(f): + candidates.append(f) + elif os.path.isdir(f): + for root, _, names in os.walk(f): + for name in names: + candidates.append(os.path.join(root, name)) + return sorted(candidates) + + files = list_git_files(rootdir) + if files is None: + return None + return sorted(files) + + +def file_passes( + filename: str, + templates: dict[str, list[str]], + new_file: bool = False, +) -> tuple[bool, str | None]: + """Verify filename's boilerplate header. + + Check 1 (all files): the header must equal the template after any + copyright year is normalized out. + Check 2 (new files): the header must be year-less. + """ + stem = template_stem_for(filename) + if stem is None or stem not in templates: + return True, None + + try: + with open(filename, encoding="utf-8") as f: + data = f.read() + except (OSError, UnicodeDecodeError) as e: + return False, f"Error reading file: {e}" + + if stem == "go" and _RE_GENERATED.search(data) and GENERATED_GO_TEMPLATE in templates: + stem = GENERATED_GO_TEMPLATE + + ref = templates[stem] + + if stem in ("go", GENERATED_GO_TEMPLATE): + data = _RE_GO_BUILD_CONSTRAINTS.sub("", data) + if stem == "sh": + data = _RE_SHEBANG.sub("", data) + + lines = data.splitlines() + header_lines = lines[: len(ref)] + + if len(lines) < len(ref): + return False, "File is shorter than the expected boilerplate header" + + # Check 1: the header must match the template once the copyright year is + # normalized out, so year-bearing and year-less headers both validate. + normalized = [_RE_YEAR_STRIP.sub(r"\1", line) for line in header_lines] + if normalized != ref: + return False, "Header does not match the boilerplate template" + + # Check 2: files added on this branch must not hardcode a copyright year. + if new_file and any(_RE_ANY_YEAR.search(line) for line in header_lines): + return ( + False, + "New file must use the year-less header (remove the hardcoded copyright year)", + ) + + return True, None + + +def print_remediation(failed: list[tuple[str, str | None]]) -> None: + print("", file=sys.stderr) + print( + "Boilerplate header verification failed for the following files:", + file=sys.stderr, + ) + print("", file=sys.stderr) + for path, err in failed: + if err: + print(f" {path}: {err}", file=sys.stderr) + else: + print(f" {path}", file=sys.stderr) + print("", file=sys.stderr) + print("For new files, use the copyright header WITHOUT a year:", file=sys.stderr) + print(" Copyright The Kubeflow Authors.", file=sys.stderr) + print("", file=sys.stderr) + print("See hack/boilerplate/ for the templates.", file=sys.stderr) + print("Reference: https://github.com/kubernetes/steering/issues/299", file=sys.stderr) + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description="Verify boilerplate copyright headers") + parser.add_argument( + "filenames", + nargs="*", + help="Specific files to check (default: all git-tracked files)", + ) + parser.add_argument( + "--boilerplate-dir", + default=os.path.dirname(os.path.abspath(__file__)), + help="Directory containing boilerplate template files", + ) + parser.add_argument( + "--rootdir", + default=None, + help="Root directory to scan (default: auto-detect via git)", + ) + parser.add_argument( + "--base-ref", + default=os.environ.get("TARGET_BRANCH", "master"), + help=( + "Base branch for new-file detection (default: $TARGET_BRANCH or " + "master). Resolved as origin/ then ." + ), + ) + return parser.parse_args() + + +def main() -> int: + args = parse_args() + rootdir = args.rootdir or find_root_dir() + os.chdir(rootdir) + + templates = load_templates(args.boilerplate_dir) + if not templates: + print( + f"ERROR: no boilerplate templates found in {args.boilerplate_dir}", + file=sys.stderr, + ) + return 1 + + files = collect_files(rootdir, args.filenames or None) + if files is None: + print("ERROR: could not list repository files via git.", file=sys.stderr) + return 1 + + base = base_tree_files(args.base_ref, rootdir) + if base is None: + print( + "ERROR: could not resolve a base ref for new-file detection " + f"(tried origin/{args.base_ref}, {args.base_ref}). Ensure the base " + "branch is fetched (actions/checkout fetch-depth: 0) or pass " + "--base-ref.", + file=sys.stderr, + ) + return 1 + + failed: list[tuple[str, str | None]] = [] + for filepath in files: + relpath = os.path.relpath(filepath, rootdir).replace(os.sep, "/") + new_file = relpath not in base + passes, error = file_passes(filepath, templates, new_file=new_file) + if not passes: + failed.append((relpath, error)) + print(relpath) # stdout stays parseable + + if failed: + print_remediation(failed) + return 1 + + print("Boilerplate header verification passed.", file=sys.stderr) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/hack/boilerplate/boilerplate.sh.txt b/hack/boilerplate/boilerplate.sh.txt new file mode 100644 index 000000000..3ba948c16 --- /dev/null +++ b/hack/boilerplate/boilerplate.sh.txt @@ -0,0 +1,13 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/hack/crds/sparkoperator.k8s.io_sparkconnects.yaml b/hack/crds/sparkoperator.k8s.io_sparkconnects.yaml index 3f12bd5dd..8252138f6 100644 --- a/hack/crds/sparkoperator.k8s.io_sparkconnects.yaml +++ b/hack/crds/sparkoperator.k8s.io_sparkconnects.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition diff --git a/hack/kind-config.yaml b/hack/kind-config.yaml index 9413b1b95..5fb081be9 100644 --- a/hack/kind-config.yaml +++ b/hack/kind-config.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + # Kind cluster config for Spark E2E: extra worker nodes for allocatable CPU/memory. # Single-node Kind often has "Insufficient cpu" when scheduling driver + executors. # 1 control-plane + 2 workers gives 3x capacity for multiple sessions or larger examples. diff --git a/kubeflow/common/__init__.py b/kubeflow/common/__init__.py index e69de29bb..3ba948c16 100644 --- a/kubeflow/common/__init__.py +++ b/kubeflow/common/__init__.py @@ -0,0 +1,13 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/kubeflow/hub/types/__init__.py b/kubeflow/hub/types/__init__.py index ec817706e..bd8bd07ba 100644 --- a/kubeflow/hub/types/__init__.py +++ b/kubeflow/hub/types/__init__.py @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + from kubeflow.hub.types.types import OCIUploadParams, S3UploadParams, StorageConfig __all__ = ["StorageConfig", "S3UploadParams", "OCIUploadParams"] diff --git a/kubeflow/optimizer/api/__init__.py b/kubeflow/optimizer/api/__init__.py index e69de29bb..3ba948c16 100644 --- a/kubeflow/optimizer/api/__init__.py +++ b/kubeflow/optimizer/api/__init__.py @@ -0,0 +1,13 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/kubeflow/spark/tests/__init__.py b/kubeflow/spark/tests/__init__.py index e69de29bb..3ba948c16 100644 --- a/kubeflow/spark/tests/__init__.py +++ b/kubeflow/spark/tests/__init__.py @@ -0,0 +1,13 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/kubeflow/trainer/api/__init__.py b/kubeflow/trainer/api/__init__.py index 52534e98a..744f00bbc 100644 --- a/kubeflow/trainer/api/__init__.py +++ b/kubeflow/trainer/api/__init__.py @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + # ruff: noqa # import apis into api package diff --git a/kubeflow/trainer/backends/__init__.py b/kubeflow/trainer/backends/__init__.py index e69de29bb..3ba948c16 100644 --- a/kubeflow/trainer/backends/__init__.py +++ b/kubeflow/trainer/backends/__init__.py @@ -0,0 +1,13 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/kubeflow/trainer/backends/kubernetes/__init__.py b/kubeflow/trainer/backends/kubernetes/__init__.py index e69de29bb..3ba948c16 100644 --- a/kubeflow/trainer/backends/kubernetes/__init__.py +++ b/kubeflow/trainer/backends/kubernetes/__init__.py @@ -0,0 +1,13 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/kubeflow/trainer/backends/localprocess/__init__.py b/kubeflow/trainer/backends/localprocess/__init__.py index e69de29bb..3ba948c16 100644 --- a/kubeflow/trainer/backends/localprocess/__init__.py +++ b/kubeflow/trainer/backends/localprocess/__init__.py @@ -0,0 +1,13 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/kubeflow/trainer/backends/localprocess/utils.py b/kubeflow/trainer/backends/localprocess/utils.py index ef01fb501..0663acbc6 100644 --- a/kubeflow/trainer/backends/localprocess/utils.py +++ b/kubeflow/trainer/backends/localprocess/utils.py @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + from collections.abc import Callable import inspect import os diff --git a/kubeflow/trainer/constants/__init__.py b/kubeflow/trainer/constants/__init__.py index e69de29bb..3ba948c16 100644 --- a/kubeflow/trainer/constants/__init__.py +++ b/kubeflow/trainer/constants/__init__.py @@ -0,0 +1,13 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/kubeflow/trainer/test/common.py b/kubeflow/trainer/test/common.py index a8316b2e5..4ffa836c4 100644 --- a/kubeflow/trainer/test/common.py +++ b/kubeflow/trainer/test/common.py @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + # Shared test utilities and types for Kubeflow Trainer tests. from dataclasses import dataclass, field diff --git a/kubeflow/trainer/types/__init__.py b/kubeflow/trainer/types/__init__.py index e69de29bb..3ba948c16 100644 --- a/kubeflow/trainer/types/__init__.py +++ b/kubeflow/trainer/types/__init__.py @@ -0,0 +1,13 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/proposals/107-spark-client/kep.yaml b/proposals/107-spark-client/kep.yaml index 7e7db0ded..389fb6bae 100644 --- a/proposals/107-spark-client/kep.yaml +++ b/proposals/107-spark-client/kep.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + title: Spark Client SDK for Kubeflow kep-number: 107 authors: diff --git a/proposals/125-kfp-client/kep.yaml b/proposals/125-kfp-client/kep.yaml index 09588c9a0..7bd1f60ef 100644 --- a/proposals/125-kfp-client/kep.yaml +++ b/proposals/125-kfp-client/kep.yaml @@ -1,3 +1,17 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + title: PipelinesClient for Kubeflow SDK kep-number: 125 authors: diff --git a/test/__init__.py b/test/__init__.py index e69de29bb..3ba948c16 100644 --- a/test/__init__.py +++ b/test/__init__.py @@ -0,0 +1,13 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/test/e2e/__init__.py b/test/e2e/__init__.py index e69de29bb..3ba948c16 100644 --- a/test/e2e/__init__.py +++ b/test/e2e/__init__.py @@ -0,0 +1,13 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/test/e2e/spark/__init__.py b/test/e2e/spark/__init__.py index e69de29bb..3ba948c16 100644 --- a/test/e2e/spark/__init__.py +++ b/test/e2e/spark/__init__.py @@ -0,0 +1,13 @@ +# Copyright The Kubeflow Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License.