| |
| |
| <!-- |
| Javascript to render AIRFLOW-XXX and PR references in text |
| as HTML links. |
| |
| Overrides extrahead block from sphinx_rtd_theme |
| https://www.sphinx-doc.org/en/master/templating.html |
| --> |
| |
| |
| <!DOCTYPE html> |
| <!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> |
| <!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> |
| <head> |
| <meta charset="utf-8"> |
| |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| |
| <title>airflow.configuration — Airflow Documentation</title> |
| |
| |
| |
| |
| <link rel="shortcut icon" href="../../_static/pin_32.png"/> |
| |
| |
| |
| |
| |
| <script type="text/javascript" src="../../_static/js/modernizr.min.js"></script> |
| |
| |
| <script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script> |
| <script type="text/javascript" src="../../_static/jquery.js"></script> |
| <script type="text/javascript" src="../../_static/underscore.js"></script> |
| <script type="text/javascript" src="../../_static/doctools.js"></script> |
| <script type="text/javascript" src="../../_static/language_data.js"></script> |
| <script type="text/javascript" src="../../_static/jira-links.js"></script> |
| |
| <script type="text/javascript" src="../../_static/js/theme.js"></script> |
| |
| |
| |
| |
| <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" /> |
| <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> |
| <link rel="stylesheet" href="../../_static/graphviz.css" type="text/css" /> |
| <link rel="stylesheet" href="../../_static/exampleinclude.css" type="text/css" /> |
| <link rel="index" title="Index" href="../../genindex.html" /> |
| <link rel="search" title="Search" href="../../search.html" /> |
| |
| <script> |
| </script> |
| <style> |
| |
| </style> |
| |
| </head> |
| |
| <body class="wy-body-for-nav"> |
| |
| |
| <div class="wy-grid-for-nav"> |
| |
| <nav data-toggle="wy-nav-shift" class="wy-nav-side"> |
| <div class="wy-side-scroll"> |
| <div class="wy-side-nav-search" > |
| |
| |
| |
| <a href="../../index.html" class="icon icon-home"> Airflow |
| |
| |
| |
| </a> |
| |
| |
| |
| |
| <div class="version"> |
| 1.10.8 |
| </div> |
| |
| |
| |
| |
| <div role="search"> |
| <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get"> |
| <input type="text" name="q" placeholder="Search docs" /> |
| <input type="hidden" name="check_keywords" value="yes" /> |
| <input type="hidden" name="area" value="default" /> |
| </form> |
| </div> |
| |
| |
| </div> |
| |
| <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> |
| |
| |
| |
| |
| |
| |
| <ul> |
| <li class="toctree-l1"><a class="reference internal" href="../../project.html">Project</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../license.html">License</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../start.html">Quick Start</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../installation.html">Installation</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../tutorial.html">Tutorial</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../howto/index.html">How-to Guides</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../ui.html">UI / Screenshots</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../concepts.html">Concepts</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../profiling.html">Data Profiling</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../cli.html">Command Line Interface Reference</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../scheduler.html">Scheduling & Triggers</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../executor/index.html">Executor</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../plugins.html">Plugins</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../security.html">Security</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../timezone.html">Time zones</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../api.html">REST API Reference</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../integration.html">Integration</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../metrics.html">Metrics</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../errors.html">Error Tracking</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../kubernetes.html">Kubernetes</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../lineage.html">Lineage</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../dag-serialization.html">DAG Serialization</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../changelog.html">Changelog</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../best-practices.html">Best Practices</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../faq.html">FAQ</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../macros.html">Macros reference</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../privacy_notice.html">Privacy Notice</a></li> |
| </ul> |
| <p class="caption"><span class="caption-text">References</span></p> |
| <ul> |
| <li class="toctree-l1"><a class="reference internal" href="../../_api/index.html">Python API</a></li> |
| <li class="toctree-l1"><a class="reference internal" href="../../configurations-ref.html">Configurations</a></li> |
| </ul> |
| |
| |
| |
| </div> |
| </div> |
| </nav> |
| |
| <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> |
| |
| |
| <nav class="wy-nav-top" aria-label="top navigation"> |
| |
| <i data-toggle="wy-nav-top" class="fa fa-bars"></i> |
| <a href="../../index.html">Airflow</a> |
| |
| </nav> |
| |
| |
| <div class="wy-nav-content"> |
| |
| <div class="rst-content"> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <div role="navigation" aria-label="breadcrumbs navigation"> |
| |
| <ul class="wy-breadcrumbs"> |
| |
| <li><a href="../../index.html">Docs</a> »</li> |
| |
| <li><a href="../index.html">Module code</a> »</li> |
| |
| <li>airflow.configuration</li> |
| |
| |
| <li class="wy-breadcrumbs-aside"> |
| |
| </li> |
| |
| </ul> |
| |
| |
| <hr/> |
| </div> |
| <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> |
| <div itemprop="articleBody"> |
| |
| <h1>Source code for airflow.configuration</h1><div class="highlight"><pre> |
| <span></span><span class="c1"># -*- coding: utf-8 -*-</span> |
| <span class="c1">#</span> |
| <span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span> |
| <span class="c1"># or more contributor license agreements. See the NOTICE file</span> |
| <span class="c1"># distributed with this work for additional information</span> |
| <span class="c1"># regarding copyright ownership. The ASF licenses this file</span> |
| <span class="c1"># to you under the Apache License, Version 2.0 (the</span> |
| <span class="c1"># "License"); you may not use this file except in compliance</span> |
| <span class="c1"># with the License. You may obtain a copy of the License at</span> |
| <span class="c1">#</span> |
| <span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span> |
| <span class="c1">#</span> |
| <span class="c1"># Unless required by applicable law or agreed to in writing,</span> |
| <span class="c1"># software distributed under the License is distributed on an</span> |
| <span class="c1"># "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span> |
| <span class="c1"># KIND, either express or implied. See the License for the</span> |
| <span class="c1"># specific language governing permissions and limitations</span> |
| <span class="c1"># under the License.</span> |
| <span class="c1">#</span> |
| <span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span> |
| <span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">division</span> |
| <span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">print_function</span> |
| <span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">unicode_literals</span> |
| |
| <span class="kn">from</span> <span class="nn">builtins</span> <span class="kn">import</span> <span class="nb">str</span> |
| <span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">OrderedDict</span> |
| <span class="kn">import</span> <span class="nn">copy</span> |
| <span class="kn">import</span> <span class="nn">errno</span> |
| <span class="kn">from</span> <span class="nn">future</span> <span class="kn">import</span> <span class="n">standard_library</span> |
| <span class="kn">import</span> <span class="nn">os</span> |
| <span class="kn">import</span> <span class="nn">shlex</span> |
| <span class="kn">import</span> <span class="nn">six</span> |
| <span class="kn">from</span> <span class="nn">six</span> <span class="kn">import</span> <span class="n">iteritems</span> |
| <span class="kn">import</span> <span class="nn">subprocess</span> |
| <span class="kn">import</span> <span class="nn">sys</span> |
| <span class="kn">import</span> <span class="nn">warnings</span> |
| |
| <span class="kn">from</span> <span class="nn">backports.configparser</span> <span class="kn">import</span> <span class="n">ConfigParser</span><span class="p">,</span> <span class="n">_UNSET</span><span class="p">,</span> <span class="n">NoOptionError</span><span class="p">,</span> <span class="n">NoSectionError</span> |
| <span class="kn">import</span> <span class="nn">yaml</span> |
| <span class="kn">from</span> <span class="nn">zope.deprecation</span> <span class="kn">import</span> <span class="n">deprecated</span> |
| |
| <span class="kn">from</span> <span class="nn">airflow.exceptions</span> <span class="kn">import</span> <span class="n">AirflowConfigException</span> |
| <span class="kn">from</span> <span class="nn">airflow.utils.log.logging_mixin</span> <span class="kn">import</span> <span class="n">LoggingMixin</span> |
| |
| <span class="n">standard_library</span><span class="o">.</span><span class="n">install_aliases</span><span class="p">()</span> |
| |
| <span class="n">log</span> <span class="o">=</span> <span class="n">LoggingMixin</span><span class="p">()</span><span class="o">.</span><span class="n">log</span> |
| |
| <span class="c1"># show Airflow's deprecation warnings</span> |
| <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span> |
| <span class="n">action</span><span class="o">=</span><span class="s1">'default'</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="ne">DeprecationWarning</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="s1">'airflow'</span><span class="p">)</span> |
| <span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span> |
| <span class="n">action</span><span class="o">=</span><span class="s1">'default'</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="ne">PendingDeprecationWarning</span><span class="p">,</span> <span class="n">module</span><span class="o">=</span><span class="s1">'airflow'</span><span class="p">)</span> |
| |
| |
| <span class="k">def</span> <span class="nf">generate_fernet_key</span><span class="p">():</span> |
| <span class="k">try</span><span class="p">:</span> |
| <span class="kn">from</span> <span class="nn">cryptography.fernet</span> <span class="kn">import</span> <span class="n">Fernet</span> |
| <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span> |
| <span class="k">return</span> <span class="s1">''</span> |
| <span class="k">else</span><span class="p">:</span> |
| <span class="k">return</span> <span class="n">Fernet</span><span class="o">.</span><span class="n">generate_key</span><span class="p">()</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span> |
| |
| |
| <span class="k">def</span> <span class="nf">expand_env_var</span><span class="p">(</span><span class="n">env_var</span><span class="p">):</span> |
| <span class="sd">"""</span> |
| <span class="sd"> Expands (potentially nested) env vars by repeatedly applying</span> |
| <span class="sd"> `expandvars` and `expanduser` until interpolation stops having</span> |
| <span class="sd"> any effect.</span> |
| <span class="sd"> """</span> |
| <span class="k">if</span> <span class="ow">not</span> <span class="n">env_var</span><span class="p">:</span> |
| <span class="k">return</span> <span class="n">env_var</span> |
| <span class="k">while</span> <span class="kc">True</span><span class="p">:</span> |
| <span class="n">interpolated</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expandvars</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">env_var</span><span class="p">)))</span> |
| <span class="k">if</span> <span class="n">interpolated</span> <span class="o">==</span> <span class="n">env_var</span><span class="p">:</span> |
| <span class="k">return</span> <span class="n">interpolated</span> |
| <span class="k">else</span><span class="p">:</span> |
| <span class="n">env_var</span> <span class="o">=</span> <span class="n">interpolated</span> |
| |
| |
| <span class="k">def</span> <span class="nf">run_command</span><span class="p">(</span><span class="n">command</span><span class="p">):</span> |
| <span class="sd">"""</span> |
| <span class="sd"> Runs command and returns stdout</span> |
| <span class="sd"> """</span> |
| <span class="n">process</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">(</span> |
| <span class="n">shlex</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">command</span><span class="p">),</span> |
| <span class="n">stdout</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span> |
| <span class="n">stderr</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span> |
| <span class="n">close_fds</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> |
| <span class="n">output</span><span class="p">,</span> <span class="n">stderr</span> <span class="o">=</span> <span class="p">[</span><span class="n">stream</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">getdefaultencoding</span><span class="p">(),</span> <span class="s1">'ignore'</span><span class="p">)</span> |
| <span class="k">for</span> <span class="n">stream</span> <span class="ow">in</span> <span class="n">process</span><span class="o">.</span><span class="n">communicate</span><span class="p">()]</span> |
| |
| <span class="k">if</span> <span class="n">process</span><span class="o">.</span><span class="n">returncode</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span> |
| <span class="k">raise</span> <span class="n">AirflowConfigException</span><span class="p">(</span> |
| <span class="s2">"Cannot execute </span><span class="si">{}</span><span class="s2">. Error code is: </span><span class="si">{}</span><span class="s2">. Output: </span><span class="si">{}</span><span class="s2">, Stderr: </span><span class="si">{}</span><span class="s2">"</span> |
| <span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">command</span><span class="p">,</span> <span class="n">process</span><span class="o">.</span><span class="n">returncode</span><span class="p">,</span> <span class="n">output</span><span class="p">,</span> <span class="n">stderr</span><span class="p">)</span> |
| <span class="p">)</span> |
| |
| <span class="k">return</span> <span class="n">output</span> |
| |
| |
| <span class="k">def</span> <span class="nf">_read_default_config_file</span><span class="p">(</span><span class="n">file_name</span><span class="p">):</span> |
| <span class="n">templates_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="vm">__file__</span><span class="p">),</span> <span class="s1">'config_templates'</span><span class="p">)</span> |
| <span class="n">file_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">templates_dir</span><span class="p">,</span> <span class="n">file_name</span><span class="p">)</span> |
| <span class="k">if</span> <span class="n">six</span><span class="o">.</span><span class="n">PY2</span><span class="p">:</span> |
| <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span> <span class="k">as</span> <span class="n">file_handle</span><span class="p">:</span> |
| <span class="n">config</span> <span class="o">=</span> <span class="n">file_handle</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> |
| <span class="k">return</span> <span class="n">config</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">'utf-8'</span><span class="p">),</span> <span class="n">file_path</span> |
| <span class="k">else</span><span class="p">:</span> |
| <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">'utf-8'</span><span class="p">)</span> <span class="k">as</span> <span class="n">file_handle</span><span class="p">:</span> |
| <span class="k">return</span> <span class="n">file_handle</span><span class="o">.</span><span class="n">read</span><span class="p">(),</span> <span class="n">file_path</span> |
| |
| |
| <span class="n">DEFAULT_CONFIG</span><span class="p">,</span> <span class="n">DEFAULT_CONFIG_FILE_PATH</span> <span class="o">=</span> <span class="n">_read_default_config_file</span><span class="p">(</span><span class="s1">'default_airflow.cfg'</span><span class="p">)</span> |
| <span class="n">TEST_CONFIG</span><span class="p">,</span> <span class="n">TEST_CONFIG_FILE_PATH</span> <span class="o">=</span> <span class="n">_read_default_config_file</span><span class="p">(</span><span class="s1">'default_test.cfg'</span><span class="p">)</span> |
| |
| |
| <span class="k">def</span> <span class="nf">default_config_yaml</span><span class="p">():</span> |
| <span class="sd">"""</span> |
| <span class="sd"> Read Airflow configs from YAML file</span> |
| |
| <span class="sd"> :return: Python dictionary containing configs & their info</span> |
| <span class="sd"> """</span> |
| <span class="n">templates_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="vm">__file__</span><span class="p">),</span> <span class="s1">'config_templates'</span><span class="p">)</span> |
| <span class="n">file_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">templates_dir</span><span class="p">,</span> <span class="s2">"config.yml"</span><span class="p">)</span> |
| |
| <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span> <span class="k">as</span> <span class="n">config_file</span><span class="p">:</span> |
| <span class="k">return</span> <span class="n">yaml</span><span class="o">.</span><span class="n">safe_load</span><span class="p">(</span><span class="n">config_file</span><span class="p">)</span> |
| |
| |
| <span class="k">class</span> <span class="nc">AirflowConfigParser</span><span class="p">(</span><span class="n">ConfigParser</span><span class="p">):</span> |
| |
| <span class="c1"># These configuration elements can be fetched as the stdout of commands</span> |
| <span class="c1"># following the "{section}__{name}__cmd" pattern, the idea behind this</span> |
| <span class="c1"># is to not store password on boxes in text files.</span> |
| <span class="n">as_command_stdout</span> <span class="o">=</span> <span class="p">{</span> |
| <span class="p">(</span><span class="s1">'core'</span><span class="p">,</span> <span class="s1">'sql_alchemy_conn'</span><span class="p">),</span> |
| <span class="p">(</span><span class="s1">'core'</span><span class="p">,</span> <span class="s1">'fernet_key'</span><span class="p">),</span> |
| <span class="p">(</span><span class="s1">'celery'</span><span class="p">,</span> <span class="s1">'broker_url'</span><span class="p">),</span> |
| <span class="p">(</span><span class="s1">'celery'</span><span class="p">,</span> <span class="s1">'flower_basic_auth'</span><span class="p">),</span> |
| <span class="p">(</span><span class="s1">'celery'</span><span class="p">,</span> <span class="s1">'result_backend'</span><span class="p">),</span> |
| <span class="c1"># Todo: remove this in Airflow 1.11</span> |
| <span class="p">(</span><span class="s1">'celery'</span><span class="p">,</span> <span class="s1">'celery_result_backend'</span><span class="p">),</span> |
| <span class="p">(</span><span class="s1">'atlas'</span><span class="p">,</span> <span class="s1">'password'</span><span class="p">),</span> |
| <span class="p">(</span><span class="s1">'smtp'</span><span class="p">,</span> <span class="s1">'smtp_password'</span><span class="p">),</span> |
| <span class="p">(</span><span class="s1">'ldap'</span><span class="p">,</span> <span class="s1">'bind_password'</span><span class="p">),</span> |
| <span class="p">(</span><span class="s1">'kubernetes'</span><span class="p">,</span> <span class="s1">'git_password'</span><span class="p">),</span> |
| <span class="p">}</span> |
| |
| <span class="c1"># A two-level mapping of (section -> new_name -> old_name). When reading</span> |
| <span class="c1"># new_name, the old_name will be checked to see if it exists. If it does a</span> |
| <span class="c1"># DeprecationWarning will be issued and the old name will be used instead</span> |
| <span class="n">deprecated_options</span> <span class="o">=</span> <span class="p">{</span> |
| <span class="s1">'celery'</span><span class="p">:</span> <span class="p">{</span> |
| <span class="c1"># Remove these keys in Airflow 1.11</span> |
| <span class="s1">'worker_concurrency'</span><span class="p">:</span> <span class="s1">'celeryd_concurrency'</span><span class="p">,</span> |
| <span class="s1">'result_backend'</span><span class="p">:</span> <span class="s1">'celery_result_backend'</span><span class="p">,</span> |
| <span class="s1">'broker_url'</span><span class="p">:</span> <span class="s1">'celery_broker_url'</span><span class="p">,</span> |
| <span class="s1">'ssl_active'</span><span class="p">:</span> <span class="s1">'celery_ssl_active'</span><span class="p">,</span> |
| <span class="s1">'ssl_cert'</span><span class="p">:</span> <span class="s1">'celery_ssl_cert'</span><span class="p">,</span> |
| <span class="s1">'ssl_key'</span><span class="p">:</span> <span class="s1">'celery_ssl_key'</span><span class="p">,</span> |
| <span class="p">},</span> |
| <span class="s1">'elasticsearch'</span><span class="p">:</span> <span class="p">{</span> |
| <span class="s1">'host'</span><span class="p">:</span> <span class="s1">'elasticsearch_host'</span><span class="p">,</span> |
| <span class="s1">'log_id_template'</span><span class="p">:</span> <span class="s1">'elasticsearch_log_id_template'</span><span class="p">,</span> |
| <span class="s1">'end_of_log_mark'</span><span class="p">:</span> <span class="s1">'elasticsearch_end_of_log_mark'</span><span class="p">,</span> |
| <span class="s1">'frontend'</span><span class="p">:</span> <span class="s1">'elasticsearch_frontend'</span><span class="p">,</span> |
| <span class="s1">'write_stdout'</span><span class="p">:</span> <span class="s1">'elasticsearch_write_stdout'</span><span class="p">,</span> |
| <span class="s1">'json_format'</span><span class="p">:</span> <span class="s1">'elasticsearch_json_format'</span><span class="p">,</span> |
| <span class="s1">'json_fields'</span><span class="p">:</span> <span class="s1">'elasticsearch_json_fields'</span> |
| |
| <span class="p">}</span> |
| <span class="p">}</span> |
| |
| <span class="c1"># A mapping of old default values that we want to change and warn the user</span> |
| <span class="c1"># about. Mapping of section -> setting -> { old, replace, by_version }</span> |
| <span class="n">deprecated_values</span> <span class="o">=</span> <span class="p">{</span> |
| <span class="s1">'core'</span><span class="p">:</span> <span class="p">{</span> |
| <span class="s1">'task_runner'</span><span class="p">:</span> <span class="p">(</span><span class="s1">'BashTaskRunner'</span><span class="p">,</span> <span class="s1">'StandardTaskRunner'</span><span class="p">,</span> <span class="s1">'2.0'</span><span class="p">),</span> |
| <span class="p">},</span> |
| <span class="p">}</span> |
| |
| <span class="c1"># This method transforms option names on every read, get, or set operation.</span> |
| <span class="c1"># This changes from the default behaviour of ConfigParser from lowercasing</span> |
| <span class="c1"># to instead be case-preserving</span> |
| <span class="k">def</span> <span class="nf">optionxform</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">optionstr</span><span class="p">):</span> |
| <span class="k">return</span> <span class="n">optionstr</span> |
| |
| <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">default_config</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> |
| <span class="nb">super</span><span class="p">(</span><span class="n">AirflowConfigParser</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> |
| |
| <span class="bp">self</span><span class="o">.</span><span class="n">airflow_defaults</span> <span class="o">=</span> <span class="n">ConfigParser</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> |
| <span class="k">if</span> <span class="n">default_config</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">airflow_defaults</span><span class="o">.</span><span class="n">read_string</span><span class="p">(</span><span class="n">default_config</span><span class="p">)</span> |
| |
| <span class="bp">self</span><span class="o">.</span><span class="n">is_validated</span> <span class="o">=</span> <span class="kc">False</span> |
| |
| <span class="k">def</span> <span class="nf">_validate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> |
| <span class="k">if</span> <span class="p">(</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"core"</span><span class="p">,</span> <span class="s2">"executor"</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'DebugExecutor'</span><span class="p">,</span> <span class="s1">'SequentialExecutor'</span><span class="p">)</span> <span class="ow">and</span> |
| <span class="s2">"sqlite"</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'core'</span><span class="p">,</span> <span class="s1">'sql_alchemy_conn'</span><span class="p">)):</span> |
| <span class="k">raise</span> <span class="n">AirflowConfigException</span><span class="p">(</span> |
| <span class="s2">"error: cannot use sqlite with the </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'core'</span><span class="p">,</span> <span class="s1">'executor'</span><span class="p">)))</span> |
| |
| <span class="k">elif</span> <span class="p">(</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s2">"webserver"</span><span class="p">,</span> <span class="s2">"authenticate"</span><span class="p">)</span> <span class="ow">and</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"webserver"</span><span class="p">,</span> <span class="s2">"owner_mode"</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">'user'</span><span class="p">,</span> <span class="s1">'ldapgroup'</span><span class="p">]</span> |
| <span class="p">):</span> |
| <span class="k">raise</span> <span class="n">AirflowConfigException</span><span class="p">(</span> |
| <span class="s2">"error: owner_mode option should be either "</span> |
| <span class="s2">"'user' or 'ldapgroup' when filtering by owner is set"</span><span class="p">)</span> |
| |
| <span class="k">elif</span> <span class="p">(</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s2">"webserver"</span><span class="p">,</span> <span class="s2">"authenticate"</span><span class="p">)</span> <span class="ow">and</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"webserver"</span><span class="p">,</span> <span class="s2">"owner_mode"</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">'ldapgroup'</span> <span class="ow">and</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"webserver"</span><span class="p">,</span> <span class="s2">"auth_backend"</span><span class="p">)</span> <span class="o">!=</span> <span class="p">(</span> |
| <span class="s1">'airflow.contrib.auth.backends.ldap_auth'</span><span class="p">)</span> |
| <span class="p">):</span> |
| <span class="k">raise</span> <span class="n">AirflowConfigException</span><span class="p">(</span> |
| <span class="s2">"error: attempt at using ldapgroup "</span> |
| <span class="s2">"filtering without using the Ldap backend"</span><span class="p">)</span> |
| |
| <span class="k">for</span> <span class="n">section</span><span class="p">,</span> <span class="n">replacement</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">deprecated_values</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> |
| <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">info</span> <span class="ow">in</span> <span class="n">replacement</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> |
| <span class="n">old</span><span class="p">,</span> <span class="n">new</span><span class="p">,</span> <span class="n">version</span> <span class="o">=</span> <span class="n">info</span> |
| <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">fallback</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span> <span class="o">==</span> <span class="n">old</span><span class="p">:</span> |
| <span class="c1"># Make sure the env var option is removed, otherwise it</span> |
| <span class="c1"># would be read and used instead of the value we set</span> |
| <span class="n">env_var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_env_var_name</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> |
| <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">env_var</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> |
| |
| <span class="bp">self</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">new</span><span class="p">)</span> |
| <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span> |
| <span class="s1">'The </span><span class="si">{name}</span><span class="s1"> setting in [</span><span class="si">{section}</span><span class="s1">] has the old default value '</span> |
| <span class="s1">'of </span><span class="si">{old!r}</span><span class="s1">. This value has been changed to </span><span class="si">{new!r}</span><span class="s1"> in the '</span> |
| <span class="s1">'running config, but please update your config before Apache '</span> |
| <span class="s1">'Airflow </span><span class="si">{version}</span><span class="s1">.'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> |
| <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">section</span><span class="o">=</span><span class="n">section</span><span class="p">,</span> <span class="n">old</span><span class="o">=</span><span class="n">old</span><span class="p">,</span> <span class="n">new</span><span class="o">=</span><span class="n">new</span><span class="p">,</span> <span class="n">version</span><span class="o">=</span><span class="n">version</span> |
| <span class="p">),</span> |
| <span class="ne">FutureWarning</span> |
| <span class="p">)</span> |
| |
| <span class="bp">self</span><span class="o">.</span><span class="n">is_validated</span> <span class="o">=</span> <span class="kc">True</span> |
| |
| <span class="nd">@staticmethod</span> |
| <span class="k">def</span> <span class="nf">_env_var_name</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span> |
| <span class="k">return</span> <span class="s1">'AIRFLOW__</span><span class="si">{S}</span><span class="s1">__</span><span class="si">{K}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">S</span><span class="o">=</span><span class="n">section</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">K</span><span class="o">=</span><span class="n">key</span><span class="o">.</span><span class="n">upper</span><span class="p">())</span> |
| |
| <span class="k">def</span> <span class="nf">_get_env_var_option</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span> |
| <span class="c1"># must have format AIRFLOW__{SECTION}__{KEY} (note double underscore)</span> |
| <span class="n">env_var</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_env_var_name</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> |
| <span class="k">if</span> <span class="n">env_var</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span> |
| <span class="k">return</span> <span class="n">expand_env_var</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="n">env_var</span><span class="p">])</span> |
| <span class="c1"># alternatively AIRFLOW__{SECTION}__{KEY}_CMD (for a command)</span> |
| <span class="n">env_var_cmd</span> <span class="o">=</span> <span class="n">env_var</span> <span class="o">+</span> <span class="s1">'_CMD'</span> |
| <span class="k">if</span> <span class="n">env_var_cmd</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span> |
| <span class="c1"># if this is a valid command key...</span> |
| <span class="k">if</span> <span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">as_command_stdout</span><span class="p">:</span> |
| <span class="k">return</span> <span class="n">run_command</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="n">env_var_cmd</span><span class="p">])</span> |
| |
| <span class="k">def</span> <span class="nf">_get_cmd_option</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span> |
| <span class="n">fallback_key</span> <span class="o">=</span> <span class="n">key</span> <span class="o">+</span> <span class="s1">'_cmd'</span> |
| <span class="c1"># if this is a valid command key...</span> |
| <span class="k">if</span> <span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">as_command_stdout</span><span class="p">:</span> |
| <span class="k">if</span> <span class="nb">super</span><span class="p">(</span><span class="n">AirflowConfigParser</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span> \ |
| <span class="o">.</span><span class="n">has_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">fallback_key</span><span class="p">):</span> |
| <span class="n">command</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">AirflowConfigParser</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span> \ |
| <span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">fallback_key</span><span class="p">)</span> |
| <span class="k">return</span> <span class="n">run_command</span><span class="p">(</span><span class="n">command</span><span class="p">)</span> |
| |
| <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> |
| <span class="n">section</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">section</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> |
| <span class="n">key</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">key</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> |
| |
| <span class="n">deprecated_name</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">deprecated_options</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="p">{})</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> |
| |
| <span class="c1"># first check environment variables</span> |
| <span class="n">option</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_env_var_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> |
| <span class="k">if</span> <span class="n">option</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> |
| <span class="k">return</span> <span class="n">option</span> |
| <span class="k">if</span> <span class="n">deprecated_name</span><span class="p">:</span> |
| <span class="n">option</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_env_var_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">deprecated_name</span><span class="p">)</span> |
| <span class="k">if</span> <span class="n">option</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">_warn_deprecate</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">deprecated_name</span><span class="p">)</span> |
| <span class="k">return</span> <span class="n">option</span> |
| |
| <span class="c1"># ...then the config file</span> |
| <span class="k">if</span> <span class="nb">super</span><span class="p">(</span><span class="n">AirflowConfigParser</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">has_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span> |
| <span class="c1"># Use the parent's methods to get the actual config here to be able to</span> |
| <span class="c1"># separate the config from default config.</span> |
| <span class="k">return</span> <span class="n">expand_env_var</span><span class="p">(</span> |
| <span class="nb">super</span><span class="p">(</span><span class="n">AirflowConfigParser</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span> |
| <span class="k">if</span> <span class="n">deprecated_name</span><span class="p">:</span> |
| <span class="k">if</span> <span class="nb">super</span><span class="p">(</span><span class="n">AirflowConfigParser</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">has_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">deprecated_name</span><span class="p">):</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">_warn_deprecate</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">deprecated_name</span><span class="p">)</span> |
| <span class="k">return</span> <span class="n">expand_env_var</span><span class="p">(</span><span class="nb">super</span><span class="p">(</span><span class="n">AirflowConfigParser</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span> |
| <span class="n">section</span><span class="p">,</span> |
| <span class="n">deprecated_name</span><span class="p">,</span> |
| <span class="o">**</span><span class="n">kwargs</span> |
| <span class="p">))</span> |
| |
| <span class="c1"># ...then commands</span> |
| <span class="n">option</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_cmd_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> |
| <span class="k">if</span> <span class="n">option</span><span class="p">:</span> |
| <span class="k">return</span> <span class="n">option</span> |
| <span class="k">if</span> <span class="n">deprecated_name</span><span class="p">:</span> |
| <span class="n">option</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_cmd_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">deprecated_name</span><span class="p">)</span> |
| <span class="k">if</span> <span class="n">option</span><span class="p">:</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">_warn_deprecate</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">deprecated_name</span><span class="p">)</span> |
| <span class="k">return</span> <span class="n">option</span> |
| |
| <span class="c1"># ...then the default config</span> |
| <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">airflow_defaults</span><span class="o">.</span><span class="n">has_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">'fallback'</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span> |
| <span class="k">return</span> <span class="n">expand_env_var</span><span class="p">(</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">airflow_defaults</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span> |
| |
| <span class="k">else</span><span class="p">:</span> |
| <span class="n">log</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span> |
| <span class="s2">"section/key [</span><span class="si">%s</span><span class="s2">/</span><span class="si">%s</span><span class="s2">] not found in config"</span><span class="p">,</span> <span class="n">section</span><span class="p">,</span> <span class="n">key</span> |
| <span class="p">)</span> |
| |
| <span class="k">raise</span> <span class="n">AirflowConfigException</span><span class="p">(</span> |
| <span class="s2">"section/key [</span><span class="si">{section}</span><span class="s2">/</span><span class="si">{key}</span><span class="s2">] not found "</span> |
| <span class="s2">"in config"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">section</span><span class="o">=</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="n">key</span><span class="p">))</span> |
| |
| <span class="k">def</span> <span class="nf">getboolean</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> |
| <span class="n">val</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> |
| <span class="k">if</span> <span class="s1">'#'</span> <span class="ow">in</span> <span class="n">val</span><span class="p">:</span> |
| <span class="n">val</span> <span class="o">=</span> <span class="n">val</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'#'</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> |
| <span class="k">if</span> <span class="n">val</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'t'</span><span class="p">,</span> <span class="s1">'true'</span><span class="p">,</span> <span class="s1">'1'</span><span class="p">):</span> |
| <span class="k">return</span> <span class="kc">True</span> |
| <span class="k">elif</span> <span class="n">val</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'f'</span><span class="p">,</span> <span class="s1">'false'</span><span class="p">,</span> <span class="s1">'0'</span><span class="p">):</span> |
| <span class="k">return</span> <span class="kc">False</span> |
| <span class="k">else</span><span class="p">:</span> |
| <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span> |
| <span class="s1">'The value for configuration option "</span><span class="si">{}</span><span class="s1">:</span><span class="si">{}</span><span class="s1">" is not a '</span> |
| <span class="s1">'boolean (received "</span><span class="si">{}</span><span class="s1">").'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">))</span> |
| |
| <span class="k">def</span> <span class="nf">getint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> |
| <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span> |
| |
| <span class="k">def</span> <span class="nf">getfloat</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> |
| <span class="k">return</span> <span class="nb">float</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">))</span> |
| |
| <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filenames</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> |
| <span class="nb">super</span><span class="p">(</span><span class="n">AirflowConfigParser</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">filenames</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">_validate</span><span class="p">()</span> |
| |
| <span class="k">def</span> <span class="nf">read_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span> |
| <span class="nb">super</span><span class="p">(</span><span class="n">AirflowConfigParser</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">read_dict</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">_validate</span><span class="p">()</span> |
| |
| <span class="k">def</span> <span class="nf">has_option</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">section</span><span class="p">,</span> <span class="n">option</span><span class="p">):</span> |
| <span class="k">try</span><span class="p">:</span> |
| <span class="c1"># Using self.get() to avoid reimplementing the priority order</span> |
| <span class="c1"># of config variables (env, config, cmd, defaults)</span> |
| <span class="c1"># UNSET to avoid logging a warning about missing values</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">option</span><span class="p">,</span> <span class="n">fallback</span><span class="o">=</span><span class="n">_UNSET</span><span class="p">)</span> |
| <span class="k">return</span> <span class="kc">True</span> |
| <span class="k">except</span> <span class="p">(</span><span class="n">NoOptionError</span><span class="p">,</span> <span class="n">NoSectionError</span><span class="p">):</span> |
| <span class="k">return</span> <span class="kc">False</span> |
| |
| <span class="k">def</span> <span class="nf">remove_option</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">section</span><span class="p">,</span> <span class="n">option</span><span class="p">,</span> <span class="n">remove_default</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span> |
| <span class="sd">"""</span> |
| <span class="sd"> Remove an option if it exists in config from a file or</span> |
| <span class="sd"> default config. If both of config have the same option, this removes</span> |
| <span class="sd"> the option in both configs unless remove_default=False.</span> |
| <span class="sd"> """</span> |
| <span class="k">if</span> <span class="nb">super</span><span class="p">(</span><span class="n">AirflowConfigParser</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">has_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">option</span><span class="p">):</span> |
| <span class="nb">super</span><span class="p">(</span><span class="n">AirflowConfigParser</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">remove_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">option</span><span class="p">)</span> |
| |
| <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">airflow_defaults</span><span class="o">.</span><span class="n">has_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">option</span><span class="p">)</span> <span class="ow">and</span> <span class="n">remove_default</span><span class="p">:</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">airflow_defaults</span><span class="o">.</span><span class="n">remove_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">option</span><span class="p">)</span> |
| |
| <span class="k">def</span> <span class="nf">getsection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">section</span><span class="p">):</span> |
| <span class="sd">"""</span> |
| <span class="sd"> Returns the section as a dict. Values are converted to int, float, bool</span> |
| <span class="sd"> as required.</span> |
| |
| <span class="sd"> :param section: section from the config</span> |
| <span class="sd"> :rtype: dict</span> |
| <span class="sd"> """</span> |
| <span class="k">if</span> <span class="p">(</span><span class="n">section</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sections</span> <span class="ow">and</span> |
| <span class="n">section</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">airflow_defaults</span><span class="o">.</span><span class="n">_sections</span><span class="p">):</span> |
| <span class="k">return</span> <span class="kc">None</span> |
| |
| <span class="n">_section</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">airflow_defaults</span><span class="o">.</span><span class="n">_sections</span><span class="p">[</span><span class="n">section</span><span class="p">])</span> |
| |
| <span class="k">if</span> <span class="n">section</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sections</span><span class="p">:</span> |
| <span class="n">_section</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sections</span><span class="p">[</span><span class="n">section</span><span class="p">]))</span> |
| |
| <span class="n">section_prefix</span> <span class="o">=</span> <span class="s1">'AIRFLOW__</span><span class="si">{S}</span><span class="s1">__'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">S</span><span class="o">=</span><span class="n">section</span><span class="o">.</span><span class="n">upper</span><span class="p">())</span> |
| <span class="k">for</span> <span class="n">env_var</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span> |
| <span class="k">if</span> <span class="n">env_var</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">section_prefix</span><span class="p">):</span> |
| <span class="n">key</span> <span class="o">=</span> <span class="n">env_var</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">section_prefix</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> |
| <span class="n">_section</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_env_var_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> |
| |
| <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">val</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="n">_section</span><span class="p">):</span> |
| <span class="k">try</span><span class="p">:</span> |
| <span class="n">val</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> |
| <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> |
| <span class="k">try</span><span class="p">:</span> |
| <span class="n">val</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> |
| <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> |
| <span class="k">if</span> <span class="n">val</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'t'</span><span class="p">,</span> <span class="s1">'true'</span><span class="p">):</span> |
| <span class="n">val</span> <span class="o">=</span> <span class="kc">True</span> |
| <span class="k">elif</span> <span class="n">val</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'f'</span><span class="p">,</span> <span class="s1">'false'</span><span class="p">):</span> |
| <span class="n">val</span> <span class="o">=</span> <span class="kc">False</span> |
| <span class="n">_section</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span> |
| <span class="k">return</span> <span class="n">_section</span> |
| |
| <span class="k">def</span> <span class="nf">as_dict</span><span class="p">(</span> |
| <span class="bp">self</span><span class="p">,</span> <span class="n">display_source</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">display_sensitive</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">raw</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> |
| <span class="n">include_env</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">include_cmds</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span> |
| <span class="sd">"""</span> |
| <span class="sd"> Returns the current configuration as an OrderedDict of OrderedDicts.</span> |
| |
| <span class="sd"> :param display_source: If False, the option value is returned. If True,</span> |
| <span class="sd"> a tuple of (option_value, source) is returned. Source is either</span> |
| <span class="sd"> 'airflow.cfg', 'default', 'env var', or 'cmd'.</span> |
| <span class="sd"> :type display_source: bool</span> |
| <span class="sd"> :param display_sensitive: If True, the values of options set by env</span> |
| <span class="sd"> vars and bash commands will be displayed. If False, those options</span> |
| <span class="sd"> are shown as '< hidden >'</span> |
| <span class="sd"> :type display_sensitive: bool</span> |
| <span class="sd"> :param raw: Should the values be output as interpolated values, or the</span> |
| <span class="sd"> "raw" form that can be fed back in to ConfigParser</span> |
| <span class="sd"> :type raw: bool</span> |
| <span class="sd"> :param include_env: Should the value of configuration from AIRFLOW__</span> |
| <span class="sd"> environment variables be included or not</span> |
| <span class="sd"> :type include_env: bool</span> |
| <span class="sd"> :param include_cmds: Should the result of calling any *_cmd config be</span> |
| <span class="sd"> set (True, default), or should the _cmd options be left as the</span> |
| <span class="sd"> command to run (False)</span> |
| <span class="sd"> :type include_cmds: bool</span> |
| <span class="sd"> """</span> |
| <span class="n">cfg</span> <span class="o">=</span> <span class="p">{}</span> |
| <span class="n">configs</span> <span class="o">=</span> <span class="p">[</span> |
| <span class="p">(</span><span class="s1">'default'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">airflow_defaults</span><span class="p">),</span> |
| <span class="p">(</span><span class="s1">'airflow.cfg'</span><span class="p">,</span> <span class="bp">self</span><span class="p">),</span> |
| <span class="p">]</span> |
| |
| <span class="k">for</span> <span class="p">(</span><span class="n">source_name</span><span class="p">,</span> <span class="n">config</span><span class="p">)</span> <span class="ow">in</span> <span class="n">configs</span><span class="p">:</span> |
| <span class="k">for</span> <span class="n">section</span> <span class="ow">in</span> <span class="n">config</span><span class="o">.</span><span class="n">sections</span><span class="p">():</span> |
| <span class="n">sect</span> <span class="o">=</span> <span class="n">cfg</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">OrderedDict</span><span class="p">())</span> |
| <span class="k">for</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span> <span class="ow">in</span> <span class="n">config</span><span class="o">.</span><span class="n">items</span><span class="p">(</span><span class="n">section</span><span class="o">=</span><span class="n">section</span><span class="p">,</span> <span class="n">raw</span><span class="o">=</span><span class="n">raw</span><span class="p">):</span> |
| <span class="k">if</span> <span class="n">display_source</span><span class="p">:</span> |
| <span class="n">val</span> <span class="o">=</span> <span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">source_name</span><span class="p">)</span> |
| <span class="n">sect</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span> |
| |
| <span class="c1"># add env vars and overwrite because they have priority</span> |
| <span class="k">if</span> <span class="n">include_env</span><span class="p">:</span> |
| <span class="k">for</span> <span class="n">ev</span> <span class="ow">in</span> <span class="p">[</span><span class="n">ev</span> <span class="k">for</span> <span class="n">ev</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span> <span class="k">if</span> <span class="n">ev</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">'AIRFLOW__'</span><span class="p">)]:</span> |
| <span class="k">try</span><span class="p">:</span> |
| <span class="n">_</span><span class="p">,</span> <span class="n">section</span><span class="p">,</span> <span class="n">key</span> <span class="o">=</span> <span class="n">ev</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'__'</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> |
| <span class="n">opt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_env_var_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> |
| <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> |
| <span class="k">continue</span> |
| <span class="k">if</span> <span class="ow">not</span> <span class="n">display_sensitive</span> <span class="ow">and</span> <span class="n">ev</span> <span class="o">!=</span> <span class="s1">'AIRFLOW__CORE__UNIT_TEST_MODE'</span><span class="p">:</span> |
| <span class="n">opt</span> <span class="o">=</span> <span class="s1">'< hidden >'</span> |
| <span class="k">elif</span> <span class="n">raw</span><span class="p">:</span> |
| <span class="n">opt</span> <span class="o">=</span> <span class="n">opt</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">'%'</span><span class="p">,</span> <span class="s1">'</span><span class="si">%%</span><span class="s1">'</span><span class="p">)</span> |
| <span class="k">if</span> <span class="n">display_source</span><span class="p">:</span> |
| <span class="n">opt</span> <span class="o">=</span> <span class="p">(</span><span class="n">opt</span><span class="p">,</span> <span class="s1">'env var'</span><span class="p">)</span> |
| |
| <span class="n">section</span> <span class="o">=</span> <span class="n">section</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> |
| <span class="c1"># if we lower key for kubernetes_environment_variables section,</span> |
| <span class="c1"># then we won't be able to set any Airflow environment</span> |
| <span class="c1"># variables. Airflow only parse environment variables starts</span> |
| <span class="c1"># with AIRFLOW_. Therefore, we need to make it a special case.</span> |
| <span class="k">if</span> <span class="n">section</span> <span class="o">!=</span> <span class="s1">'kubernetes_environment_variables'</span><span class="p">:</span> |
| <span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> |
| <span class="n">cfg</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">OrderedDict</span><span class="p">())</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="n">key</span><span class="p">:</span> <span class="n">opt</span><span class="p">})</span> |
| |
| <span class="c1"># add bash commands</span> |
| <span class="k">if</span> <span class="n">include_cmds</span><span class="p">:</span> |
| <span class="k">for</span> <span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">as_command_stdout</span><span class="p">:</span> |
| <span class="n">opt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_cmd_option</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span> |
| <span class="k">if</span> <span class="n">opt</span><span class="p">:</span> |
| <span class="k">if</span> <span class="ow">not</span> <span class="n">display_sensitive</span><span class="p">:</span> |
| <span class="n">opt</span> <span class="o">=</span> <span class="s1">'< hidden >'</span> |
| <span class="k">if</span> <span class="n">display_source</span><span class="p">:</span> |
| <span class="n">opt</span> <span class="o">=</span> <span class="p">(</span><span class="n">opt</span><span class="p">,</span> <span class="s1">'cmd'</span><span class="p">)</span> |
| <span class="k">elif</span> <span class="n">raw</span><span class="p">:</span> |
| <span class="n">opt</span> <span class="o">=</span> <span class="n">opt</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">'%'</span><span class="p">,</span> <span class="s1">'</span><span class="si">%%</span><span class="s1">'</span><span class="p">)</span> |
| <span class="n">cfg</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">OrderedDict</span><span class="p">())</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="n">key</span><span class="p">:</span> <span class="n">opt</span><span class="p">})</span> |
| <span class="k">del</span> <span class="n">cfg</span><span class="p">[</span><span class="n">section</span><span class="p">][</span><span class="n">key</span> <span class="o">+</span> <span class="s1">'_cmd'</span><span class="p">]</span> |
| |
| <span class="k">return</span> <span class="n">cfg</span> |
| |
| <span class="k">def</span> <span class="nf">load_test_config</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> |
| <span class="sd">"""</span> |
| <span class="sd"> Load the unit test configuration.</span> |
| |
| <span class="sd"> Note: this is not reversible.</span> |
| <span class="sd"> """</span> |
| <span class="c1"># override any custom settings with defaults</span> |
| <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Overriding settings with defaults from </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">DEFAULT_CONFIG_FILE_PATH</span><span class="p">)</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">read_string</span><span class="p">(</span><span class="n">parameterized_config</span><span class="p">(</span><span class="n">DEFAULT_CONFIG</span><span class="p">))</span> |
| <span class="c1"># then read test config</span> |
| <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Reading default test configuration from </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">TEST_CONFIG_FILE_PATH</span><span class="p">)</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">read_string</span><span class="p">(</span><span class="n">parameterized_config</span><span class="p">(</span><span class="n">TEST_CONFIG</span><span class="p">))</span> |
| <span class="c1"># then read any "custom" test settings</span> |
| <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Reading test configuration from </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">TEST_CONFIG_FILE</span><span class="p">)</span> |
| <span class="bp">self</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">TEST_CONFIG_FILE</span><span class="p">)</span> |
| |
| <span class="k">def</span> <span class="nf">_warn_deprecate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">section</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">deprecated_name</span><span class="p">):</span> |
| <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span> |
| <span class="s1">'The </span><span class="si">{old}</span><span class="s1"> option in [</span><span class="si">{section}</span><span class="s1">] has been renamed to </span><span class="si">{new}</span><span class="s1"> - the old '</span> |
| <span class="s1">'setting has been used, but please update your config.'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span> |
| <span class="n">old</span><span class="o">=</span><span class="n">deprecated_name</span><span class="p">,</span> |
| <span class="n">new</span><span class="o">=</span><span class="n">key</span><span class="p">,</span> |
| <span class="n">section</span><span class="o">=</span><span class="n">section</span><span class="p">,</span> |
| <span class="p">),</span> |
| <span class="ne">DeprecationWarning</span><span class="p">,</span> |
| <span class="n">stacklevel</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> |
| <span class="p">)</span> |
| |
| |
| <span class="k">def</span> <span class="nf">mkdir_p</span><span class="p">(</span><span class="n">path</span><span class="p">):</span> |
| <span class="k">try</span><span class="p">:</span> |
| <span class="n">os</span><span class="o">.</span><span class="n">makedirs</span><span class="p">(</span><span class="n">path</span><span class="p">)</span> |
| <span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">exc</span><span class="p">:</span> <span class="c1"># Python >2.5</span> |
| <span class="k">if</span> <span class="n">exc</span><span class="o">.</span><span class="n">errno</span> <span class="o">==</span> <span class="n">errno</span><span class="o">.</span><span class="n">EEXIST</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">path</span><span class="p">):</span> |
| <span class="k">pass</span> |
| <span class="k">else</span><span class="p">:</span> |
| <span class="k">raise</span> <span class="n">AirflowConfigException</span><span class="p">(</span> |
| <span class="s1">'Error creating </span><span class="si">{}</span><span class="s1">: </span><span class="si">{}</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="n">exc</span><span class="o">.</span><span class="n">strerror</span><span class="p">))</span> |
| |
| |
| <span class="k">def</span> <span class="nf">get_airflow_home</span><span class="p">():</span> |
| <span class="k">return</span> <span class="n">expand_env_var</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'AIRFLOW_HOME'</span><span class="p">,</span> <span class="s1">'~/airflow'</span><span class="p">))</span> |
| |
| |
| <span class="k">def</span> <span class="nf">get_airflow_config</span><span class="p">(</span><span class="n">airflow_home</span><span class="p">):</span> |
| <span class="k">if</span> <span class="s1">'AIRFLOW_CONFIG'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span> |
| <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">airflow_home</span><span class="p">,</span> <span class="s1">'airflow.cfg'</span><span class="p">)</span> |
| <span class="k">return</span> <span class="n">expand_env_var</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">'AIRFLOW_CONFIG'</span><span class="p">])</span> |
| |
| |
| <span class="c1"># Setting AIRFLOW_HOME and AIRFLOW_CONFIG from environment variables, using</span> |
| <span class="c1"># "~/airflow" and "$AIRFLOW_HOME/airflow.cfg" respectively as defaults.</span> |
| |
| <span class="n">AIRFLOW_HOME</span> <span class="o">=</span> <span class="n">get_airflow_home</span><span class="p">()</span> |
| <span class="n">AIRFLOW_CONFIG</span> <span class="o">=</span> <span class="n">get_airflow_config</span><span class="p">(</span><span class="n">AIRFLOW_HOME</span><span class="p">)</span> |
| <span class="n">mkdir_p</span><span class="p">(</span><span class="n">AIRFLOW_HOME</span><span class="p">)</span> |
| |
| |
| <span class="c1"># Set up dags folder for unit tests</span> |
| <span class="c1"># this directory won't exist if users install via pip</span> |
| <span class="n">_TEST_DAGS_FOLDER</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span> |
| <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">realpath</span><span class="p">(</span><span class="vm">__file__</span><span class="p">))),</span> |
| <span class="s1">'tests'</span><span class="p">,</span> |
| <span class="s1">'dags'</span><span class="p">)</span> |
| <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">_TEST_DAGS_FOLDER</span><span class="p">):</span> |
| <span class="n">TEST_DAGS_FOLDER</span> <span class="o">=</span> <span class="n">_TEST_DAGS_FOLDER</span> |
| <span class="k">else</span><span class="p">:</span> |
| <span class="n">TEST_DAGS_FOLDER</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">AIRFLOW_HOME</span><span class="p">,</span> <span class="s1">'dags'</span><span class="p">)</span> |
| |
| <span class="c1"># Set up plugins folder for unit tests</span> |
| <span class="n">_TEST_PLUGINS_FOLDER</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span> |
| <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">realpath</span><span class="p">(</span><span class="vm">__file__</span><span class="p">))),</span> |
| <span class="s1">'tests'</span><span class="p">,</span> |
| <span class="s1">'plugins'</span><span class="p">)</span> |
| <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">_TEST_PLUGINS_FOLDER</span><span class="p">):</span> |
| <span class="n">TEST_PLUGINS_FOLDER</span> <span class="o">=</span> <span class="n">_TEST_PLUGINS_FOLDER</span> |
| <span class="k">else</span><span class="p">:</span> |
| <span class="n">TEST_PLUGINS_FOLDER</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">AIRFLOW_HOME</span><span class="p">,</span> <span class="s1">'plugins'</span><span class="p">)</span> |
| |
| |
| <span class="k">def</span> <span class="nf">parameterized_config</span><span class="p">(</span><span class="n">template</span><span class="p">):</span> |
| <span class="sd">"""</span> |
| <span class="sd"> Generates a configuration from the provided template + variables defined in</span> |
| <span class="sd"> current scope</span> |
| |
| <span class="sd"> :param template: a config content templated with {{variables}}</span> |
| <span class="sd"> """</span> |
| <span class="n">all_vars</span> <span class="o">=</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">v</span> <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="p">[</span><span class="nb">globals</span><span class="p">(),</span> <span class="nb">locals</span><span class="p">()]</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">d</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span> |
| <span class="k">return</span> <span class="n">template</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="o">**</span><span class="n">all_vars</span><span class="p">)</span> |
| |
| |
| <span class="k">def</span> <span class="nf">get_airflow_test_config</span><span class="p">(</span><span class="n">airflow_home</span><span class="p">):</span> |
| <span class="k">if</span> <span class="s1">'AIRFLOW_TEST_CONFIG'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span> |
| <span class="k">return</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">airflow_home</span><span class="p">,</span> <span class="s1">'unittests.cfg'</span><span class="p">)</span> |
| <span class="k">return</span> <span class="n">expand_env_var</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">'AIRFLOW_TEST_CONFIG'</span><span class="p">])</span> |
| |
| |
| <span class="n">TEST_CONFIG_FILE</span> <span class="o">=</span> <span class="n">get_airflow_test_config</span><span class="p">(</span><span class="n">AIRFLOW_HOME</span><span class="p">)</span> |
| |
| <span class="c1"># only generate a Fernet key if we need to create a new config file</span> |
| <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">TEST_CONFIG_FILE</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">AIRFLOW_CONFIG</span><span class="p">):</span> |
| <span class="n">FERNET_KEY</span> <span class="o">=</span> <span class="n">generate_fernet_key</span><span class="p">()</span> |
| <span class="k">else</span><span class="p">:</span> |
| <span class="n">FERNET_KEY</span> <span class="o">=</span> <span class="s1">''</span> |
| |
| <span class="n">TEMPLATE_START</span> <span class="o">=</span> <span class="p">(</span> |
| <span class="s1">'# ----------------------- TEMPLATE BEGINS HERE -----------------------'</span><span class="p">)</span> |
| <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">TEST_CONFIG_FILE</span><span class="p">):</span> |
| <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span> |
| <span class="s1">'Creating new Airflow config file for unit tests in: </span><span class="si">%s</span><span class="s1">'</span><span class="p">,</span> <span class="n">TEST_CONFIG_FILE</span> |
| <span class="p">)</span> |
| <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">TEST_CONFIG_FILE</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> |
| <span class="n">cfg</span> <span class="o">=</span> <span class="n">parameterized_config</span><span class="p">(</span><span class="n">TEST_CONFIG</span><span class="p">)</span> |
| <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">cfg</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">TEMPLATE_START</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">())</span> |
| <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">AIRFLOW_CONFIG</span><span class="p">):</span> |
| <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span> |
| <span class="s1">'Creating new Airflow config file in: </span><span class="si">%s</span><span class="s1">'</span><span class="p">,</span> |
| <span class="n">AIRFLOW_CONFIG</span> |
| <span class="p">)</span> |
| <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">AIRFLOW_CONFIG</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> |
| <span class="n">cfg</span> <span class="o">=</span> <span class="n">parameterized_config</span><span class="p">(</span><span class="n">DEFAULT_CONFIG</span><span class="p">)</span> |
| <span class="n">cfg</span> <span class="o">=</span> <span class="n">cfg</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">TEMPLATE_START</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> |
| <span class="k">if</span> <span class="n">six</span><span class="o">.</span><span class="n">PY2</span><span class="p">:</span> |
| <span class="n">cfg</span> <span class="o">=</span> <span class="n">cfg</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">'utf8'</span><span class="p">)</span> |
| <span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">cfg</span><span class="p">)</span> |
| |
| <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">"Reading the config from </span><span class="si">%s</span><span class="s2">"</span><span class="p">,</span> <span class="n">AIRFLOW_CONFIG</span><span class="p">)</span> |
| |
| <div class="viewcode-block" id="conf"><a class="viewcode-back" href="../../_api/airflow/executors/index.html#airflow.executors.conf">[docs]</a><span class="n">conf</span> <span class="o">=</span> <span class="n">AirflowConfigParser</span><span class="p">(</span><span class="n">default_config</span><span class="o">=</span><span class="n">parameterized_config</span><span class="p">(</span><span class="n">DEFAULT_CONFIG</span><span class="p">))</span></div> |
| |
| <span class="n">conf</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">AIRFLOW_CONFIG</span><span class="p">)</span> |
| |
| <span class="k">if</span> <span class="n">conf</span><span class="o">.</span><span class="n">has_option</span><span class="p">(</span><span class="s1">'core'</span><span class="p">,</span> <span class="s1">'AIRFLOW_HOME'</span><span class="p">):</span> |
| <span class="n">msg</span> <span class="o">=</span> <span class="p">(</span> |
| <span class="s1">'Specifying both AIRFLOW_HOME environment variable and airflow_home '</span> |
| <span class="s1">'in the config file is deprecated. Please use only the AIRFLOW_HOME '</span> |
| <span class="s1">'environment variable and remove the config file entry.'</span> |
| <span class="p">)</span> |
| <span class="k">if</span> <span class="s1">'AIRFLOW_HOME'</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">:</span> |
| <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="ne">DeprecationWarning</span><span class="p">)</span> |
| <span class="k">elif</span> <span class="n">conf</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'core'</span><span class="p">,</span> <span class="s1">'airflow_home'</span><span class="p">)</span> <span class="o">==</span> <span class="n">AIRFLOW_HOME</span><span class="p">:</span> |
| <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span> |
| <span class="s1">'Specifying airflow_home in the config file is deprecated. As you '</span> |
| <span class="s1">'have left it at the default value you should remove the setting '</span> |
| <span class="s1">'from your airflow.cfg and suffer no change in behaviour.'</span><span class="p">,</span> |
| <span class="n">category</span><span class="o">=</span><span class="ne">DeprecationWarning</span><span class="p">,</span> |
| <span class="p">)</span> |
| <span class="k">else</span><span class="p">:</span> |
| <span class="n">AIRFLOW_HOME</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'core'</span><span class="p">,</span> <span class="s1">'airflow_home'</span><span class="p">)</span> |
| <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">category</span><span class="o">=</span><span class="ne">DeprecationWarning</span><span class="p">)</span> |
| |
| <span class="c1"># Warn about old config file. We used to read ~/airflow/airflow.cfg even if</span> |
| <span class="c1"># that AIRFLOW_HOME was set to something else</span> |
| <span class="n">_old_config_file</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s2">"~/airflow/airflow.cfg"</span><span class="p">)</span> |
| <span class="k">if</span> <span class="n">_old_config_file</span> <span class="o">!=</span> <span class="n">AIRFLOW_CONFIG</span> <span class="ow">and</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">_old_config_file</span><span class="p">):</span> |
| <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span> |
| <span class="s1">'You have two airflow.cfg files: </span><span class="si">{old}</span><span class="s1"> and </span><span class="si">{new}</span><span class="s1">. Airflow used to look '</span> |
| <span class="s1">'at ~/airflow/airflow.cfg, even when AIRFLOW_HOME was set to a different '</span> |
| <span class="s1">'value. Airflow will now only read </span><span class="si">{new}</span><span class="s1">, and you should remove the '</span> |
| <span class="s1">'other file'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">old</span><span class="o">=</span><span class="n">_old_config_file</span><span class="p">,</span> <span class="n">new</span><span class="o">=</span><span class="n">AIRFLOW_CONFIG</span><span class="p">),</span> |
| <span class="n">category</span><span class="o">=</span><span class="ne">DeprecationWarning</span><span class="p">,</span> |
| <span class="p">)</span> |
| |
| |
| <span class="n">WEBSERVER_CONFIG</span> <span class="o">=</span> <span class="n">AIRFLOW_HOME</span> <span class="o">+</span> <span class="s1">'/webserver_config.py'</span> |
| |
| <span class="k">if</span> <span class="n">conf</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s1">'webserver'</span><span class="p">,</span> <span class="s1">'rbac'</span><span class="p">):</span> |
| <span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isfile</span><span class="p">(</span><span class="n">WEBSERVER_CONFIG</span><span class="p">):</span> |
| <span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">'Creating new FAB webserver config file in: </span><span class="si">%s</span><span class="s1">'</span><span class="p">,</span> <span class="n">WEBSERVER_CONFIG</span><span class="p">)</span> |
| <span class="n">DEFAULT_WEBSERVER_CONFIG</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">_read_default_config_file</span><span class="p">(</span><span class="s1">'default_webserver_config.py'</span><span class="p">)</span> |
| <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">WEBSERVER_CONFIG</span><span class="p">,</span> <span class="s1">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">file</span><span class="p">:</span> |
| <span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">DEFAULT_WEBSERVER_CONFIG</span><span class="p">)</span> |
| |
| <span class="k">if</span> <span class="n">conf</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s1">'core'</span><span class="p">,</span> <span class="s1">'unit_test_mode'</span><span class="p">):</span> |
| <span class="n">conf</span><span class="o">.</span><span class="n">load_test_config</span><span class="p">()</span> |
| |
| <span class="c1"># Historical convenience functions to access config entries</span> |
| |
| <span class="n">load_test_config</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">load_test_config</span> |
| <span class="n">get</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">get</span> |
| <span class="n">getboolean</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">getboolean</span> |
| <span class="n">getfloat</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">getfloat</span> |
| <span class="n">getint</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">getint</span> |
| <span class="n">getsection</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">getsection</span> |
| <span class="n">has_option</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">has_option</span> |
| <span class="n">remove_option</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">remove_option</span> |
| <span class="n">as_dict</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">as_dict</span> |
| <span class="nb">set</span> <span class="o">=</span> <span class="n">conf</span><span class="o">.</span><span class="n">set</span> <span class="c1"># noqa</span> |
| |
| <span class="k">for</span> <span class="n">func</span> <span class="ow">in</span> <span class="p">[</span><span class="n">load_test_config</span><span class="p">,</span> <span class="n">get</span><span class="p">,</span> <span class="n">getboolean</span><span class="p">,</span> <span class="n">getfloat</span><span class="p">,</span> <span class="n">getint</span><span class="p">,</span> <span class="n">has_option</span><span class="p">,</span> |
| <span class="n">remove_option</span><span class="p">,</span> <span class="n">as_dict</span><span class="p">,</span> <span class="nb">set</span><span class="p">]:</span> |
| <span class="n">deprecated</span><span class="p">(</span> |
| <span class="n">func</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> |
| <span class="s2">"Accessing configuration method '</span><span class="si">{f.__name__}</span><span class="s2">' directly from "</span> |
| <span class="s2">"the configuration module is deprecated. Please access the "</span> |
| <span class="s2">"configuration from the 'configuration.conf' object via "</span> |
| <span class="s2">"'conf.</span><span class="si">{f.__name__}</span><span class="s2">'"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">f</span><span class="o">=</span><span class="n">func</span><span class="p">))</span> |
| </pre></div> |
| |
| </div> |
| |
| </div> |
| |
| |
| <footer> |
| |
| |
| <hr/> |
| |
| <div role="contentinfo"> |
| <p> |
| |
| </p> |
| </div> |
| Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. |
| <div class="footer">This page uses <a href="https://analytics.google.com/"> |
| Google Analytics</a> to collect statistics. You can disable it by blocking |
| the JavaScript coming from www.google-analytics.com. Check our |
| <a href="../../privacy_notice.html">Privacy Policy</a> |
| for more details. |
| </div> |
| |
| |
| </footer> |
| |
| </div> |
| </div> |
| |
| </section> |
| |
| </div> |
| |
| |
| |
| <script type="text/javascript"> |
| jQuery(function () { |
| SphinxRtdTheme.Navigation.enable(true); |
| }); |
| </script> |
| |
| |
| |
| |
| <!-- Theme Analytics --> |
| <script> |
| (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ |
| (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), |
| m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) |
| })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); |
| |
| ga('create', 'UA-140539454-1', 'auto'); |
| ga('send', 'pageview'); |
| </script> |
| |
| |
| |
| |
| </body> |
| </html> |