blob: 9263006b5194e9e7eeb18f87a17eb36c68a99174 [file] [log] [blame]
<!--
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 &mdash; 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 &amp; 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> &raquo;</li>
<li><a href="../index.html">Module code</a> &raquo;</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"># &quot;License&quot;); 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"># &quot;AS IS&quot; 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&#39;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">&#39;default&#39;</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">&#39;airflow&#39;</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">&#39;default&#39;</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">&#39;airflow&#39;</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">&#39;&#39;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</span>
<span class="sd"> Runs command and returns stdout</span>
<span class="sd"> &quot;&quot;&quot;</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">&#39;ignore&#39;</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">&quot;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">&quot;</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">&#39;config_templates&#39;</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">&#39;utf-8&#39;</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">&#39;utf-8&#39;</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">&#39;default_airflow.cfg&#39;</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">&#39;default_test.cfg&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">default_config_yaml</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Read Airflow configs from YAML file</span>
<span class="sd"> :return: Python dictionary containing configs &amp; their info</span>
<span class="sd"> &quot;&quot;&quot;</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">&#39;config_templates&#39;</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">&quot;config.yml&quot;</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 &quot;{section}__{name}__cmd&quot; 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">&#39;core&#39;</span><span class="p">,</span> <span class="s1">&#39;sql_alchemy_conn&#39;</span><span class="p">),</span>
<span class="p">(</span><span class="s1">&#39;core&#39;</span><span class="p">,</span> <span class="s1">&#39;fernet_key&#39;</span><span class="p">),</span>
<span class="p">(</span><span class="s1">&#39;celery&#39;</span><span class="p">,</span> <span class="s1">&#39;broker_url&#39;</span><span class="p">),</span>
<span class="p">(</span><span class="s1">&#39;celery&#39;</span><span class="p">,</span> <span class="s1">&#39;flower_basic_auth&#39;</span><span class="p">),</span>
<span class="p">(</span><span class="s1">&#39;celery&#39;</span><span class="p">,</span> <span class="s1">&#39;result_backend&#39;</span><span class="p">),</span>
<span class="c1"># Todo: remove this in Airflow 1.11</span>
<span class="p">(</span><span class="s1">&#39;celery&#39;</span><span class="p">,</span> <span class="s1">&#39;celery_result_backend&#39;</span><span class="p">),</span>
<span class="p">(</span><span class="s1">&#39;atlas&#39;</span><span class="p">,</span> <span class="s1">&#39;password&#39;</span><span class="p">),</span>
<span class="p">(</span><span class="s1">&#39;smtp&#39;</span><span class="p">,</span> <span class="s1">&#39;smtp_password&#39;</span><span class="p">),</span>
<span class="p">(</span><span class="s1">&#39;ldap&#39;</span><span class="p">,</span> <span class="s1">&#39;bind_password&#39;</span><span class="p">),</span>
<span class="p">(</span><span class="s1">&#39;kubernetes&#39;</span><span class="p">,</span> <span class="s1">&#39;git_password&#39;</span><span class="p">),</span>
<span class="p">}</span>
<span class="c1"># A two-level mapping of (section -&gt; new_name -&gt; 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">&#39;celery&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="c1"># Remove these keys in Airflow 1.11</span>
<span class="s1">&#39;worker_concurrency&#39;</span><span class="p">:</span> <span class="s1">&#39;celeryd_concurrency&#39;</span><span class="p">,</span>
<span class="s1">&#39;result_backend&#39;</span><span class="p">:</span> <span class="s1">&#39;celery_result_backend&#39;</span><span class="p">,</span>
<span class="s1">&#39;broker_url&#39;</span><span class="p">:</span> <span class="s1">&#39;celery_broker_url&#39;</span><span class="p">,</span>
<span class="s1">&#39;ssl_active&#39;</span><span class="p">:</span> <span class="s1">&#39;celery_ssl_active&#39;</span><span class="p">,</span>
<span class="s1">&#39;ssl_cert&#39;</span><span class="p">:</span> <span class="s1">&#39;celery_ssl_cert&#39;</span><span class="p">,</span>
<span class="s1">&#39;ssl_key&#39;</span><span class="p">:</span> <span class="s1">&#39;celery_ssl_key&#39;</span><span class="p">,</span>
<span class="p">},</span>
<span class="s1">&#39;elasticsearch&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;host&#39;</span><span class="p">:</span> <span class="s1">&#39;elasticsearch_host&#39;</span><span class="p">,</span>
<span class="s1">&#39;log_id_template&#39;</span><span class="p">:</span> <span class="s1">&#39;elasticsearch_log_id_template&#39;</span><span class="p">,</span>
<span class="s1">&#39;end_of_log_mark&#39;</span><span class="p">:</span> <span class="s1">&#39;elasticsearch_end_of_log_mark&#39;</span><span class="p">,</span>
<span class="s1">&#39;frontend&#39;</span><span class="p">:</span> <span class="s1">&#39;elasticsearch_frontend&#39;</span><span class="p">,</span>
<span class="s1">&#39;write_stdout&#39;</span><span class="p">:</span> <span class="s1">&#39;elasticsearch_write_stdout&#39;</span><span class="p">,</span>
<span class="s1">&#39;json_format&#39;</span><span class="p">:</span> <span class="s1">&#39;elasticsearch_json_format&#39;</span><span class="p">,</span>
<span class="s1">&#39;json_fields&#39;</span><span class="p">:</span> <span class="s1">&#39;elasticsearch_json_fields&#39;</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 -&gt; setting -&gt; { old, replace, by_version }</span>
<span class="n">deprecated_values</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">&#39;core&#39;</span><span class="p">:</span> <span class="p">{</span>
<span class="s1">&#39;task_runner&#39;</span><span class="p">:</span> <span class="p">(</span><span class="s1">&#39;BashTaskRunner&#39;</span><span class="p">,</span> <span class="s1">&#39;StandardTaskRunner&#39;</span><span class="p">,</span> <span class="s1">&#39;2.0&#39;</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">&quot;core&quot;</span><span class="p">,</span> <span class="s2">&quot;executor&quot;</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;DebugExecutor&#39;</span><span class="p">,</span> <span class="s1">&#39;SequentialExecutor&#39;</span><span class="p">)</span> <span class="ow">and</span>
<span class="s2">&quot;sqlite&quot;</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">&#39;core&#39;</span><span class="p">,</span> <span class="s1">&#39;sql_alchemy_conn&#39;</span><span class="p">)):</span>
<span class="k">raise</span> <span class="n">AirflowConfigException</span><span class="p">(</span>
<span class="s2">&quot;error: cannot use sqlite with the </span><span class="si">{}</span><span class="s2">&quot;</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">&#39;core&#39;</span><span class="p">,</span> <span class="s1">&#39;executor&#39;</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">&quot;webserver&quot;</span><span class="p">,</span> <span class="s2">&quot;authenticate&quot;</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">&quot;webserver&quot;</span><span class="p">,</span> <span class="s2">&quot;owner_mode&quot;</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;user&#39;</span><span class="p">,</span> <span class="s1">&#39;ldapgroup&#39;</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">&quot;error: owner_mode option should be either &quot;</span>
<span class="s2">&quot;&#39;user&#39; or &#39;ldapgroup&#39; when filtering by owner is set&quot;</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">&quot;webserver&quot;</span><span class="p">,</span> <span class="s2">&quot;authenticate&quot;</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">&quot;webserver&quot;</span><span class="p">,</span> <span class="s2">&quot;owner_mode&quot;</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">&#39;ldapgroup&#39;</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">&quot;webserver&quot;</span><span class="p">,</span> <span class="s2">&quot;auth_backend&quot;</span><span class="p">)</span> <span class="o">!=</span> <span class="p">(</span>
<span class="s1">&#39;airflow.contrib.auth.backends.ldap_auth&#39;</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">&quot;error: attempt at using ldapgroup &quot;</span>
<span class="s2">&quot;filtering without using the Ldap backend&quot;</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">&#39;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 &#39;</span>
<span class="s1">&#39;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 &#39;</span>
<span class="s1">&#39;running config, but please update your config before Apache &#39;</span>
<span class="s1">&#39;Airflow </span><span class="si">{version}</span><span class="s1">.&#39;</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">&#39;AIRFLOW__</span><span class="si">{S}</span><span class="s1">__</span><span class="si">{K}</span><span class="s1">&#39;</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">&#39;_CMD&#39;</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">&#39;_cmd&#39;</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&#39;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">&#39;fallback&#39;</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">&quot;section/key [</span><span class="si">%s</span><span class="s2">/</span><span class="si">%s</span><span class="s2">] not found in config&quot;</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">&quot;section/key [</span><span class="si">{section}</span><span class="s2">/</span><span class="si">{key}</span><span class="s2">] not found &quot;</span>
<span class="s2">&quot;in config&quot;</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">&#39;#&#39;</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">&#39;#&#39;</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">&#39;t&#39;</span><span class="p">,</span> <span class="s1">&#39;true&#39;</span><span class="p">,</span> <span class="s1">&#39;1&#39;</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">&#39;f&#39;</span><span class="p">,</span> <span class="s1">&#39;false&#39;</span><span class="p">,</span> <span class="s1">&#39;0&#39;</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">&#39;The value for configuration option &quot;</span><span class="si">{}</span><span class="s1">:</span><span class="si">{}</span><span class="s1">&quot; is not a &#39;</span>
<span class="s1">&#39;boolean (received &quot;</span><span class="si">{}</span><span class="s1">&quot;).&#39;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;AIRFLOW__</span><span class="si">{S}</span><span class="s1">__&#39;</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">&#39;&#39;</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">&#39;t&#39;</span><span class="p">,</span> <span class="s1">&#39;true&#39;</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">&#39;f&#39;</span><span class="p">,</span> <span class="s1">&#39;false&#39;</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">&quot;&quot;&quot;</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"> &#39;airflow.cfg&#39;, &#39;default&#39;, &#39;env var&#39;, or &#39;cmd&#39;.</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 &#39;&lt; hidden &gt;&#39;</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"> &quot;raw&quot; 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"> &quot;&quot;&quot;</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">&#39;default&#39;</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">&#39;airflow.cfg&#39;</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">&#39;AIRFLOW__&#39;</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">&#39;__&#39;</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">&#39;AIRFLOW__CORE__UNIT_TEST_MODE&#39;</span><span class="p">:</span>
<span class="n">opt</span> <span class="o">=</span> <span class="s1">&#39;&lt; hidden &gt;&#39;</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">&#39;%&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">%%</span><span class="s1">&#39;</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">&#39;env var&#39;</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&#39;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">&#39;kubernetes_environment_variables&#39;</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">&#39;&lt; hidden &gt;&#39;</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">&#39;cmd&#39;</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">&#39;%&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">%%</span><span class="s1">&#39;</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">&#39;_cmd&#39;</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">&quot;&quot;&quot;</span>
<span class="sd"> Load the unit test configuration.</span>
<span class="sd"> Note: this is not reversible.</span>
<span class="sd"> &quot;&quot;&quot;</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">&quot;Overriding settings with defaults from </span><span class="si">%s</span><span class="s2">&quot;</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">&quot;Reading default test configuration from </span><span class="si">%s</span><span class="s2">&quot;</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 &quot;custom&quot; test settings</span>
<span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Reading test configuration from </span><span class="si">%s</span><span class="s2">&quot;</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">&#39;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 &#39;</span>
<span class="s1">&#39;setting has been used, but please update your config.&#39;</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 &gt;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">&#39;Error creating </span><span class="si">{}</span><span class="s1">: </span><span class="si">{}</span><span class="s1">&#39;</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">&#39;AIRFLOW_HOME&#39;</span><span class="p">,</span> <span class="s1">&#39;~/airflow&#39;</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">&#39;AIRFLOW_CONFIG&#39;</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">&#39;airflow.cfg&#39;</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">&#39;AIRFLOW_CONFIG&#39;</span><span class="p">])</span>
<span class="c1"># Setting AIRFLOW_HOME and AIRFLOW_CONFIG from environment variables, using</span>
<span class="c1"># &quot;~/airflow&quot; and &quot;$AIRFLOW_HOME/airflow.cfg&quot; 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&#39;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">&#39;tests&#39;</span><span class="p">,</span>
<span class="s1">&#39;dags&#39;</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">&#39;dags&#39;</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">&#39;tests&#39;</span><span class="p">,</span>
<span class="s1">&#39;plugins&#39;</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">&#39;plugins&#39;</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">&quot;&quot;&quot;</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"> &quot;&quot;&quot;</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">&#39;AIRFLOW_TEST_CONFIG&#39;</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">&#39;unittests.cfg&#39;</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">&#39;AIRFLOW_TEST_CONFIG&#39;</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">&#39;&#39;</span>
<span class="n">TEMPLATE_START</span> <span class="o">=</span> <span class="p">(</span>
<span class="s1">&#39;# ----------------------- TEMPLATE BEGINS HERE -----------------------&#39;</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">&#39;Creating new Airflow config file for unit tests in: </span><span class="si">%s</span><span class="s1">&#39;</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">&#39;w&#39;</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">&#39;Creating new Airflow config file in: </span><span class="si">%s</span><span class="s1">&#39;</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">&#39;w&#39;</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">&#39;utf8&#39;</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">&quot;Reading the config from </span><span class="si">%s</span><span class="s2">&quot;</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">&#39;core&#39;</span><span class="p">,</span> <span class="s1">&#39;AIRFLOW_HOME&#39;</span><span class="p">):</span>
<span class="n">msg</span> <span class="o">=</span> <span class="p">(</span>
<span class="s1">&#39;Specifying both AIRFLOW_HOME environment variable and airflow_home &#39;</span>
<span class="s1">&#39;in the config file is deprecated. Please use only the AIRFLOW_HOME &#39;</span>
<span class="s1">&#39;environment variable and remove the config file entry.&#39;</span>
<span class="p">)</span>
<span class="k">if</span> <span class="s1">&#39;AIRFLOW_HOME&#39;</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">&#39;core&#39;</span><span class="p">,</span> <span class="s1">&#39;airflow_home&#39;</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">&#39;Specifying airflow_home in the config file is deprecated. As you &#39;</span>
<span class="s1">&#39;have left it at the default value you should remove the setting &#39;</span>
<span class="s1">&#39;from your airflow.cfg and suffer no change in behaviour.&#39;</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">&#39;core&#39;</span><span class="p">,</span> <span class="s1">&#39;airflow_home&#39;</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">&quot;~/airflow/airflow.cfg&quot;</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">&#39;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 &#39;</span>
<span class="s1">&#39;at ~/airflow/airflow.cfg, even when AIRFLOW_HOME was set to a different &#39;</span>
<span class="s1">&#39;value. Airflow will now only read </span><span class="si">{new}</span><span class="s1">, and you should remove the &#39;</span>
<span class="s1">&#39;other file&#39;</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">&#39;/webserver_config.py&#39;</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">&#39;webserver&#39;</span><span class="p">,</span> <span class="s1">&#39;rbac&#39;</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">&#39;Creating new FAB webserver config file in: </span><span class="si">%s</span><span class="s1">&#39;</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">&#39;default_webserver_config.py&#39;</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">&#39;w&#39;</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">&#39;core&#39;</span><span class="p">,</span> <span class="s1">&#39;unit_test_mode&#39;</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">&quot;Accessing configuration method &#39;</span><span class="si">{f.__name__}</span><span class="s2">&#39; directly from &quot;</span>
<span class="s2">&quot;the configuration module is deprecated. Please access the &quot;</span>
<span class="s2">&quot;configuration from the &#39;configuration.conf&#39; object via &quot;</span>
<span class="s2">&quot;&#39;conf.</span><span class="si">{f.__name__}</span><span class="s2">&#39;&quot;</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>