You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by wf...@apache.org on 2016/03/04 03:43:06 UTC

svn commit: r1733548 [5/15] - in /aurora/site: ./ data/ publish/ publish/documentation/0.10.0/ publish/documentation/0.10.0/build-system/ publish/documentation/0.10.0/client-cluster-configuration/ publish/documentation/0.10.0/client-commands/ publish/d...

Added: aurora/site/publish/documentation/0.12.0/design-documents/index.html
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/design-documents/index.html?rev=1733548&view=auto
==============================================================================
--- aurora/site/publish/documentation/0.12.0/design-documents/index.html (added)
+++ aurora/site/publish/documentation/0.12.0/design-documents/index.html Fri Mar  4 02:43:01 2016
@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+	<title>Apache Aurora</title>
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
+    <link href="/assets/css/main.css" rel="stylesheet">
+	<!-- Analytics -->
+	<script type="text/javascript">
+		  var _gaq = _gaq || [];
+		  _gaq.push(['_setAccount', 'UA-45879646-1']);
+		  _gaq.push(['_setDomainName', 'apache.org']);
+		  _gaq.push(['_trackPageview']);
+
+		  (function() {
+		    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+		    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+		    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+		  })();
+	</script>
+  </head>
+  <body>
+    <div class="container-fluid section-header">
+  <div class="container">
+    <div class="nav nav-bar">
+    <a href="/"><img src="/assets/img/aurora_logo_dkbkg.svg" width="300" alt="Transparent Apache Aurora logo with dark background"/></a>
+    <ul class="nav navbar-nav navbar-right">
+      <li><a href="/documentation/latest/">Documentation</a></li>
+      <li><a href="/community/">Community</a></li>
+      <li><a href="/downloads/">Downloads</a></li>
+      <li><a href="/blog/">Blog</a></li>
+    </ul>
+    </div>
+  </div>
+</div>
+	
+    <div class="container-fluid">
+      <div class="container content">
+        <div class="col-md-12 documentation">
+<h5 class="page-header text-uppercase">Documentation
+<select onChange="window.location.href='/documentation/' + this.value + '/design-documents/'"
+        value="0.12.0">
+  <option value="0.12.0"
+    selected="selected">
+    0.12.0
+      (latest)
+  </option>
+  <option value="0.11.0"
+    >
+    0.11.0
+  </option>
+  <option value="0.10.0"
+    >
+    0.10.0
+  </option>
+  <option value="0.9.0"
+    >
+    0.9.0
+  </option>
+  <option value="0.8.0"
+    >
+    0.8.0
+  </option>
+  <option value="0.7.0-incubating"
+    >
+    0.7.0-incubating
+  </option>
+  <option value="0.6.0-incubating"
+    >
+    0.6.0-incubating
+  </option>
+  <option value="0.5.0-incubating"
+    >
+    0.5.0-incubating
+  </option>
+</select>
+</h5>
+<h1 id="design-documents">Design Documents</h1>
+
+<p>Since its inception as an Apache project, larger feature additions to the
+Aurora code base are discussed in form of design documents. Design documents
+are living documents until a consensus has been reached to implement a feature
+in the proposed form.</p>
+
+<p>Current and past documents:</p>
+
+<ul>
+<li><a href="design/command-hooks.md">Command Hooks for the Aurora Client</a></li>
+<li><a href="https://docs.google.com/document/d/1ZdgW8S4xMhvKW7iQUX99xZm10NXSxEWR0a-21FP5d94/edit">Health Checks for Updates</a></li>
+<li><a href="https://docs.google.com/document/d/1Fc_YhhV7fc4D9Xv6gJzpfooxbK4YWZcvzw6Bd3qVTL8/edit">JobUpdateDiff thrift API</a></li>
+<li><a href="https://docs.google.com/document/d/11_lAsYIRlD5ETRzF2eSd3oa8LXAHYFD8rSetspYXaf4/edit">REST API RFC</a></li>
+<li><a href="https://docs.google.com/document/d/1r1WCHgmPJp5wbrqSZLsgtxPNj3sULfHrSFmxp2GyPTo/edit">Revocable Mesos offers in Aurora</a></li>
+<li><a href="https://docs.google.com/document/d/12hr6GnUZU3mc7xsWRzMi3nQILGB-3vyUxvbG-6YmvdE/edit">Ubiquitous Jobs</a></li>
+</ul>
+
+<p>Design documents can be found in the Aurora issue tracker via the query <a href="https://issues.apache.org/jira/browse/AURORA-1528?jql=project%20%3D%20AURORA%20AND%20text%20~%20%22docs.google.com%22%20ORDER%20BY%20created"><code>project = AURORA AND text ~ &quot;docs.google.com&quot; ORDER BY created</code></a>.</p>
+
+</div>
+
+      </div>
+    </div>
+  	<div class="container-fluid section-footer buffer">
+      <div class="container">
+        <div class="row">
+		  <div class="col-md-2 col-md-offset-1"><h3>Quick Links</h3>
+		  <ul>
+		    <li><a href="/downloads/">Downloads</a></li>
+            <li><a href="/community/">Mailing Lists</a></li>
+			<li><a href="http://issues.apache.org/jira/browse/AURORA">Issue Tracking</a></li>
+			<li><a href="/documentation/latest/contributing/">How To Contribute</a></li>     
+		  </ul>
+	      </div>
+		  <div class="col-md-2"><h3>The ASF</h3>
+          <ul>
+            <li><a href="http://www.apache.org/licenses/">License</a></li>
+            <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>  
+            <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
+            <li><a href="http://www.apache.org/security/">Security</a></li>
+          </ul>
+		  </div>
+		  <div class="col-md-6">
+			<p class="disclaimer">Copyright 2014 <a href="http://www.apache.org/">Apache Software Foundation</a>. Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>. The <a href="https://www.flickr.com/photos/trondk/12706051375/">Aurora Borealis IX photo</a> displayed on the homepage is available under a <a href="https://creativecommons.org/licenses/by-nc-nd/2.0/">Creative Commons BY-NC-ND 2.0 license</a>. Apache, Apache Aurora, and the Apache feather logo are trademarks of The Apache Software Foundation.</p>
+        </div>
+      </div>
+    </div>
+
+  </body>
+</html>

