Kubernetes decorator - #21077

Closed
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator
Closed

Kubernetes decorator#21077
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator

Conversation

@subkanthi

@subkanthisubkanthi commented Jan 24, 2022

Copy link
Copy Markdown
Contributor

Decorator to execute functions in k8s using KubernetesPodOperator

closes: #19135

@task.kubernetes(image='python:3.8-slim-buster', name='k8s_test', namespace='default')
def k8s_decorator_func():
print("decorator func")

If no parameters passed, defaults are set in kubernetes.py

 # Image, name and namespace are all required.
if not 'image' in kwargs:
kwargs['image'] = 'python:3.8-slim-buster'
if not 'name' in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'
if not 'namespace' in kwargs:
kwargs['namespace'] = 'default'

This version sets the function as an environment variable - PYTHON_SCRIPT and in the command , the logic is to retrieve the environment variable and write to '/tmp/script.py' to execute the function(very similar to Docker)

  1. Initially proceeded with trying to mount a local file using the hostPath, the problem is that requires Airflow also to run in the same node. For example running airflow locally and connecting to the kind cluster would need a mount.

^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

subkanthiand others added 30 commits November 22, 2021 13:36
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
@subkanthi
subkanthi requested a review from uranusjrApril 11, 2022 13:23

@uranusjruranusjr 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.

Also need to add image to the argument list of _KubernetesDecoratedOperator

Comment threadairflow/decorators/__init__.pyi Outdated
Co-authored-by: Tzu-ping Chung <uranusjr@gmail.com>
@@ -0,0 +1,44 @@
{#

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.

This has to be in the kube provider folder, else it won't get released with the provider, and it won't work.

@subkanthi

subkanthi commented Apr 27, 2022

Copy link
Copy Markdown
ContributorAuthor

@ashb , currently the decorator uses the write_python_script function thats in the utils/python_virtualenv.py file and thats why the template(python_kubernetes_script.jinja2) was also placed in the same folder. If we want to remove the dependency on the utils folder, I guess we can make a copy of the write_python_script in the cncf.providers.kubernetes folder. Question is if there a benefit of having a central place for the function and all templates, Docker decorator and python operator also call this function.

def write_python_script(
jinja_context: dict,
filename: str,
render_template_as_native_obj: bool = False,
template_file: str = 'python_virtualenv_script.jinja2',
):

@subkanthi
subkanthi requested a review from uranusjrApril 27, 2022 16:08
@Asciotti

Copy link
Copy Markdown

Bump? :)

@potiukpotiuk mentioned this pull request May 23, 2022
2 tasks

@kaxilkaxil 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.

Please also rebase your PR?

@@ -0,0 +1,44 @@
{#

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 move this @subkanthi to the cncf kube providers please?

pod_runtime_info_envs: Optional[List[PodRuntimeInfoEnv]] = None,
termination_grace_period: Optional[int] = None,
configmaps: Optional[List[str]] = None,
**kwargs,

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 can go into kwargs here? It seems unnecessary.

Comment on lines +76 to +81
# Set defaults for name and namespace.
if 'name' not in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'

if 'namespace' not in kwargs:
kwargs['namespace'] = 'default'

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.

Nit, it’s easier to use setdefault for these

return res


T = TypeVar("T", bound=Callable)

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.

Unused?

@potiuk

Copy link
Copy Markdown
Member

Closing, as this has been already implemented and merged in #25663

@potiukpotiuk closed this Sep 1, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PythonKubernetesOperator and kubernetes taskflow decorator

7 participants

@subkanthi@uranusjr@potiuk@Asciotti@ashb@kaxil@josh-fell
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Kubernetes decorator - #21077

Closed
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator
Closed

Kubernetes decorator#21077
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator

Conversation

@subkanthi

@subkanthisubkanthi commented Jan 24, 2022

Copy link
Copy Markdown
Contributor

Decorator to execute functions in k8s using KubernetesPodOperator

closes: #19135

@task.kubernetes(image='python:3.8-slim-buster', name='k8s_test', namespace='default')
def k8s_decorator_func():
print("decorator func")

If no parameters passed, defaults are set in kubernetes.py

 # Image, name and namespace are all required.
if not 'image' in kwargs:
kwargs['image'] = 'python:3.8-slim-buster'
if not 'name' in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'
if not 'namespace' in kwargs:
kwargs['namespace'] = 'default'

This version sets the function as an environment variable - PYTHON_SCRIPT and in the command , the logic is to retrieve the environment variable and write to '/tmp/script.py' to execute the function(very similar to Docker)

  1. Initially proceeded with trying to mount a local file using the hostPath, the problem is that requires Airflow also to run in the same node. For example running airflow locally and connecting to the kind cluster would need a mount.

^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

subkanthiand others added 30 commits November 22, 2021 13:36
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
@subkanthi
subkanthi requested a review from uranusjrApril 11, 2022 13:23

@uranusjruranusjr 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.

Also need to add image to the argument list of _KubernetesDecoratedOperator

Comment threadairflow/decorators/__init__.pyi Outdated
Co-authored-by: Tzu-ping Chung <uranusjr@gmail.com>
@@ -0,0 +1,44 @@
{#

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.

This has to be in the kube provider folder, else it won't get released with the provider, and it won't work.

@subkanthi

subkanthi commented Apr 27, 2022

Copy link
Copy Markdown
ContributorAuthor

@ashb , currently the decorator uses the write_python_script function thats in the utils/python_virtualenv.py file and thats why the template(python_kubernetes_script.jinja2) was also placed in the same folder. If we want to remove the dependency on the utils folder, I guess we can make a copy of the write_python_script in the cncf.providers.kubernetes folder. Question is if there a benefit of having a central place for the function and all templates, Docker decorator and python operator also call this function.

def write_python_script(
jinja_context: dict,
filename: str,
render_template_as_native_obj: bool = False,
template_file: str = 'python_virtualenv_script.jinja2',
):

@subkanthi
subkanthi requested a review from uranusjrApril 27, 2022 16:08
@Asciotti

Copy link
Copy Markdown

Bump? :)

@potiukpotiuk mentioned this pull request May 23, 2022
2 tasks

@kaxilkaxil 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.

Please also rebase your PR?

@@ -0,0 +1,44 @@
{#

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 move this @subkanthi to the cncf kube providers please?

pod_runtime_info_envs: Optional[List[PodRuntimeInfoEnv]] = None,
termination_grace_period: Optional[int] = None,
configmaps: Optional[List[str]] = None,
**kwargs,

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 can go into kwargs here? It seems unnecessary.

Comment on lines +76 to +81
# Set defaults for name and namespace.
if 'name' not in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'

if 'namespace' not in kwargs:
kwargs['namespace'] = 'default'

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.

Nit, it’s easier to use setdefault for these

return res


T = TypeVar("T", bound=Callable)

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.

Unused?

@potiuk

Copy link
Copy Markdown
Member

Closing, as this has been already implemented and merged in #25663

@potiukpotiuk closed this Sep 1, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PythonKubernetesOperator and kubernetes taskflow decorator

7 participants

@subkanthi@uranusjr@potiuk@Asciotti@ashb@kaxil@josh-fell
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Kubernetes decorator - #21077

Closed
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator
Closed

Kubernetes decorator#21077
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator

Conversation

@subkanthi

@subkanthisubkanthi commented Jan 24, 2022

Copy link
Copy Markdown
Contributor

Decorator to execute functions in k8s using KubernetesPodOperator

closes: #19135

@task.kubernetes(image='python:3.8-slim-buster', name='k8s_test', namespace='default')
def k8s_decorator_func():
print("decorator func")

If no parameters passed, defaults are set in kubernetes.py

 # Image, name and namespace are all required.
if not 'image' in kwargs:
kwargs['image'] = 'python:3.8-slim-buster'
if not 'name' in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'
if not 'namespace' in kwargs:
kwargs['namespace'] = 'default'

This version sets the function as an environment variable - PYTHON_SCRIPT and in the command , the logic is to retrieve the environment variable and write to '/tmp/script.py' to execute the function(very similar to Docker)

  1. Initially proceeded with trying to mount a local file using the hostPath, the problem is that requires Airflow also to run in the same node. For example running airflow locally and connecting to the kind cluster would need a mount.

^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

subkanthiand others added 30 commits November 22, 2021 13:36
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
@subkanthi
subkanthi requested a review from uranusjrApril 11, 2022 13:23

@uranusjruranusjr 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.

Also need to add image to the argument list of _KubernetesDecoratedOperator

Comment threadairflow/decorators/__init__.pyi Outdated
Co-authored-by: Tzu-ping Chung <uranusjr@gmail.com>
@@ -0,0 +1,44 @@
{#

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.

This has to be in the kube provider folder, else it won't get released with the provider, and it won't work.

@subkanthi

subkanthi commented Apr 27, 2022

Copy link
Copy Markdown
ContributorAuthor

@ashb , currently the decorator uses the write_python_script function thats in the utils/python_virtualenv.py file and thats why the template(python_kubernetes_script.jinja2) was also placed in the same folder. If we want to remove the dependency on the utils folder, I guess we can make a copy of the write_python_script in the cncf.providers.kubernetes folder. Question is if there a benefit of having a central place for the function and all templates, Docker decorator and python operator also call this function.

def write_python_script(
jinja_context: dict,
filename: str,
render_template_as_native_obj: bool = False,
template_file: str = 'python_virtualenv_script.jinja2',
):

@subkanthi
subkanthi requested a review from uranusjrApril 27, 2022 16:08
@Asciotti

Copy link
Copy Markdown

Bump? :)

@potiukpotiuk mentioned this pull request May 23, 2022
2 tasks

@kaxilkaxil 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.

Please also rebase your PR?

@@ -0,0 +1,44 @@
{#

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 move this @subkanthi to the cncf kube providers please?

pod_runtime_info_envs: Optional[List[PodRuntimeInfoEnv]] = None,
termination_grace_period: Optional[int] = None,
configmaps: Optional[List[str]] = None,
**kwargs,

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 can go into kwargs here? It seems unnecessary.

Comment on lines +76 to +81
# Set defaults for name and namespace.
if 'name' not in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'

if 'namespace' not in kwargs:
kwargs['namespace'] = 'default'

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.

Nit, it’s easier to use setdefault for these

return res


T = TypeVar("T", bound=Callable)

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.

Unused?

@potiuk

Copy link
Copy Markdown
Member

Closing, as this has been already implemented and merged in #25663

@potiukpotiuk closed this Sep 1, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PythonKubernetesOperator and kubernetes taskflow decorator

7 participants

@subkanthi@uranusjr@potiuk@Asciotti@ashb@kaxil@josh-fell
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Kubernetes decorator - #21077

Closed
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator
Closed

Kubernetes decorator#21077
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator

Conversation

@subkanthi

@subkanthisubkanthi commented Jan 24, 2022

Copy link
Copy Markdown
Contributor

Decorator to execute functions in k8s using KubernetesPodOperator

closes: #19135

@task.kubernetes(image='python:3.8-slim-buster', name='k8s_test', namespace='default')
def k8s_decorator_func():
print("decorator func")

If no parameters passed, defaults are set in kubernetes.py

 # Image, name and namespace are all required.
if not 'image' in kwargs:
kwargs['image'] = 'python:3.8-slim-buster'
if not 'name' in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'
if not 'namespace' in kwargs:
kwargs['namespace'] = 'default'

This version sets the function as an environment variable - PYTHON_SCRIPT and in the command , the logic is to retrieve the environment variable and write to '/tmp/script.py' to execute the function(very similar to Docker)

  1. Initially proceeded with trying to mount a local file using the hostPath, the problem is that requires Airflow also to run in the same node. For example running airflow locally and connecting to the kind cluster would need a mount.

^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

subkanthiand others added 30 commits November 22, 2021 13:36
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
@subkanthi
subkanthi requested a review from uranusjrApril 11, 2022 13:23

@uranusjruranusjr 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.

Also need to add image to the argument list of _KubernetesDecoratedOperator

Comment threadairflow/decorators/__init__.pyi Outdated
Co-authored-by: Tzu-ping Chung <uranusjr@gmail.com>
@@ -0,0 +1,44 @@
{#

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.

This has to be in the kube provider folder, else it won't get released with the provider, and it won't work.

@subkanthi

subkanthi commented Apr 27, 2022

Copy link
Copy Markdown
ContributorAuthor

@ashb , currently the decorator uses the write_python_script function thats in the utils/python_virtualenv.py file and thats why the template(python_kubernetes_script.jinja2) was also placed in the same folder. If we want to remove the dependency on the utils folder, I guess we can make a copy of the write_python_script in the cncf.providers.kubernetes folder. Question is if there a benefit of having a central place for the function and all templates, Docker decorator and python operator also call this function.

def write_python_script(
jinja_context: dict,
filename: str,
render_template_as_native_obj: bool = False,
template_file: str = 'python_virtualenv_script.jinja2',
):

@subkanthi
subkanthi requested a review from uranusjrApril 27, 2022 16:08
@Asciotti

Copy link
Copy Markdown

Bump? :)

@potiukpotiuk mentioned this pull request May 23, 2022
2 tasks

@kaxilkaxil 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.

Please also rebase your PR?

@@ -0,0 +1,44 @@
{#

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 move this @subkanthi to the cncf kube providers please?

pod_runtime_info_envs: Optional[List[PodRuntimeInfoEnv]] = None,
termination_grace_period: Optional[int] = None,
configmaps: Optional[List[str]] = None,
**kwargs,

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 can go into kwargs here? It seems unnecessary.

Comment on lines +76 to +81
# Set defaults for name and namespace.
if 'name' not in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'

if 'namespace' not in kwargs:
kwargs['namespace'] = 'default'

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.

Nit, it’s easier to use setdefault for these

return res


T = TypeVar("T", bound=Callable)

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.

Unused?

@potiuk

Copy link
Copy Markdown
Member

Closing, as this has been already implemented and merged in #25663

@potiukpotiuk closed this Sep 1, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PythonKubernetesOperator and kubernetes taskflow decorator

7 participants

@subkanthi@uranusjr@potiuk@Asciotti@ashb@kaxil@josh-fell
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Kubernetes decorator - #21077

Closed
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator
Closed

Kubernetes decorator#21077
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator

Conversation

@subkanthi

@subkanthisubkanthi commented Jan 24, 2022

Copy link
Copy Markdown
Contributor

Decorator to execute functions in k8s using KubernetesPodOperator

closes: #19135

@task.kubernetes(image='python:3.8-slim-buster', name='k8s_test', namespace='default')
def k8s_decorator_func():
print("decorator func")

If no parameters passed, defaults are set in kubernetes.py

 # Image, name and namespace are all required.
if not 'image' in kwargs:
kwargs['image'] = 'python:3.8-slim-buster'
if not 'name' in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'
if not 'namespace' in kwargs:
kwargs['namespace'] = 'default'

This version sets the function as an environment variable - PYTHON_SCRIPT and in the command , the logic is to retrieve the environment variable and write to '/tmp/script.py' to execute the function(very similar to Docker)

  1. Initially proceeded with trying to mount a local file using the hostPath, the problem is that requires Airflow also to run in the same node. For example running airflow locally and connecting to the kind cluster would need a mount.

^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

subkanthiand others added 30 commits November 22, 2021 13:36
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
@subkanthi
subkanthi requested a review from uranusjrApril 11, 2022 13:23

@uranusjruranusjr 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.

Also need to add image to the argument list of _KubernetesDecoratedOperator

Comment threadairflow/decorators/__init__.pyi Outdated
Co-authored-by: Tzu-ping Chung <uranusjr@gmail.com>
@@ -0,0 +1,44 @@
{#

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.

This has to be in the kube provider folder, else it won't get released with the provider, and it won't work.

@subkanthi

subkanthi commented Apr 27, 2022

Copy link
Copy Markdown
ContributorAuthor

@ashb , currently the decorator uses the write_python_script function thats in the utils/python_virtualenv.py file and thats why the template(python_kubernetes_script.jinja2) was also placed in the same folder. If we want to remove the dependency on the utils folder, I guess we can make a copy of the write_python_script in the cncf.providers.kubernetes folder. Question is if there a benefit of having a central place for the function and all templates, Docker decorator and python operator also call this function.

def write_python_script(
jinja_context: dict,
filename: str,
render_template_as_native_obj: bool = False,
template_file: str = 'python_virtualenv_script.jinja2',
):

@subkanthi
subkanthi requested a review from uranusjrApril 27, 2022 16:08
@Asciotti

Copy link
Copy Markdown

Bump? :)

@potiukpotiuk mentioned this pull request May 23, 2022
2 tasks

@kaxilkaxil 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.

Please also rebase your PR?

@@ -0,0 +1,44 @@
{#

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 move this @subkanthi to the cncf kube providers please?

pod_runtime_info_envs: Optional[List[PodRuntimeInfoEnv]] = None,
termination_grace_period: Optional[int] = None,
configmaps: Optional[List[str]] = None,
**kwargs,

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 can go into kwargs here? It seems unnecessary.

Comment on lines +76 to +81
# Set defaults for name and namespace.
if 'name' not in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'

if 'namespace' not in kwargs:
kwargs['namespace'] = 'default'

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.

Nit, it’s easier to use setdefault for these

return res


T = TypeVar("T", bound=Callable)

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.

Unused?

@potiuk

Copy link
Copy Markdown
Member

Closing, as this has been already implemented and merged in #25663

@potiukpotiuk closed this Sep 1, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PythonKubernetesOperator and kubernetes taskflow decorator

7 participants

@subkanthi@uranusjr@potiuk@Asciotti@ashb@kaxil@josh-fell
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Kubernetes decorator - #21077

Closed
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator
Closed

Kubernetes decorator#21077
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator

Conversation

@subkanthi

@subkanthisubkanthi commented Jan 24, 2022

Copy link
Copy Markdown
Contributor

Decorator to execute functions in k8s using KubernetesPodOperator

closes: #19135

@task.kubernetes(image='python:3.8-slim-buster', name='k8s_test', namespace='default')
def k8s_decorator_func():
print("decorator func")

If no parameters passed, defaults are set in kubernetes.py

 # Image, name and namespace are all required.
if not 'image' in kwargs:
kwargs['image'] = 'python:3.8-slim-buster'
if not 'name' in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'
if not 'namespace' in kwargs:
kwargs['namespace'] = 'default'

This version sets the function as an environment variable - PYTHON_SCRIPT and in the command , the logic is to retrieve the environment variable and write to '/tmp/script.py' to execute the function(very similar to Docker)

  1. Initially proceeded with trying to mount a local file using the hostPath, the problem is that requires Airflow also to run in the same node. For example running airflow locally and connecting to the kind cluster would need a mount.

^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

subkanthiand others added 30 commits November 22, 2021 13:36
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
@subkanthi
subkanthi requested a review from uranusjrApril 11, 2022 13:23

@uranusjruranusjr 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.

Also need to add image to the argument list of _KubernetesDecoratedOperator

Comment threadairflow/decorators/__init__.pyi Outdated
Co-authored-by: Tzu-ping Chung <uranusjr@gmail.com>
@@ -0,0 +1,44 @@
{#

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.

This has to be in the kube provider folder, else it won't get released with the provider, and it won't work.

@subkanthi

subkanthi commented Apr 27, 2022

Copy link
Copy Markdown
ContributorAuthor

@ashb , currently the decorator uses the write_python_script function thats in the utils/python_virtualenv.py file and thats why the template(python_kubernetes_script.jinja2) was also placed in the same folder. If we want to remove the dependency on the utils folder, I guess we can make a copy of the write_python_script in the cncf.providers.kubernetes folder. Question is if there a benefit of having a central place for the function and all templates, Docker decorator and python operator also call this function.

def write_python_script(
jinja_context: dict,
filename: str,
render_template_as_native_obj: bool = False,
template_file: str = 'python_virtualenv_script.jinja2',
):

@subkanthi
subkanthi requested a review from uranusjrApril 27, 2022 16:08
@Asciotti

Copy link
Copy Markdown

Bump? :)

@potiukpotiuk mentioned this pull request May 23, 2022
2 tasks

@kaxilkaxil 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.

Please also rebase your PR?

@@ -0,0 +1,44 @@
{#

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 move this @subkanthi to the cncf kube providers please?

pod_runtime_info_envs: Optional[List[PodRuntimeInfoEnv]] = None,
termination_grace_period: Optional[int] = None,
configmaps: Optional[List[str]] = None,
**kwargs,

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 can go into kwargs here? It seems unnecessary.

Comment on lines +76 to +81
# Set defaults for name and namespace.
if 'name' not in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'

if 'namespace' not in kwargs:
kwargs['namespace'] = 'default'

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.

Nit, it’s easier to use setdefault for these

return res


T = TypeVar("T", bound=Callable)

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.

Unused?

@potiuk

Copy link
Copy Markdown
Member

Closing, as this has been already implemented and merged in #25663

@potiukpotiuk closed this Sep 1, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PythonKubernetesOperator and kubernetes taskflow decorator

7 participants

@subkanthi@uranusjr@potiuk@Asciotti@ashb@kaxil@josh-fell
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Kubernetes decorator - #21077

Closed
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator
Closed

Kubernetes decorator#21077
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator

Conversation

@subkanthi

@subkanthisubkanthi commented Jan 24, 2022

Copy link
Copy Markdown
Contributor

Decorator to execute functions in k8s using KubernetesPodOperator

closes: #19135

@task.kubernetes(image='python:3.8-slim-buster', name='k8s_test', namespace='default')
def k8s_decorator_func():
print("decorator func")

If no parameters passed, defaults are set in kubernetes.py

 # Image, name and namespace are all required.
if not 'image' in kwargs:
kwargs['image'] = 'python:3.8-slim-buster'
if not 'name' in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'
if not 'namespace' in kwargs:
kwargs['namespace'] = 'default'

This version sets the function as an environment variable - PYTHON_SCRIPT and in the command , the logic is to retrieve the environment variable and write to '/tmp/script.py' to execute the function(very similar to Docker)

  1. Initially proceeded with trying to mount a local file using the hostPath, the problem is that requires Airflow also to run in the same node. For example running airflow locally and connecting to the kind cluster would need a mount.

^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

subkanthiand others added 30 commits November 22, 2021 13:36
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
@subkanthi
subkanthi requested a review from uranusjrApril 11, 2022 13:23

@uranusjruranusjr 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.

Also need to add image to the argument list of _KubernetesDecoratedOperator

Comment threadairflow/decorators/__init__.pyi Outdated
Co-authored-by: Tzu-ping Chung <uranusjr@gmail.com>
@@ -0,0 +1,44 @@
{#

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.

This has to be in the kube provider folder, else it won't get released with the provider, and it won't work.

@subkanthi

subkanthi commented Apr 27, 2022

Copy link
Copy Markdown
ContributorAuthor

@ashb , currently the decorator uses the write_python_script function thats in the utils/python_virtualenv.py file and thats why the template(python_kubernetes_script.jinja2) was also placed in the same folder. If we want to remove the dependency on the utils folder, I guess we can make a copy of the write_python_script in the cncf.providers.kubernetes folder. Question is if there a benefit of having a central place for the function and all templates, Docker decorator and python operator also call this function.

def write_python_script(
jinja_context: dict,
filename: str,
render_template_as_native_obj: bool = False,
template_file: str = 'python_virtualenv_script.jinja2',
):

@subkanthi
subkanthi requested a review from uranusjrApril 27, 2022 16:08
@Asciotti

Copy link
Copy Markdown

Bump? :)

@potiukpotiuk mentioned this pull request May 23, 2022
2 tasks

@kaxilkaxil 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.

Please also rebase your PR?

@@ -0,0 +1,44 @@
{#

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 move this @subkanthi to the cncf kube providers please?

pod_runtime_info_envs: Optional[List[PodRuntimeInfoEnv]] = None,
termination_grace_period: Optional[int] = None,
configmaps: Optional[List[str]] = None,
**kwargs,

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 can go into kwargs here? It seems unnecessary.

Comment on lines +76 to +81
# Set defaults for name and namespace.
if 'name' not in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'

if 'namespace' not in kwargs:
kwargs['namespace'] = 'default'

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.

Nit, it’s easier to use setdefault for these

return res


T = TypeVar("T", bound=Callable)

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.

Unused?

@potiuk

Copy link
Copy Markdown
Member

Closing, as this has been already implemented and merged in #25663

@potiukpotiuk closed this Sep 1, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PythonKubernetesOperator and kubernetes taskflow decorator

7 participants

@subkanthi@uranusjr@potiuk@Asciotti@ashb@kaxil@josh-fell
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Kubernetes decorator - #21077

Closed
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator
Closed

Kubernetes decorator#21077
subkanthi wants to merge 95 commits into
apache:mainfrom
subkanthi:kubernetes_decorator

Conversation

@subkanthi

@subkanthisubkanthi commented Jan 24, 2022

Copy link
Copy Markdown
Contributor

Decorator to execute functions in k8s using KubernetesPodOperator

closes: #19135

@task.kubernetes(image='python:3.8-slim-buster', name='k8s_test', namespace='default')
def k8s_decorator_func():
print("decorator func")

If no parameters passed, defaults are set in kubernetes.py

 # Image, name and namespace are all required.
if not 'image' in kwargs:
kwargs['image'] = 'python:3.8-slim-buster'
if not 'name' in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'
if not 'namespace' in kwargs:
kwargs['namespace'] = 'default'

This version sets the function as an environment variable - PYTHON_SCRIPT and in the command , the logic is to retrieve the environment variable and write to '/tmp/script.py' to execute the function(very similar to Docker)

  1. Initially proceeded with trying to mount a local file using the hostPath, the problem is that requires Airflow also to run in the same node. For example running airflow locally and connecting to the kind cluster would need a mount.

^ Add meaningful description above

Read the Pull Request Guidelines for more information.
In case of fundamental code change, Airflow Improvement Proposal (AIP) is needed.
In case of a new dependency, check compliance with the ASF 3rd Party License Policy.
In case of backwards incompatible changes please leave a note in UPDATING.md.

subkanthiand others added 30 commits November 22, 2021 13:36
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py
Comment threadairflow/providers/cncf/kubernetes/decorators/kubernetes.py Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
Comment threadairflow/decorators/__init__.pyi Outdated
@subkanthi
subkanthi requested a review from uranusjrApril 11, 2022 13:23

@uranusjruranusjr 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.

Also need to add image to the argument list of _KubernetesDecoratedOperator

Comment threadairflow/decorators/__init__.pyi Outdated
Co-authored-by: Tzu-ping Chung <uranusjr@gmail.com>
@@ -0,0 +1,44 @@
{#

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.

This has to be in the kube provider folder, else it won't get released with the provider, and it won't work.

@subkanthi

subkanthi commented Apr 27, 2022

Copy link
Copy Markdown
ContributorAuthor

@ashb , currently the decorator uses the write_python_script function thats in the utils/python_virtualenv.py file and thats why the template(python_kubernetes_script.jinja2) was also placed in the same folder. If we want to remove the dependency on the utils folder, I guess we can make a copy of the write_python_script in the cncf.providers.kubernetes folder. Question is if there a benefit of having a central place for the function and all templates, Docker decorator and python operator also call this function.

def write_python_script(
jinja_context: dict,
filename: str,
render_template_as_native_obj: bool = False,
template_file: str = 'python_virtualenv_script.jinja2',
):

@subkanthi
subkanthi requested a review from uranusjrApril 27, 2022 16:08
@Asciotti

Copy link
Copy Markdown

Bump? :)

@potiukpotiuk mentioned this pull request May 23, 2022
2 tasks

@kaxilkaxil 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.

Please also rebase your PR?

@@ -0,0 +1,44 @@
{#

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 move this @subkanthi to the cncf kube providers please?

pod_runtime_info_envs: Optional[List[PodRuntimeInfoEnv]] = None,
termination_grace_period: Optional[int] = None,
configmaps: Optional[List[str]] = None,
**kwargs,

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 can go into kwargs here? It seems unnecessary.

Comment on lines +76 to +81
# Set defaults for name and namespace.
if 'name' not in kwargs:
kwargs['name'] = f'k8s_airflow_pod_{uuid.uuid4().hex}'

if 'namespace' not in kwargs:
kwargs['namespace'] = 'default'

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.

Nit, it’s easier to use setdefault for these

return res


T = TypeVar("T", bound=Callable)

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.

Unused?

@potiuk

Copy link
Copy Markdown
Member

Closing, as this has been already implemented and merged in #25663

@potiukpotiuk closed this Sep 1, 2022
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:providersprovider:cncf-kubernetesKubernetes (k8s) provider related issues

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PythonKubernetesOperator and kubernetes taskflow decorator

7 participants

@subkanthi@uranusjr@potiuk@Asciotti@ashb@kaxil@josh-fell