Added: aurora/site/publish/documentation/0.12.0/design/command-hooks/index.html
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/design/command-hooks/index.html?rev=1733548&view=auto
==============================================================================
--- aurora/site/publish/documentation/0.12.0/design/command-hooks/index.html (added)
+++ aurora/site/publish/documentation/0.12.0/design/command-hooks/index.html Fri Mar  4 02:43:01 2016
@@ -0,0 +1,213 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+	<title>Apache Aurora</title>
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
+    <link href="/assets/css/main.css" rel="stylesheet">
+	<!-- Analytics -->
+	<script type="text/javascript">
+		  var _gaq = _gaq || [];
+		  _gaq.push(['_setAccount', 'UA-45879646-1']);
+		  _gaq.push(['_setDomainName', 'apache.org']);
+		  _gaq.push(['_trackPageview']);
+
+		  (function() {
+		    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+		    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+		    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+		  })();
+	</script>
+  </head>
+  <body>
+    <div class="container-fluid section-header">
+  <div class="container">
+    <div class="nav nav-bar">
+    <a href="/"><img src="/assets/img/aurora_logo_dkbkg.svg" width="300" alt="Transparent Apache Aurora logo with dark background"/></a>
+    <ul class="nav navbar-nav navbar-right">
+      <li><a href="/documentation/latest/">Documentation</a></li>
+      <li><a href="/community/">Community</a></li>
+      <li><a href="/downloads/">Downloads</a></li>
+      <li><a href="/blog/">Blog</a></li>
+    </ul>
+    </div>
+  </div>
+</div>
+	
+    <div class="container-fluid">
+      <div class="container content">
+        <div class="col-md-12 documentation">
+<h5 class="page-header text-uppercase">Documentation
+<select onChange="window.location.href='/documentation/' + this.value + '/design/command-hooks/'"
+        value="0.12.0">
+  <option value="0.12.0"
+    selected="selected">
+    0.12.0
+      (latest)
+  </option>
+  <option value="0.11.0"
+    >
+    0.11.0
+  </option>
+  <option value="0.10.0"
+    >
+    0.10.0
+  </option>
+  <option value="0.9.0"
+    >
+    0.9.0
+  </option>
+  <option value="0.8.0"
+    >
+    0.8.0
+  </option>
+  <option value="0.7.0-incubating"
+    >
+    0.7.0-incubating
+  </option>
+  <option value="0.6.0-incubating"
+    >
+    0.6.0-incubating
+  </option>
+  <option value="0.5.0-incubating"
+    >
+    0.5.0-incubating
+  </option>
+</select>
+</h5>
+<h1 id="command-hooks-for-the-aurora-client">Command Hooks for the Aurora Client</h1>
+
+<h2 id="introduction-motivation">Introduction/Motivation</h2>
+
+<p>We&rsquo;ve got hooks in the client that surround API calls. These are
+pretty awkward, because they don&rsquo;t correlate with user actions. For
+example, suppose we wanted a policy that said users weren&rsquo;t allowed to
+kill all instances of a production job at once.</p>
+
+<p>Right now, all that we could hook would be the &ldquo;killJob&rdquo; api call. But
+kill (at least in newer versions of the client) normally runs in
+batches. If a user called killall, what we would see on the API level
+is a series of &ldquo;killJob&rdquo; calls, each of which specified a batch of
+instances. We woudn&rsquo;t be able to distinguish between really killing
+all instances of a job (which is forbidden under this policy), and
+carefully killing in batches (which is permitted.) In each case, the
+hook would just see a series of API calls, and couldn&rsquo;t find out what
+the actual command being executed was!</p>
+
+<p>For most policy enforcement, what we really want to be able to do is
+look at and vet the commands that a user is performing, not the API
+calls that the client uses to implement those commands.</p>
+
+<p>So I propose that we add a new kind of hooks, which surround noun/verb
+commands. A hook will register itself to handle a collection of (noun,
+verb) pairs. Whenever any of those noun/verb commands are invoked, the
+hooks methods will be called around the execution of the verb. A
+pre-hook will have the ability to reject a command, preventing the
+verb from being executed.</p>
+
+<h2 id="registering-hooks">Registering Hooks</h2>
+
+<p>These hooks will be registered via configuration plugins. A configuration plugin
+can register hooks using an API. Hooks registered this way are, effectively,
+hardwired into the client executable.</p>
+
+<p>The order of execution of hooks is unspecified: they may be called in
+any order. There is no way to guarantee that one hook will execute
+before some other hook.</p>
+
+<h3 id="global-hooks">Global Hooks</h3>
+
+<p>Commands registered by the python call are called <em>global</em> hooks,
+because they will run for all configurations, whether or not they
+specify any hooks in the configuration file.</p>
+
+<p>In the implementation, hooks are registered in the module
+<code>apache.aurora.client.cli.command_hooks</code>, using the class
+<code>GlobalCommandHookRegistry</code>. A global hook can be registered by calling
+<code>GlobalCommandHookRegistry.register_command_hook</code> in a configuration plugin.</p>
+
+<h3 id="the-api">The API</h3>
+<pre class="highlight objective_c"><code><span style="background-color: #f8f8f8">class</span> <span style="background-color: #f8f8f8">CommandHook</span><span style="background-color: #f8f8f8">(</span><span style="background-color: #f8f8f8">object</span><span style="background-color: #f8f8f8">)</span>
+  <span style="color: #000000;font-weight: bold">@property</span>
+  <span style="background-color: #f8f8f8">def</span> <span style="background-color: #f8f8f8">name</span><span style="background-color: #f8f8f8">(</span><span style="background-color: #f8f8f8">self</span><span style="background-color: #f8f8f8">)</span><span style="color: #000000;font-weight: bold">:</span>
+    <span style="color: #d14">"""Returns a name for the hook."</span>
+
+  <span style="background-color: #f8f8f8">def</span> <span style="background-color: #f8f8f8">get_nouns</span><span style="background-color: #f8f8f8">(</span><span style="background-color: #f8f8f8">self</span><span style="background-color: #f8f8f8">)</span><span style="color: #000000;font-weight: bold">:</span>
+    <span style="color: #d14">"""Return the nouns that have verbs that should invoke this hook."""</span>
+
+  <span style="background-color: #f8f8f8">def</span> <span style="background-color: #f8f8f8">get_verbs</span><span style="background-color: #f8f8f8">(</span><span style="background-color: #f8f8f8">self</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">noun</span><span style="background-color: #f8f8f8">)</span><span style="color: #000000;font-weight: bold">:</span>
+    <span style="color: #d14">"""Return the verbs for a particular noun that should invoke his hook."""</span>
+
+  <span style="color: #a61717;background-color: #e3d2d2">@abstractmethod</span>
+  <span style="background-color: #f8f8f8">def</span> <span style="background-color: #f8f8f8">pre_command</span><span style="background-color: #f8f8f8">(</span><span style="background-color: #f8f8f8">self</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">noun</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">verb</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">context</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">commandline</span><span style="background-color: #f8f8f8">)</span><span style="color: #000000;font-weight: bold">:</span>
+    <span style="color: #d14">"""Execute a hook before invoking a verb.</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">    * noun: the noun being invoked.</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">    * verb: the verb being invoked.</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">    * context: the context object that will be used to invoke the verb.</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">      The options object will be initialized before calling the hook</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">    * commandline: the original argv collection used to invoke the client.</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">    Returns: True if the command should be allowed to proceed; False if the command</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">    should be rejected.</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">    """</span>
+
+  <span style="background-color: #f8f8f8">def</span> <span style="background-color: #f8f8f8">post_command</span><span style="background-color: #f8f8f8">(</span><span style="background-color: #f8f8f8">self</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">noun</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">verb</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">context</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">commandline</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">result</span><span style="background-color: #f8f8f8">)</span><span style="color: #000000;font-weight: bold">:</span>
+    <span style="color: #d14">"""Execute a hook after invoking a verb.</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">    * noun: the noun being invoked.</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">    * verb: the verb being invoked.</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">    * context: the context object that will be used to invoke the verb.</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">      The options object will be initialized before calling the hook</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">    * commandline: the original argv collection used to invoke the client.</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">    * result: the result code returned by the verb.</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">    Returns: nothing</span><span style="color: #a61717;background-color: #e3d2d2">
+</span><span style="color: #d14">    """</span>
+
+<span style="background-color: #f8f8f8">class</span> <span style="background-color: #f8f8f8">GlobalCommandHookRegistry</span><span style="background-color: #f8f8f8">(</span><span style="background-color: #f8f8f8">object</span><span style="background-color: #f8f8f8">)</span><span style="color: #000000;font-weight: bold">:</span>
+  <span style="color: #a61717;background-color: #e3d2d2">@classmethod</span>
+  <span style="background-color: #f8f8f8">def</span> <span style="background-color: #f8f8f8">register_command_hook</span><span style="background-color: #f8f8f8">(</span><span style="background-color: #f8f8f8">self</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">hook</span><span style="background-color: #f8f8f8">)</span><span style="color: #000000;font-weight: bold">:</span>
+    <span style="background-color: #f8f8f8">pass</span>
+</code></pre>
+
+<h3 id="skipping-hooks">Skipping Hooks</h3>
+
+<p>To skip a hook, a user uses a command-line option, <code>--skip-hooks</code>. The option can either
+specify specific hooks to skip, or &ldquo;all&rdquo;:</p>
+
+<ul>
+<li><code>aurora --skip-hooks=all job create east/bozo/devel/myjob</code> will create a job
+without running any hooks.</li>
+<li><code>aurora --skip-hooks=test,iq create east/bozo/devel/myjob</code> will create a job,
+and will skip only the hooks named &ldquo;test&rdquo; and &ldquo;iq&rdquo;.</li>
+</ul>
+
+</div>
+
+      </div>
+    </div>
+  	<div class="container-fluid section-footer buffer">
+      <div class="container">
+        <div class="row">
+		  <div class="col-md-2 col-md-offset-1"><h3>Quick Links</h3>
+		  <ul>
+		    <li><a href="/downloads/">Downloads</a></li>
+            <li><a href="/community/">Mailing Lists</a></li>
+			<li><a href="http://issues.apache.org/jira/browse/AURORA">Issue Tracking</a></li>
+			<li><a href="/documentation/latest/contributing/">How To Contribute</a></li>     
+		  </ul>
+	      </div>
+		  <div class="col-md-2"><h3>The ASF</h3>
+          <ul>
+            <li><a href="http://www.apache.org/licenses/">License</a></li>
+            <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>  
+            <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
+            <li><a href="http://www.apache.org/security/">Security</a></li>
+          </ul>
+		  </div>
+		  <div class="col-md-6">
+			<p class="disclaimer">Copyright 2014 <a href="http://www.apache.org/">Apache Software Foundation</a>. Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>. The <a href="https://www.flickr.com/photos/trondk/12706051375/">Aurora Borealis IX photo</a> displayed on the homepage is available under a <a href="https://creativecommons.org/licenses/by-nc-nd/2.0/">Creative Commons BY-NC-ND 2.0 license</a>. Apache, Apache Aurora, and the Apache feather logo are trademarks of The Apache Software Foundation.</p>
+        </div>
+      </div>
+    </div>
+
+  </body>
+</html>

Added: aurora/site/publish/documentation/0.12.0/developing-aurora-client/index.html
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/developing-aurora-client/index.html?rev=1733548&view=auto
==============================================================================
--- aurora/site/publish/documentation/0.12.0/developing-aurora-client/index.html (added)
+++ aurora/site/publish/documentation/0.12.0/developing-aurora-client/index.html Fri Mar  4 02:43:01 2016
@@ -0,0 +1,202 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+	<title>Apache Aurora</title>
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
+    <link href="/assets/css/main.css" rel="stylesheet">
+	<!-- Analytics -->
+	<script type="text/javascript">
+		  var _gaq = _gaq || [];
+		  _gaq.push(['_setAccount', 'UA-45879646-1']);
+		  _gaq.push(['_setDomainName', 'apache.org']);
+		  _gaq.push(['_trackPageview']);
+
+		  (function() {
+		    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+		    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+		    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+		  })();
+	</script>
+  </head>
+  <body>
+    <div class="container-fluid section-header">
+  <div class="container">
+    <div class="nav nav-bar">
+    <a href="/"><img src="/assets/img/aurora_logo_dkbkg.svg" width="300" alt="Transparent Apache Aurora logo with dark background"/></a>
+    <ul class="nav navbar-nav navbar-right">
+      <li><a href="/documentation/latest/">Documentation</a></li>
+      <li><a href="/community/">Community</a></li>
+      <li><a href="/downloads/">Downloads</a></li>
+      <li><a href="/blog/">Blog</a></li>
+    </ul>
+    </div>
+  </div>
+</div>
+	
+    <div class="container-fluid">
+      <div class="container content">
+        <div class="col-md-12 documentation">
+<h5 class="page-header text-uppercase">Documentation
+<select onChange="window.location.href='/documentation/' + this.value + '/developing-aurora-client/'"
+        value="0.12.0">
+  <option value="0.12.0"
+    selected="selected">
+    0.12.0
+      (latest)
+  </option>
+  <option value="0.11.0"
+    >
+    0.11.0
+  </option>
+  <option value="0.10.0"
+    >
+    0.10.0
+  </option>
+  <option value="0.9.0"
+    >
+    0.9.0
+  </option>
+  <option value="0.8.0"
+    >
+    0.8.0
+  </option>
+  <option value="0.7.0-incubating"
+    >
+    0.7.0-incubating
+  </option>
+  <option value="0.6.0-incubating"
+    >
+    0.6.0-incubating
+  </option>
+  <option value="0.5.0-incubating"
+    >
+    0.5.0-incubating
+  </option>
+</select>
+</h5>
+<h1 id="getting-started">Getting Started</h1>
+
+<p>The client is written in Python, and uses the
+<a href="http://pantsbuild.github.io/python-readme.html">Pants</a> build tool.</p>
+
+<h1 id="client-configuration">Client Configuration</h1>
+
+<p>The client uses a configuration file that specifies available clusters. More information about the
+contents of this file can be found in the
+<a href="/documentation/0.12.0/client-cluster-configuration/">Client Cluster Configuration</a> documentation. Information about
+how the client locates this file can be found in the
+<a href="/documentation/0.12.0/client-commands/#cluster-configuration">Client Commands</a> documentation.</p>
+
+<h1 id="building-and-testing-the-client">Building and Testing the Client</h1>
+
+<p>Building and testing the client code are both done using Pants. The relevant targets to know about
+are:</p>
+
+<ul>
+<li>Build a client executable: <code>./pants binary src/main/python/apache/aurora/client:aurora</code></li>
+<li>Test client code: <code>./pants test src/test/python/apache/aurora/client/cli:all</code></li>
+</ul>
+
+<p>If you want to build a source distribution of the client, you need to run <code>./build-support/release/make-python-sdists</code>.</p>
+
+<h1 id="running-debugging-the-client">Running/Debugging the Client</h1>
+
+<p>For manually testing client changes against a cluster, we use <a href="https://www.vagrantup.com/">Vagrant</a>.
+To start a virtual cluster, you need to install Vagrant, and then run <code>vagrant up</code> for the root of
+the aurora workspace. This will create a vagrant host named &ldquo;devcluster&rdquo;, with a mesos master, a set
+of mesos slaves, and an aurora scheduler.</p>
+
+<p>If you have a change you would like to test in your local cluster, you&rsquo;ll rebuild the client:</p>
+<pre class="highlight plaintext"><code>vagrant ssh -c 'aurorabuild client'
+</code></pre>
+
+<p>Once this completes, the <code>aurora</code> command will reflect your changes.</p>
+
+<h1 id="running-debugging-the-client-in-pycharm">Running/Debugging the Client in PyCharm</h1>
+
+<p>It&rsquo;s possible to use PyCharm to run and debug both the client and client tests in an IDE. In order
+to do this, first run:</p>
+<pre class="highlight plaintext"><code>build-support/python/make-pycharm-virtualenv
+</code></pre>
+
+<p>This script will configure a virtualenv with all of our Python requirements. Once the script
+completes it will emit instructions for configuring PyCharm:</p>
+<pre class="highlight plaintext"><code>Your PyCharm environment is now set up.  You can open the project root
+directory with PyCharm.
+
+Once the project is loaded:
+  - open project settings
+  - click 'Project Interpreter'
+  - click the cog in the upper-right corner
+  - click 'Add Local'
+  - select 'build-support/python/pycharm.venv/bin/python'
+  - click 'OK'
+</code></pre>
+
+<h3 id="running-debugging-tests">Running/Debugging Tests</h3>
+
+<p>After following these instructions, you should now be able to run/debug tests directly from the IDE
+by right-clicking on a test (or test class) and choosing to run or debug:</p>
+
+<p><a href="/documentation/0.12.0/images/debug-client-test.png"><img alt="Debug Client Test" src="../images/debug-client-test.png" /></a></p>
+
+<p>If you&rsquo;ve set a breakpoint, you can see the run will now stop and let you debug:</p>
+
+<p><a href="/documentation/0.12.0/images/debugging-client-test.png"><img alt="Debugging Client Test" src="../images/debugging-client-test.png" /></a></p>
+
+<h3 id="running-debugging-the-client">Running/Debugging the Client</h3>
+
+<p>Actually running and debugging the client is unfortunately a bit more complex. You&rsquo;ll need to create
+a Run configuration:</p>
+
+<ul>
+<li>Go to Run → Edit Configurations</li>
+<li>Click the + icon to add a new configuration.</li>
+<li>Choose python and name the configuration &lsquo;client&rsquo;.</li>
+<li>Set the script path to <code>/your/path/to/aurora/src/main/python/apache/aurora/client/cli/client.py</code></li>
+<li>Set the script parameters to the command you want to run (e.g. <code>job status &lt;job key&gt;</code>)</li>
+<li>Expand the Environment section and click the ellipsis to add a new environment variable</li>
+<li>Click the + at the bottom to add a new variable named AURORA<em>CONFIG</em>ROOT whose value is the
+path where the your cluster configuration can be found. For example, to talk to the scheduler
+running in the vagrant image, it would be set to <code>/your/path/to/aurora/examples/vagrant</code> (this
+is the directory where our example clusters.json is found).</li>
+<li>You should now be able to run and debug this configuration!</li>
+</ul>
+
+<h1 id="making-thrift-schema-changes">Making thrift schema changes</h1>
+
+<p>See <a href="/documentation/0.12.0/thrift-deprecation/">this document</a> for any thrift related changes.</p>
+
+</div>
+
+      </div>
+    </div>
+  	<div class="container-fluid section-footer buffer">
+      <div class="container">
+        <div class="row">
+		  <div class="col-md-2 col-md-offset-1"><h3>Quick Links</h3>
+		  <ul>
+		    <li><a href="/downloads/">Downloads</a></li>
+            <li><a href="/community/">Mailing Lists</a></li>
+			<li><a href="http://issues.apache.org/jira/browse/AURORA">Issue Tracking</a></li>
+			<li><a href="/documentation/latest/contributing/">How To Contribute</a></li>     
+		  </ul>
+	      </div>
+		  <div class="col-md-2"><h3>The ASF</h3>
+          <ul>
+            <li><a href="http://www.apache.org/licenses/">License</a></li>
+            <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>  
+            <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
+            <li><a href="http://www.apache.org/security/">Security</a></li>
+          </ul>
+		  </div>
+		  <div class="col-md-6">
+			<p class="disclaimer">Copyright 2014 <a href="http://www.apache.org/">Apache Software Foundation</a>. Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>. The <a href="https://www.flickr.com/photos/trondk/12706051375/">Aurora Borealis IX photo</a> displayed on the homepage is available under a <a href="https://creativecommons.org/licenses/by-nc-nd/2.0/">Creative Commons BY-NC-ND 2.0 license</a>. Apache, Apache Aurora, and the Apache feather logo are trademarks of The Apache Software Foundation.</p>
+        </div>
+      </div>
+    </div>
+
+  </body>
+</html>

Added: aurora/site/publish/documentation/0.12.0/developing-aurora-scheduler/index.html
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/developing-aurora-scheduler/index.html?rev=1733548&view=auto
==============================================================================
--- aurora/site/publish/documentation/0.12.0/developing-aurora-scheduler/index.html (added)
+++ aurora/site/publish/documentation/0.12.0/developing-aurora-scheduler/index.html Fri Mar  4 02:43:01 2016
@@ -0,0 +1,265 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+	<title>Apache Aurora</title>
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
+    <link href="/assets/css/main.css" rel="stylesheet">
+	<!-- Analytics -->
+	<script type="text/javascript">
+		  var _gaq = _gaq || [];
+		  _gaq.push(['_setAccount', 'UA-45879646-1']);
+		  _gaq.push(['_setDomainName', 'apache.org']);
+		  _gaq.push(['_trackPageview']);
+
+		  (function() {
+		    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+		    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+		    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+		  })();
+	</script>
+  </head>
+  <body>
+    <div class="container-fluid section-header">
+  <div class="container">
+    <div class="nav nav-bar">
+    <a href="/"><img src="/assets/img/aurora_logo_dkbkg.svg" width="300" alt="Transparent Apache Aurora logo with dark background"/></a>
+    <ul class="nav navbar-nav navbar-right">
+      <li><a href="/documentation/latest/">Documentation</a></li>
+      <li><a href="/community/">Community</a></li>
+      <li><a href="/downloads/">Downloads</a></li>
+      <li><a href="/blog/">Blog</a></li>
+    </ul>
+    </div>
+  </div>
+</div>
+	
+    <div class="container-fluid">
+      <div class="container content">
+        <div class="col-md-12 documentation">
+<h5 class="page-header text-uppercase">Documentation
+<select onChange="window.location.href='/documentation/' + this.value + '/developing-aurora-scheduler/'"
+        value="0.12.0">
+  <option value="0.12.0"
+    selected="selected">
+    0.12.0
+      (latest)
+  </option>
+  <option value="0.11.0"
+    >
+    0.11.0
+  </option>
+  <option value="0.10.0"
+    >
+    0.10.0
+  </option>
+  <option value="0.9.0"
+    >
+    0.9.0
+  </option>
+  <option value="0.8.0"
+    >
+    0.8.0
+  </option>
+  <option value="0.7.0-incubating"
+    >
+    0.7.0-incubating
+  </option>
+  <option value="0.6.0-incubating"
+    >
+    0.6.0-incubating
+  </option>
+  <option value="0.5.0-incubating"
+    >
+    0.5.0-incubating
+  </option>
+</select>
+</h5>
+<p>Java code in the aurora repo is built with <a href="http://gradle.org">Gradle</a>.</p>
+
+<h1 id="prerequisite">Prerequisite</h1>
+
+<p>When using Apache Aurora checked out from the source repository or the binary
+distribution, the Gradle wrapper and JavaScript dependencies are provided.
+However, you need to manually install them when using the source release
+downloads:</p>
+
+<ol>
+<li>Install Gradle following the instructions on the <a href="http://gradle.org">Gradle web site</a></li>
+<li><p>From the root directory of the Apache Aurora project generate the gradle
+wrapper by running:</p>
+
+<p>gradle wrapper</p></li>
+</ol>
+
+<h1 id="getting-started">Getting Started</h1>
+
+<p>You will need Java 8 installed and on your <code>PATH</code> or unzipped somewhere with <code>JAVA_HOME</code> set. Then</p>
+<pre class="highlight plaintext"><code>./gradlew tasks
+</code></pre>
+
+<p>will bootstrap the build system and show available tasks. This can take a while the first time you
+run it but subsequent runs will be much faster due to cached artifacts.</p>
+
+<h2 id="running-the-tests">Running the Tests</h2>
+
+<p>Aurora has a comprehensive unit test suite. To run the tests use</p>
+<pre class="highlight plaintext"><code>./gradlew build
+</code></pre>
+
+<p>Gradle will only re-run tests when dependencies of them have changed. To force a re-run of all
+tests use</p>
+<pre class="highlight plaintext"><code>./gradlew clean build
+</code></pre>
+
+<h2 id="running-the-build-with-code-quality-checks">Running the build with code quality checks</h2>
+
+<p>To speed up development iteration, the plain gradle commands will not run static analysis tools.
+However, you should run these before posting a review diff, and <strong>always</strong> run this before pushing a
+commit to origin/master.</p>
+<pre class="highlight plaintext"><code>./gradlew build -Pq
+</code></pre>
+
+<h2 id="running-integration-tests">Running integration tests</h2>
+
+<p>To run the same tests that are run in the Apache Aurora continuous integration
+environment:</p>
+<pre class="highlight plaintext"><code>./build-support/jenkins/build.sh
+</code></pre>
+
+<p>In addition, there is an end-to-end test that runs a suite of aurora commands
+using a virtual cluster:</p>
+<pre class="highlight plaintext"><code>./src/test/sh/org/apache/aurora/e2e/test_end_to_end.sh
+</code></pre>
+
+<h2 id="creating-a-bundle-for-deployment">Creating a bundle for deployment</h2>
+
+<p>Gradle can create a zip file containing Aurora, all of its dependencies, and a launch script with</p>
+<pre class="highlight plaintext"><code>./gradlew distZip
+</code></pre>
+
+<p>or a tar file containing the same files with</p>
+<pre class="highlight plaintext"><code>./gradlew distTar
+</code></pre>
+
+<p>The output file will be written to <code>dist/distributions/aurora-scheduler.zip</code> or
+<code>dist/distributions/aurora-scheduler.tar</code>.</p>
+
+<h1 id="developing-aurora-java-code">Developing Aurora Java code</h1>
+
+<h2 id="setting-up-an-ide">Setting up an IDE</h2>
+
+<p>Gradle can generate project files for your IDE. To generate an IntelliJ IDEA project run</p>
+<pre class="highlight plaintext"><code>./gradlew idea
+</code></pre>
+
+<p>and import the generated <code>aurora.ipr</code> file.</p>
+
+<h2 id="adding-or-upgrading-a-dependency">Adding or Upgrading a Dependency</h2>
+
+<p>New dependencies can be added from Maven central by adding a <code>compile</code> dependency to <code>build.gradle</code>.
+For example, to add a dependency on <code>com.example</code>&rsquo;s <code>example-lib</code> 1.0 add this block:</p>
+<pre class="highlight plaintext"><code>compile 'com.example:example-lib:1.0'
+</code></pre>
+
+<p>NOTE: Anyone thinking about adding a new dependency should first familiarize themself with the
+Apache Foundation&rsquo;s third-party licensing
+<a href="http://www.apache.org/legal/resolved.html#category-x">policy</a>.</p>
+
+<h1 id="developing-aurora-ui">Developing Aurora UI</h1>
+
+<h2 id="installing-bower-optional">Installing bower (optional)</h2>
+
+<p>Third party JS libraries used in Aurora (located at 3rdparty/javascript/bower_components) are
+managed by bower, a JS dependency manager. Bower is only required if you plan to add, remove or
+update JS libraries. Bower can be installed using the following command:</p>
+<pre class="highlight plaintext"><code>npm install -g bower
+</code></pre>
+
+<p>Bower depends on node.js and npm. The easiest way to install node on a mac is via brew:</p>
+<pre class="highlight plaintext"><code>brew install node
+</code></pre>
+
+<p>For more node.js installation options refer to <a href="https://github.com/joyent/node/wiki/Installation">https://github.com/joyent/node/wiki/Installation</a>.</p>
+
+<p>More info on installing and using bower can be found at: <a href="http://bower.io/">http://bower.io/</a>. Once installed, you can
+use the following commands to view and modify the bower repo at
+3rdparty/javascript/bower_components</p>
+<pre class="highlight plaintext"><code>bower list
+bower install &lt;library name&gt;
+bower remove &lt;library name&gt;
+bower update &lt;library name&gt;
+bower help
+</code></pre>
+
+<h2 id="faster-iteration-in-vagrant">Faster Iteration in Vagrant</h2>
+
+<p>The scheduler serves UI assets from the classpath. For production deployments this means the assets
+are served from within a jar. However, for faster development iteration, the vagrant image is
+configured to add <code>/vagrant/dist/resources/main</code> to the head of CLASSPATH. This path is configured
+as a shared filesystem to the path on the host system where your Aurora repository lives. This means
+that any updates to dist/resources/main in your checkout will be reflected immediately in the UI
+served from within the vagrant image.</p>
+
+<p>The one caveat to this is that this path is under <code>dist</code> not <code>src</code>. This is because the assets must
+be processed by gradle before they can be served. So, unfortunately, you cannot just save your local
+changes and see them reflected in the UI, you must first run <code>./gradlew processResources</code>. This is
+less than ideal, but better than having to restart the scheduler after every change. Additionally,
+gradle makes this process somewhat easier with the use of the <code>--continuous</code> flag. If you run:
+<code>./gradlew processResources --continuous</code> gradle will monitor the filesystem for changes and run the
+task automatically as necessary. This doesn&rsquo;t quite provide hot-reload capabilities, but it does
+allow for &lt;5s from save to changes being visibile in the UI with no further action required on the
+part of the developer.</p>
+
+<h1 id="developing-the-aurora-build-system">Developing the Aurora Build System</h1>
+
+<h2 id="bootstrapping-gradle">Bootstrapping Gradle</h2>
+
+<p>The following files were autogenerated by <code>gradle wrapper</code> using gradle 1.8&rsquo;s
+<a href="http://www.gradle.org/docs/1.8/dsl/org.gradle.api.tasks.wrapper.Wrapper.html">Wrapper</a> plugin and
+should not be modified directly:</p>
+<pre class="highlight plaintext"><code>./gradlew
+./gradlew.bat
+./gradle/wrapper/gradle-wrapper.jar
+./gradle/wrapper/gradle-wrapper.properties
+</code></pre>
+
+<p>To upgrade Gradle unpack the new version somewhere, run <code>/path/to/new/gradle wrapper</code> in the
+repository root and commit the changed files.</p>
+
+<h1 id="making-thrift-schema-changes">Making thrift schema changes</h1>
+
+<p>See <a href="/documentation/0.12.0/thrift-deprecation/">this document</a> for any thrift related changes.</p>
+
+</div>
+
+      </div>
+    </div>
+  	<div class="container-fluid section-footer buffer">
+      <div class="container">
+        <div class="row">
+		  <div class="col-md-2 col-md-offset-1"><h3>Quick Links</h3>
+		  <ul>
+		    <li><a href="/downloads/">Downloads</a></li>
+            <li><a href="/community/">Mailing Lists</a></li>
+			<li><a href="http://issues.apache.org/jira/browse/AURORA">Issue Tracking</a></li>
+			<li><a href="/documentation/latest/contributing/">How To Contribute</a></li>     
+		  </ul>
+	      </div>
+		  <div class="col-md-2"><h3>The ASF</h3>
+          <ul>
+            <li><a href="http://www.apache.org/licenses/">License</a></li>
+            <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>  
+            <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
+            <li><a href="http://www.apache.org/security/">Security</a></li>
+          </ul>
+		  </div>
+		  <div class="col-md-6">
+			<p class="disclaimer">Copyright 2014 <a href="http://www.apache.org/">Apache Software Foundation</a>. Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>. The <a href="https://www.flickr.com/photos/trondk/12706051375/">Aurora Borealis IX photo</a> displayed on the homepage is available under a <a href="https://creativecommons.org/licenses/by-nc-nd/2.0/">Creative Commons BY-NC-ND 2.0 license</a>. Apache, Apache Aurora, and the Apache feather logo are trademarks of The Apache Software Foundation.</p>
+        </div>
+      </div>
+    </div>
+
+  </body>
+</html>

Added: aurora/site/publish/documentation/0.12.0/hooks/index.html
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/hooks/index.html?rev=1733548&view=auto
==============================================================================
--- aurora/site/publish/documentation/0.12.0/hooks/index.html (added)
+++ aurora/site/publish/documentation/0.12.0/hooks/index.html Fri Mar  4 02:43:01 2016
@@ -0,0 +1,380 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+	<title>Apache Aurora</title>
+    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
+    <link href="/assets/css/main.css" rel="stylesheet">
+	<!-- Analytics -->
+	<script type="text/javascript">
+		  var _gaq = _gaq || [];
+		  _gaq.push(['_setAccount', 'UA-45879646-1']);
+		  _gaq.push(['_setDomainName', 'apache.org']);
+		  _gaq.push(['_trackPageview']);
+
+		  (function() {
+		    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+		    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+		    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+		  })();
+	</script>
+  </head>
+  <body>
+    <div class="container-fluid section-header">
+  <div class="container">
+    <div class="nav nav-bar">
+    <a href="/"><img src="/assets/img/aurora_logo_dkbkg.svg" width="300" alt="Transparent Apache Aurora logo with dark background"/></a>
+    <ul class="nav navbar-nav navbar-right">
+      <li><a href="/documentation/latest/">Documentation</a></li>
+      <li><a href="/community/">Community</a></li>
+      <li><a href="/downloads/">Downloads</a></li>
+      <li><a href="/blog/">Blog</a></li>
+    </ul>
+    </div>
+  </div>
+</div>
+	
+    <div class="container-fluid">
+      <div class="container content">
+        <div class="col-md-12 documentation">
+<h5 class="page-header text-uppercase">Documentation
+<select onChange="window.location.href='/documentation/' + this.value + '/hooks/'"
+        value="0.12.0">
+  <option value="0.12.0"
+    selected="selected">
+    0.12.0
+      (latest)
+  </option>
+  <option value="0.11.0"
+    >
+    0.11.0
+  </option>
+  <option value="0.10.0"
+    >
+    0.10.0
+  </option>
+  <option value="0.9.0"
+    >
+    0.9.0
+  </option>
+  <option value="0.8.0"
+    >
+    0.8.0
+  </option>
+  <option value="0.7.0-incubating"
+    >
+    0.7.0-incubating
+  </option>
+  <option value="0.6.0-incubating"
+    >
+    0.6.0-incubating
+  </option>
+  <option value="0.5.0-incubating"
+    >
+    0.5.0-incubating
+  </option>
+</select>
+</h5>
+<h1 id="hooks-for-aurora-client-api">Hooks for Aurora Client API</h1>
+
+<ul>
+<li><a href="#introduction">Introduction</a></li>
+<li><a href="#hook-types">Hook Types</a></li>
+<li><a href="#execution-order">Execution Order</a></li>
+<li><a href="#hookable-methods">Hookable Methods</a></li>
+<li><a href="#activating-and-using-hooks">Activating and Using Hooks</a></li>
+<li><a href="#aurora-config-file-settings">.aurora Config File Settings</a></li>
+<li><a href="#command-line">Command Line</a></li>
+<li><a href="#hooks-protocol">Hooks Protocol</a>
+
+<ul>
+<li><a href="#pre_-methods">pre_ Methods</a></li>
+<li><a href="#err_-methods">err_ Methods</a></li>
+<li><a href="#post_-methods">post_ Methods</a></li>
+</ul></li>
+<li><a href="#generic-hooks">Generic Hooks</a></li>
+<li><a href="#hooks-process-checklist">Hooks Process Checklist</a></li>
+</ul>
+
+<h2 id="introduction">Introduction</h2>
+
+<p>You can execute hook methods around Aurora API Client methods when they are called by the Aurora Command Line commands.</p>
+
+<p>Explaining how hooks work is a bit tricky because of some indirection about what they apply to. Basically, a hook is code that executes when a particular Aurora Client API method runs, letting you extend the method&rsquo;s actions. The hook executes on the client side, specifically on the machine executing Aurora commands.</p>
+
+<p>The catch is that hooks are associated with Aurora Client API methods, which users don&rsquo;t directly call. Instead, users call Aurora Command Line commands, which call Client API methods during their execution. Since which hooks run depend on which Client API methods get called, you will need to know which Command Line commands call which API methods. Later on, there is a table showing the various associations.</p>
+
+<p><strong>Terminology Note</strong>: From now on, &ldquo;method(s)&rdquo; refer to Client API methods, and &ldquo;command(s)&rdquo; refer to Command Line commands.</p>
+
+<h2 id="hook-types">Hook Types</h2>
+
+<p>Hooks have three basic types, differing by when they run with respect to their associated method.</p>
+
+<p><code>pre_&lt;method_name&gt;</code>: When its associated method is called, the <code>pre_</code> hook executes first, then the called method. If the <code>pre_</code> hook fails, the method never runs. Later code that expected the method to succeed may be affected by this, and result in terminating the Aurora client.</p>
+
+<p>Note that a <code>pre_</code> hook can error-trap internally so it does not
+return <code>False</code>. Designers/contributors of new <code>pre_</code> hooks should
+consider whether or not to error-trap them. You can error trap at the
+highest level very generally and always pass the <code>pre_</code> hook by
+returning <code>True</code>. For example:</p>
+<pre class="highlight python"><code><span style="color: #000000;font-weight: bold">def</span> <span style="color: #990000;font-weight: bold">pre_create</span><span style="background-color: #f8f8f8">(</span><span style="color: #000000;font-weight: bold">...</span><span style="background-color: #f8f8f8">):</span>
+  <span style="background-color: #f8f8f8">do_something</span><span style="background-color: #f8f8f8">()</span>  <span style="color: #999988;font-style: italic"># if do_something fails with an exception, the create_job is not attempted!</span>
+  <span style="color: #000000;font-weight: bold">return</span> <span style="color: #999999">True</span>
+
+<span style="color: #999988;font-style: italic"># However...</span>
+<span style="color: #000000;font-weight: bold">def</span> <span style="color: #990000;font-weight: bold">pre_create</span><span style="background-color: #f8f8f8">(</span><span style="color: #000000;font-weight: bold">...</span><span style="background-color: #f8f8f8">):</span>
+  <span style="color: #000000;font-weight: bold">try</span><span style="background-color: #f8f8f8">:</span>
+    <span style="background-color: #f8f8f8">do_something</span><span style="background-color: #f8f8f8">()</span>  <span style="color: #999988;font-style: italic"># may cause exception</span>
+  <span style="color: #000000;font-weight: bold">except</span> <span style="color: #0086B3">Exception</span><span style="background-color: #f8f8f8">:</span>  <span style="color: #999988;font-style: italic"># generic error trap will catch it</span>
+    <span style="color: #000000;font-weight: bold">pass</span>  <span style="color: #999988;font-style: italic"># and ignore the exception</span>
+  <span style="color: #000000;font-weight: bold">return</span> <span style="color: #999999">True</span>  <span style="color: #999988;font-style: italic"># create_job will run in any case!</span>
+</code></pre>
+
+<p><code>post_&lt;method_name&gt;</code>: A <code>post_</code> hook executes after its associated method successfully finishes running. If it fails, the already executed method is unaffected. A <code>post_</code> hook&rsquo;s error is trapped, and any later operations are unaffected.</p>
+
+<p><code>err_&lt;method_name&gt;</code>: Executes only when its associated method returns a status other than OK or throws an exception. If an <code>err_</code> hook fails, the already executed method is unaffected. An <code>err_</code> hook&rsquo;s error is trapped, and any later operations are unaffected.</p>
+
+<h2 id="execution-order">Execution Order</h2>
+
+<p>A command with <code>pre_</code>, <code>post_</code>, and <code>err_</code> hooks defined and activated for its called method executes in the following order when the method successfully executes:</p>
+
+<ol>
+<li>Command called</li>
+<li>Command code executes</li>
+<li>Method Called</li>
+<li><code>pre_</code> method hook runs</li>
+<li>Method runs and successfully finishes</li>
+<li><code>post_</code> method hook runs</li>
+<li>Command code executes</li>
+<li>Command execution ends</li>
+</ol>
+
+<p>The following is what happens when, for the same command and hooks, the method associated with the command suffers an error and does not successfully finish executing:</p>
+
+<ol>
+<li>Command called</li>
+<li>Command code executes</li>
+<li>Method Called</li>
+<li><code>pre_</code> method hook runs</li>
+<li>Method runs and fails</li>
+<li><code>err_</code> method hook runs</li>
+<li>Command Code executes (if <code>err_</code> method does not end the command execution)</li>
+<li>Command execution ends</li>
+</ol>
+
+<p>Note that the <code>post_</code> and <code>err_</code> hooks for the same method can never both run for a single execution of that method.</p>
+
+<h2 id="hookable-methods">Hookable Methods</h2>
+
+<p>You can associate <code>pre_</code>, <code>post_</code>, and <code>err_</code> hooks with the following methods. Since you do not directly interact with the methods, but rather the Aurora Command Line commands that call them, for each method we also list the command(s) that can call the method. Note that a different method or methods may be called by a command depending on how the command&rsquo;s other code executes. Similarly, multiple commands can call the same method. We also list the methods&rsquo; argument signatures, which are used by their associated hooks. <a name="Chart"></a></p>
+
+<table><thead>
+<tr>
+<th>Aurora Client API Method</th>
+<th>Client API Method Argument Signature</th>
+<th>Aurora Command Line Command</th>
+</tr>
+</thead><tbody>
+<tr>
+<td><code>create_job</code></td>
+<td><code>self</code>, <code>config</code></td>
+<td><code>job create</code>, <code>runtask</td>
+</tr>
+<tr>
+<td><code>restart</code></td>
+<td><code>self</code>, <code>job_key</code>, <code>shards</code>, <code>update_config</code>, <code>health_check_interval_seconds</code></td>
+<td><code>job restart</code></td>
+</tr>
+<tr>
+<td><code>kill_job</code></td>
+<td><code>self</code>, <code>job_key</code>, <code>shards=None</code></td>
+<td><code>job kill</code></td>
+</tr>
+<tr>
+<td><code>start_cronjob</code></td>
+<td><code>self</code>, <code>job_key</code></td>
+<td><code>cron start</code></td>
+</tr>
+<tr>
+<td><code>start_job_update</code></td>
+<td><code>self</code>, <code>config</code>, <code>instances=None</code></td>
+<td><code>update start</code></td>
+</tr>
+</tbody></table>
+
+<p>Some specific examples:</p>
+
+<ul>
+<li><p><code>pre_create_job</code> executes when a <code>create_job</code> method is called, and before the <code>create_job</code> method itself executes.</p></li>
+<li><p><code>post_cancel_update</code> executes after a <code>cancel_update</code> method has successfully finished running.</p></li>
+<li><p><code>err_kill_job</code> executes when the <code>kill_job</code> method is called, but doesn&rsquo;t successfully finish running.</p></li>
+</ul>
+
+<h2 id="activating-and-using-hooks">Activating and Using Hooks</h2>
+
+<p>By default, hooks are inactive. If you do not want to use hooks, you do not need to make any changes to your code. If you do want to use hooks, you will need to alter your <code>.aurora</code> config file to activate them both for the configuration as a whole as well as for individual <code>Job</code>s. And, of course, you will need to define in your config file what happens when a particular hook executes.</p>
+
+<h2 id="aurora-config-file-settings">.aurora Config File Settings</h2>
+
+<p>You can define a top-level <code>hooks</code> variable in any <code>.aurora</code> config file. <code>hooks</code> is a list of all objects that define hooks used by <code>Job</code>s defined in that config file. If you do not want to define any hooks for a configuration, <code>hooks</code> is optional.</p>
+<pre class="highlight plaintext"><code>hooks = [Object_with_defined_hooks1, Object_with_defined_hooks2]
+</code></pre>
+
+<p>Be careful when assembling a config file using <code>include</code> on multiple smaller config files. If there are multiple files that assign a value to <code>hooks</code>, only the last assignment made will stick. For example, if <code>x.aurora</code> has <code>hooks = [a, b, c]</code> and <code>y.aurora</code> has <code>hooks = [d, e, f]</code> and <code>z.aurora</code> has, in this order, <code>include x.aurora</code> and <code>include y.aurora</code>, the <code>hooks</code> value will be <code>[d, e, f]</code>.</p>
+
+<p>Also, for any <code>Job</code> that you want to use hooks with, its <code>Job</code> definition in the <code>.aurora</code> config file must set an <code>enable_hooks</code> flag to <code>True</code> (it defaults to <code>False</code>). By default, hooks are disabled and you must enable them for <code>Job</code>s of your choice.</p>
+
+<p>To summarize, to use hooks for a particular job, you must both activate hooks for your config file as a whole, and for that job. Activating hooks only for individual jobs won&rsquo;t work, nor will only activating hooks for your config file as a whole. You must also specify the hooks&rsquo; defining object in the <code>hooks</code> variable.</p>
+
+<p>Recall that <code>.aurora</code> config files are written in Pystachio. So the following turns on hooks for production jobs at cluster1 and cluster2, but leaves them off for similar jobs with a defined user role. Of course, you also need to list the objects that define the hooks in your config file&rsquo;s <code>hooks</code> variable.</p>
+<pre class="highlight python"><code><span style="background-color: #f8f8f8">jobs</span> <span style="color: #000000;font-weight: bold">=</span> <span style="background-color: #f8f8f8">[</span>
+        <span style="background-color: #f8f8f8">Job</span><span style="background-color: #f8f8f8">(</span><span style="background-color: #f8f8f8">enable_hooks</span> <span style="color: #000000;font-weight: bold">=</span> <span style="color: #999999">True</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">cluster</span> <span style="color: #000000;font-weight: bold">=</span> <span style="background-color: #f8f8f8">c</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">env</span> <span style="color: #000000;font-weight: bold">=</span> <span style="color: #d14">'prod'</span><span style="background-color: #f8f8f8">)</span> <span style="color: #000000;font-weight: bold">for</span> <span style="background-color: #f8f8f8">c</span> <span style="color: #000000;font-weight: bold">in</span> <span style="background-color: #f8f8f8">(</span><span style="color: #d14">'cluster1'</span><span style="background-colo
 r: #f8f8f8">,</span> <span style="color: #d14">'cluster2'</span><span style="background-color: #f8f8f8">)</span>
+       <span style="background-color: #f8f8f8">]</span>
+<span style="background-color: #f8f8f8">jobs</span><span style="color: #000000;font-weight: bold">.</span><span style="background-color: #f8f8f8">extend</span><span style="background-color: #f8f8f8">(</span>
+   <span style="background-color: #f8f8f8">Job</span><span style="background-color: #f8f8f8">(</span><span style="background-color: #f8f8f8">cluster</span> <span style="color: #000000;font-weight: bold">=</span> <span style="background-color: #f8f8f8">c</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">env</span> <span style="color: #000000;font-weight: bold">=</span> <span style="color: #d14">'prod'</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">role</span> <span style="color: #000000;font-weight: bold">=</span> <span style="background-color: #f8f8f8">getpass</span><span style="color: #000000;font-weight: bold">.</span><span style="background-color: #f8f8f8">getuser</span><span style="background-color: #f8f8f8">())</span> <span style="color: #000000;font-weight: bold">for</span> <span style="background-color: #f8f8f8">c</span> <span style="color: #000000;font-weight: bold">in</span> <span s
 tyle="background-color: #f8f8f8">(</span><span style="color: #d14">'cluster1'</span><span style="background-color: #f8f8f8">,</span> <span style="color: #d14">'cluster2'</span><span style="background-color: #f8f8f8">))</span>
+   <span style="color: #999988;font-style: italic"># Hooks disabled for these jobs</span>
+</code></pre>
+
+<h2 id="command-line">Command Line</h2>
+
+<p>All Aurora Command Line commands now accept an <code>.aurora</code> config file as an optional parameter (some, of course, accept it as a required parameter). Whenever a command has a <code>.aurora</code> file parameter, any hooks specified and activated in the <code>.aurora</code> file can be used. For example:</p>
+<pre class="highlight plaintext"><code>aurora job restart cluster1/role/env/app myapp.aurora
+</code></pre>
+
+<p>The command activates any hooks specified and activated in <code>myapp.aurora</code>. For the <code>restart</code> command, that is the only thing the <code>myapp.aurora</code> parameter does. So, if the command was the following, since there is no <code>.aurora</code> config file to specify any hooks, no hooks on the <code>restart</code> command can run.</p>
+<pre class="highlight plaintext"><code>aurora job restart cluster1/role/env/app
+</code></pre>
+
+<h2 id="hooks-protocol">Hooks Protocol</h2>
+
+<p>Any object defined in the <code>.aurora</code> config file can define hook methods. You should define your hook methods within a class, and then use the class name as a value in the <code>hooks</code> list in your config file.</p>
+
+<p>Note that you can define other methods in the class that its hook methods can call; all the logic of a hook does not have to be in its definition.</p>
+
+<p>The following example defines a class containing a <code>pre_kill_job</code> hook definition that calls another method defined in the class.</p>
+<pre class="highlight python"><code><span style="color: #999988;font-style: italic"># Defines a method pre_kill_job</span>
+<span style="color: #000000;font-weight: bold">class</span> <span style="color: #445588;font-weight: bold">KillConfirmer</span><span style="background-color: #f8f8f8">(</span><span style="color: #0086B3">object</span><span style="background-color: #f8f8f8">):</span>
+  <span style="color: #000000;font-weight: bold">def</span> <span style="color: #990000;font-weight: bold">confirm</span><span style="background-color: #f8f8f8">(</span><span style="color: #999999">self</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">msg</span><span style="background-color: #f8f8f8">):</span>
+    <span style="color: #000000;font-weight: bold">return</span> <span style="color: #0086B3">raw_input</span><span style="background-color: #f8f8f8">(</span><span style="background-color: #f8f8f8">msg</span><span style="background-color: #f8f8f8">)</span><span style="color: #000000;font-weight: bold">.</span><span style="background-color: #f8f8f8">lower</span><span style="background-color: #f8f8f8">()</span> <span style="color: #000000;font-weight: bold">==</span> <span style="color: #d14">'yes'</span>
+
+  <span style="color: #000000;font-weight: bold">def</span> <span style="color: #990000;font-weight: bold">pre_kill_job</span><span style="background-color: #f8f8f8">(</span><span style="color: #999999">self</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">job_key</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">shards</span><span style="color: #000000;font-weight: bold">=</span><span style="color: #999999">None</span><span style="background-color: #f8f8f8">):</span>
+    <span style="background-color: #f8f8f8">shards</span> <span style="color: #000000;font-weight: bold">=</span> <span style="background-color: #f8f8f8">(</span><span style="color: #d14">'shards </span><span style="color: #d14">%</span><span style="color: #d14">s'</span> <span style="color: #000000;font-weight: bold">%</span> <span style="background-color: #f8f8f8">shards</span><span style="background-color: #f8f8f8">)</span> <span style="color: #000000;font-weight: bold">if</span> <span style="background-color: #f8f8f8">shards</span> <span style="color: #000000;font-weight: bold">is</span> <span style="color: #000000;font-weight: bold">not</span> <span style="color: #999999">None</span> <span style="color: #000000;font-weight: bold">else</span> <span style="color: #d14">'all shards'</span>
+    <span style="color: #000000;font-weight: bold">return</span> <span style="color: #999999">self</span><span style="color: #000000;font-weight: bold">.</span><span style="background-color: #f8f8f8">confirm</span><span style="background-color: #f8f8f8">(</span><span style="color: #d14">'Are you sure you want to kill </span><span style="color: #d14">%</span><span style="color: #d14">s (</span><span style="color: #d14">%</span><span style="color: #d14">s)? (yes/no): '</span>
+                        <span style="color: #000000;font-weight: bold">%</span> <span style="background-color: #f8f8f8">(</span><span style="background-color: #f8f8f8">job_key</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">shards</span><span style="background-color: #f8f8f8">))</span>
+</code></pre>
+
+<h3 id="pre_-methods">pre_ Methods</h3>
+
+<p><code>pre_</code> methods have the signature:</p>
+<pre class="highlight plaintext"><code>pre_&lt;API method name&gt;(self, &lt;associated method's signature&gt;)
+</code></pre>
+
+<p><code>pre_</code> methods have the same signature as their associated method, with the addition of <code>self</code> as the first parameter. See the <a href="#Chart">chart</a> above for the mapping of parameters to methods. When writing <code>pre_</code> methods, you can use the <code>*</code> and <code>**</code> syntax to designate that all unspecified parameters are passed in a list to the <code>*</code>ed variable and all named parameters with values are passed as name/value pairs to the <code>**</code>ed variable.</p>
+
+<p>If this method returns False, the API command call aborts.</p>
+
+<h3 id="err_-methods">err_ Methods</h3>
+
+<p><code>err_</code> methods have the signature:</p>
+<pre class="highlight plaintext"><code>err_&lt;API method name&gt;(self, exc, &lt;associated method's signature&gt;)
+</code></pre>
+
+<p><code>err_</code> methods have the same signature as their associated method, with the addition of a first parameter <code>self</code> and a second parameter <code>exc</code>. <code>exc</code> is either a result with responseCode other than <code>ResponseCode.OK</code> or an <code>Exception</code>. See the <a href="#Chart">chart</a> above for the mapping of parameters to methods. When writing <code>err</code>_ methods, you can use the <code>*</code> and <code>**</code> syntax to designate that all unspecified parameters are passed in a list to the <code>*</code>ed variable and all named parameters with values are passed as name/value pairs to the <code>**</code>ed variable.</p>
+
+<p><code>err_</code> method return codes are ignored.</p>
+
+<h3 id="post_-methods">post_ Methods</h3>
+
+<p><code>post_</code> methods have the signature:</p>
+<pre class="highlight plaintext"><code>post_&lt;API method name&gt;(self, result, &lt;associated method signature&gt;)
+</code></pre>
+
+<p><code>post_</code> method parameters are <code>self</code>, then <code>result</code>, followed by the same parameter signature as their associated method. <code>result</code> is the result of the associated method call. See the <a href="#chart">chart</a> above for the mapping of parameters to methods. When writing <code>post_</code> methods, you can use the <code>*</code> and <code>**</code> syntax to designate that all unspecified arguments are passed in a list to the <code>*</code>ed parameter and all unspecified named arguments with values are passed as name/value pairs to the <code>**</code>ed parameter.</p>
+
+<p><code>post_</code> method return codes are ignored.</p>
+
+<h2 id="generic-hooks">Generic Hooks</h2>
+
+<p>There are seven Aurora API Methods which any of the three hook types can attach to. Thus, there are 21 possible hook/method combinations for a single <code>.aurora</code> config file. Say that you define <code>pre_</code> and <code>post_</code> hooks for the <code>restart</code> method. That leaves 19 undefined hook/method combinations; <code>err_restart</code> and the 3 <code>pre_</code>, <code>post_</code>, and <code>err_</code> hooks for each of the other 6 hookable methods. You can define what happens when any of these otherwise undefined 19 hooks execute via a generic hook, whose signature is:</p>
+<pre class="highlight python"><code><span style="background-color: #f8f8f8">generic_hook</span><span style="background-color: #f8f8f8">(</span><span style="color: #999999">self</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">hook_config</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">event</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">method_name</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">result_or_err</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">args</span><span style="color: #000000;font-weight: bold">*</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">kw</span><span style="color: #000000;font-weight: bold">**</span><span style="background-color: #f8f8f8">)</span>
+</code></pre>
+
+<p>where:</p>
+
+<ul>
+<li><p><code>hook_config</code> is a named tuple of <code>config</code> (the Pystashio <code>config</code> object) and <code>job_key</code>.</p></li>
+<li><p><code>event</code> is one of <code>pre</code>, <code>err</code>, or <code>post</code>, indicating which type of hook the genetic hook is standing in for. For example, assume no specific hooks were defined for the <code>restart</code> API command. If <code>generic_hook</code> is defined and activated, and <code>restart</code> is called, <code>generic_hook</code> will effectively run as <code>pre_restart</code>, <code>post_restart</code>, and <code>err_restart</code>. You can use a selection statement on this value so that <code>generic_hook</code> will act differently based on whether it is standing in for a <code>pre_</code>, <code>post_</code>, or <code>err_</code> hook.</p></li>
+<li><p><code>method_name</code> is the Client API method name whose execution is causing this execution of the <code>generic_hook</code>.</p></li>
+<li><p><code>args*</code>, <code>kw**</code> are the API method arguments and keyword arguments respectively.</p></li>
+<li><p><code>result_or_err</code> is a tri-state parameter taking one of these three values:</p>
+
+<ol>
+<li>None for <code>pre_</code>hooks</li>
+<li><code>result</code> for <code>post_</code> nooks</li>
+<li><code>exc</code> for <code>err_</code> hooks</li>
+</ol></li>
+</ul>
+
+<p>Example:</p>
+<pre class="highlight python"><code><span style="color: #999988;font-style: italic"># Overrides the standard do-nothing generic_hook by adding a log writing operation.</span>
+<span style="color: #000000;font-weight: bold">from</span> <span style="color: #555555">twitter.common</span> <span style="color: #000000;font-weight: bold">import</span> <span style="background-color: #f8f8f8">log</span>
+  <span style="color: #000000;font-weight: bold">class</span> <span style="color: #445588;font-weight: bold">Logger</span><span style="background-color: #f8f8f8">(</span><span style="color: #0086B3">object</span><span style="background-color: #f8f8f8">):</span>
+    <span style="color: #d14">'''Adds to the log every time a hookable API method is called'''</span>
+    <span style="color: #000000;font-weight: bold">def</span> <span style="color: #990000;font-weight: bold">generic_hook</span><span style="background-color: #f8f8f8">(</span><span style="color: #999999">self</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">hook_config</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">event</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">method_name</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">result_or_err</span><span style="background-color: #f8f8f8">,</span> <span style="color: #000000;font-weight: bold">*</span><span style="background-color: #f8f8f8">args</span><span style="background-color: #f8f8f8">,</span> <span style="color: #000000;font-weight: bold">**</span><span style="background-color: #f8f8f8">kw</span><span style="background-color: #f8f8f8">)</span>
+      <span style="background-color: #f8f8f8">log</span><span style="color: #000000;font-weight: bold">.</span><span style="background-color: #f8f8f8">info</span><span style="background-color: #f8f8f8">(</span><span style="color: #d14">'</span><span style="color: #d14">%</span><span style="color: #d14">s: </span><span style="color: #d14">%</span><span style="color: #d14">s_</span><span style="color: #d14">%</span><span style="color: #d14">s of </span><span style="color: #d14">%</span><span style="color: #d14">s'</span>
+               <span style="color: #000000;font-weight: bold">%</span> <span style="background-color: #f8f8f8">(</span><span style="color: #999999">self</span><span style="color: #000000;font-weight: bold">.</span><span style="background-color: #f8f8f8">__class__</span><span style="color: #000000;font-weight: bold">.</span><span style="background-color: #f8f8f8">__name__</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">event</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">method_name</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">hook_config</span><span style="color: #000000;font-weight: bold">.</span><span style="background-color: #f8f8f8">job_key</span><span style="background-color: #f8f8f8">))</span>
+</code></pre>
+
+<h2 id="hooks-process-checklist">Hooks Process Checklist</h2>
+
+<ol>
+<li>In your <code>.aurora</code> config file, add a <code>hooks</code> variable. Note that you may want to define a <code>.aurora</code> file only for hook definitions and then include this file in multiple other config files that you want to use the same hooks.</li>
+</ol>
+<pre class="highlight python"><code><span style="background-color: #f8f8f8">hooks</span> <span style="color: #000000;font-weight: bold">=</span> <span style="background-color: #f8f8f8">[]</span>
+</code></pre>
+
+<ol>
+<li>In the <code>hooks</code> variable, list all objects that define hooks used by <code>Job</code>s defined in this config:</li>
+</ol>
+<pre class="highlight python"><code><span style="background-color: #f8f8f8">hooks</span> <span style="color: #000000;font-weight: bold">=</span> <span style="background-color: #f8f8f8">[</span><span style="background-color: #f8f8f8">Object_hook_definer1</span><span style="background-color: #f8f8f8">,</span> <span style="background-color: #f8f8f8">Object_hook_definer2</span><span style="background-color: #f8f8f8">]</span>
+</code></pre>
+
+<ol>
+<li><p>For each job that uses hooks in this config file, add <code>enable_hooks = True</code> to the <code>Job</code> definition. Note that this is necessary even if you only want to use the generic hook.</p></li>
+<li><p>Write your <code>pre_</code>, <code>post_</code>, and <code>err_</code> hook definitions as part of an object definition in your <code>.aurora</code> config file.</p></li>
+<li><p>If desired, write your <code>generic_hook</code> definition as part of an object definition in your <code>.aurora</code> config file. Remember, the object must be listed as a member of <code>hooks</code>.</p></li>
+<li><p>If your Aurora command line command does not otherwise take an <code>.aurora</code> config file argument, add the appropriate <code>.aurora</code> file as an argument in order to define and activate the configuration&rsquo;s hooks.</p></li>
+</ol>
+
+</div>
+
+      </div>
+    </div>
+  	<div class="container-fluid section-footer buffer">
+      <div class="container">
+        <div class="row">
+		  <div class="col-md-2 col-md-offset-1"><h3>Quick Links</h3>
+		  <ul>
+		    <li><a href="/downloads/">Downloads</a></li>
+            <li><a href="/community/">Mailing Lists</a></li>
+			<li><a href="http://issues.apache.org/jira/browse/AURORA">Issue Tracking</a></li>
+			<li><a href="/documentation/latest/contributing/">How To Contribute</a></li>     
+		  </ul>
+	      </div>
+		  <div class="col-md-2"><h3>The ASF</h3>
+          <ul>
+            <li><a href="http://www.apache.org/licenses/">License</a></li>
+            <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>  
+            <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
+            <li><a href="http://www.apache.org/security/">Security</a></li>
+          </ul>
+		  </div>
+		  <div class="col-md-6">
+			<p class="disclaimer">Copyright 2014 <a href="http://www.apache.org/">Apache Software Foundation</a>. Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>. The <a href="https://www.flickr.com/photos/trondk/12706051375/">Aurora Borealis IX photo</a> displayed on the homepage is available under a <a href="https://creativecommons.org/licenses/by-nc-nd/2.0/">Creative Commons BY-NC-ND 2.0 license</a>. Apache, Apache Aurora, and the Apache feather logo are trademarks of The Apache Software Foundation.</p>
+        </div>
+      </div>
+    </div>
+
+  </body>
+</html>

Added: aurora/site/publish/documentation/0.12.0/images/CPUavailability.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/CPUavailability.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/CPUavailability.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/CompletedTasks.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/CompletedTasks.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/CompletedTasks.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/HelloWorldJob.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/HelloWorldJob.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/HelloWorldJob.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/RoleJobs.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/RoleJobs.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/RoleJobs.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/RunningJob.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/RunningJob.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/RunningJob.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/ScheduledJobs.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/ScheduledJobs.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/ScheduledJobs.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/TaskBreakdown.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/TaskBreakdown.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/TaskBreakdown.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/aurora_hierarchy.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/aurora_hierarchy.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/aurora_hierarchy.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/aurora_logo.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/aurora_logo.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/aurora_logo.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/components.odg
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/components.odg?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/components.odg
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/components.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/components.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/components.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/debug-client-test.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/debug-client-test.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/debug-client-test.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/debugging-client-test.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/debugging-client-test.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/debugging-client-test.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/killedtask.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/killedtask.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/killedtask.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/lifeofatask.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/lifeofatask.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/lifeofatask.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/presentations/02_19_2015_aurora_adopters_panel_thumb.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/presentations/02_19_2015_aurora_adopters_panel_thumb.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/presentations/02_19_2015_aurora_adopters_panel_thumb.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/presentations/02_19_2015_aurora_at_tellapart_thumb.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/presentations/02_19_2015_aurora_at_tellapart_thumb.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/presentations/02_19_2015_aurora_at_tellapart_thumb.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/presentations/02_19_2015_aurora_at_twitter_thumb.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/presentations/02_19_2015_aurora_at_twitter_thumb.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/presentations/02_19_2015_aurora_at_twitter_thumb.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/presentations/02_28_2015_apache_aurora_thumb.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/presentations/02_28_2015_apache_aurora_thumb.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/presentations/02_28_2015_apache_aurora_thumb.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/presentations/03_07_2015_aurora_mesos_in_practice_at_twitter_thumb.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/presentations/03_07_2015_aurora_mesos_in_practice_at_twitter_thumb.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/presentations/03_07_2015_aurora_mesos_in_practice_at_twitter_thumb.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/presentations/03_25_2014_introduction_to_aurora_thumb.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/presentations/03_25_2014_introduction_to_aurora_thumb.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/presentations/03_25_2014_introduction_to_aurora_thumb.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/presentations/04_30_2015_monolith_to_microservices_thumb.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/presentations/04_30_2015_monolith_to_microservices_thumb.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/presentations/04_30_2015_monolith_to_microservices_thumb.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/presentations/08_21_2014_past_present_future_thumb.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/presentations/08_21_2014_past_present_future_thumb.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/presentations/08_21_2014_past_present_future_thumb.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: aurora/site/publish/documentation/0.12.0/images/presentations/09_20_2015_shipping_code_with_aurora_thumb.png
URL: http://svn.apache.org/viewvc/aurora/site/publish/documentation/0.12.0/images/presentations/09_20_2015_shipping_code_with_aurora_thumb.png?rev=1733548&view=auto
==============================================================================
Binary file - no diff available.

Propchange: aurora/site/publish/documentation/0.12.0/images/presentations/09_20_2015_shipping_code_with_aurora_thumb.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream