Initial commit of the hplefthand client

This commit is contained in:
Kurt Martin 2013-12-12 16:25:45 -08:00
commit fc5818cc11
93 changed files with 22625 additions and 0 deletions

202
LICENSE.txt Normal file
View File

@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

73
README.rst Normal file
View File

@ -0,0 +1,73 @@
HP LeftHand/StoreVirtual REST Client
===================
This is a Client library that can talk to the HP LeftHand/StoreVirtual Storage array.
The HP LeftHand storage array has a REST web service interface.
This client library implements a simple interface to talk with that REST
interface using the python httplib2 http library.
Requirements
============
This branch requires 11.5 version of the LeftHand OS firmware.
Capabilities
============
* Get Volume(s)
* Get Volume by Name
* Create Volume
* Delete Volume
* Modify Volume
* Clone Volume
* Get Snapshot(s)
* Delete Shapshot
* Get Shapshot by Name
* Create Snapshot
* Delete Snapshot
* Clone Snapshot
* Get Cluster(s)
* Get Cluster by Name
* Get Server(s)
* Get Server by Name
* Create Server
* Delete Server
* Add Server Access
* Remove Server Access
Installation
============
::
$ python setup.py install
Unit Tests
==========
::
$ pip install nose
$ pip install nose-testconfig
$ cd test
$ nosetests --tc-file config.ini
Folders
=======
* docs -- contains the documentation.
* hplefthandlient -- the actual client.py library
* test -- unit tests
* samples -- some sample uses
Documentation
=============
To view the built documentation point your browser to
::
python-hplefthand/docs/_build/html/index.html

153
docs/Makefile Normal file
View File

@ -0,0 +1,153 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
-rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/hplefthandclient.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/hplefthandclient.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/hplefthandclient"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/hplefthandclient"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
docs/_build/doctrees/api/index.doctree vendored Normal file

Binary file not shown.

BIN
docs/_build/doctrees/changelog.doctree vendored Normal file

Binary file not shown.

BIN
docs/_build/doctrees/environment.pickle vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
docs/_build/doctrees/index.doctree vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
docs/_build/doctrees/tutorial.doctree vendored Normal file

Binary file not shown.

4
docs/_build/html/.buildinfo vendored Normal file
View File

@ -0,0 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 526306b7904f34b2dc7f0e35d98b76a4
tags: fbb0d17656682115ca4d033fb2f83ba1

View File

@ -0,0 +1,128 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>hplefthandclient &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="../index.html" />
<link rel="up" title="Module code" href="index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U">Module code</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1>Source code for hplefthandclient</h1><div class="highlight"><pre>
<span class="c"># vim: tabstop=4 shiftwidth=4 softtabstop=4</span>
<span class="c">#</span>
<span class="c"># Copyright 2013 Hewlett Packard Development Company, L.P.</span>
<span class="c"># All Rights Reserved.</span>
<span class="c">#</span>
<span class="c"># Licensed under the Apache License, Version 2.0 (the &quot;License&quot;); you may</span>
<span class="c"># not use this file except in compliance with the License. You may obtain</span>
<span class="c"># a copy of the License at</span>
<span class="c">#</span>
<span class="c"># http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="c">#</span>
<span class="c"># Unless required by applicable law or agreed to in writing, software</span>
<span class="c"># distributed under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT</span>
<span class="c"># WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the</span>
<span class="c"># License for the specific language governing permissions and limitations</span>
<span class="c"># under the License.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">HP LeftHand REST Client</span>
<span class="sd">:Author: Walter A. Boring IV</span>
<span class="sd">:Copyright: Copyright 2013, Hewlett Packard Development Company, L.P.</span>
<span class="sd">:License: Apache v2.0</span>
<span class="sd"> </span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="n">version_tuple</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_version_string</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">version_tuple</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="nb">basestring</span><span class="p">):</span>
<span class="k">return</span> <span class="s">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">version_tuple</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">version_tuple</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">return</span> <span class="s">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">version_tuple</span><span class="p">))</span>
<span class="n">version</span> <span class="o">=</span> <span class="n">get_version_string</span><span class="p">()</span>
<span class="sd">&quot;&quot;&quot;Current version of HPLeftHandClient.&quot;&quot;&quot;</span>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="index.html" >Module code</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@ -0,0 +1,130 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>hplefthandclient.__init__ &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="../../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="../../index.html" />
<link rel="up" title="hplefthandclient" href="../hplefthandclient.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >Module code</a> &raquo;</li>
<li><a href="../hplefthandclient.html" accesskey="U">hplefthandclient</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1>Source code for hplefthandclient.__init__</h1><div class="highlight"><pre>
<span class="c"># vim: tabstop=4 shiftwidth=4 softtabstop=4</span>
<span class="c">#</span>
<span class="c"># Copyright 2013 Hewlett Packard Development Company, L.P.</span>
<span class="c"># All Rights Reserved.</span>
<span class="c">#</span>
<span class="c"># Licensed under the Apache License, Version 2.0 (the &quot;License&quot;); you may</span>
<span class="c"># not use this file except in compliance with the License. You may obtain</span>
<span class="c"># a copy of the License at</span>
<span class="c">#</span>
<span class="c"># http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="c">#</span>
<span class="c"># Unless required by applicable law or agreed to in writing, software</span>
<span class="c"># distributed under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT</span>
<span class="c"># WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the</span>
<span class="c"># License for the specific language governing permissions and limitations</span>
<span class="c"># under the License.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">HP LeftHand REST Client</span>
<span class="sd">:Author: Walter A. Boring IV</span>
<span class="sd">:Copyright: Copyright 2013, Hewlett Packard Development Company, L.P.</span>
<span class="sd">:License: Apache v2.0</span>
<span class="sd"> </span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="n">version_tuple</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
<div class="viewcode-block" id="get_version_string"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.__init__.get_version_string">[docs]</a><span class="k">def</span> <span class="nf">get_version_string</span><span class="p">():</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">version_tuple</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="nb">basestring</span><span class="p">):</span>
<span class="k">return</span> <span class="s">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">version_tuple</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">version_tuple</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">return</span> <span class="s">&#39;.&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">version_tuple</span><span class="p">))</span>
</div>
<span class="n">version</span> <span class="o">=</span> <span class="n">get_version_string</span><span class="p">()</span>
<span class="sd">&quot;&quot;&quot;Current version of HPLeftHandClient.&quot;&quot;&quot;</span>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >Module code</a> &raquo;</li>
<li><a href="../hplefthandclient.html" >hplefthandclient</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@ -0,0 +1,594 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>hplefthandclient.client &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="../../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="../../index.html" />
<link rel="up" title="hplefthandclient" href="../hplefthandclient.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >Module code</a> &raquo;</li>
<li><a href="../hplefthandclient.html" accesskey="U">hplefthandclient</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1>Source code for hplefthandclient.client</h1><div class="highlight"><pre>
<span class="c"># vim: tabstop=4 shiftwidth=4 softtabstop=4</span>
<span class="c">#</span>
<span class="c"># Copyright 2012 Hewlett Packard Development Company, L.P.</span>
<span class="c"># All Rights Reserved.</span>
<span class="c">#</span>
<span class="c"># Licensed under the Apache License, Version 2.0 (the &quot;License&quot;); you may</span>
<span class="c"># not use this file except in compliance with the License. You may obtain</span>
<span class="c"># a copy of the License at</span>
<span class="c">#</span>
<span class="c"># http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="c">#</span>
<span class="c"># Unless required by applicable law or agreed to in writing, software</span>
<span class="c"># distributed under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT</span>
<span class="c"># WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the</span>
<span class="c"># License for the specific language governing permissions and limitations</span>
<span class="c"># under the License.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">HPLeftHand REST Client</span>
<span class="sd">.. module: HPLeftHandClient</span>
<span class="sd">.. moduleauthor: Kurt Martin</span>
<span class="sd">.. moduleauthor: Walter A. Boring IV</span>
<span class="sd">:Author: Kurt Martin</span>
<span class="sd">:Description: This is the LeftHand/StoreVirtual Client that talks to the</span>
<span class="sd">LeftHand OS REST Service.</span>
<span class="sd">This client requires and works with version 11.5 of the LeftHand firmware</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">hplefthandclient</span> <span class="kn">import</span> <span class="n">http</span>
<div class="viewcode-block" id="HPLeftHandClient"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient">[docs]</a><span class="k">class</span> <span class="nc">HPLeftHandClient</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">api_url</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">api_url</span> <span class="o">=</span> <span class="n">api_url</span>
<span class="bp">self</span><span class="o">.</span><span class="n">http</span> <span class="o">=</span> <span class="n">http</span><span class="o">.</span><span class="n">HTTPJSONRESTClient</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">api_url</span><span class="p">)</span>
<div class="viewcode-block" id="HPLeftHandClient.debug_rest"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.debug_rest">[docs]</a> <span class="k">def</span> <span class="nf">debug_rest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">flag</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This is useful for debugging requests to 3PAR</span>
<span class="sd"> :param flag: set to True to enable debugging</span>
<span class="sd"> :type flag: bool</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">set_debug_flag</span><span class="p">(</span><span class="n">flag</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.login"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.login">[docs]</a> <span class="k">def</span> <span class="nf">login</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This authenticates against the LH OS REST server and creates a session.</span>
<span class="sd"> :param username: The username</span>
<span class="sd"> :type username: str</span>
<span class="sd"> :param password: The password</span>
<span class="sd"> :type password: str</span>
<span class="sd"> :returns: None</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">authenticate</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.logout"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.logout">[docs]</a> <span class="k">def</span> <span class="nf">logout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This destroys the session and logs out from the LH OS server</span>
<span class="sd"> :returns: None</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">unauthenticate</span><span class="p">()</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.getClusters"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getClusters">[docs]</a> <span class="k">def</span> <span class="nf">getClusters</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the list of Clusters</span>
<span class="sd"> :returns: list of Clusters</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/clusters&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.getCluster"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getCluster">[docs]</a> <span class="k">def</span> <span class="nf">getCluster</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cluster_id</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get information about a Cluster</span>
<span class="sd"> :param cluster_id: The id of the cluster to find</span>
<span class="sd"> :type cluster_id: str</span>
<span class="sd"> :returns: cluster</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/clusters/</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">cluster_id</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.getClusterByName"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getClusterByName">[docs]</a> <span class="k">def</span> <span class="nf">getClusterByName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get information about a cluster by name</span>
<span class="sd"> :param name: The name of the cluster to find</span>
<span class="sd"> :type name: str</span>
<span class="sd"> :returns: cluster</span>
<span class="sd"> :raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -</span>
<span class="sd"> NON_EXISTENT_CLUSTER - cluster doesn&#39;t exist</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/clusters?name=</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.getServers"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getServers">[docs]</a> <span class="k">def</span> <span class="nf">getServers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the list of Servers</span>
<span class="sd"> :returns: list of Servers</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/servers&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.getServer"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getServer">[docs]</a> <span class="k">def</span> <span class="nf">getServer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">server_id</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get information about a server</span>
<span class="sd"> :param server_id: The id of the server to find</span>
<span class="sd"> :type server_id: str</span>
<span class="sd"> :returns: server</span>
<span class="sd"> :raises: :class:`~hplefthandclient.exceptions.HTTPServerError`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/servers/</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">server_id</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.getServerByName"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getServerByName">[docs]</a> <span class="k">def</span> <span class="nf">getServerByName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get information about a server by name</span>
<span class="sd"> :param name: The name of the server to find</span>
<span class="sd"> :type name: str</span>
<span class="sd"> :returns: server</span>
<span class="sd"> :raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -</span>
<span class="sd"> NON_EXISTENT_SERVER - server doesn&#39;t exist</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/servers?name=</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.createServer"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.createServer">[docs]</a> <span class="k">def</span> <span class="nf">createServer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">iqn</span><span class="p">,</span> <span class="n">optional</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create a server by name</span>
<span class="sd"> :param name: The name of the server to create</span>
<span class="sd"> :type name: str</span>
<span class="sd"> :param iqn: The iSCSI qualified name</span>
<span class="sd"> :type name: str</span>
<span class="sd"> :param optional: Dictionary of optional params</span>
<span class="sd"> :type optional: dict</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> optional = {</span>
<span class="sd"> &#39;description&#39; : &quot;some comment&quot;,</span>
<span class="sd"> &#39;iscsiEnabled&#39; : True,</span>
<span class="sd"> &#39;chapName&#39;: &quot;some chap name&quot;,</span>
<span class="sd"> &#39;chapAuthenticationRequired&#39;: False,</span>
<span class="sd"> &#39;chapInitiatorSecret&#39;: &quot;initiator secret&quot;,</span>
<span class="sd"> &#39;chapTargetSecret&#39;: &quot;target secret&quot;,</span>
<span class="sd"> &#39;iscsiLoadBalancingEnabled&#39;: True,</span>
<span class="sd"> &#39;controllingServerName&#39;: &quot;server name&quot;,</span>
<span class="sd"> &#39;fibreChannelEnabled&#39;: False,</span>
<span class="sd"> &#39;inServerCluster&quot;: True</span>
<span class="sd"> }</span>
<span class="sd"> :returns: server</span>
<span class="sd"> :raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -</span>
<span class="sd"> NON_EXISTENT_SERVER - server doesn&#39;t exist</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">info</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;name&#39;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="s">&#39;iscsiIQN&#39;</span><span class="p">:</span> <span class="n">iqn</span><span class="p">}</span>
<span class="k">if</span> <span class="n">optional</span><span class="p">:</span>
<span class="n">info</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mergeDict</span><span class="p">(</span><span class="n">info</span><span class="p">,</span> <span class="n">optional</span><span class="p">)</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s">&#39;/servers&#39;</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="n">info</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.deleteServer"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.deleteServer">[docs]</a> <span class="k">def</span> <span class="nf">deleteServer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">server_id</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Delete a Server</span>
<span class="sd"> :param server_id: the server ID to delete</span>
<span class="sd"> :raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -</span>
<span class="sd"> NON_EXISTENT_SERVER - The server does not exist</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="s">&#39;/servers/</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">server_id</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.getSnapshots"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getSnapshots">[docs]</a> <span class="k">def</span> <span class="nf">getSnapshots</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the list of Snapshots</span>
<span class="sd"> :returns: list of Snapshots</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/snapshots&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.getSnapshot"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getSnapshot">[docs]</a> <span class="k">def</span> <span class="nf">getSnapshot</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">snapshot_id</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get information about a Snapshot</span>
<span class="sd"> :returns: snapshot</span>
<span class="sd"> :raises: :class:`~hplefthandclient.exceptions.HTTPServerError`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/snapshots/</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">snapshot_id</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.getSnapshotByName"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getSnapshotByName">[docs]</a> <span class="k">def</span> <span class="nf">getSnapshotByName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get information about a snapshot by name</span>
<span class="sd"> :param name: The name of the snapshot to find</span>
<span class="sd"> :returns: volume</span>
<span class="sd"> :raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -</span>
<span class="sd"> NON_EXISTENT_SNAP - shapshot doesn&#39;t exist</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/snapshots?name=</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.createSnapshot"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.createSnapshot">[docs]</a> <span class="k">def</span> <span class="nf">createSnapshot</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">source_volume_id</span><span class="p">,</span> <span class="n">optional</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create a snapshot of an existing Volume</span>
<span class="sd"> :param name: Name of the Snapshot</span>
<span class="sd"> :type name: str</span>
<span class="sd"> :param source_volume_id: The volume you want to snapshot</span>
<span class="sd"> :type source_volume_id: int</span>
<span class="sd"> :param optional: Dictionary of optional params</span>
<span class="sd"> :type optional: dict</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> optional = {</span>
<span class="sd"> &#39;description&#39; : &quot;some comment&quot;,</span>
<span class="sd"> &#39;inheritAccess&#39; : false</span>
<span class="sd"> }</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">parameters</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;name&#39;</span><span class="p">:</span> <span class="n">name</span><span class="p">}</span>
<span class="k">if</span> <span class="n">optional</span><span class="p">:</span>
<span class="n">parameters</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mergeDict</span><span class="p">(</span><span class="n">parameters</span><span class="p">,</span> <span class="n">optional</span><span class="p">)</span>
<span class="n">info</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;action&#39;</span><span class="p">:</span> <span class="s">&#39;createSnapshot&#39;</span><span class="p">,</span>
<span class="s">&#39;parameters&#39;</span><span class="p">:</span> <span class="n">parameters</span><span class="p">}</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s">&#39;/volumes/</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">source_volume_id</span><span class="p">,</span>
<span class="n">body</span><span class="o">=</span><span class="n">info</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.deleteSnapshot"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.deleteSnapshot">[docs]</a> <span class="k">def</span> <span class="nf">deleteSnapshot</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">snapshot_id</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Delete a Snapshot</span>
<span class="sd"> :param snapshot_id: the snapshot ID to delete</span>
<span class="sd"> :raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -</span>
<span class="sd"> NON_EXISTENT_SNAPSHOT - The snapshot does not exist</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="s">&#39;/snapshots/</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">snapshot_id</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.cloneSnapshot"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.cloneSnapshot">[docs]</a> <span class="k">def</span> <span class="nf">cloneSnapshot</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">source_snapshot_id</span><span class="p">,</span> <span class="n">optional</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create a clone of an existing Shapshot</span>
<span class="sd"> :param name: Name of the Snapshot clone</span>
<span class="sd"> :type name: str</span>
<span class="sd"> :param source_snapshot_id: The snapshot you want to clone</span>
<span class="sd"> :type source_snapshot_id: int</span>
<span class="sd"> :param optional: Dictionary of optional params</span>
<span class="sd"> :type optional: dict</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> optional = {</span>
<span class="sd"> &#39;description&#39; : &quot;some comment&quot;</span>
<span class="sd"> }</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">parameters</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;name&#39;</span><span class="p">:</span> <span class="n">name</span><span class="p">}</span>
<span class="k">if</span> <span class="n">optional</span><span class="p">:</span>
<span class="n">parameters</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mergeDict</span><span class="p">(</span><span class="n">parameters</span><span class="p">,</span> <span class="n">optional</span><span class="p">)</span>
<span class="n">info</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;action&#39;</span><span class="p">:</span> <span class="s">&#39;createSmartClone&#39;</span><span class="p">,</span>
<span class="s">&#39;parameters&#39;</span><span class="p">:</span> <span class="n">parameters</span><span class="p">}</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s">&#39;/snapshots/</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">source_snapshot_id</span><span class="p">,</span>
<span class="n">body</span><span class="o">=</span><span class="n">info</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.getVolumes"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getVolumes">[docs]</a> <span class="k">def</span> <span class="nf">getVolumes</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the list of Volumes</span>
<span class="sd"> :returns: list of Volumes</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/volumes&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.getVolume"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getVolume">[docs]</a> <span class="k">def</span> <span class="nf">getVolume</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">volume_id</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get information about a volume</span>
<span class="sd"> :param volume_id: The id of the volume to find</span>
<span class="sd"> :type volume_id: str</span>
<span class="sd"> :returns: volume</span>
<span class="sd"> :raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -</span>
<span class="sd"> NON_EXISTENT_VOL - volume doesn&#39;t exist</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/volumes/</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">volume_id</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.getVolumeByName"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getVolumeByName">[docs]</a> <span class="k">def</span> <span class="nf">getVolumeByName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get information about a volume by name</span>
<span class="sd"> :param name: The name of the volume to find</span>
<span class="sd"> :type volume_id: str</span>
<span class="sd"> :returns: volume</span>
<span class="sd"> :raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -</span>
<span class="sd"> NON_EXISTENT_VOL - volume doesn&#39;t exist</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;/volumes?name=</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.createVolume"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.createVolume">[docs]</a> <span class="k">def</span> <span class="nf">createVolume</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">cluster_id</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">optional</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot; Create a new volume</span>
<span class="sd"> :param name: the name of the volume</span>
<span class="sd"> :type name: str</span>
<span class="sd"> :param cluster_id: the cluster Id</span>
<span class="sd"> :type cluster_id: int</span>
<span class="sd"> :param sizeKB: size in KB for the volume</span>
<span class="sd"> :type sizeKB: int</span>
<span class="sd"> :param optional: dict of other optional items</span>
<span class="sd"> :type optional: dict</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> optional = {</span>
<span class="sd"> &#39;description&#39;: &#39;some comment&#39;,</span>
<span class="sd"> &#39;isThinProvisioned&#39;: &#39;true&#39;,</span>
<span class="sd"> &#39;autogrowSeconds&#39;: 200,</span>
<span class="sd"> &#39;clusterName&#39;: &#39;somename&#39;,</span>
<span class="sd"> &#39;isAdaptiveOptimizationEnabled&#39;: &#39;true&#39;,</span>
<span class="sd"> &#39;dataProtectionLevel&#39;: 2,</span>
<span class="sd"> }</span>
<span class="sd"> :returns: List of Volumes</span>
<span class="sd"> :raises: :class:`~hplefthandclient.exceptions.HTTPConflict` -</span>
<span class="sd"> EXISTENT_SV - Volume Exists already</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">info</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;name&#39;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="s">&#39;clusterID&#39;</span><span class="p">:</span> <span class="n">cluster_id</span><span class="p">,</span> <span class="s">&#39;size&#39;</span><span class="p">:</span> <span class="n">size</span><span class="p">}</span>
<span class="k">if</span> <span class="n">optional</span><span class="p">:</span>
<span class="n">info</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mergeDict</span><span class="p">(</span><span class="n">info</span><span class="p">,</span> <span class="n">optional</span><span class="p">)</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s">&#39;/volumes&#39;</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="n">info</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.deleteVolume"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.deleteVolume">[docs]</a> <span class="k">def</span> <span class="nf">deleteVolume</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">volume_id</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Delete a volume</span>
<span class="sd"> :param name: the name of the volume</span>
<span class="sd"> :type name: str</span>
<span class="sd"> :raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -</span>
<span class="sd"> NON_EXISTENT_VOL - The volume does not exist</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="s">&#39;/volumes/</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">volume_id</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.modifyVolume"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.modifyVolume">[docs]</a> <span class="k">def</span> <span class="nf">modifyVolume</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">volume_id</span><span class="p">,</span> <span class="n">optional</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Modify an existing volume.</span>
<span class="sd"> :param volume_id: The id of the volume to find</span>
<span class="sd"> :type volume_id: str</span>
<span class="sd"> :returns: volume</span>
<span class="sd"> :raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -</span>
<span class="sd"> NON_EXISTENT_VOL - volume doesn&#39;t exist</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">info</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;volume_id&#39;</span><span class="p">:</span> <span class="n">volume_id</span><span class="p">}</span>
<span class="n">info</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mergeDict</span><span class="p">(</span><span class="n">info</span><span class="p">,</span> <span class="n">optional</span><span class="p">)</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="s">&#39;/volumes/</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">volume_id</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="n">info</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.cloneVolume"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.cloneVolume">[docs]</a> <span class="k">def</span> <span class="nf">cloneVolume</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">source_volume_id</span><span class="p">,</span> <span class="n">optional</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Create a clone of an existing Volume</span>
<span class="sd"> :param name: Name of the Volume clone</span>
<span class="sd"> :type name: str</span>
<span class="sd"> :param source_volume_id: The Volume you want to clone</span>
<span class="sd"> :type source_volume_id: int</span>
<span class="sd"> :param optional: Dictionary of optional params</span>
<span class="sd"> :type optional: dict</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> optional = {</span>
<span class="sd"> &#39;description&#39; : &quot;some comment&quot;</span>
<span class="sd"> }</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">parameters</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;name&#39;</span><span class="p">:</span> <span class="n">name</span><span class="p">}</span>
<span class="k">if</span> <span class="n">optional</span><span class="p">:</span>
<span class="n">parameters</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mergeDict</span><span class="p">(</span><span class="n">parameters</span><span class="p">,</span> <span class="n">optional</span><span class="p">)</span>
<span class="n">info</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;action&#39;</span><span class="p">:</span> <span class="s">&#39;createSmartClone&#39;</span><span class="p">,</span>
<span class="s">&#39;parameters&#39;</span><span class="p">:</span> <span class="n">parameters</span><span class="p">}</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s">&#39;/volumes/</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">source_volume_id</span><span class="p">,</span>
<span class="n">body</span><span class="o">=</span><span class="n">info</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.addServerAccess"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.addServerAccess">[docs]</a> <span class="k">def</span> <span class="nf">addServerAccess</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">volume_id</span><span class="p">,</span> <span class="n">server_id</span><span class="p">,</span> <span class="n">optional</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Assign a Volume to a Server</span>
<span class="sd"> :param volume_id: Volume ID of the volume</span>
<span class="sd"> :type name: int</span>
<span class="sd"> :param server_id: Server ID of the server to add the volume to</span>
<span class="sd"> :type source_volume_id: int</span>
<span class="sd"> :param optional: Dictionary of optional params</span>
<span class="sd"> :type optional: dict</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> optional = {</span>
<span class="sd"> &#39;Transport&#39; : 0,</span>
<span class="sd"> &#39;Lun&#39; : 1,</span>
<span class="sd"> }</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">parameters</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;serverID&#39;</span><span class="p">:</span> <span class="n">server_id</span><span class="p">,</span>
<span class="s">&#39;exclusiveAccess&#39;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s">&#39;readAccess&#39;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s">&#39;writeAccess&#39;</span><span class="p">:</span> <span class="bp">True</span><span class="p">}</span>
<span class="k">if</span> <span class="n">optional</span><span class="p">:</span>
<span class="n">parameters</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mergeDict</span><span class="p">(</span><span class="n">parameters</span><span class="p">,</span> <span class="n">optional</span><span class="p">)</span>
<span class="n">info</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;action&#39;</span><span class="p">:</span> <span class="s">&#39;addServerAccess&#39;</span><span class="p">,</span>
<span class="s">&#39;parameters&#39;</span><span class="p">:</span> <span class="n">parameters</span><span class="p">}</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s">&#39;/volumes/</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">volume_id</span><span class="p">,</span>
<span class="n">body</span><span class="o">=</span><span class="n">info</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<div class="viewcode-block" id="HPLeftHandClient.removeServerAccess"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.removeServerAccess">[docs]</a> <span class="k">def</span> <span class="nf">removeServerAccess</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">volume_id</span><span class="p">,</span> <span class="n">server_id</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Unassign a Volume from a Server</span>
<span class="sd"> :param volume_id: Volume ID of the volume</span>
<span class="sd"> :type name: int</span>
<span class="sd"> :param server_id: Server ID of the server to remove the volume fom</span>
<span class="sd"> :type source_volume_id: int</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">parameters</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;serverID&#39;</span><span class="p">:</span> <span class="n">server_id</span><span class="p">}</span>
<span class="n">info</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;action&#39;</span><span class="p">:</span> <span class="s">&#39;removeServerAccess&#39;</span><span class="p">,</span>
<span class="s">&#39;parameters&#39;</span><span class="p">:</span> <span class="n">parameters</span><span class="p">}</span>
<span class="n">response</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">http</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s">&#39;/volumes/</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">volume_id</span><span class="p">,</span>
<span class="n">body</span><span class="o">=</span><span class="n">info</span><span class="p">)</span>
<span class="k">return</span> <span class="n">body</span>
</div>
<span class="k">def</span> <span class="nf">_mergeDict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dict1</span><span class="p">,</span> <span class="n">dict2</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Safely merge 2 dictionaries together</span>
<span class="sd"> :param dict1: The first dictionary</span>
<span class="sd"> :type dict1: dict</span>
<span class="sd"> :param dict2: The second dictionary</span>
<span class="sd"> :type dict2: dict</span>
<span class="sd"> :returns: dict</span>
<span class="sd"> :raises Exception: dict1, dict2 is not a dictionary</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">dict1</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">dict</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s">&quot;dict1 is not a dictionary&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">dict2</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">dict</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s">&quot;dict2 is not a dictionary&quot;</span><span class="p">)</span>
<span class="n">dict3</span> <span class="o">=</span> <span class="n">dict1</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">dict3</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">dict2</span><span class="p">)</span>
<span class="k">return</span> <span class="n">dict3</span></div>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >Module code</a> &raquo;</li>
<li><a href="../hplefthandclient.html" >hplefthandclient</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@ -0,0 +1,404 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>hplefthandclient.exceptions &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="../../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="../../index.html" />
<link rel="up" title="hplefthandclient" href="../hplefthandclient.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >Module code</a> &raquo;</li>
<li><a href="../hplefthandclient.html" accesskey="U">hplefthandclient</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1>Source code for hplefthandclient.exceptions</h1><div class="highlight"><pre>
<span class="c"># vim: tabstop=4 shiftwidth=4 softtabstop=4</span>
<span class="c">#</span>
<span class="c"># Copyright 2012 Hewlett Packard Development Company, L.P.</span>
<span class="c"># All Rights Reserved.</span>
<span class="c">#</span>
<span class="c"># Licensed under the Apache License, Version 2.0 (the &quot;License&quot;); you may</span>
<span class="c"># not use this file except in compliance with the License. You may obtain</span>
<span class="c"># a copy of the License at</span>
<span class="c">#</span>
<span class="c"># http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="c">#</span>
<span class="c"># Unless required by applicable law or agreed to in writing, software</span>
<span class="c"># distributed under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT</span>
<span class="c"># WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the</span>
<span class="c"># License for the specific language governing permissions and limitations</span>
<span class="c"># under the License.</span>
<span class="sd">&quot;&quot;&quot; </span>
<span class="sd">Exceptions for the client</span>
<span class="sd">.. module: Exceptions</span>
<span class="sd">:Author: Walter A. Boring IV</span>
<span class="sd">:Description: This contains the HTTP exceptions that can come back from the REST calls</span>
<span class="sd">&quot;&quot;&quot;</span>
<div class="viewcode-block" id="UnsupportedVersion"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.UnsupportedVersion">[docs]</a><span class="k">class</span> <span class="nc">UnsupportedVersion</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Indicates that the user is trying to use an unsupported version of the API</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">pass</span>
</div>
<div class="viewcode-block" id="CommandError"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.CommandError">[docs]</a><span class="k">class</span> <span class="nc">CommandError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
<span class="k">pass</span>
</div>
<div class="viewcode-block" id="AuthorizationFailure"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.AuthorizationFailure">[docs]</a><span class="k">class</span> <span class="nc">AuthorizationFailure</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
<span class="k">pass</span>
</div>
<div class="viewcode-block" id="NoUniqueMatch"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.NoUniqueMatch">[docs]</a><span class="k">class</span> <span class="nc">NoUniqueMatch</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
<span class="k">pass</span>
</div>
<div class="viewcode-block" id="ClientException"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.ClientException">[docs]</a><span class="k">class</span> <span class="nc">ClientException</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The base exception class for all exceptions this library raises.</span>
<span class="sd"> :param error: The error array </span>
<span class="sd"> :type error: array</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">_error_code</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">_error_desc</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">_debug1</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">_debug2</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">error</span><span class="p">:</span>
<span class="k">if</span> <span class="s">&#39;messageID&#39;</span> <span class="ow">in</span> <span class="n">error</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_error_code</span> <span class="o">=</span> <span class="n">error</span><span class="p">[</span><span class="s">&#39;messageID&#39;</span><span class="p">]</span>
<span class="k">if</span> <span class="s">&#39;message&#39;</span> <span class="ow">in</span> <span class="n">error</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_error_desc</span> <span class="o">=</span> <span class="n">error</span><span class="p">[</span><span class="s">&#39;message&#39;</span><span class="p">]</span>
<span class="k">if</span> <span class="s">&#39;debug1&#39;</span> <span class="ow">in</span> <span class="n">error</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_debug1</span> <span class="o">=</span> <span class="n">error</span><span class="p">[</span><span class="s">&#39;debug1&#39;</span><span class="p">]</span>
<span class="k">if</span> <span class="s">&#39;debug2&#39;</span> <span class="ow">in</span> <span class="n">error</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_debug2</span> <span class="o">=</span> <span class="n">error</span><span class="p">[</span><span class="s">&#39;debug2&#39;</span><span class="p">]</span>
<div class="viewcode-block" id="ClientException.get_code"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.ClientException.get_code">[docs]</a> <span class="k">def</span> <span class="nf">get_code</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_error_code</span>
</div>
<div class="viewcode-block" id="ClientException.get_description"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.ClientException.get_description">[docs]</a> <span class="k">def</span> <span class="nf">get_description</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_error_desc</span>
</div>
<span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">formatted_string</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%s</span><span class="s"> (HTTP </span><span class="si">%s</span><span class="s">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_status</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_error_code</span><span class="p">:</span>
<span class="n">formatted_string</span> <span class="o">+=</span> <span class="s">&quot; </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_error_code</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_error_desc</span><span class="p">:</span>
<span class="n">formatted_string</span> <span class="o">+=</span> <span class="s">&quot; - </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_error_desc</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_debug1</span><span class="p">:</span>
<span class="n">formatted_string</span> <span class="o">+=</span> <span class="s">&quot; (1: &#39;</span><span class="si">%s</span><span class="s">&#39;)&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_debug1</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_debug2</span><span class="p">:</span>
<span class="n">formatted_string</span> <span class="o">+=</span> <span class="s">&quot; (2: &#39;</span><span class="si">%s</span><span class="s">&#39;)&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_debug2</span>
<span class="k">return</span> <span class="n">formatted_string</span>
<span class="c">##</span>
<span class="c">## 400 Errors</span>
<span class="c">##</span>
</div>
<div class="viewcode-block" id="HTTPBadRequest"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPBadRequest">[docs]</a><span class="k">class</span> <span class="nc">HTTPBadRequest</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 400 - Bad request: you sent some malformed data.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">400</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Bad request&quot;</span>
</div>
<div class="viewcode-block" id="HTTPUnauthorized"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPUnauthorized">[docs]</a><span class="k">class</span> <span class="nc">HTTPUnauthorized</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 401 - Unauthorized: bad credentials.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">401</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Unauthorized&quot;</span>
</div>
<div class="viewcode-block" id="HTTPForbidden"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPForbidden">[docs]</a><span class="k">class</span> <span class="nc">HTTPForbidden</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 403 - Forbidden: your credentials don&#39;t give you access to this</span>
<span class="sd"> resource.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">403</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Forbidden&quot;</span>
</div>
<div class="viewcode-block" id="HTTPNotFound"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPNotFound">[docs]</a><span class="k">class</span> <span class="nc">HTTPNotFound</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 404 - Not found</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">404</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Not found&quot;</span>
</div>
<div class="viewcode-block" id="HTTPMethodNotAllowed"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPMethodNotAllowed">[docs]</a><span class="k">class</span> <span class="nc">HTTPMethodNotAllowed</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 405 - Method not Allowed </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">405</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Method Not Allowed&quot;</span>
</div>
<div class="viewcode-block" id="HTTPNotAcceptable"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPNotAcceptable">[docs]</a><span class="k">class</span> <span class="nc">HTTPNotAcceptable</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 406 - Method not Acceptable</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">406</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Method Not Acceptable&quot;</span>
</div>
<div class="viewcode-block" id="HTTPProxyAuthRequired"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPProxyAuthRequired">[docs]</a><span class="k">class</span> <span class="nc">HTTPProxyAuthRequired</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 407 - The client must first authenticate itself with the proxy.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">407</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Proxy Authentication Required&quot;</span>
</div>
<div class="viewcode-block" id="HTTPRequestTimeout"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestTimeout">[docs]</a><span class="k">class</span> <span class="nc">HTTPRequestTimeout</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 408 - The server timed out waiting for the request.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">408</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Request Timeout&quot;</span>
</div>
<div class="viewcode-block" id="HTTPConflict"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPConflict">[docs]</a><span class="k">class</span> <span class="nc">HTTPConflict</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 409 - Conflict: A Conflict happened on the server</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">409</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Conflict&quot;</span>
</div>
<div class="viewcode-block" id="HTTPGone"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPGone">[docs]</a><span class="k">class</span> <span class="nc">HTTPGone</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 410 - Indicates that the resource requested is no longer available and will not be available again.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">410</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Gone&quot;</span>
</div>
<div class="viewcode-block" id="HTTPLengthRequired"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPLengthRequired">[docs]</a><span class="k">class</span> <span class="nc">HTTPLengthRequired</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 411 - The request did not specify the length of its content, which is required by the requested resource.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">411</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Length Required&quot;</span>
</div>
<div class="viewcode-block" id="HTTPPreconditionFailed"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPPreconditionFailed">[docs]</a><span class="k">class</span> <span class="nc">HTTPPreconditionFailed</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 412 - The server does not meet one of the preconditions that the requester put on the request.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">412</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Over limit&quot;</span>
</div>
<div class="viewcode-block" id="HTTPRequestEntityTooLarge"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestEntityTooLarge">[docs]</a><span class="k">class</span> <span class="nc">HTTPRequestEntityTooLarge</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 413 - The request is larger than the server is willing or able to process</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">413</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Request Entity Too Large&quot;</span>
</div>
<div class="viewcode-block" id="HTTPRequestURITooLong"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestURITooLong">[docs]</a><span class="k">class</span> <span class="nc">HTTPRequestURITooLong</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 414 - The URI provided was too long for the server to process.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">414</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Request URI Too Large&quot;</span>
</div>
<div class="viewcode-block" id="HTTPUnsupportedMediaType"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPUnsupportedMediaType">[docs]</a><span class="k">class</span> <span class="nc">HTTPUnsupportedMediaType</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 415 - The request entity has a media type which the server or resource does not support.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">415</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Unsupported Media Type&quot;</span>
</div>
<div class="viewcode-block" id="HTTPRequestedRangeNotSatisfiable"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestedRangeNotSatisfiable">[docs]</a><span class="k">class</span> <span class="nc">HTTPRequestedRangeNotSatisfiable</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 416 - The client has asked for a portion of the file, but the server cannot supply that portion.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">416</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Requested Range Not Satisfiable&quot;</span>
</div>
<div class="viewcode-block" id="HTTPExpectationFailed"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPExpectationFailed">[docs]</a><span class="k">class</span> <span class="nc">HTTPExpectationFailed</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 417 - The server cannot meet the requirements of the Expect request-header field.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">417</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Expectation Failed&quot;</span>
</div>
<div class="viewcode-block" id="HTTPTeaPot"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPTeaPot">[docs]</a><span class="k">class</span> <span class="nc">HTTPTeaPot</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 418 - I&#39;m a Tea Pot</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">418</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;I&#39;m A Teapot. (RFC 2324)&quot;</span>
<span class="c">##</span>
<span class="c">## 500 Errors</span>
<span class="c">##</span>
</div>
<div class="viewcode-block" id="HTTPServerError"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPServerError">[docs]</a><span class="k">class</span> <span class="nc">HTTPServerError</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 500 - </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">500</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Error&quot;</span>
<span class="c"># NotImplemented is a python keyword.</span></div>
<div class="viewcode-block" id="HTTPNotImplemented"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPNotImplemented">[docs]</a><span class="k">class</span> <span class="nc">HTTPNotImplemented</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 501 - Not Implemented: the server does not support this operation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">501</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Not Implemented&quot;</span>
</div>
<div class="viewcode-block" id="HTTPBadGateway"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPBadGateway">[docs]</a><span class="k">class</span> <span class="nc">HTTPBadGateway</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 502 - The server was acting as a gateway or proxy and received an invalid response from the upstream server. </span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">502</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Bad Gateway&quot;</span>
</div>
<div class="viewcode-block" id="HTTPServiceUnavailable"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPServiceUnavailable">[docs]</a><span class="k">class</span> <span class="nc">HTTPServiceUnavailable</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 503 - The server is currently unavailable</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">503</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Service Unavailable&quot;</span>
</div>
<div class="viewcode-block" id="HTTPGatewayTimeout"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPGatewayTimeout">[docs]</a><span class="k">class</span> <span class="nc">HTTPGatewayTimeout</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 504 - The server was acting as a gateway or proxy and did not receive a timely response from the upstream server.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">504</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Gateway Timeout&quot;</span>
</div>
<div class="viewcode-block" id="HTTPVersionNotSupported"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPVersionNotSupported">[docs]</a><span class="k">class</span> <span class="nc">HTTPVersionNotSupported</span><span class="p">(</span><span class="n">ClientException</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> HTTP 505 - The server does not support the HTTP protocol version used in the request.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">http_status</span> <span class="o">=</span> <span class="mi">505</span>
<span class="n">message</span> <span class="o">=</span> <span class="s">&quot;Version Not Supported&quot;</span>
<span class="c"># In Python 2.4 Exception is old-style and thus doesn&#39;t have a __subclasses__()</span>
<span class="c"># so we can do this:</span>
<span class="c"># _code_map = dict((c.http_status, c)</span>
<span class="c"># for c in ClientException.__subclasses__())</span>
<span class="c">#</span>
<span class="c"># Instead, we have to hardcode it:</span></div>
<span class="n">_code_map</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">((</span><span class="n">c</span><span class="o">.</span><span class="n">http_status</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="p">[</span><span class="n">HTTPBadRequest</span><span class="p">,</span> <span class="n">HTTPUnauthorized</span><span class="p">,</span>
<span class="n">HTTPForbidden</span><span class="p">,</span> <span class="n">HTTPNotFound</span><span class="p">,</span> <span class="n">HTTPMethodNotAllowed</span><span class="p">,</span>
<span class="n">HTTPNotAcceptable</span><span class="p">,</span> <span class="n">HTTPProxyAuthRequired</span><span class="p">,</span> <span class="n">HTTPRequestTimeout</span><span class="p">,</span>
<span class="n">HTTPConflict</span><span class="p">,</span> <span class="n">HTTPGone</span><span class="p">,</span> <span class="n">HTTPLengthRequired</span><span class="p">,</span>
<span class="n">HTTPPreconditionFailed</span><span class="p">,</span> <span class="n">HTTPRequestEntityTooLarge</span><span class="p">,</span>
<span class="n">HTTPRequestURITooLong</span><span class="p">,</span> <span class="n">HTTPUnsupportedMediaType</span><span class="p">,</span>
<span class="n">HTTPRequestedRangeNotSatisfiable</span><span class="p">,</span> <span class="n">HTTPExpectationFailed</span><span class="p">,</span>
<span class="n">HTTPTeaPot</span><span class="p">,</span> <span class="n">HTTPServerError</span><span class="p">,</span>
<span class="n">HTTPNotImplemented</span><span class="p">,</span> <span class="n">HTTPBadGateway</span><span class="p">,</span>
<span class="n">HTTPServiceUnavailable</span><span class="p">,</span> <span class="n">HTTPGatewayTimeout</span><span class="p">,</span>
<span class="n">HTTPVersionNotSupported</span><span class="p">])</span>
<div class="viewcode-block" id="from_response"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.exceptions.from_response">[docs]</a><span class="k">def</span> <span class="nf">from_response</span><span class="p">(</span><span class="n">response</span><span class="p">,</span> <span class="n">body</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return an instance of an ClientException or subclass</span>
<span class="sd"> based on an httplib2 response.</span>
<span class="sd"> Usage:: </span>
<span class="sd"> resp, body = http.request(...)</span>
<span class="sd"> if resp.status != 200:</span>
<span class="sd"> raise exception_from_response(resp, body)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">cls</span> <span class="o">=</span> <span class="n">_code_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">status</span><span class="p">,</span> <span class="n">ClientException</span><span class="p">)</span>
<span class="k">return</span> <span class="n">cls</span><span class="p">(</span><span class="n">body</span><span class="p">)</span></div>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >Module code</a> &raquo;</li>
<li><a href="../hplefthandclient.html" >hplefthandclient</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@ -0,0 +1,427 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>hplefthandclient.http &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="../../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="../../index.html" />
<link rel="up" title="hplefthandclient" href="../hplefthandclient.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >Module code</a> &raquo;</li>
<li><a href="../hplefthandclient.html" accesskey="U">hplefthandclient</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1>Source code for hplefthandclient.http</h1><div class="highlight"><pre>
<span class="c"># vim: tabstop=4 shiftwidth=4 softtabstop=4</span>
<span class="c">#</span>
<span class="c"># Copyright 2013 Hewlett Packard Development Company, L.P.</span>
<span class="c"># All Rights Reserved.</span>
<span class="c">#</span>
<span class="c"># Licensed under the Apache License, Version 2.0 (the &quot;License&quot;); you may</span>
<span class="c"># not use this file except in compliance with the License. You may obtain</span>
<span class="c"># a copy of the License at</span>
<span class="c">#</span>
<span class="c"># http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="c">#</span>
<span class="c"># Unless required by applicable law or agreed to in writing, software</span>
<span class="c"># distributed under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT</span>
<span class="c"># WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the</span>
<span class="c"># License for the specific language governing permissions and limitations</span>
<span class="c"># under the License.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd">HPLeftHand HTTP Client</span>
<span class="sd">:Author: Walter A. Boring IV</span>
<span class="sd">:Description: This is the HTTP Client that is used to make the actual calls.</span>
<span class="sd"> It includes the authentication that knows the cookie name for LH.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">import</span> <span class="nn">httplib2</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">pprint</span>
<span class="k">try</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">json</span>
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
<span class="kn">import</span> <span class="nn">simplejson</span> <span class="kn">as</span> <span class="nn">json</span>
<span class="kn">from</span> <span class="nn">hplefthandclient</span> <span class="kn">import</span> <span class="n">exceptions</span>
<div class="viewcode-block" id="HTTPJSONRESTClient"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient">[docs]</a><span class="k">class</span> <span class="nc">HTTPJSONRESTClient</span><span class="p">(</span><span class="n">httplib2</span><span class="o">.</span><span class="n">Http</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> An HTTP REST Client that sends and recieves JSON data as the body of the</span>
<span class="sd"> HTTP request.</span>
<span class="sd"> :param api_url: The url to the LH OS REST service</span>
<span class="sd"> ie. https://&lt;hostname or IP&gt;:&lt;port&gt;/lhos</span>
<span class="sd"> :type api_url: str</span>
<span class="sd"> :param insecure: Use https? requires a local certificate</span>
<span class="sd"> :type insecure: bool</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">USER_AGENT</span> <span class="o">=</span> <span class="s">&#39;python-hplefthandclient&#39;</span>
<span class="n">SESSION_COOKIE_NAME</span> <span class="o">=</span> <span class="s">&#39;Authorization&#39;</span>
<span class="c">#API_VERSION = &#39;X-API-Version&#39;</span>
<span class="c">#CHRP_VERSION = &#39;X_HP-CHRP-Client-Version&#39;</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">api_url</span><span class="p">,</span> <span class="n">insecure</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">http_log_debug</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">HTTPJSONRESTClient</span><span class="p">,</span>
<span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">disable_ssl_certificate_validation</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">session_key</span> <span class="o">=</span> <span class="bp">None</span>
<span class="c">#should be http://&lt;Server:Port&gt;/lhos</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_url</span><span class="p">(</span><span class="n">api_url</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">set_debug_flag</span><span class="p">(</span><span class="n">http_log_debug</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">times</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># [(&quot;item&quot;, starttime, endtime), ...]</span>
<span class="c"># httplib2 overrides</span>
<span class="bp">self</span><span class="o">.</span><span class="n">force_exception_to_status_code</span> <span class="o">=</span> <span class="bp">True</span>
<span class="c">#self.disable_ssl_certificate_validation = insecure</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
<div class="viewcode-block" id="HTTPJSONRESTClient.set_url"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.set_url">[docs]</a> <span class="k">def</span> <span class="nf">set_url</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">api_url</span><span class="p">):</span>
<span class="c">#should be http://&lt;Server:Port&gt;/lhos</span>
<span class="bp">self</span><span class="o">.</span><span class="n">api_url</span> <span class="o">=</span> <span class="n">api_url</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s">&#39;/&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">api_url</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">api_url</span>
</div>
<div class="viewcode-block" id="HTTPJSONRESTClient.set_debug_flag"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.set_debug_flag">[docs]</a> <span class="k">def</span> <span class="nf">set_debug_flag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">flag</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This turns on/off http request/response debugging output to console</span>
<span class="sd"> :param flag: Set to True to enable debugging output</span>
<span class="sd"> :type flag: bool</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">http_log_debug</span> <span class="o">=</span> <span class="n">flag</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_log_debug</span><span class="p">:</span>
<span class="n">ch</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">StreamHandler</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_logger</span><span class="o">.</span><span class="n">setLevel</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_logger</span><span class="o">.</span><span class="n">addHandler</span><span class="p">(</span><span class="n">ch</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="HTTPJSONRESTClient.authenticate"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.authenticate">[docs]</a> <span class="k">def</span> <span class="nf">authenticate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">optional</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This tries to create an authenticated session with the LH OS server</span>
<span class="sd"> :param user: The username</span>
<span class="sd"> :type user: str</span>
<span class="sd"> :param password: The password</span>
<span class="sd"> :type password: str</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c">#this prevens re-auth attempt if auth fails</span>
<span class="bp">self</span><span class="o">.</span><span class="n">auth_try</span> <span class="o">=</span> <span class="mi">1</span>
<span class="bp">self</span><span class="o">.</span><span class="n">session_key</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">info</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;user&#39;</span><span class="p">:</span> <span class="n">user</span><span class="p">,</span> <span class="s">&#39;password&#39;</span><span class="p">:</span> <span class="n">password</span><span class="p">}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_auth_optional</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">if</span> <span class="n">optional</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_auth_optional</span> <span class="o">=</span> <span class="n">optional</span>
<span class="n">info</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">optional</span><span class="p">)</span>
<span class="n">resp</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s">&#39;/credentials&#39;</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="n">info</span><span class="p">)</span>
<span class="k">if</span> <span class="n">body</span> <span class="ow">and</span> <span class="s">&#39;authToken&#39;</span> <span class="ow">in</span> <span class="n">body</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">session_key</span> <span class="o">=</span> <span class="n">body</span><span class="p">[</span><span class="s">&#39;authToken&#39;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">auth_try</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">user</span> <span class="o">=</span> <span class="n">user</span>
<span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">password</span>
</div>
<span class="k">def</span> <span class="nf">_reauth</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">authenticate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">user</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_auth_optional</span><span class="p">)</span>
<div class="viewcode-block" id="HTTPJSONRESTClient.unauthenticate"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.unauthenticate">[docs]</a> <span class="k">def</span> <span class="nf">unauthenticate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This clears the authenticated session with the LH server. It logs out.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c">#delete the session on the LH</span>
<span class="bp">self</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="s">&#39;/credentials/</span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_key</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">session_key</span> <span class="o">=</span> <span class="bp">None</span>
</div>
<div class="viewcode-block" id="HTTPJSONRESTClient.get_timings"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.get_timings">[docs]</a> <span class="k">def</span> <span class="nf">get_timings</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Ths gives an array of the request timings since last reset_timings call</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">times</span>
</div>
<div class="viewcode-block" id="HTTPJSONRESTClient.reset_timings"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.reset_timings">[docs]</a> <span class="k">def</span> <span class="nf">reset_timings</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This resets the request/response timings array</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">times</span> <span class="o">=</span> <span class="p">[]</span>
</div>
<span class="k">def</span> <span class="nf">_http_log_req</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_log_debug</span><span class="p">:</span>
<span class="k">return</span>
<span class="n">string_parts</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;curl -i&#39;</span><span class="p">]</span>
<span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
<span class="k">if</span> <span class="n">element</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&#39;GET&#39;</span><span class="p">,</span> <span class="s">&#39;POST&#39;</span><span class="p">):</span>
<span class="n">string_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&#39; -X </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">element</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">string_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&#39; </span><span class="si">%s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">element</span><span class="p">)</span>
<span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;headers&#39;</span><span class="p">]:</span>
<span class="n">header</span> <span class="o">=</span> <span class="s">&#39; -H &quot;</span><span class="si">%s</span><span class="s">: </span><span class="si">%s</span><span class="s">&quot;&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">element</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;headers&#39;</span><span class="p">][</span><span class="n">element</span><span class="p">])</span>
<span class="n">string_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">header</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">REQ: </span><span class="si">%s</span><span class="se">\n</span><span class="s">&quot;</span> <span class="o">%</span> <span class="s">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">string_parts</span><span class="p">))</span>
<span class="k">if</span> <span class="s">&#39;body&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;REQ BODY: </span><span class="si">%s</span><span class="se">\n</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;body&#39;</span><span class="p">]))</span>
<span class="k">def</span> <span class="nf">_http_log_resp</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">resp</span><span class="p">,</span> <span class="n">body</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">http_log_debug</span><span class="p">:</span>
<span class="k">return</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;RESP:</span><span class="si">%s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">pprint</span><span class="o">.</span><span class="n">pformat</span><span class="p">(</span><span class="n">resp</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s">&quot;RESP BODY:</span><span class="si">%s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
<div class="viewcode-block" id="HTTPJSONRESTClient.request"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.request">[docs]</a> <span class="k">def</span> <span class="nf">request</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="sd">&quot;&quot;&quot;</span>
<span class="sd"> This makes an HTTP Request to the LH server. You should use get, post,</span>
<span class="sd"> delete instead.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_key</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">auth_try</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s">&#39;headers&#39;</span><span class="p">,</span>
<span class="p">{})[</span><span class="bp">self</span><span class="o">.</span><span class="n">SESSION_COOKIE_NAME</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_key</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s">&#39;headers&#39;</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;headers&#39;</span><span class="p">,</span> <span class="p">{}))</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;headers&#39;</span><span class="p">][</span><span class="s">&#39;User-Agent&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">USER_AGENT</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;headers&#39;</span><span class="p">][</span><span class="s">&#39;Accept&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;application/json&#39;</span>
<span class="k">if</span> <span class="s">&#39;body&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;headers&#39;</span><span class="p">][</span><span class="s">&#39;Content-Type&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;application/json&#39;</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;body&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s">&#39;body&#39;</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_http_log_req</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">)</span>
<span class="n">resp</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">HTTPJSONRESTClient</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">request</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">_http_log_resp</span><span class="p">(</span><span class="n">resp</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
<span class="c"># Try and conver the body response to an object</span>
<span class="c"># This assumes the body of the reply is JSON</span>
<span class="k">if</span> <span class="n">body</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">body</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">body</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="c">#pprint.pprint(&quot;failed to decode json\n&quot;)</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">body</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">if</span> <span class="n">resp</span><span class="o">.</span><span class="n">status</span> <span class="o">&gt;=</span> <span class="mi">400</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">from_response</span><span class="p">(</span><span class="n">resp</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
<span class="k">return</span> <span class="n">resp</span><span class="p">,</span> <span class="n">body</span>
</div>
<span class="k">def</span> <span class="nf">_time_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="n">resp</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">method</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">times</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="s">&quot;</span><span class="si">%s</span><span class="s"> </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">method</span><span class="p">,</span> <span class="n">url</span><span class="p">),</span>
<span class="n">start_time</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()))</span>
<span class="k">return</span> <span class="n">resp</span><span class="p">,</span> <span class="n">body</span>
<span class="k">def</span> <span class="nf">_do_reauth</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">ex</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">print</span> <span class="s">&quot;_do_reauth called&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">auth_try</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_reauth</span><span class="p">()</span>
<span class="n">resp</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_time_request</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">api_url</span> <span class="o">+</span> <span class="n">url</span><span class="p">,</span>
<span class="n">method</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="n">resp</span><span class="p">,</span> <span class="n">body</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ex</span>
<span class="k">except</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">HTTPUnauthorized</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ex</span>
<span class="k">def</span> <span class="nf">_cs_request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="c"># Perform the request once. If we get a 401 back then it</span>
<span class="c"># might be because the auth token expired, so try to</span>
<span class="c"># re-authenticate and try again. If it still fails, bail.</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">resp</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_time_request</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">api_url</span> <span class="o">+</span> <span class="n">url</span><span class="p">,</span> <span class="n">method</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="n">resp</span><span class="p">,</span> <span class="n">body</span>
<span class="k">except</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">HTTPUnauthorized</span><span class="p">,</span> <span class="n">ex</span><span class="p">:</span>
<span class="k">print</span> <span class="s">&quot;_CS_REQUEST HTTPUnauthorized&quot;</span>
<span class="n">resp</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_do_reauth</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">ex</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="n">resp</span><span class="p">,</span> <span class="n">body</span>
<span class="k">except</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">HTTPForbidden</span><span class="p">,</span> <span class="n">ex</span><span class="p">:</span>
<span class="k">print</span> <span class="s">&quot;_CS_REQUEST HTTPForbidden&quot;</span>
<span class="n">resp</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_do_reauth</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">ex</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="n">resp</span><span class="p">,</span> <span class="n">body</span>
<div class="viewcode-block" id="HTTPJSONRESTClient.get"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.get">[docs]</a> <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">url</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Make an HTTP GET request to the server.</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> #example call</span>
<span class="sd"> try {</span>
<span class="sd"> headers, body = http.get(&#39;/volumes&#39;)</span>
<span class="sd"> } except exceptions.HTTPUnauthorized as ex:</span>
<span class="sd"> print &quot;Not logged in&quot;</span>
<span class="sd"> }</span>
<span class="sd"> :param url: The relative url from the LH api_url</span>
<span class="sd"> :type url: str</span>
<span class="sd"> :returns: headers - dict of HTTP Response headers</span>
<span class="sd"> :returns: body - the body of the response. If the body was JSON,</span>
<span class="sd"> it will be an object</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cs_request</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="s">&#39;GET&#39;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="HTTPJSONRESTClient.post"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.post">[docs]</a> <span class="k">def</span> <span class="nf">post</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Make an HTTP POST request to the server.</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> #example call</span>
<span class="sd"> try {</span>
<span class="sd"> info = {&#39;name&#39;: &#39;new volume name&#39;, &#39;sizeMiB&#39;: 300}</span>
<span class="sd"> headers, body = http.post(&#39;/volumes&#39;, body=info)</span>
<span class="sd"> } except exceptions.HTTPUnauthorized as ex:</span>
<span class="sd"> print &quot;Not logged in&quot;</span>
<span class="sd"> }</span>
<span class="sd"> :param url: The relative url from the LH api_url</span>
<span class="sd"> :type url: str</span>
<span class="sd"> :returns: headers - dict of HTTP Response headers</span>
<span class="sd"> :returns: body - the body of the response. If the body was JSON,</span>
<span class="sd"> it will be an object</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cs_request</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="s">&#39;POST&#39;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="HTTPJSONRESTClient.put"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.put">[docs]</a> <span class="k">def</span> <span class="nf">put</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Make an HTTP PUT request to the server.</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> #example call</span>
<span class="sd"> try {</span>
<span class="sd"> info = {&#39;name&#39;: &#39;something&#39;}</span>
<span class="sd"> headers, body = http.put(&#39;/volumes&#39;, body=info)</span>
<span class="sd"> } except exceptions.HTTPUnauthorized as ex:</span>
<span class="sd"> print &quot;Not logged in&quot;</span>
<span class="sd"> }</span>
<span class="sd"> :param url: The relative url from the LH api_url</span>
<span class="sd"> :type url: str</span>
<span class="sd"> :returns: headers - dict of HTTP Response headers</span>
<span class="sd"> :returns: body - the body of the response. If the body was JSON,</span>
<span class="sd"> it will be an object</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cs_request</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="s">&#39;PUT&#39;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</div>
<div class="viewcode-block" id="HTTPJSONRESTClient.delete"><a class="viewcode-back" href="../../hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.delete">[docs]</a> <span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Make an HTTP DELETE request to the server.</span>
<span class="sd"> .. code-block:: python</span>
<span class="sd"> #example call</span>
<span class="sd"> try {</span>
<span class="sd"> headers, body = http.delete(&#39;/volumes/%s&#39; % name)</span>
<span class="sd"> } except exceptions.HTTPUnauthorized as ex:</span>
<span class="sd"> print &quot;Not logged in&quot;</span>
<span class="sd"> }</span>
<span class="sd"> :param url: The relative url from the LH api_url</span>
<span class="sd"> :type url: str</span>
<span class="sd"> :returns: headers - dict of HTTP Response headers</span>
<span class="sd"> :returns: body - the body of the response. If the body was JSON,</span>
<span class="sd"> it will be an object</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cs_request</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="s">&#39;DELETE&#39;</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span></div></div>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >Module code</a> &raquo;</li>
<li><a href="../hplefthandclient.html" >hplefthandclient</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

96
docs/_build/html/_modules/index.html vendored Normal file
View File

@ -0,0 +1,96 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Overview: module code &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="../index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1>All modules for which code is available</h1>
<ul><li><a href="hplefthandclient.html">hplefthandclient</a></li>
<ul><li><a href="hplefthandclient/__init__.html">hplefthandclient.__init__</a></li>
<li><a href="hplefthandclient/client.html">hplefthandclient.client</a></li>
<li><a href="hplefthandclient/exceptions.html">hplefthandclient.exceptions</a></li>
<li><a href="hplefthandclient/http.html">hplefthandclient.http</a></li>
</ul></ul>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@ -0,0 +1,34 @@
:mod:`client` -- HPLeftHandClient
=================================
.. automodule:: hplefthandclient.client
:synopsis: HP LeftHand REST Web client
.. autoclass:: hplefthandclient.client.HPLeftHandClient(api_url)
.. automethod:: debug_rest
.. automethod:: login
.. automethod:: logout
.. automethod:: getClusters
.. automethod:: getCluster
.. automethod:: getClusterByName
.. automethod:: getServers
.. automethod:: getServer
.. automethod:: getServerByName
.. automethod:: createServer
.. automethod:: deleteServer
.. automethod:: getSnapshots
.. automethod:: getSnapshot
.. automethod:: getSnapshotByName
.. automethod:: createSnapshot
.. automethod:: deleteSnapshot
.. automethod:: cloneSnapshot
.. automethod:: getVolumes
.. automethod:: getVolume
.. automethod:: getVolumeByName
.. automethod:: createVolume
.. automethod:: deleteVolume
.. automethod:: modifyVolume
.. automethod:: cloneVolume
.. automethod:: addServerAccess
.. automethod:: removeServerAccess

View File

@ -0,0 +1,8 @@
:mod:`exceptions` -- HTTP Exceptions
====================================================
.. automodule:: hplefthandclient.exceptions
:synopsis: HTTP Exceptions
.. autoclass:: hplefthandclient.exceptions.HTTPNotFound
.. autoclass:: hplefthandclient.exceptions.HTTPBadRequest

View File

@ -0,0 +1,24 @@
:mod:`http` -- HTTP REST Base Class
====================================================
.. automodule:: hplefthandclient.http
:synopsis: HTTP REST Base Class
.. autoclass::hplefthandclient.http(api_url, [insecure=False[,http_log_debug=False]])
.. automethod:: authenticate
.. automethod:: unauthenticate
.. describe:: c[db_name] || c.db_name
Get the `db_name` :class:`~pymongo.database.Database` on :class:`Connection` `c`.
Raises :class:`~pymongo.errors.InvalidName` if an invalid database name is used.
.. autoattribute:: api_url
.. autoattribute:: http_log_debug
.. automethod:: request
.. automethod:: get
.. automethod:: post
.. automethod:: put
.. automethod:: delete

View File

@ -0,0 +1,18 @@
:mod:`client` -- HPLeftHandClient
=================================
.. automodule:: hplefthandclient
:synopsis: HP LeftHand REST Web client
.. autodata:: version
Sub-modules:
.. toctree::
:maxdepth: 2
client
exceptions
http

11
docs/_build/html/_sources/api/index.txt vendored Normal file
View File

@ -0,0 +1,11 @@
API Documentation
=================
The HP LeftHand Client package contains a :mod:`hplefthandclient` class which extends a more
generic :mod:`http` class for doing REST calls
.. toctree::
:maxdepth: 2
hplefthandclient/index

View File

@ -0,0 +1,9 @@
Changelog
=========
Changes in Version 1.0.0
------------------------
- First implementation of the REST API Client

View File

@ -0,0 +1,37 @@
hplefthandclient Package
========================
:mod:`hplefthandclient` Package
-------------------------------
.. automodule:: hplefthandclient.__init__
:members:
:undoc-members:
:show-inheritance:
:mod:`client` Module
--------------------
.. automodule:: hplefthandclient.client
:members:
:undoc-members:
:show-inheritance:
:mod:`exceptions` Module
------------------------
.. automodule:: hplefthandclient.exceptions
:members:
:undoc-members:
:show-inheritance:
:mod:`http` Module
------------------
.. automodule:: hplefthandclient.http
:members:
:undoc-members:
:show-inheritance:

65
docs/_build/html/_sources/index.txt vendored Normal file
View File

@ -0,0 +1,65 @@
HPLeftHandClient |release| Documentation
========================================
Overview
--------
**HPLeftHandClient** is a Python package containing a class that uses
HTTP REST calls to talk with an HP LeftHand/StoreVirtual drive array.
distribution containing tools for working with
`LeftHand/StoreVirtual Storage Arrays <http://www.hp.com/go/storevirtual>`_.
. This documentation attempts to explain
everything you need to know to use **HPLeftHandClient**.
:doc:`installation`
Instructions on how to get the distribution.
:doc:`tutorial`
Start here for a quick overview.
:doc:`api/index`
The complete API documentation, organized by module.
Issues
------
.. todo:: create the open source website
.. todo:: create the bug tracker
All issues should be reported (and can be tracked / voted for /
commented on) at the main `github issues
<https://github.com/WaltHP/python-hplefthandclient/issues>`_, in the "LeftHand Python Driver"
project.
Changes
-------
See the :doc:`changelog` for a full list of changes to HPLeftHandClient.
About This Documentation
------------------------
This documentation is generated using the `Sphinx
<http://sphinx.pocoo.org/>`_ documentation generator. The source files
for the documentation are located in the *doc/* directory of the
**HPLeftHandClient** distribution. To generate the docs locally run the
following command from the root directory of the **HPLeftHandClient**
.. code-block:: bash
$ python setup.py doc
.. toctree::
:hidden:
installation
tutorial
changelog
api/index
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

View File

@ -0,0 +1,43 @@
Installing / Upgrading
======================
.. highlight:: bash
**HPLeftHandClient** is in the `Python Package Index
<http://pypi.python.org/pypi/hplefthandclient/>`_.
Installing with pip
-------------------
We prefer `pip <http://pypi.python.org/pypi/pip>`_
to install hplefthandclient on platforms other than Windows::
$ pip install hplefthandclient
To upgrade using pip::
$ pip install --upgrade hplefthandclient
Installing with easy_install
----------------------------
If you must install hplefthandclient using
`setuptools <http://pypi.python.org/pypi/setuptools>`_ do::
$ easy_install hplefthandclient
To upgrade do::
$ easy_install -U hplefthandclient
Installing from source
----------------------
If you'd rather install directly from the source (i.e. to stay on the
bleeding edge), install the C extension dependencies then check out the
latest source from github and install the driver from the resulting tree::
$ git clone git://github.com/WaltHP/python-3parclient.git
$ cd pyton-hplefthandclient/
$ python setup.py install

68
docs/_build/html/_sources/tutorial.txt vendored Normal file
View File

@ -0,0 +1,68 @@
Tutorial
========
This tutorial is intended as an introduction to working with
**HPLeftHandClient**.
Prerequisites
-------------
Before we start, make sure that you have the **HPLeftHandClient** distribution
:doc:`installed <installation>`. In the Python shell, the following
should run without raising an exception:
.. code-block:: bash
>>> import hplefthandclient
This tutorial also assumes that a LeftHand array is up and running and the
LeftHand OS is running.
Create the Client and login
---------------------------
The first step when working with **HPLeftHandClient** is to create a
:class:`~hplefthandclient.client.HPLeftHandClient` to the LeftHand drive array
and logging in to create the session. You must :meth:`~hplefthandclient.client.HPLeftHandClient.login` prior to calling the other APIs to do work on the LeftHand.
Doing so is easy:
.. code-block:: python
from hplefthandclient import client, exceptions
#this creates the client object and sets the url to the
#LeftHand server with IP 10.10.10.10 on port 8008.
cl = client.HPLeftHandClient("https://10.10.10.10:8008/api/v1")
try:
cl.login(username, password)
print "Login worked!"
except exceptions.HTTPUnauthorized as ex:
print "Login failed."
When you are done with the the client, it's a good idea to logout from
the LeftHand so there isn't a stale session sitting around.
.. code-block:: python
cl.logout()
print "logout worked"
Getting a list of Volumes
-------------------------
After you have logged in, you can start making calls to the LeftHand APIs.
A simple example is getting a list of existing volumes on the array with
a call to :meth:`~hplefthandclient.client.HPLeftHandClient.getVolumes`.
.. code-block:: python
import pprint
try:
volumes = cl.getVolumes()
pprint.pprint(volumes)
except exceptions.HTTPUnauthorized as ex:
print "You must login first"
except Exception as ex:
#something unexpected happened
print ex
.. note:: volumes is an array of volumes in the above call

BIN
docs/_build/html/_static/ajax-loader.gif vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

540
docs/_build/html/_static/basic.css vendored Normal file
View File

@ -0,0 +1,540 @@
/*
* basic.css
* ~~~~~~~~~
*
* Sphinx stylesheet -- basic theme.
*
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/* -- main layout ----------------------------------------------------------- */
div.clearer {
clear: both;
}
/* -- relbar ---------------------------------------------------------------- */
div.related {
width: 100%;
font-size: 90%;
}
div.related h3 {
display: none;
}
div.related ul {
margin: 0;
padding: 0 0 0 10px;
list-style: none;
}
div.related li {
display: inline;
}
div.related li.right {
float: right;
margin-right: 5px;
}
/* -- sidebar --------------------------------------------------------------- */
div.sphinxsidebarwrapper {
padding: 10px 5px 0 10px;
}
div.sphinxsidebar {
float: left;
width: 230px;
margin-left: -100%;
font-size: 90%;
}
div.sphinxsidebar ul {
list-style: none;
}
div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
margin-left: 20px;
list-style: square;
}
div.sphinxsidebar ul ul {
margin-top: 0;
margin-bottom: 0;
}
div.sphinxsidebar form {
margin-top: 10px;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
div.sphinxsidebar #searchbox input[type="text"] {
width: 170px;
}
div.sphinxsidebar #searchbox input[type="submit"] {
width: 30px;
}
img {
border: 0;
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin: 10px 0 0 20px;
padding: 0;
}
ul.search li {
padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
}
ul.search li a {
font-weight: bold;
}
ul.search li div.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable {
width: 100%;
}
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable dl, table.indextable dd {
margin-top: 0;
margin-bottom: 0;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
div.modindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
div.genindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
/* -- general body styles --------------------------------------------------- */
a.headerlink {
visibility: hidden;
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink {
visibility: visible;
}
div.body p.caption {
text-align: inherit;
}
div.body td {
text-align: left;
}
.field-list ul {
padding-left: 1em;
}
.first {
margin-top: 0 !important;
}
p.rubric {
margin-top: 30px;
font-weight: bold;
}
img.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-right {
text-align: right;
}
/* -- sidebars -------------------------------------------------------------- */
div.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
padding: 7px 7px 0 7px;
background-color: #ffe;
width: 40%;
float: right;
}
p.sidebar-title {
font-weight: bold;
}
/* -- topics ---------------------------------------------------------------- */
div.topic {
border: 1px solid #ccc;
padding: 7px 7px 0 7px;
margin: 10px 0 10px 0;
}
p.topic-title {
font-size: 1.1em;
font-weight: bold;
margin-top: 10px;
}
/* -- admonitions ----------------------------------------------------------- */
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 7px;
}
div.admonition dt {
font-weight: bold;
}
div.admonition dl {
margin-bottom: 0;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
div.body p.centered {
text-align: center;
margin-top: 25px;
}
/* -- tables ---------------------------------------------------------------- */
table.docutils {
border: 0;
border-collapse: collapse;
}
table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #aaa;
}
table.field-list td, table.field-list th {
border: 0 !important;
}
table.footnote td, table.footnote th {
border: 0 !important;
}
th {
text-align: left;
padding-right: 5px;
}
table.citation {
border-left: solid 1px gray;
margin-left: 1px;
}
table.citation td {
border-bottom: none;
}
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
list-style: decimal;
}
ol.loweralpha {
list-style: lower-alpha;
}
ol.upperalpha {
list-style: upper-alpha;
}
ol.lowerroman {
list-style: lower-roman;
}
ol.upperroman {
list-style: upper-roman;
}
dl {
margin-bottom: 15px;
}
dd p {
margin-top: 0px;
}
dd ul, dd table {
margin-bottom: 10px;
}
dd {
margin-top: 3px;
margin-bottom: 10px;
margin-left: 30px;
}
dt:target, .highlighted {
background-color: #fbe54e;
}
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
}
.field-list ul {
margin: 0;
padding-left: 1em;
}
.field-list p {
margin: 0;
}
.refcount {
color: #060;
}
.optional {
font-size: 1.3em;
}
.versionmodified {
font-style: italic;
}
.system-message {
background-color: #fda;
padding: 5px;
border: 3px solid red;
}
.footnote:target {
background-color: #ffa;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
.guilabel, .menuselection {
font-family: sans-serif;
}
.accelerator {
text-decoration: underline;
}
.classifier {
font-style: oblique;
}
abbr, acronym {
border-bottom: dotted 1px;
cursor: help;
}
/* -- code displays --------------------------------------------------------- */
pre {
overflow: auto;
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
td.linenos pre {
padding: 5px 0px;
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
margin-left: 0.5em;
}
table.highlighttable td {
padding: 0 0.5em 0 0.5em;
}
tt.descname {
background-color: transparent;
font-weight: bold;
font-size: 1.2em;
}
tt.descclassname {
background-color: transparent;
}
tt.xref, a tt {
background-color: transparent;
font-weight: bold;
}
h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
background-color: transparent;
}
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family: sans-serif;
}
div.viewcode-block:target {
margin: -1px -10px;
padding: 0 10px;
}
/* -- math display ---------------------------------------------------------- */
img.math {
vertical-align: middle;
}
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}
/* -- printout stylesheet --------------------------------------------------- */
@media print {
div.document,
div.documentwrapper,
div.bodywrapper {
margin: 0 !important;
width: 100%;
}
div.sphinxsidebar,
div.related,
div.footer,
#top-link {
display: none;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
docs/_build/html/_static/comment.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

256
docs/_build/html/_static/default.css vendored Normal file
View File

@ -0,0 +1,256 @@
/*
* default.css_t
* ~~~~~~~~~~~~~
*
* Sphinx stylesheet -- default theme.
*
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@import url("basic.css");
/* -- page layout ----------------------------------------------------------- */
body {
font-family: sans-serif;
font-size: 100%;
background-color: #11303d;
color: #000;
margin: 0;
padding: 0;
}
div.document {
background-color: #1c4e63;
}
div.documentwrapper {
float: left;
width: 100%;
}
div.bodywrapper {
margin: 0 0 0 230px;
}
div.body {
background-color: #ffffff;
color: #000000;
padding: 0 20px 30px 20px;
}
div.footer {
color: #ffffff;
width: 100%;
padding: 9px 0 9px 0;
text-align: center;
font-size: 75%;
}
div.footer a {
color: #ffffff;
text-decoration: underline;
}
div.related {
background-color: #133f52;
line-height: 30px;
color: #ffffff;
}
div.related a {
color: #ffffff;
}
div.sphinxsidebar {
}
div.sphinxsidebar h3 {
font-family: 'Trebuchet MS', sans-serif;
color: #ffffff;
font-size: 1.4em;
font-weight: normal;
margin: 0;
padding: 0;
}
div.sphinxsidebar h3 a {
color: #ffffff;
}
div.sphinxsidebar h4 {
font-family: 'Trebuchet MS', sans-serif;
color: #ffffff;
font-size: 1.3em;
font-weight: normal;
margin: 5px 0 0 0;
padding: 0;
}
div.sphinxsidebar p {
color: #ffffff;
}
div.sphinxsidebar p.topless {
margin: 5px 10px 10px 10px;
}
div.sphinxsidebar ul {
margin: 10px;
padding: 0;
color: #ffffff;
}
div.sphinxsidebar a {
color: #98dbcc;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
/* -- hyperlink styles ------------------------------------------------------ */
a {
color: #355f7c;
text-decoration: none;
}
a:visited {
color: #355f7c;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
/* -- body styles ----------------------------------------------------------- */
div.body h1,
div.body h2,
div.body h3,
div.body h4,
div.body h5,
div.body h6 {
font-family: 'Trebuchet MS', sans-serif;
background-color: #f2f2f2;
font-weight: normal;
color: #20435c;
border-bottom: 1px solid #ccc;
margin: 20px -20px 10px -20px;
padding: 3px 0 3px 10px;
}
div.body h1 { margin-top: 0; font-size: 200%; }
div.body h2 { font-size: 160%; }
div.body h3 { font-size: 140%; }
div.body h4 { font-size: 120%; }
div.body h5 { font-size: 110%; }
div.body h6 { font-size: 100%; }
a.headerlink {
color: #c60f0f;
font-size: 0.8em;
padding: 0 4px 0 4px;
text-decoration: none;
}
a.headerlink:hover {
background-color: #c60f0f;
color: white;
}
div.body p, div.body dd, div.body li {
text-align: justify;
line-height: 130%;
}
div.admonition p.admonition-title + p {
display: inline;
}
div.admonition p {
margin-bottom: 5px;
}
div.admonition pre {
margin-bottom: 5px;
}
div.admonition ul, div.admonition ol {
margin-bottom: 5px;
}
div.note {
background-color: #eee;
border: 1px solid #ccc;
}
div.seealso {
background-color: #ffc;
border: 1px solid #ff6;
}
div.topic {
background-color: #eee;
}
div.warning {
background-color: #ffe4e4;
border: 1px solid #f66;
}
p.admonition-title {
display: inline;
}
p.admonition-title:after {
content: ":";
}
pre {
padding: 5px;
background-color: #eeffcc;
color: #333333;
line-height: 120%;
border: 1px solid #ac9;
border-left: none;
border-right: none;
}
tt {
background-color: #ecf0f3;
padding: 0 1px 0 1px;
font-size: 0.95em;
}
th {
background-color: #ede;
}
.warning tt {
background: #efc2c2;
}
.note tt {
background: #d6d6d6;
}
.viewcode-back {
font-family: sans-serif;
}
div.viewcode-block:target {
background-color: #f4debf;
border-top: 1px solid #ac9;
border-bottom: 1px solid #ac9;
}

247
docs/_build/html/_static/doctools.js vendored Normal file
View File

@ -0,0 +1,247 @@
/*
* doctools.js
* ~~~~~~~~~~~
*
* Sphinx JavaScript utilities for all documentation.
*
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/**
* select a different prefix for underscore
*/
$u = _.noConflict();
/**
* make the code below compatible with browsers without
* an installed firebug like debugger
if (!window.console || !console.firebug) {
var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
"dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
"profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {};
}
*/
/**
* small helper function to urldecode strings
*/
jQuery.urldecode = function(x) {
return decodeURIComponent(x).replace(/\+/g, ' ');
}
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s == 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* small function to check if an array contains
* a given item.
*/
jQuery.contains = function(arr, item) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] == item)
return true;
}
return false;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node) {
if (node.nodeType == 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
var span = document.createElement("span");
span.className = className;
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this);
});
}
}
return this.each(function() {
highlight(this);
});
};
/**
* Small JavaScript module for the documentation.
*/
var Documentation = {
init : function() {
this.fixFirefoxAnchorBug();
this.highlightSearchWords();
this.initIndexTable();
},
/**
* i18n support
*/
TRANSLATIONS : {},
PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
LOCALE : 'unknown',
// gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext)
gettext : function(string) {
var translated = Documentation.TRANSLATIONS[string];
if (typeof translated == 'undefined')
return string;
return (typeof translated == 'string') ? translated : translated[0];
},
ngettext : function(singular, plural, n) {
var translated = Documentation.TRANSLATIONS[singular];
if (typeof translated == 'undefined')
return (n == 1) ? singular : plural;
return translated[Documentation.PLURALEXPR(n)];
},
addTranslations : function(catalog) {
for (var key in catalog.messages)
this.TRANSLATIONS[key] = catalog.messages[key];
this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
this.LOCALE = catalog.locale;
},
/**
* add context elements like header anchor links
*/
addContextElements : function() {
$('div[id] > :header:first').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this headline')).
appendTo(this);
});
$('dt[id]').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this definition')).
appendTo(this);
});
},
/**
* workaround a firefox stupidity
*/
fixFirefoxAnchorBug : function() {
if (document.location.hash && $.browser.mozilla)
window.setTimeout(function() {
document.location.href += '';
}, 10);
},
/**
* highlight the search words provided in the url in the text
*/
highlightSearchWords : function() {
var params = $.getQueryParameters();
var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
if (terms.length) {
var body = $('div.body');
window.setTimeout(function() {
$.each(terms, function() {
body.highlightText(this.toLowerCase(), 'highlighted');
});
}, 10);
$('<p class="highlight-link"><a href="javascript:Documentation.' +
'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
.appendTo($('#searchbox'));
}
},
/**
* init the domain index toggle buttons
*/
initIndexTable : function() {
var togglers = $('img.toggler').click(function() {
var src = $(this).attr('src');
var idnum = $(this).attr('id').substr(7);
$('tr.cg-' + idnum).toggle();
if (src.substr(-9) == 'minus.png')
$(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
else
$(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
}).css('display', '');
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
togglers.click();
}
},
/**
* helper function to hide the search marks again
*/
hideSearchWords : function() {
$('#searchbox .highlight-link').fadeOut(300);
$('span.highlighted').removeClass('highlighted');
},
/**
* make the url absolute
*/
makeURL : function(relativeURL) {
return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
},
/**
* get the current relative url
*/
getCurrentURL : function() {
var path = document.location.pathname;
var parts = path.split(/\//);
$.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
if (this == '..')
parts.pop();
});
var url = parts.join('/');
return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
}
};
// quick alias for translations
_ = Documentation.gettext;
$(document).ready(function() {
Documentation.init();
});

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

BIN
docs/_build/html/_static/down.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

0
docs/_build/html/_static/empty_dir vendored Normal file
View File

BIN
docs/_build/html/_static/file.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 B

9266
docs/_build/html/_static/jquery.js vendored Normal file

File diff suppressed because it is too large Load Diff

BIN
docs/_build/html/_static/minus.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

BIN
docs/_build/html/_static/plus.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

62
docs/_build/html/_static/pygments.css vendored Normal file
View File

@ -0,0 +1,62 @@
.highlight .hll { background-color: #ffffcc }
.highlight { background: #eeffcc; }
.highlight .c { color: #408090; font-style: italic } /* Comment */
.highlight .err { border: 1px solid #FF0000 } /* Error */
.highlight .k { color: #007020; font-weight: bold } /* Keyword */
.highlight .o { color: #666666 } /* Operator */
.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #007020 } /* Comment.Preproc */
.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #A00000 } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #FF0000 } /* Generic.Error */
.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #00A000 } /* Generic.Inserted */
.highlight .go { color: #303030 } /* Generic.Output */
.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
.highlight .gt { color: #0040D0 } /* Generic.Traceback */
.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #007020 } /* Keyword.Pseudo */
.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #902000 } /* Keyword.Type */
.highlight .m { color: #208050 } /* Literal.Number */
.highlight .s { color: #4070a0 } /* Literal.String */
.highlight .na { color: #4070a0 } /* Name.Attribute */
.highlight .nb { color: #007020 } /* Name.Builtin */
.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
.highlight .no { color: #60add5 } /* Name.Constant */
.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
.highlight .ne { color: #007020 } /* Name.Exception */
.highlight .nf { color: #06287e } /* Name.Function */
.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #bb60d5 } /* Name.Variable */
.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mf { color: #208050 } /* Literal.Number.Float */
.highlight .mh { color: #208050 } /* Literal.Number.Hex */
.highlight .mi { color: #208050 } /* Literal.Number.Integer */
.highlight .mo { color: #208050 } /* Literal.Number.Oct */
.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
.highlight .sc { color: #4070a0 } /* Literal.String.Char */
.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
.highlight .sx { color: #c65d09 } /* Literal.String.Other */
.highlight .sr { color: #235388 } /* Literal.String.Regex */
.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
.highlight .ss { color: #517918 } /* Literal.String.Symbol */
.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */

560
docs/_build/html/_static/searchtools.js vendored Normal file
View File

@ -0,0 +1,560 @@
/*
* searchtools.js_t
* ~~~~~~~~~~~~~~~~
*
* Sphinx JavaScript utilties for the full-text search.
*
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/**
* helper function to return a node containing the
* search summary for a given text. keywords is a list
* of stemmed words, hlwords is the list of normal, unstemmed
* words. the first one is used to find the occurance, the
* latter for highlighting it.
*/
jQuery.makeSearchSummary = function(text, keywords, hlwords) {
var textLower = text.toLowerCase();
var start = 0;
$.each(keywords, function() {
var i = textLower.indexOf(this.toLowerCase());
if (i > -1)
start = i;
});
start = Math.max(start - 120, 0);
var excerpt = ((start > 0) ? '...' : '') +
$.trim(text.substr(start, 240)) +
((start + 240 - text.length) ? '...' : '');
var rv = $('<div class="context"></div>').text(excerpt);
$.each(hlwords, function() {
rv = rv.highlightText(this, 'highlighted');
});
return rv;
}
/**
* Porter Stemmer
*/
var Stemmer = function() {
var step2list = {
ational: 'ate',
tional: 'tion',
enci: 'ence',
anci: 'ance',
izer: 'ize',
bli: 'ble',
alli: 'al',
entli: 'ent',
eli: 'e',
ousli: 'ous',
ization: 'ize',
ation: 'ate',
ator: 'ate',
alism: 'al',
iveness: 'ive',
fulness: 'ful',
ousness: 'ous',
aliti: 'al',
iviti: 'ive',
biliti: 'ble',
logi: 'log'
};
var step3list = {
icate: 'ic',
ative: '',
alize: 'al',
iciti: 'ic',
ical: 'ic',
ful: '',
ness: ''
};
var c = "[^aeiou]"; // consonant
var v = "[aeiouy]"; // vowel
var C = c + "[^aeiouy]*"; // consonant sequence
var V = v + "[aeiou]*"; // vowel sequence
var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
var s_v = "^(" + C + ")?" + v; // vowel in stem
this.stemWord = function (w) {
var stem;
var suffix;
var firstch;
var origword = w;
if (w.length < 3)
return w;
var re;
var re2;
var re3;
var re4;
firstch = w.substr(0,1);
if (firstch == "y")
w = firstch.toUpperCase() + w.substr(1);
// Step 1a
re = /^(.+?)(ss|i)es$/;
re2 = /^(.+?)([^s])s$/;
if (re.test(w))
w = w.replace(re,"$1$2");
else if (re2.test(w))
w = w.replace(re2,"$1$2");
// Step 1b
re = /^(.+?)eed$/;
re2 = /^(.+?)(ed|ing)$/;
if (re.test(w)) {
var fp = re.exec(w);
re = new RegExp(mgr0);
if (re.test(fp[1])) {
re = /.$/;
w = w.replace(re,"");
}
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1];
re2 = new RegExp(s_v);
if (re2.test(stem)) {
w = stem;
re2 = /(at|bl|iz)$/;
re3 = new RegExp("([^aeiouylsz])\\1$");
re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re2.test(w))
w = w + "e";
else if (re3.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
else if (re4.test(w))
w = w + "e";
}
}
// Step 1c
re = /^(.+?)y$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(s_v);
if (re.test(stem))
w = stem + "i";
}
// Step 2
re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step2list[suffix];
}
// Step 3
re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
suffix = fp[2];
re = new RegExp(mgr0);
if (re.test(stem))
w = stem + step3list[suffix];
}
// Step 4
re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
re2 = /^(.+?)(s|t)(ion)$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
if (re.test(stem))
w = stem;
}
else if (re2.test(w)) {
var fp = re2.exec(w);
stem = fp[1] + fp[2];
re2 = new RegExp(mgr1);
if (re2.test(stem))
w = stem;
}
// Step 5
re = /^(.+?)e$/;
if (re.test(w)) {
var fp = re.exec(w);
stem = fp[1];
re = new RegExp(mgr1);
re2 = new RegExp(meq1);
re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
w = stem;
}
re = /ll$/;
re2 = new RegExp(mgr1);
if (re.test(w) && re2.test(w)) {
re = /.$/;
w = w.replace(re,"");
}
// and turn initial Y back to y
if (firstch == "y")
w = firstch.toLowerCase() + w.substr(1);
return w;
}
}
/**
* Search Module
*/
var Search = {
_index : null,
_queued_query : null,
_pulse_status : -1,
init : function() {
var params = $.getQueryParameters();
if (params.q) {
var query = params.q[0];
$('input[name="q"]')[0].value = query;
this.performSearch(query);
}
},
loadIndex : function(url) {
$.ajax({type: "GET", url: url, data: null, success: null,
dataType: "script", cache: true});
},
setIndex : function(index) {
var q;
this._index = index;
if ((q = this._queued_query) !== null) {
this._queued_query = null;
Search.query(q);
}
},
hasIndex : function() {
return this._index !== null;
},
deferQuery : function(query) {
this._queued_query = query;
},
stopPulse : function() {
this._pulse_status = 0;
},
startPulse : function() {
if (this._pulse_status >= 0)
return;
function pulse() {
Search._pulse_status = (Search._pulse_status + 1) % 4;
var dotString = '';
for (var i = 0; i < Search._pulse_status; i++)
dotString += '.';
Search.dots.text(dotString);
if (Search._pulse_status > -1)
window.setTimeout(pulse, 500);
};
pulse();
},
/**
* perform a search for something
*/
performSearch : function(query) {
// create the required interface elements
this.out = $('#search-results');
this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
this.dots = $('<span></span>').appendTo(this.title);
this.status = $('<p style="display: none"></p>').appendTo(this.out);
this.output = $('<ul class="search"/>').appendTo(this.out);
$('#search-progress').text(_('Preparing search...'));
this.startPulse();
// index already loaded, the browser was quick!
if (this.hasIndex())
this.query(query);
else
this.deferQuery(query);
},
query : function(query) {
var stopwords = ["and","then","into","it","as","are","in","if","for","no","there","their","was","is","be","to","that","but","they","not","such","with","by","a","on","these","of","will","this","near","the","or","at"];
// Stem the searchterms and add them to the correct list
var stemmer = new Stemmer();
var searchterms = [];
var excluded = [];
var hlterms = [];
var tmp = query.split(/\s+/);
var objectterms = [];
for (var i = 0; i < tmp.length; i++) {
if (tmp[i] != "") {
objectterms.push(tmp[i].toLowerCase());
}
if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) ||
tmp[i] == "") {
// skip this "word"
continue;
}
// stem the word
var word = stemmer.stemWord(tmp[i]).toLowerCase();
// select the correct list
if (word[0] == '-') {
var toAppend = excluded;
word = word.substr(1);
}
else {
var toAppend = searchterms;
hlterms.push(tmp[i].toLowerCase());
}
// only add if not already in the list
if (!$.contains(toAppend, word))
toAppend.push(word);
};
var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
// console.debug('SEARCH: searching for:');
// console.info('required: ', searchterms);
// console.info('excluded: ', excluded);
// prepare search
var filenames = this._index.filenames;
var titles = this._index.titles;
var terms = this._index.terms;
var fileMap = {};
var files = null;
// different result priorities
var importantResults = [];
var objectResults = [];
var regularResults = [];
var unimportantResults = [];
$('#search-progress').empty();
// lookup as object
for (var i = 0; i < objectterms.length; i++) {
var others = [].concat(objectterms.slice(0,i),
objectterms.slice(i+1, objectterms.length))
var results = this.performObjectSearch(objectterms[i], others);
// Assume first word is most likely to be the object,
// other words more likely to be in description.
// Therefore put matches for earlier words first.
// (Results are eventually used in reverse order).
objectResults = results[0].concat(objectResults);
importantResults = results[1].concat(importantResults);
unimportantResults = results[2].concat(unimportantResults);
}
// perform the search on the required terms
for (var i = 0; i < searchterms.length; i++) {
var word = searchterms[i];
// no match but word was a required one
if ((files = terms[word]) == null)
break;
if (files.length == undefined) {
files = [files];
}
// create the mapping
for (var j = 0; j < files.length; j++) {
var file = files[j];
if (file in fileMap)
fileMap[file].push(word);
else
fileMap[file] = [word];
}
}
// now check if the files don't contain excluded terms
for (var file in fileMap) {
var valid = true;
// check if all requirements are matched
if (fileMap[file].length != searchterms.length)
continue;
// ensure that none of the excluded terms is in the
// search result.
for (var i = 0; i < excluded.length; i++) {
if (terms[excluded[i]] == file ||
$.contains(terms[excluded[i]] || [], file)) {
valid = false;
break;
}
}
// if we have still a valid result we can add it
// to the result list
if (valid)
regularResults.push([filenames[file], titles[file], '', null]);
}
// delete unused variables in order to not waste
// memory until list is retrieved completely
delete filenames, titles, terms;
// now sort the regular results descending by title
regularResults.sort(function(a, b) {
var left = a[1].toLowerCase();
var right = b[1].toLowerCase();
return (left > right) ? -1 : ((left < right) ? 1 : 0);
});
// combine all results
var results = unimportantResults.concat(regularResults)
.concat(objectResults).concat(importantResults);
// print the results
var resultCount = results.length;
function displayNextItem() {
// results left, load the summary and display it
if (results.length) {
var item = results.pop();
var listItem = $('<li style="display:none"></li>');
if (DOCUMENTATION_OPTIONS.FILE_SUFFIX == '') {
// dirhtml builder
var dirname = item[0] + '/';
if (dirname.match(/\/index\/$/)) {
dirname = dirname.substring(0, dirname.length-6);
} else if (dirname == 'index/') {
dirname = '';
}
listItem.append($('<a/>').attr('href',
DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
highlightstring + item[2]).html(item[1]));
} else {
// normal html builders
listItem.append($('<a/>').attr('href',
item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
highlightstring + item[2]).html(item[1]));
}
if (item[3]) {
listItem.append($('<span> (' + item[3] + ')</span>'));
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
} else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
$.get(DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' +
item[0] + '.txt', function(data) {
if (data != '') {
listItem.append($.makeSearchSummary(data, searchterms, hlterms));
Search.output.append(listItem);
}
listItem.slideDown(5, function() {
displayNextItem();
});
}, "text");
} else {
// no source available, just display title
Search.output.append(listItem);
listItem.slideDown(5, function() {
displayNextItem();
});
}
}
// search finished, update title and status message
else {
Search.stopPulse();
Search.title.text(_('Search Results'));
if (!resultCount)
Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
else
Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
Search.status.fadeIn(500);
}
}
displayNextItem();
},
performObjectSearch : function(object, otherterms) {
var filenames = this._index.filenames;
var objects = this._index.objects;
var objnames = this._index.objnames;
var titles = this._index.titles;
var importantResults = [];
var objectResults = [];
var unimportantResults = [];
for (var prefix in objects) {
for (var name in objects[prefix]) {
var fullname = (prefix ? prefix + '.' : '') + name;
if (fullname.toLowerCase().indexOf(object) > -1) {
var match = objects[prefix][name];
var objname = objnames[match[1]][2];
var title = titles[match[0]];
// If more than one term searched for, we require other words to be
// found in the name/title/description
if (otherterms.length > 0) {
var haystack = (prefix + ' ' + name + ' ' +
objname + ' ' + title).toLowerCase();
var allfound = true;
for (var i = 0; i < otherterms.length; i++) {
if (haystack.indexOf(otherterms[i]) == -1) {
allfound = false;
break;
}
}
if (!allfound) {
continue;
}
}
var descr = objname + _(', in ') + title;
anchor = match[3];
if (anchor == '')
anchor = fullname;
else if (anchor == '-')
anchor = objnames[match[1]][1] + '-' + fullname;
result = [filenames[match[0]], fullname, '#'+anchor, descr];
switch (match[2]) {
case 1: objectResults.push(result); break;
case 0: importantResults.push(result); break;
case 2: unimportantResults.push(result); break;
}
}
}
}
// sort results descending
objectResults.sort(function(a, b) {
return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
});
importantResults.sort(function(a, b) {
return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
});
unimportantResults.sort(function(a, b) {
return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
});
return [importantResults, objectResults, unimportantResults]
}
}
$(document).ready(function() {
Search.init();
});

151
docs/_build/html/_static/sidebar.js vendored Normal file
View File

@ -0,0 +1,151 @@
/*
* sidebar.js
* ~~~~~~~~~~
*
* This script makes the Sphinx sidebar collapsible.
*
* .sphinxsidebar contains .sphinxsidebarwrapper. This script adds
* in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
* used to collapse and expand the sidebar.
*
* When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
* and the width of the sidebar and the margin-left of the document
* are decreased. When the sidebar is expanded the opposite happens.
* This script saves a per-browser/per-session cookie used to
* remember the position of the sidebar among the pages.
* Once the browser is closed the cookie is deleted and the position
* reset to the default (expanded).
*
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
$(function() {
// global elements used by the functions.
// the 'sidebarbutton' element is defined as global after its
// creation, in the add_sidebar_button function
var bodywrapper = $('.bodywrapper');
var sidebar = $('.sphinxsidebar');
var sidebarwrapper = $('.sphinxsidebarwrapper');
// for some reason, the document has no sidebar; do not run into errors
if (!sidebar.length) return;
// original margin-left of the bodywrapper and width of the sidebar
// with the sidebar expanded
var bw_margin_expanded = bodywrapper.css('margin-left');
var ssb_width_expanded = sidebar.width();
// margin-left of the bodywrapper and width of the sidebar
// with the sidebar collapsed
var bw_margin_collapsed = '.8em';
var ssb_width_collapsed = '.8em';
// colors used by the current theme
var dark_color = $('.related').css('background-color');
var light_color = $('.document').css('background-color');
function sidebar_is_collapsed() {
return sidebarwrapper.is(':not(:visible)');
}
function toggle_sidebar() {
if (sidebar_is_collapsed())
expand_sidebar();
else
collapse_sidebar();
}
function collapse_sidebar() {
sidebarwrapper.hide();
sidebar.css('width', ssb_width_collapsed);
bodywrapper.css('margin-left', bw_margin_collapsed);
sidebarbutton.css({
'margin-left': '0',
'height': bodywrapper.height()
});
sidebarbutton.find('span').text('»');
sidebarbutton.attr('title', _('Expand sidebar'));
document.cookie = 'sidebar=collapsed';
}
function expand_sidebar() {
bodywrapper.css('margin-left', bw_margin_expanded);
sidebar.css('width', ssb_width_expanded);
sidebarwrapper.show();
sidebarbutton.css({
'margin-left': ssb_width_expanded-12,
'height': bodywrapper.height()
});
sidebarbutton.find('span').text('«');
sidebarbutton.attr('title', _('Collapse sidebar'));
document.cookie = 'sidebar=expanded';
}
function add_sidebar_button() {
sidebarwrapper.css({
'float': 'left',
'margin-right': '0',
'width': ssb_width_expanded - 28
});
// create the button
sidebar.append(
'<div id="sidebarbutton"><span>&laquo;</span></div>'
);
var sidebarbutton = $('#sidebarbutton');
light_color = sidebarbutton.css('background-color');
// find the height of the viewport to center the '<<' in the page
var viewport_height;
if (window.innerHeight)
viewport_height = window.innerHeight;
else
viewport_height = $(window).height();
sidebarbutton.find('span').css({
'display': 'block',
'margin-top': (viewport_height - sidebar.position().top - 20) / 2
});
sidebarbutton.click(toggle_sidebar);
sidebarbutton.attr('title', _('Collapse sidebar'));
sidebarbutton.css({
'color': '#FFFFFF',
'border-left': '1px solid ' + dark_color,
'font-size': '1.2em',
'cursor': 'pointer',
'height': bodywrapper.height(),
'padding-top': '1px',
'margin-left': ssb_width_expanded - 12
});
sidebarbutton.hover(
function () {
$(this).css('background-color', dark_color);
},
function () {
$(this).css('background-color', light_color);
}
);
}
function set_position_from_cookie() {
if (!document.cookie)
return;
var items = document.cookie.split(';');
for(var k=0; k<items.length; k++) {
var key_val = items[k].split('=');
var key = key_val[0];
if (key == 'sidebar') {
var value = key_val[1];
if ((value == 'collapsed') && (!sidebar_is_collapsed()))
collapse_sidebar();
else if ((value == 'expanded') && (sidebar_is_collapsed()))
expand_sidebar();
}
}
}
add_sidebar_button();
var sidebarbutton = $('#sidebarbutton');
set_position_from_cookie();
});

807
docs/_build/html/_static/underscore.js vendored Normal file
View File

@ -0,0 +1,807 @@
// Underscore.js 1.1.6
// (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
// Underscore is freely distributable under the MIT license.
// Portions of Underscore are inspired or borrowed from Prototype,
// Oliver Steele's Functional, and John Resig's Micro-Templating.
// For all details and documentation:
// http://documentcloud.github.com/underscore
(function() {
// Baseline setup
// --------------
// Establish the root object, `window` in the browser, or `global` on the server.
var root = this;
// Save the previous value of the `_` variable.
var previousUnderscore = root._;
// Establish the object that gets returned to break out of a loop iteration.
var breaker = {};
// Save bytes in the minified (but not gzipped) version:
var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
// Create quick reference variables for speed access to core prototypes.
var slice = ArrayProto.slice,
unshift = ArrayProto.unshift,
toString = ObjProto.toString,
hasOwnProperty = ObjProto.hasOwnProperty;
// All **ECMAScript 5** native function implementations that we hope to use
// are declared here.
var
nativeForEach = ArrayProto.forEach,
nativeMap = ArrayProto.map,
nativeReduce = ArrayProto.reduce,
nativeReduceRight = ArrayProto.reduceRight,
nativeFilter = ArrayProto.filter,
nativeEvery = ArrayProto.every,
nativeSome = ArrayProto.some,
nativeIndexOf = ArrayProto.indexOf,
nativeLastIndexOf = ArrayProto.lastIndexOf,
nativeIsArray = Array.isArray,
nativeKeys = Object.keys,
nativeBind = FuncProto.bind;
// Create a safe reference to the Underscore object for use below.
var _ = function(obj) { return new wrapper(obj); };
// Export the Underscore object for **CommonJS**, with backwards-compatibility
// for the old `require()` API. If we're not in CommonJS, add `_` to the
// global object.
if (typeof module !== 'undefined' && module.exports) {
module.exports = _;
_._ = _;
} else {
root._ = _;
}
// Current version.
_.VERSION = '1.1.6';
// Collection Functions
// --------------------
// The cornerstone, an `each` implementation, aka `forEach`.
// Handles objects implementing `forEach`, arrays, and raw objects.
// Delegates to **ECMAScript 5**'s native `forEach` if available.
var each = _.each = _.forEach = function(obj, iterator, context) {
if (obj == null) return;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (_.isNumber(obj.length)) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (hasOwnProperty.call(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};
// Return the results of applying the iterator to each element.
// Delegates to **ECMAScript 5**'s native `map` if available.
_.map = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
each(obj, function(value, index, list) {
results[results.length] = iterator.call(context, value, index, list);
});
return results;
};
// **Reduce** builds up a single result from a list of values, aka `inject`,
// or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
_.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
var initial = memo !== void 0;
if (obj == null) obj = [];
if (nativeReduce && obj.reduce === nativeReduce) {
if (context) iterator = _.bind(iterator, context);
return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
}
each(obj, function(value, index, list) {
if (!initial && index === 0) {
memo = value;
initial = true;
} else {
memo = iterator.call(context, memo, value, index, list);
}
});
if (!initial) throw new TypeError("Reduce of empty array with no initial value");
return memo;
};
// The right-associative version of reduce, also known as `foldr`.
// Delegates to **ECMAScript 5**'s native `reduceRight` if available.
_.reduceRight = _.foldr = function(obj, iterator, memo, context) {
if (obj == null) obj = [];
if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
if (context) iterator = _.bind(iterator, context);
return memo !== void 0 ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
}
var reversed = (_.isArray(obj) ? obj.slice() : _.toArray(obj)).reverse();
return _.reduce(reversed, iterator, memo, context);
};
// Return the first value which passes a truth test. Aliased as `detect`.
_.find = _.detect = function(obj, iterator, context) {
var result;
any(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) {
result = value;
return true;
}
});
return result;
};
// Return all the elements that pass a truth test.
// Delegates to **ECMAScript 5**'s native `filter` if available.
// Aliased as `select`.
_.filter = _.select = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
each(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) results[results.length] = value;
});
return results;
};
// Return all the elements for which a truth test fails.
_.reject = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
each(obj, function(value, index, list) {
if (!iterator.call(context, value, index, list)) results[results.length] = value;
});
return results;
};
// Determine whether all of the elements match a truth test.
// Delegates to **ECMAScript 5**'s native `every` if available.
// Aliased as `all`.
_.every = _.all = function(obj, iterator, context) {
var result = true;
if (obj == null) return result;
if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
each(obj, function(value, index, list) {
if (!(result = result && iterator.call(context, value, index, list))) return breaker;
});
return result;
};
// Determine if at least one element in the object matches a truth test.
// Delegates to **ECMAScript 5**'s native `some` if available.
// Aliased as `any`.
var any = _.some = _.any = function(obj, iterator, context) {
iterator || (iterator = _.identity);
var result = false;
if (obj == null) return result;
if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
each(obj, function(value, index, list) {
if (result = iterator.call(context, value, index, list)) return breaker;
});
return result;
};
// Determine if a given value is included in the array or object using `===`.
// Aliased as `contains`.
_.include = _.contains = function(obj, target) {
var found = false;
if (obj == null) return found;
if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
any(obj, function(value) {
if (found = value === target) return true;
});
return found;
};
// Invoke a method (with arguments) on every item in a collection.
_.invoke = function(obj, method) {
var args = slice.call(arguments, 2);
return _.map(obj, function(value) {
return (method.call ? method || value : value[method]).apply(value, args);
});
};
// Convenience version of a common use case of `map`: fetching a property.
_.pluck = function(obj, key) {
return _.map(obj, function(value){ return value[key]; });
};
// Return the maximum element or (element-based computation).
_.max = function(obj, iterator, context) {
if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);
var result = {computed : -Infinity};
each(obj, function(value, index, list) {
var computed = iterator ? iterator.call(context, value, index, list) : value;
computed >= result.computed && (result = {value : value, computed : computed});
});
return result.value;
};
// Return the minimum element (or element-based computation).
_.min = function(obj, iterator, context) {
if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);
var result = {computed : Infinity};
each(obj, function(value, index, list) {
var computed = iterator ? iterator.call(context, value, index, list) : value;
computed < result.computed && (result = {value : value, computed : computed});
});
return result.value;
};
// Sort the object's values by a criterion produced by an iterator.
_.sortBy = function(obj, iterator, context) {
return _.pluck(_.map(obj, function(value, index, list) {
return {
value : value,
criteria : iterator.call(context, value, index, list)
};
}).sort(function(left, right) {
var a = left.criteria, b = right.criteria;
return a < b ? -1 : a > b ? 1 : 0;
}), 'value');
};
// Use a comparator function to figure out at what index an object should
// be inserted so as to maintain order. Uses binary search.
_.sortedIndex = function(array, obj, iterator) {
iterator || (iterator = _.identity);
var low = 0, high = array.length;
while (low < high) {
var mid = (low + high) >> 1;
iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
}
return low;
};
// Safely convert anything iterable into a real, live array.
_.toArray = function(iterable) {
if (!iterable) return [];
if (iterable.toArray) return iterable.toArray();
if (_.isArray(iterable)) return iterable;
if (_.isArguments(iterable)) return slice.call(iterable);
return _.values(iterable);
};
// Return the number of elements in an object.
_.size = function(obj) {
return _.toArray(obj).length;
};
// Array Functions
// ---------------
// Get the first element of an array. Passing **n** will return the first N
// values in the array. Aliased as `head`. The **guard** check allows it to work
// with `_.map`.
_.first = _.head = function(array, n, guard) {
return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
};
// Returns everything but the first entry of the array. Aliased as `tail`.
// Especially useful on the arguments object. Passing an **index** will return
// the rest of the values in the array from that index onward. The **guard**
// check allows it to work with `_.map`.
_.rest = _.tail = function(array, index, guard) {
return slice.call(array, (index == null) || guard ? 1 : index);
};
// Get the last element of an array.
_.last = function(array) {
return array[array.length - 1];
};
// Trim out all falsy values from an array.
_.compact = function(array) {
return _.filter(array, function(value){ return !!value; });
};
// Return a completely flattened version of an array.
_.flatten = function(array) {
return _.reduce(array, function(memo, value) {
if (_.isArray(value)) return memo.concat(_.flatten(value));
memo[memo.length] = value;
return memo;
}, []);
};
// Return a version of the array that does not contain the specified value(s).
_.without = function(array) {
var values = slice.call(arguments, 1);
return _.filter(array, function(value){ return !_.include(values, value); });
};
// Produce a duplicate-free version of the array. If the array has already
// been sorted, you have the option of using a faster algorithm.
// Aliased as `unique`.
_.uniq = _.unique = function(array, isSorted) {
return _.reduce(array, function(memo, el, i) {
if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) memo[memo.length] = el;
return memo;
}, []);
};
// Produce an array that contains every item shared between all the
// passed-in arrays.
_.intersect = function(array) {
var rest = slice.call(arguments, 1);
return _.filter(_.uniq(array), function(item) {
return _.every(rest, function(other) {
return _.indexOf(other, item) >= 0;
});
});
};
// Zip together multiple lists into a single array -- elements that share
// an index go together.
_.zip = function() {
var args = slice.call(arguments);
var length = _.max(_.pluck(args, 'length'));
var results = new Array(length);
for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
return results;
};
// If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
// we need this function. Return the position of the first occurrence of an
// item in an array, or -1 if the item is not included in the array.
// Delegates to **ECMAScript 5**'s native `indexOf` if available.
// If the array is large and already in sort order, pass `true`
// for **isSorted** to use binary search.
_.indexOf = function(array, item, isSorted) {
if (array == null) return -1;
var i, l;
if (isSorted) {
i = _.sortedIndex(array, item);
return array[i] === item ? i : -1;
}
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
for (i = 0, l = array.length; i < l; i++) if (array[i] === item) return i;
return -1;
};
// Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
_.lastIndexOf = function(array, item) {
if (array == null) return -1;
if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
var i = array.length;
while (i--) if (array[i] === item) return i;
return -1;
};
// Generate an integer Array containing an arithmetic progression. A port of
// the native Python `range()` function. See
// [the Python documentation](http://docs.python.org/library/functions.html#range).
_.range = function(start, stop, step) {
if (arguments.length <= 1) {
stop = start || 0;
start = 0;
}
step = arguments[2] || 1;
var len = Math.max(Math.ceil((stop - start) / step), 0);
var idx = 0;
var range = new Array(len);
while(idx < len) {
range[idx++] = start;
start += step;
}
return range;
};
// Function (ahem) Functions
// ------------------
// Create a function bound to a given object (assigning `this`, and arguments,
// optionally). Binding with arguments is also known as `curry`.
// Delegates to **ECMAScript 5**'s native `Function.bind` if available.
// We check for `func.bind` first, to fail fast when `func` is undefined.
_.bind = function(func, obj) {
if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
var args = slice.call(arguments, 2);
return function() {
return func.apply(obj, args.concat(slice.call(arguments)));
};
};
// Bind all of an object's methods to that object. Useful for ensuring that
// all callbacks defined on an object belong to it.
_.bindAll = function(obj) {
var funcs = slice.call(arguments, 1);
if (funcs.length == 0) funcs = _.functions(obj);
each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
return obj;
};
// Memoize an expensive function by storing its results.
_.memoize = function(func, hasher) {
var memo = {};
hasher || (hasher = _.identity);
return function() {
var key = hasher.apply(this, arguments);
return hasOwnProperty.call(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
};
};
// Delays a function for the given number of milliseconds, and then calls
// it with the arguments supplied.
_.delay = function(func, wait) {
var args = slice.call(arguments, 2);
return setTimeout(function(){ return func.apply(func, args); }, wait);
};
// Defers a function, scheduling it to run after the current call stack has
// cleared.
_.defer = function(func) {
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};
// Internal function used to implement `_.throttle` and `_.debounce`.
var limit = function(func, wait, debounce) {
var timeout;
return function() {
var context = this, args = arguments;
var throttler = function() {
timeout = null;
func.apply(context, args);
};
if (debounce) clearTimeout(timeout);
if (debounce || !timeout) timeout = setTimeout(throttler, wait);
};
};
// Returns a function, that, when invoked, will only be triggered at most once
// during a given window of time.
_.throttle = function(func, wait) {
return limit(func, wait, false);
};
// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds.
_.debounce = function(func, wait) {
return limit(func, wait, true);
};
// Returns a function that will be executed at most one time, no matter how
// often you call it. Useful for lazy initialization.
_.once = function(func) {
var ran = false, memo;
return function() {
if (ran) return memo;
ran = true;
return memo = func.apply(this, arguments);
};
};
// Returns the first function passed as an argument to the second,
// allowing you to adjust arguments, run code before and after, and
// conditionally execute the original function.
_.wrap = function(func, wrapper) {
return function() {
var args = [func].concat(slice.call(arguments));
return wrapper.apply(this, args);
};
};
// Returns a function that is the composition of a list of functions, each
// consuming the return value of the function that follows.
_.compose = function() {
var funcs = slice.call(arguments);
return function() {
var args = slice.call(arguments);
for (var i=funcs.length-1; i >= 0; i--) {
args = [funcs[i].apply(this, args)];
}
return args[0];
};
};
// Returns a function that will only be executed after being called N times.
_.after = function(times, func) {
return function() {
if (--times < 1) { return func.apply(this, arguments); }
};
};
// Object Functions
// ----------------
// Retrieve the names of an object's properties.
// Delegates to **ECMAScript 5**'s native `Object.keys`
_.keys = nativeKeys || function(obj) {
if (obj !== Object(obj)) throw new TypeError('Invalid object');
var keys = [];
for (var key in obj) if (hasOwnProperty.call(obj, key)) keys[keys.length] = key;
return keys;
};
// Retrieve the values of an object's properties.
_.values = function(obj) {
return _.map(obj, _.identity);
};
// Return a sorted list of the function names available on the object.
// Aliased as `methods`
_.functions = _.methods = function(obj) {
return _.filter(_.keys(obj), function(key){ return _.isFunction(obj[key]); }).sort();
};
// Extend a given object with all the properties in passed-in object(s).
_.extend = function(obj) {
each(slice.call(arguments, 1), function(source) {
for (var prop in source) {
if (source[prop] !== void 0) obj[prop] = source[prop];
}
});
return obj;
};
// Fill in a given object with default properties.
_.defaults = function(obj) {
each(slice.call(arguments, 1), function(source) {
for (var prop in source) {
if (obj[prop] == null) obj[prop] = source[prop];
}
});
return obj;
};
// Create a (shallow-cloned) duplicate of an object.
_.clone = function(obj) {
return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
};
// Invokes interceptor with the obj, and then returns obj.
// The primary purpose of this method is to "tap into" a method chain, in
// order to perform operations on intermediate results within the chain.
_.tap = function(obj, interceptor) {
interceptor(obj);
return obj;
};
// Perform a deep comparison to check if two objects are equal.
_.isEqual = function(a, b) {
// Check object identity.
if (a === b) return true;
// Different types?
var atype = typeof(a), btype = typeof(b);
if (atype != btype) return false;
// Basic equality test (watch out for coercions).
if (a == b) return true;
// One is falsy and the other truthy.
if ((!a && b) || (a && !b)) return false;
// Unwrap any wrapped objects.
if (a._chain) a = a._wrapped;
if (b._chain) b = b._wrapped;
// One of them implements an isEqual()?
if (a.isEqual) return a.isEqual(b);
// Check dates' integer values.
if (_.isDate(a) && _.isDate(b)) return a.getTime() === b.getTime();
// Both are NaN?
if (_.isNaN(a) && _.isNaN(b)) return false;
// Compare regular expressions.
if (_.isRegExp(a) && _.isRegExp(b))
return a.source === b.source &&
a.global === b.global &&
a.ignoreCase === b.ignoreCase &&
a.multiline === b.multiline;
// If a is not an object by this point, we can't handle it.
if (atype !== 'object') return false;
// Check for different array lengths before comparing contents.
if (a.length && (a.length !== b.length)) return false;
// Nothing else worked, deep compare the contents.
var aKeys = _.keys(a), bKeys = _.keys(b);
// Different object sizes?
if (aKeys.length != bKeys.length) return false;
// Recursive comparison of contents.
for (var key in a) if (!(key in b) || !_.isEqual(a[key], b[key])) return false;
return true;
};
// Is a given array or object empty?
_.isEmpty = function(obj) {
if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
for (var key in obj) if (hasOwnProperty.call(obj, key)) return false;
return true;
};
// Is a given value a DOM element?
_.isElement = function(obj) {
return !!(obj && obj.nodeType == 1);
};
// Is a given value an array?
// Delegates to ECMA5's native Array.isArray
_.isArray = nativeIsArray || function(obj) {
return toString.call(obj) === '[object Array]';
};
// Is a given variable an arguments object?
_.isArguments = function(obj) {
return !!(obj && hasOwnProperty.call(obj, 'callee'));
};
// Is a given value a function?
_.isFunction = function(obj) {
return !!(obj && obj.constructor && obj.call && obj.apply);
};
// Is a given value a string?
_.isString = function(obj) {
return !!(obj === '' || (obj && obj.charCodeAt && obj.substr));
};
// Is a given value a number?
_.isNumber = function(obj) {
return !!(obj === 0 || (obj && obj.toExponential && obj.toFixed));
};
// Is the given value `NaN`? `NaN` happens to be the only value in JavaScript
// that does not equal itself.
_.isNaN = function(obj) {
return obj !== obj;
};
// Is a given value a boolean?
_.isBoolean = function(obj) {
return obj === true || obj === false;
};
// Is a given value a date?
_.isDate = function(obj) {
return !!(obj && obj.getTimezoneOffset && obj.setUTCFullYear);
};
// Is the given value a regular expression?
_.isRegExp = function(obj) {
return !!(obj && obj.test && obj.exec && (obj.ignoreCase || obj.ignoreCase === false));
};
// Is a given value equal to null?
_.isNull = function(obj) {
return obj === null;
};
// Is a given variable undefined?
_.isUndefined = function(obj) {
return obj === void 0;
};
// Utility Functions
// -----------------
// Run Underscore.js in *noConflict* mode, returning the `_` variable to its
// previous owner. Returns a reference to the Underscore object.
_.noConflict = function() {
root._ = previousUnderscore;
return this;
};
// Keep the identity function around for default iterators.
_.identity = function(value) {
return value;
};
// Run a function **n** times.
_.times = function (n, iterator, context) {
for (var i = 0; i < n; i++) iterator.call(context, i);
};
// Add your own custom functions to the Underscore object, ensuring that
// they're correctly added to the OOP wrapper as well.
_.mixin = function(obj) {
each(_.functions(obj), function(name){
addToWrapper(name, _[name] = obj[name]);
});
};
// Generate a unique integer id (unique within the entire client session).
// Useful for temporary DOM ids.
var idCounter = 0;
_.uniqueId = function(prefix) {
var id = idCounter++;
return prefix ? prefix + id : id;
};
// By default, Underscore uses ERB-style template delimiters, change the
// following template settings to use alternative delimiters.
_.templateSettings = {
evaluate : /<%([\s\S]+?)%>/g,
interpolate : /<%=([\s\S]+?)%>/g
};
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
_.template = function(str, data) {
var c = _.templateSettings;
var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
'with(obj||{}){__p.push(\'' +
str.replace(/\\/g, '\\\\')
.replace(/'/g, "\\'")
.replace(c.interpolate, function(match, code) {
return "'," + code.replace(/\\'/g, "'") + ",'";
})
.replace(c.evaluate || null, function(match, code) {
return "');" + code.replace(/\\'/g, "'")
.replace(/[\r\n\t]/g, ' ') + "__p.push('";
})
.replace(/\r/g, '\\r')
.replace(/\n/g, '\\n')
.replace(/\t/g, '\\t')
+ "');}return __p.join('');";
var func = new Function('obj', tmpl);
return data ? func(data) : func;
};
// The OOP Wrapper
// ---------------
// If Underscore is called as a function, it returns a wrapped object that
// can be used OO-style. This wrapper holds altered versions of all the
// underscore functions. Wrapped objects may be chained.
var wrapper = function(obj) { this._wrapped = obj; };
// Expose `wrapper.prototype` as `_.prototype`
_.prototype = wrapper.prototype;
// Helper function to continue chaining intermediate results.
var result = function(obj, chain) {
return chain ? _(obj).chain() : obj;
};
// A method to easily add functions to the OOP wrapper.
var addToWrapper = function(name, func) {
wrapper.prototype[name] = function() {
var args = slice.call(arguments);
unshift.call(args, this._wrapped);
return result(func.apply(_, args), this._chain);
};
};
// Add all of the Underscore functions to the wrapper object.
_.mixin(_);
// Add all mutator Array functions to the wrapper.
each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
var method = ArrayProto[name];
wrapper.prototype[name] = function() {
method.apply(this._wrapped, arguments);
return result(this._wrapped, this._chain);
};
});
// Add all accessor Array functions to the wrapper.
each(['concat', 'join', 'slice'], function(name) {
var method = ArrayProto[name];
wrapper.prototype[name] = function() {
return result(method.apply(this._wrapped, arguments), this._chain);
};
});
// Start chaining a wrapped Underscore object.
wrapper.prototype.chain = function() {
this._chain = true;
return this;
};
// Extracts the result from a wrapped and chained object.
wrapper.prototype.value = function() {
return this._wrapped;
};
})();

BIN
docs/_build/html/_static/up-pressed.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 B

BIN
docs/_build/html/_static/up.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

808
docs/_build/html/_static/websupport.js vendored Normal file
View File

@ -0,0 +1,808 @@
/*
* websupport.js
* ~~~~~~~~~~~~~
*
* sphinx.websupport utilties for all documentation.
*
* :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
(function($) {
$.fn.autogrow = function() {
return this.each(function() {
var textarea = this;
$.fn.autogrow.resize(textarea);
$(textarea)
.focus(function() {
textarea.interval = setInterval(function() {
$.fn.autogrow.resize(textarea);
}, 500);
})
.blur(function() {
clearInterval(textarea.interval);
});
});
};
$.fn.autogrow.resize = function(textarea) {
var lineHeight = parseInt($(textarea).css('line-height'), 10);
var lines = textarea.value.split('\n');
var columns = textarea.cols;
var lineCount = 0;
$.each(lines, function() {
lineCount += Math.ceil(this.length / columns) || 1;
});
var height = lineHeight * (lineCount + 1);
$(textarea).css('height', height);
};
})(jQuery);
(function($) {
var comp, by;
function init() {
initEvents();
initComparator();
}
function initEvents() {
$('a.comment-close').live("click", function(event) {
event.preventDefault();
hide($(this).attr('id').substring(2));
});
$('a.vote').live("click", function(event) {
event.preventDefault();
handleVote($(this));
});
$('a.reply').live("click", function(event) {
event.preventDefault();
openReply($(this).attr('id').substring(2));
});
$('a.close-reply').live("click", function(event) {
event.preventDefault();
closeReply($(this).attr('id').substring(2));
});
$('a.sort-option').live("click", function(event) {
event.preventDefault();
handleReSort($(this));
});
$('a.show-proposal').live("click", function(event) {
event.preventDefault();
showProposal($(this).attr('id').substring(2));
});
$('a.hide-proposal').live("click", function(event) {
event.preventDefault();
hideProposal($(this).attr('id').substring(2));
});
$('a.show-propose-change').live("click", function(event) {
event.preventDefault();
showProposeChange($(this).attr('id').substring(2));
});
$('a.hide-propose-change').live("click", function(event) {
event.preventDefault();
hideProposeChange($(this).attr('id').substring(2));
});
$('a.accept-comment').live("click", function(event) {
event.preventDefault();
acceptComment($(this).attr('id').substring(2));
});
$('a.delete-comment').live("click", function(event) {
event.preventDefault();
deleteComment($(this).attr('id').substring(2));
});
$('a.comment-markup').live("click", function(event) {
event.preventDefault();
toggleCommentMarkupBox($(this).attr('id').substring(2));
});
}
/**
* Set comp, which is a comparator function used for sorting and
* inserting comments into the list.
*/
function setComparator() {
// If the first three letters are "asc", sort in ascending order
// and remove the prefix.
if (by.substring(0,3) == 'asc') {
var i = by.substring(3);
comp = function(a, b) { return a[i] - b[i]; };
} else {
// Otherwise sort in descending order.
comp = function(a, b) { return b[by] - a[by]; };
}
// Reset link styles and format the selected sort option.
$('a.sel').attr('href', '#').removeClass('sel');
$('a.by' + by).removeAttr('href').addClass('sel');
}
/**
* Create a comp function. If the user has preferences stored in
* the sortBy cookie, use those, otherwise use the default.
*/
function initComparator() {
by = 'rating'; // Default to sort by rating.
// If the sortBy cookie is set, use that instead.
if (document.cookie.length > 0) {
var start = document.cookie.indexOf('sortBy=');
if (start != -1) {
start = start + 7;
var end = document.cookie.indexOf(";", start);
if (end == -1) {
end = document.cookie.length;
by = unescape(document.cookie.substring(start, end));
}
}
}
setComparator();
}
/**
* Show a comment div.
*/
function show(id) {
$('#ao' + id).hide();
$('#ah' + id).show();
var context = $.extend({id: id}, opts);
var popup = $(renderTemplate(popupTemplate, context)).hide();
popup.find('textarea[name="proposal"]').hide();
popup.find('a.by' + by).addClass('sel');
var form = popup.find('#cf' + id);
form.submit(function(event) {
event.preventDefault();
addComment(form);
});
$('#s' + id).after(popup);
popup.slideDown('fast', function() {
getComments(id);
});
}
/**
* Hide a comment div.
*/
function hide(id) {
$('#ah' + id).hide();
$('#ao' + id).show();
var div = $('#sc' + id);
div.slideUp('fast', function() {
div.remove();
});
}
/**
* Perform an ajax request to get comments for a node
* and insert the comments into the comments tree.
*/
function getComments(id) {
$.ajax({
type: 'GET',
url: opts.getCommentsURL,
data: {node: id},
success: function(data, textStatus, request) {
var ul = $('#cl' + id);
var speed = 100;
$('#cf' + id)
.find('textarea[name="proposal"]')
.data('source', data.source);
if (data.comments.length === 0) {
ul.html('<li>No comments yet.</li>');
ul.data('empty', true);
} else {
// If there are comments, sort them and put them in the list.
var comments = sortComments(data.comments);
speed = data.comments.length * 100;
appendComments(comments, ul);
ul.data('empty', false);
}
$('#cn' + id).slideUp(speed + 200);
ul.slideDown(speed);
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem retrieving the comments.');
},
dataType: 'json'
});
}
/**
* Add a comment via ajax and insert the comment into the comment tree.
*/
function addComment(form) {
var node_id = form.find('input[name="node"]').val();
var parent_id = form.find('input[name="parent"]').val();
var text = form.find('textarea[name="comment"]').val();
var proposal = form.find('textarea[name="proposal"]').val();
if (text == '') {
showError('Please enter a comment.');
return;
}
// Disable the form that is being submitted.
form.find('textarea,input').attr('disabled', 'disabled');
// Send the comment to the server.
$.ajax({
type: "POST",
url: opts.addCommentURL,
dataType: 'json',
data: {
node: node_id,
parent: parent_id,
text: text,
proposal: proposal
},
success: function(data, textStatus, error) {
// Reset the form.
if (node_id) {
hideProposeChange(node_id);
}
form.find('textarea')
.val('')
.add(form.find('input'))
.removeAttr('disabled');
var ul = $('#cl' + (node_id || parent_id));
if (ul.data('empty')) {
$(ul).empty();
ul.data('empty', false);
}
insertComment(data.comment);
var ao = $('#ao' + node_id);
ao.find('img').attr({'src': opts.commentBrightImage});
if (node_id) {
// if this was a "root" comment, remove the commenting box
// (the user can get it back by reopening the comment popup)
$('#ca' + node_id).slideUp();
}
},
error: function(request, textStatus, error) {
form.find('textarea,input').removeAttr('disabled');
showError('Oops, there was a problem adding the comment.');
}
});
}
/**
* Recursively append comments to the main comment list and children
* lists, creating the comment tree.
*/
function appendComments(comments, ul) {
$.each(comments, function() {
var div = createCommentDiv(this);
ul.append($(document.createElement('li')).html(div));
appendComments(this.children, div.find('ul.comment-children'));
// To avoid stagnating data, don't store the comments children in data.
this.children = null;
div.data('comment', this);
});
}
/**
* After adding a new comment, it must be inserted in the correct
* location in the comment tree.
*/
function insertComment(comment) {
var div = createCommentDiv(comment);
// To avoid stagnating data, don't store the comments children in data.
comment.children = null;
div.data('comment', comment);
var ul = $('#cl' + (comment.node || comment.parent));
var siblings = getChildren(ul);
var li = $(document.createElement('li'));
li.hide();
// Determine where in the parents children list to insert this comment.
for(i=0; i < siblings.length; i++) {
if (comp(comment, siblings[i]) <= 0) {
$('#cd' + siblings[i].id)
.parent()
.before(li.html(div));
li.slideDown('fast');
return;
}
}
// If we get here, this comment rates lower than all the others,
// or it is the only comment in the list.
ul.append(li.html(div));
li.slideDown('fast');
}
function acceptComment(id) {
$.ajax({
type: 'POST',
url: opts.acceptCommentURL,
data: {id: id},
success: function(data, textStatus, request) {
$('#cm' + id).fadeOut('fast');
$('#cd' + id).removeClass('moderate');
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem accepting the comment.');
}
});
}
function deleteComment(id) {
$.ajax({
type: 'POST',
url: opts.deleteCommentURL,
data: {id: id},
success: function(data, textStatus, request) {
var div = $('#cd' + id);
if (data == 'delete') {
// Moderator mode: remove the comment and all children immediately
div.slideUp('fast', function() {
div.remove();
});
return;
}
// User mode: only mark the comment as deleted
div
.find('span.user-id:first')
.text('[deleted]').end()
.find('div.comment-text:first')
.text('[deleted]').end()
.find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id +
', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id)
.remove();
var comment = div.data('comment');
comment.username = '[deleted]';
comment.text = '[deleted]';
div.data('comment', comment);
},
error: function(request, textStatus, error) {
showError('Oops, there was a problem deleting the comment.');
}
});
}
function showProposal(id) {
$('#sp' + id).hide();
$('#hp' + id).show();
$('#pr' + id).slideDown('fast');
}
function hideProposal(id) {
$('#hp' + id).hide();
$('#sp' + id).show();
$('#pr' + id).slideUp('fast');
}
function showProposeChange(id) {
$('#pc' + id).hide();
$('#hc' + id).show();
var textarea = $('#pt' + id);
textarea.val(textarea.data('source'));
$.fn.autogrow.resize(textarea[0]);
textarea.slideDown('fast');
}
function hideProposeChange(id) {
$('#hc' + id).hide();
$('#pc' + id).show();
var textarea = $('#pt' + id);
textarea.val('').removeAttr('disabled');
textarea.slideUp('fast');
}
function toggleCommentMarkupBox(id) {
$('#mb' + id).toggle();
}
/** Handle when the user clicks on a sort by link. */
function handleReSort(link) {
var classes = link.attr('class').split(/\s+/);
for (var i=0; i<classes.length; i++) {
if (classes[i] != 'sort-option') {
by = classes[i].substring(2);
}
}
setComparator();
// Save/update the sortBy cookie.
var expiration = new Date();
expiration.setDate(expiration.getDate() + 365);
document.cookie= 'sortBy=' + escape(by) +
';expires=' + expiration.toUTCString();
$('ul.comment-ul').each(function(index, ul) {
var comments = getChildren($(ul), true);
comments = sortComments(comments);
appendComments(comments, $(ul).empty());
});
}
/**
* Function to process a vote when a user clicks an arrow.
*/
function handleVote(link) {
if (!opts.voting) {
showError("You'll need to login to vote.");
return;
}
var id = link.attr('id');
if (!id) {
// Didn't click on one of the voting arrows.
return;
}
// If it is an unvote, the new vote value is 0,
// Otherwise it's 1 for an upvote, or -1 for a downvote.
var value = 0;
if (id.charAt(1) != 'u') {
value = id.charAt(0) == 'u' ? 1 : -1;
}
// The data to be sent to the server.
var d = {
comment_id: id.substring(2),
value: value
};
// Swap the vote and unvote links.
link.hide();
$('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id)
.show();
// The div the comment is displayed in.
var div = $('div#cd' + d.comment_id);
var data = div.data('comment');
// If this is not an unvote, and the other vote arrow has
// already been pressed, unpress it.
if ((d.value !== 0) && (data.vote === d.value * -1)) {
$('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide();
$('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show();
}
// Update the comments rating in the local data.
data.rating += (data.vote === 0) ? d.value : (d.value - data.vote);
data.vote = d.value;
div.data('comment', data);
// Change the rating text.
div.find('.rating:first')
.text(data.rating + ' point' + (data.rating == 1 ? '' : 's'));
// Send the vote information to the server.
$.ajax({
type: "POST",
url: opts.processVoteURL,
data: d,
error: function(request, textStatus, error) {
showError('Oops, there was a problem casting that vote.');
}
});
}
/**
* Open a reply form used to reply to an existing comment.
*/
function openReply(id) {
// Swap out the reply link for the hide link
$('#rl' + id).hide();
$('#cr' + id).show();
// Add the reply li to the children ul.
var div = $(renderTemplate(replyTemplate, {id: id})).hide();
$('#cl' + id)
.prepend(div)
// Setup the submit handler for the reply form.
.find('#rf' + id)
.submit(function(event) {
event.preventDefault();
addComment($('#rf' + id));
closeReply(id);
})
.find('input[type=button]')
.click(function() {
closeReply(id);
});
div.slideDown('fast', function() {
$('#rf' + id).find('textarea').focus();
});
}
/**
* Close the reply form opened with openReply.
*/
function closeReply(id) {
// Remove the reply div from the DOM.
$('#rd' + id).slideUp('fast', function() {
$(this).remove();
});
// Swap out the hide link for the reply link
$('#cr' + id).hide();
$('#rl' + id).show();
}
/**
* Recursively sort a tree of comments using the comp comparator.
*/
function sortComments(comments) {
comments.sort(comp);
$.each(comments, function() {
this.children = sortComments(this.children);
});
return comments;
}
/**
* Get the children comments from a ul. If recursive is true,
* recursively include childrens' children.
*/
function getChildren(ul, recursive) {
var children = [];
ul.children().children("[id^='cd']")
.each(function() {
var comment = $(this).data('comment');
if (recursive)
comment.children = getChildren($(this).find('#cl' + comment.id), true);
children.push(comment);
});
return children;
}
/** Create a div to display a comment in. */
function createCommentDiv(comment) {
if (!comment.displayed && !opts.moderator) {
return $('<div class="moderate">Thank you! Your comment will show up '
+ 'once it is has been approved by a moderator.</div>');
}
// Prettify the comment rating.
comment.pretty_rating = comment.rating + ' point' +
(comment.rating == 1 ? '' : 's');
// Make a class (for displaying not yet moderated comments differently)
comment.css_class = comment.displayed ? '' : ' moderate';
// Create a div for this comment.
var context = $.extend({}, opts, comment);
var div = $(renderTemplate(commentTemplate, context));
// If the user has voted on this comment, highlight the correct arrow.
if (comment.vote) {
var direction = (comment.vote == 1) ? 'u' : 'd';
div.find('#' + direction + 'v' + comment.id).hide();
div.find('#' + direction + 'u' + comment.id).show();
}
if (opts.moderator || comment.text != '[deleted]') {
div.find('a.reply').show();
if (comment.proposal_diff)
div.find('#sp' + comment.id).show();
if (opts.moderator && !comment.displayed)
div.find('#cm' + comment.id).show();
if (opts.moderator || (opts.username == comment.username))
div.find('#dc' + comment.id).show();
}
return div;
}
/**
* A simple template renderer. Placeholders such as <%id%> are replaced
* by context['id'] with items being escaped. Placeholders such as <#id#>
* are not escaped.
*/
function renderTemplate(template, context) {
var esc = $(document.createElement('div'));
function handle(ph, escape) {
var cur = context;
$.each(ph.split('.'), function() {
cur = cur[this];
});
return escape ? esc.text(cur || "").html() : cur;
}
return template.replace(/<([%#])([\w\.]*)\1>/g, function() {
return handle(arguments[2], arguments[1] == '%' ? true : false);
});
}
/** Flash an error message briefly. */
function showError(message) {
$(document.createElement('div')).attr({'class': 'popup-error'})
.append($(document.createElement('div'))
.attr({'class': 'error-message'}).text(message))
.appendTo('body')
.fadeIn("slow")
.delay(2000)
.fadeOut("slow");
}
/** Add a link the user uses to open the comments popup. */
$.fn.comment = function() {
return this.each(function() {
var id = $(this).attr('id').substring(1);
var count = COMMENT_METADATA[id];
var title = count + ' comment' + (count == 1 ? '' : 's');
var image = count > 0 ? opts.commentBrightImage : opts.commentImage;
var addcls = count == 0 ? ' nocomment' : '';
$(this)
.append(
$(document.createElement('a')).attr({
href: '#',
'class': 'sphinx-comment-open' + addcls,
id: 'ao' + id
})
.append($(document.createElement('img')).attr({
src: image,
alt: 'comment',
title: title
}))
.click(function(event) {
event.preventDefault();
show($(this).attr('id').substring(2));
})
)
.append(
$(document.createElement('a')).attr({
href: '#',
'class': 'sphinx-comment-close hidden',
id: 'ah' + id
})
.append($(document.createElement('img')).attr({
src: opts.closeCommentImage,
alt: 'close',
title: 'close'
}))
.click(function(event) {
event.preventDefault();
hide($(this).attr('id').substring(2));
})
);
});
};
var opts = {
processVoteURL: '/_process_vote',
addCommentURL: '/_add_comment',
getCommentsURL: '/_get_comments',
acceptCommentURL: '/_accept_comment',
deleteCommentURL: '/_delete_comment',
commentImage: '/static/_static/comment.png',
closeCommentImage: '/static/_static/comment-close.png',
loadingImage: '/static/_static/ajax-loader.gif',
commentBrightImage: '/static/_static/comment-bright.png',
upArrow: '/static/_static/up.png',
downArrow: '/static/_static/down.png',
upArrowPressed: '/static/_static/up-pressed.png',
downArrowPressed: '/static/_static/down-pressed.png',
voting: false,
moderator: false
};
if (typeof COMMENT_OPTIONS != "undefined") {
opts = jQuery.extend(opts, COMMENT_OPTIONS);
}
var popupTemplate = '\
<div class="sphinx-comments" id="sc<%id%>">\
<p class="sort-options">\
Sort by:\
<a href="#" class="sort-option byrating">best rated</a>\
<a href="#" class="sort-option byascage">newest</a>\
<a href="#" class="sort-option byage">oldest</a>\
</p>\
<div class="comment-header">Comments</div>\
<div class="comment-loading" id="cn<%id%>">\
loading comments... <img src="<%loadingImage%>" alt="" /></div>\
<ul id="cl<%id%>" class="comment-ul"></ul>\
<div id="ca<%id%>">\
<p class="add-a-comment">Add a comment\
(<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
<div class="comment-markup-box" id="mb<%id%>">\
reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
<tt>``code``</tt>, \
code blocks: <tt>::</tt> and an indented block after blank line</div>\
<form method="post" id="cf<%id%>" class="comment-form" action="">\
<textarea name="comment" cols="80"></textarea>\
<p class="propose-button">\
<a href="#" id="pc<%id%>" class="show-propose-change">\
Propose a change &#9657;\
</a>\
<a href="#" id="hc<%id%>" class="hide-propose-change">\
Propose a change &#9663;\
</a>\
</p>\
<textarea name="proposal" id="pt<%id%>" cols="80"\
spellcheck="false"></textarea>\
<input type="submit" value="Add comment" />\
<input type="hidden" name="node" value="<%id%>" />\
<input type="hidden" name="parent" value="" />\
</form>\
</div>\
</div>';
var commentTemplate = '\
<div id="cd<%id%>" class="sphinx-comment<%css_class%>">\
<div class="vote">\
<div class="arrow">\
<a href="#" id="uv<%id%>" class="vote" title="vote up">\
<img src="<%upArrow%>" />\
</a>\
<a href="#" id="uu<%id%>" class="un vote" title="vote up">\
<img src="<%upArrowPressed%>" />\
</a>\
</div>\
<div class="arrow">\
<a href="#" id="dv<%id%>" class="vote" title="vote down">\
<img src="<%downArrow%>" id="da<%id%>" />\
</a>\
<a href="#" id="du<%id%>" class="un vote" title="vote down">\
<img src="<%downArrowPressed%>" />\
</a>\
</div>\
</div>\
<div class="comment-content">\
<p class="tagline comment">\
<span class="user-id"><%username%></span>\
<span class="rating"><%pretty_rating%></span>\
<span class="delta"><%time.delta%></span>\
</p>\
<div class="comment-text comment"><#text#></div>\
<p class="comment-opts comment">\
<a href="#" class="reply hidden" id="rl<%id%>">reply &#9657;</a>\
<a href="#" class="close-reply" id="cr<%id%>">reply &#9663;</a>\
<a href="#" id="sp<%id%>" class="show-proposal">proposal &#9657;</a>\
<a href="#" id="hp<%id%>" class="hide-proposal">proposal &#9663;</a>\
<a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\
<span id="cm<%id%>" class="moderation hidden">\
<a href="#" id="ac<%id%>" class="accept-comment">accept</a>\
</span>\
</p>\
<pre class="proposal" id="pr<%id%>">\
<#proposal_diff#>\
</pre>\
<ul class="comment-children" id="cl<%id%>"></ul>\
</div>\
<div class="clearleft"></div>\
</div>\
</div>';
var replyTemplate = '\
<li>\
<div class="reply-div" id="rd<%id%>">\
<form id="rf<%id%>">\
<textarea name="comment" cols="80"></textarea>\
<input type="submit" value="Add reply" />\
<input type="button" value="Cancel" />\
<input type="hidden" name="parent" value="<%id%>" />\
<input type="hidden" name="node" value="" />\
</form>\
</div>\
</li>';
$(document).ready(function() {
init();
});
})(jQuery);
$(document).ready(function() {
// add comment anchors for all paragraphs that are commentable
$('.sphinx-has-comment').comment();
// highlight search words in search results
$("div.context").each(function() {
var params = $.getQueryParameters();
var terms = (params.q) ? params.q[0].split(/\s+/) : [];
var result = $(this);
$.each(terms, function() {
result.highlightText(this.toLowerCase(), 'highlighted');
});
});
// directly open comment window if requested
var anchor = document.location.hash;
if (anchor.substring(0, 9) == '#comment-') {
$('#ao' + anchor.substring(9)).click();
document.location.hash = '#s' + anchor.substring(9);
}
});

View File

@ -0,0 +1,662 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>client HPLeftHandClient &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="../../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="../../index.html" />
<link rel="up" title="client HPLeftHandClient" href="index.html" />
<link rel="next" title="exceptions HTTP Exceptions" href="exceptions.html" />
<link rel="prev" title="client HPLeftHandClient" href="index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="exceptions.html" title="exceptions HTTP Exceptions"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="index.html" title="client HPLeftHandClient"
accesskey="P">previous</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >API Documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U"><tt class="docutils literal docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHandClient</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="module-hplefthandclient.client">
<span id="client-hplefthandclient"></span><h1><tt class="xref py py-mod docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHandClient<a class="headerlink" href="#module-hplefthandclient.client" title="Permalink to this headline"></a></h1>
<p>HPLeftHand REST Client</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Author:</th><td class="field-body">Kurt Martin</td>
</tr>
<tr class="field-even field"><th class="field-name">Description:</th><td class="field-body">This is the LeftHand/StoreVirtual Client that talks to the</td>
</tr>
</tbody>
</table>
<p>LeftHand OS REST Service.</p>
<p>This client requires and works with version 11.5 of the LeftHand firmware</p>
<dl class="class">
<dt id="hplefthandclient.client.HPLeftHandClient">
<em class="property">class </em><tt class="descclassname">hplefthandclient.client.</tt><tt class="descname">HPLeftHandClient</tt><big>(</big><em>api_url</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient" title="Permalink to this definition"></a></dt>
<dd><dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.debug_rest">
<tt class="descname">debug_rest</tt><big>(</big><em>flag</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.debug_rest"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.debug_rest" title="Permalink to this definition"></a></dt>
<dd><p>This is useful for debugging requests to LeftHand</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>flag</strong> (<em>bool</em>) &#8211; set to True to enable debugging</td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.login">
<tt class="descname">login</tt><big>(</big><em>username</em>, <em>password</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.login"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.login" title="Permalink to this definition"></a></dt>
<dd><p>This authenticates against the LH OS REST server and creates a session.</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
<li><strong>username</strong> (<em>str</em>) &#8211; The username</li>
<li><strong>password</strong> (<em>str</em>) &#8211; The password</li>
</ul>
</td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">None</p>
</td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.logout">
<tt class="descname">logout</tt><big>(</big><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.logout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.logout" title="Permalink to this definition"></a></dt>
<dd><p>This destroys the session and logs out from the LH OS server</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">None</td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.getClusters">
<tt class="descname">getClusters</tt><big>(</big><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.getClusters"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.getClusters" title="Permalink to this definition"></a></dt>
<dd><p>Get the list of Clusters</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">list of Clusters</td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.getCluster">
<tt class="descname">getCluster</tt><big>(</big><em>cluster_id</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.getCluster"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.getCluster" title="Permalink to this definition"></a></dt>
<dd><p>Get information about a Cluster</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>cluster_id</strong> (<em>str</em>) &#8211; The id of the cluster to find</td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">cluster</td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.getClusterByName">
<tt class="descname">getClusterByName</tt><big>(</big><em>name</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.getClusterByName"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.getClusterByName" title="Permalink to this definition"></a></dt>
<dd><p>Get information about a cluster by name</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>name</strong> (<em>str</em>) &#8211; The name of the cluster to find</td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">cluster</td>
</tr>
<tr class="field-odd field"><th class="field-name">Raises :</th><td class="field-body"><a class="reference internal" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPNotFound" title="hplefthandclient.exceptions.HTTPNotFound"><tt class="xref py py-class docutils literal"><span class="pre">HTTPNotFound</span></tt></a> -</td>
</tr>
</tbody>
</table>
<p>NON_EXISTENT_CLUSTER - cluster doesn&#8217;t exist</p>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.getServers">
<tt class="descname">getServers</tt><big>(</big><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.getServers"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.getServers" title="Permalink to this definition"></a></dt>
<dd><p>Get the list of Servers</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">list of Servers</td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.getServer">
<tt class="descname">getServer</tt><big>(</big><em>server_id</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.getServer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.getServer" title="Permalink to this definition"></a></dt>
<dd><p>Get information about a server</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>server_id</strong> (<em>str</em>) &#8211; The id of the server to find</td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">server</td>
</tr>
<tr class="field-odd field"><th class="field-name">Raises :</th><td class="field-body"><a class="reference internal" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPServerError" title="hplefthandclient.exceptions.HTTPServerError"><tt class="xref py py-class docutils literal"><span class="pre">HTTPServerError</span></tt></a></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.getServerByName">
<tt class="descname">getServerByName</tt><big>(</big><em>name</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.getServerByName"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.getServerByName" title="Permalink to this definition"></a></dt>
<dd><p>Get information about a server by name</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>name</strong> (<em>str</em>) &#8211; The name of the server to find</td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">server</td>
</tr>
<tr class="field-odd field"><th class="field-name">Raises :</th><td class="field-body"><a class="reference internal" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPNotFound" title="hplefthandclient.exceptions.HTTPNotFound"><tt class="xref py py-class docutils literal"><span class="pre">HTTPNotFound</span></tt></a> -</td>
</tr>
</tbody>
</table>
<p>NON_EXISTENT_SERVER - server doesn&#8217;t exist</p>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.createServer">
<tt class="descname">createServer</tt><big>(</big><em>name</em>, <em>iqn</em>, <em>optional=None</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.createServer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.createServer" title="Permalink to this definition"></a></dt>
<dd><p>Create a server by name</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
<li><strong>name</strong> (<em>str</em>) &#8211; The name of the server to create</li>
<li><strong>iqn</strong> &#8211; The iSCSI qualified name</li>
<li><strong>optional</strong> (<em>dict</em>) &#8211; Dictionary of optional params</li>
</ul>
</td>
</tr>
</tbody>
</table>
<div class="highlight-python"><div class="highlight"><pre><span class="n">optional</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&#39;description&#39;</span> <span class="p">:</span> <span class="s">&quot;some comment&quot;</span><span class="p">,</span>
<span class="s">&#39;iscsiEnabled&#39;</span> <span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s">&#39;chapName&#39;</span><span class="p">:</span> <span class="s">&quot;some chap name&quot;</span><span class="p">,</span>
<span class="s">&#39;chapAuthenticationRequired&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
<span class="s">&#39;chapInitiatorSecret&#39;</span><span class="p">:</span> <span class="s">&quot;initiator secret&quot;</span><span class="p">,</span>
<span class="s">&#39;chapTargetSecret&#39;</span><span class="p">:</span> <span class="s">&quot;target secret&quot;</span><span class="p">,</span>
<span class="s">&#39;iscsiLoadBalancingEnabled&#39;</span><span class="p">:</span> <span class="bp">True</span><span class="p">,</span>
<span class="s">&#39;controllingServerName&#39;</span><span class="p">:</span> <span class="s">&quot;server name&quot;</span><span class="p">,</span>
<span class="s">&#39;fibreChannelEnabled&#39;</span><span class="p">:</span> <span class="bp">False</span><span class="p">,</span>
<span class="s">&#39;inServerCluster&quot;: True</span>
<span class="p">}</span>
</pre></div>
</div>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">server</td>
</tr>
<tr class="field-even field"><th class="field-name">Raises :</th><td class="field-body"><a class="reference internal" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPNotFound" title="hplefthandclient.exceptions.HTTPNotFound"><tt class="xref py py-class docutils literal"><span class="pre">HTTPNotFound</span></tt></a> -</td>
</tr>
</tbody>
</table>
<p>NON_EXISTENT_SERVER - server doesn&#8217;t exist</p>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.deleteServer">
<tt class="descname">deleteServer</tt><big>(</big><em>server_id</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.deleteServer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.deleteServer" title="Permalink to this definition"></a></dt>
<dd><p>Delete a Server</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>server_id</strong> &#8211; the server ID to delete</td>
</tr>
<tr class="field-even field"><th class="field-name">Raises :</th><td class="field-body"><a class="reference internal" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPNotFound" title="hplefthandclient.exceptions.HTTPNotFound"><tt class="xref py py-class docutils literal"><span class="pre">HTTPNotFound</span></tt></a> -</td>
</tr>
</tbody>
</table>
<p>NON_EXISTENT_SERVER - The server does not exist</p>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.getSnapshots">
<tt class="descname">getSnapshots</tt><big>(</big><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.getSnapshots"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.getSnapshots" title="Permalink to this definition"></a></dt>
<dd><p>Get the list of Snapshots</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">list of Snapshots</td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.getSnapshot">
<tt class="descname">getSnapshot</tt><big>(</big><em>snapshot_id</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.getSnapshot"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.getSnapshot" title="Permalink to this definition"></a></dt>
<dd><p>Get information about a Snapshot</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">snapshot</td>
</tr>
<tr class="field-even field"><th class="field-name">Raises :</th><td class="field-body"><a class="reference internal" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPServerError" title="hplefthandclient.exceptions.HTTPServerError"><tt class="xref py py-class docutils literal"><span class="pre">HTTPServerError</span></tt></a></td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.getSnapshotByName">
<tt class="descname">getSnapshotByName</tt><big>(</big><em>name</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.getSnapshotByName"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.getSnapshotByName" title="Permalink to this definition"></a></dt>
<dd><p>Get information about a snapshot by name</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>name</strong> &#8211; The name of the snapshot to find</td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">volume</td>
</tr>
<tr class="field-odd field"><th class="field-name">Raises :</th><td class="field-body"><a class="reference internal" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPNotFound" title="hplefthandclient.exceptions.HTTPNotFound"><tt class="xref py py-class docutils literal"><span class="pre">HTTPNotFound</span></tt></a> -</td>
</tr>
</tbody>
</table>
<p>NON_EXISTENT_SNAP - shapshot doesn&#8217;t exist</p>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.createSnapshot">
<tt class="descname">createSnapshot</tt><big>(</big><em>name</em>, <em>source_volume_id</em>, <em>optional=None</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.createSnapshot"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.createSnapshot" title="Permalink to this definition"></a></dt>
<dd><p>Create a snapshot of an existing Volume</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
<li><strong>name</strong> (<em>str</em>) &#8211; Name of the Snapshot</li>
<li><strong>source_volume_id</strong> (<em>int</em>) &#8211; The volume you want to snapshot</li>
<li><strong>optional</strong> (<em>dict</em>) &#8211; Dictionary of optional params</li>
</ul>
</td>
</tr>
</tbody>
</table>
<div class="highlight-python"><div class="highlight"><pre><span class="n">optional</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&#39;description&#39;</span> <span class="p">:</span> <span class="s">&quot;some comment&quot;</span><span class="p">,</span>
<span class="s">&#39;inheritAccess&#39;</span> <span class="p">:</span> <span class="n">false</span>
<span class="p">}</span>
</pre></div>
</div>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.deleteSnapshot">
<tt class="descname">deleteSnapshot</tt><big>(</big><em>snapshot_id</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.deleteSnapshot"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.deleteSnapshot" title="Permalink to this definition"></a></dt>
<dd><p>Delete a Snapshot</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>snapshot_id</strong> &#8211; the snapshot ID to delete</td>
</tr>
<tr class="field-even field"><th class="field-name">Raises :</th><td class="field-body"><a class="reference internal" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPNotFound" title="hplefthandclient.exceptions.HTTPNotFound"><tt class="xref py py-class docutils literal"><span class="pre">HTTPNotFound</span></tt></a> -</td>
</tr>
</tbody>
</table>
<p>NON_EXISTENT_SNAPSHOT - The snapshot does not exist</p>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.cloneSnapshot">
<tt class="descname">cloneSnapshot</tt><big>(</big><em>name</em>, <em>source_snapshot_id</em>, <em>optional=None</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.cloneSnapshot"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.cloneSnapshot" title="Permalink to this definition"></a></dt>
<dd><p>Create a clone of an existing Shapshot</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
<li><strong>name</strong> (<em>str</em>) &#8211; Name of the Snapshot clone</li>
<li><strong>source_snapshot_id</strong> (<em>int</em>) &#8211; The snapshot you want to clone</li>
<li><strong>optional</strong> (<em>dict</em>) &#8211; Dictionary of optional params</li>
</ul>
</td>
</tr>
</tbody>
</table>
<div class="highlight-python"><div class="highlight"><pre><span class="n">optional</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&#39;description&#39;</span> <span class="p">:</span> <span class="s">&quot;some comment&quot;</span>
<span class="p">}</span>
</pre></div>
</div>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.getVolumes">
<tt class="descname">getVolumes</tt><big>(</big><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.getVolumes"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.getVolumes" title="Permalink to this definition"></a></dt>
<dd><p>Get the list of Volumes</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">list of Volumes</td>
</tr>
</tbody>
</table>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.getVolume">
<tt class="descname">getVolume</tt><big>(</big><em>volume_id</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.getVolume"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.getVolume" title="Permalink to this definition"></a></dt>
<dd><p>Get information about a volume</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>volume_id</strong> (<em>str</em>) &#8211; The id of the volume to find</td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">volume</td>
</tr>
<tr class="field-odd field"><th class="field-name">Raises :</th><td class="field-body"><a class="reference internal" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPNotFound" title="hplefthandclient.exceptions.HTTPNotFound"><tt class="xref py py-class docutils literal"><span class="pre">HTTPNotFound</span></tt></a> -</td>
</tr>
</tbody>
</table>
<p>NON_EXISTENT_VOL - volume doesn&#8217;t exist</p>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.getVolumeByName">
<tt class="descname">getVolumeByName</tt><big>(</big><em>name</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.getVolumeByName"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.getVolumeByName" title="Permalink to this definition"></a></dt>
<dd><p>Get information about a volume by name</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>name</strong> &#8211; The name of the volume to find</td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">volume</td>
</tr>
<tr class="field-odd field"><th class="field-name">Raises :</th><td class="field-body"><a class="reference internal" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPNotFound" title="hplefthandclient.exceptions.HTTPNotFound"><tt class="xref py py-class docutils literal"><span class="pre">HTTPNotFound</span></tt></a> -</td>
</tr>
</tbody>
</table>
<p>NON_EXISTENT_VOL - volume doesn&#8217;t exist</p>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.createVolume">
<tt class="descname">createVolume</tt><big>(</big><em>name</em>, <em>cluster_id</em>, <em>size</em>, <em>optional=None</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.createVolume"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.createVolume" title="Permalink to this definition"></a></dt>
<dd><p>Create a new volume</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
<li><strong>name</strong> (<em>str</em>) &#8211; the name of the volume</li>
<li><strong>cluster_id</strong> (<em>int</em>) &#8211; the cluster Id</li>
<li><strong>sizeKB</strong> (<em>int</em>) &#8211; size in KB for the volume</li>
<li><strong>optional</strong> (<em>dict</em>) &#8211; dict of other optional items</li>
</ul>
</td>
</tr>
</tbody>
</table>
<div class="highlight-python"><div class="highlight"><pre><span class="n">optional</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&#39;description&#39;</span><span class="p">:</span> <span class="s">&#39;some comment&#39;</span><span class="p">,</span>
<span class="s">&#39;isThinProvisioned&#39;</span><span class="p">:</span> <span class="s">&#39;true&#39;</span><span class="p">,</span>
<span class="s">&#39;autogrowSeconds&#39;</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
<span class="s">&#39;clusterName&#39;</span><span class="p">:</span> <span class="s">&#39;somename&#39;</span><span class="p">,</span>
<span class="s">&#39;isAdaptiveOptimizationEnabled&#39;</span><span class="p">:</span> <span class="s">&#39;true&#39;</span><span class="p">,</span>
<span class="s">&#39;dataProtectionLevel&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
<span class="p">}</span>
</pre></div>
</div>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">List of Volumes</td>
</tr>
<tr class="field-even field"><th class="field-name">Raises :</th><td class="field-body"><a class="reference internal" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPConflict" title="hplefthandclient.exceptions.HTTPConflict"><tt class="xref py py-class docutils literal"><span class="pre">HTTPConflict</span></tt></a> -</td>
</tr>
</tbody>
</table>
<p>EXISTENT_SV - Volume Exists already</p>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.deleteVolume">
<tt class="descname">deleteVolume</tt><big>(</big><em>volume_id</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.deleteVolume"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.deleteVolume" title="Permalink to this definition"></a></dt>
<dd><p>Delete a volume</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>name</strong> (<em>str</em>) &#8211; the name of the volume</td>
</tr>
<tr class="field-even field"><th class="field-name">Raises :</th><td class="field-body"><a class="reference internal" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPNotFound" title="hplefthandclient.exceptions.HTTPNotFound"><tt class="xref py py-class docutils literal"><span class="pre">HTTPNotFound</span></tt></a> -</td>
</tr>
</tbody>
</table>
<p>NON_EXISTENT_VOL - The volume does not exist</p>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.modifyVolume">
<tt class="descname">modifyVolume</tt><big>(</big><em>volume_id</em>, <em>optional</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.modifyVolume"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.modifyVolume" title="Permalink to this definition"></a></dt>
<dd><p>Modify an existing volume.</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>volume_id</strong> (<em>str</em>) &#8211; The id of the volume to find</td>
</tr>
<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">volume</td>
</tr>
<tr class="field-odd field"><th class="field-name">Raises :</th><td class="field-body"><a class="reference internal" href="../../hplefthandclient.html#hplefthandclient.exceptions.HTTPNotFound" title="hplefthandclient.exceptions.HTTPNotFound"><tt class="xref py py-class docutils literal"><span class="pre">HTTPNotFound</span></tt></a> -</td>
</tr>
</tbody>
</table>
<p>NON_EXISTENT_VOL - volume doesn&#8217;t exist</p>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.cloneVolume">
<tt class="descname">cloneVolume</tt><big>(</big><em>name</em>, <em>source_volume_id</em>, <em>optional=None</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.cloneVolume"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.cloneVolume" title="Permalink to this definition"></a></dt>
<dd><p>Create a clone of an existing Volume</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
<li><strong>name</strong> (<em>str</em>) &#8211; Name of the Volume clone</li>
<li><strong>source_volume_id</strong> (<em>int</em>) &#8211; The Volume you want to clone</li>
<li><strong>optional</strong> (<em>dict</em>) &#8211; Dictionary of optional params</li>
</ul>
</td>
</tr>
</tbody>
</table>
<div class="highlight-python"><div class="highlight"><pre><span class="n">optional</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&#39;description&#39;</span> <span class="p">:</span> <span class="s">&quot;some comment&quot;</span>
<span class="p">}</span>
</pre></div>
</div>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.addServerAccess">
<tt class="descname">addServerAccess</tt><big>(</big><em>volume_id</em>, <em>server_id</em>, <em>optional=None</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.addServerAccess"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.addServerAccess" title="Permalink to this definition"></a></dt>
<dd><p>Assign a Volume to a Server</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
<li><strong>volume_id</strong> &#8211; Volume ID of the volume</li>
<li><strong>server_id</strong> &#8211; Server ID of the server to add the volume to</li>
<li><strong>optional</strong> (<em>dict</em>) &#8211; Dictionary of optional params</li>
</ul>
</td>
</tr>
</tbody>
</table>
<div class="highlight-python"><div class="highlight"><pre><span class="n">optional</span> <span class="o">=</span> <span class="p">{</span>
<span class="s">&#39;Transport&#39;</span> <span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
<span class="s">&#39;Lun&#39;</span> <span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
<span class="p">}</span>
</pre></div>
</div>
</dd></dl>
<dl class="method">
<dt id="hplefthandclient.client.HPLeftHandClient.removeServerAccess">
<tt class="descname">removeServerAccess</tt><big>(</big><em>volume_id</em>, <em>server_id</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/client.html#HPLeftHandClient.removeServerAccess"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.client.HPLeftHandClient.removeServerAccess" title="Permalink to this definition"></a></dt>
<dd><p>Unassign a Volume from a Server</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
<li><strong>volume_id</strong> &#8211; Volume ID of the volume</li>
<li><strong>server_id</strong> &#8211; Server ID of the server to remove the volume fom</li>
</ul>
</td>
</tr>
</tbody>
</table>
</dd></dl>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h4>Previous topic</h4>
<p class="topless"><a href="index.html"
title="previous chapter"><tt class="docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHandClient</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="exceptions.html"
title="next chapter"><tt class="docutils literal"><span class="pre">exceptions</span></tt> &#8211; HTTP Exceptions</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="../../_sources/api/hplefthandclient/client.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="exceptions.html" title="exceptions HTTP Exceptions"
>next</a> |</li>
<li class="right" >
<a href="index.html" title="client HPLeftHandClient"
>previous</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >API Documentation</a> &raquo;</li>
<li><a href="index.html" ><tt class="docutils literal docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHandClient</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@ -0,0 +1,146 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>exceptions HTTP Exceptions &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="../../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="../../index.html" />
<link rel="up" title="client HPLeftHnadClient" href="index.html" />
<link rel="next" title="http HTTP REST Base Class" href="http.html" />
<link rel="prev" title="client HPLeftHandClient" href="client.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="http.html" title="http HTTP REST Base Class"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="client.html" title="client HPLeftHandClient"
accesskey="P">previous</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >API Documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U"><tt class="docutils literal docutils literal docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHnadClient</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="module-hplefthandclient.exceptions">
<span id="exceptions-http-exceptions"></span><h1><tt class="xref py py-mod docutils literal"><span class="pre">exceptions</span></tt> &#8211; HTTP Exceptions<a class="headerlink" href="#module-hplefthandclient.exceptions" title="Permalink to this headline"></a></h1>
<p>Exceptions for the client</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Author:</th><td class="field-body">Walter A. Boring IV</td>
</tr>
<tr class="field-even field"><th class="field-name">Description:</th><td class="field-body">This contains the HTTP exceptions that can come back from the REST calls</td>
</tr>
</tbody>
</table>
<dl class="class">
<dt id="hplefthandclient.exceptions.HTTPNotFound">
<em class="property">class </em><tt class="descclassname">hplefthandclient.exceptions.</tt><tt class="descname">HTTPNotFound</tt><big>(</big><em>error=None</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/exceptions.html#HTTPNotFound"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.exceptions.HTTPNotFound" title="Permalink to this definition"></a></dt>
<dd><p>HTTP 404 - Not found</p>
</dd></dl>
<dl class="class">
<dt id="hplefthandclient.exceptions.HTTPBadRequest">
<em class="property">class </em><tt class="descclassname">hplefthandclient.exceptions.</tt><tt class="descname">HTTPBadRequest</tt><big>(</big><em>error=None</em><big>)</big><a class="reference internal" href="../../_modules/hplefthandclient/exceptions.html#HTTPBadRequest"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#hplefthandclient.exceptions.HTTPBadRequest" title="Permalink to this definition"></a></dt>
<dd><p>HTTP 400 - Bad request: you sent some malformed data.</p>
</dd></dl>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h4>Previous topic</h4>
<p class="topless"><a href="client.html"
title="previous chapter"><tt class="docutils literal docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHandClient</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="http.html"
title="next chapter"><tt class="docutils literal"><span class="pre">http</span></tt> &#8211; HTTP REST Base Class</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="../../_sources/api/hplefthandclient/exceptions.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="http.html" title="http HTTP REST Base Class"
>next</a> |</li>
<li class="right" >
<a href="client.html" title="client HPLeftHandClient"
>previous</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >API Documentation</a> &raquo;</li>
<li><a href="index.html" ><tt class="docutils literal docutils literal docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHnadClient</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@ -0,0 +1,118 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>http HTTP REST Base Class &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="../../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="../../index.html" />
<link rel="up" title="client HPLeftHnadClient" href="index.html" />
<link rel="prev" title="exceptions HTTP Exceptions" href="exceptions.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="exceptions.html" title="exceptions HTTP Exceptions"
accesskey="P">previous</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >API Documentation</a> &raquo;</li>
<li><a href="index.html" accesskey="U"><tt class="docutils literal docutils literal docutils literal docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHnadClient</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="module-hplefthandclient.http">
<span id="http-http-rest-base-class"></span><h1><tt class="xref py py-mod docutils literal"><span class="pre">http</span></tt> &#8211; HTTP REST Base Class<a class="headerlink" href="#module-hplefthandclient.http" title="Permalink to this headline"></a></h1>
<p>HPLeftHand HTTP Client
:Author: Walter A. Boring IV
:Description: This is the HTTP Client that is used to make the actual calls.</p>
<blockquote>
<div>It includes the authentication that knows the cookie name for LH.</div></blockquote>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h4>Previous topic</h4>
<p class="topless"><a href="exceptions.html"
title="previous chapter"><tt class="docutils literal docutils literal docutils literal"><span class="pre">exceptions</span></tt> &#8211; HTTP Exceptions</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="../../_sources/api/hplefthandclient/http.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="exceptions.html" title="exceptions HTTP Exceptions"
>previous</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >API Documentation</a> &raquo;</li>
<li><a href="index.html" ><tt class="docutils literal docutils literal docutils literal docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHnadClient</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

View File

@ -0,0 +1,150 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>client HPLeftHandClient &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="../../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../../',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="../../index.html" />
<link rel="up" title="API Documentation" href="../index.html" />
<link rel="next" title="client HPLeftHandClient" href="client.html" />
<link rel="prev" title="API Documentation" href="../index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="client.html" title="client HPLeftHandClient"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="../index.html" title="API Documentation"
accesskey="P">previous</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" accesskey="U">API Documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="module-hplefthandclient">
<span id="client-hplefthandclient"></span><h1><tt class="xref py py-mod docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHandClient<a class="headerlink" href="#module-hplefthandclient" title="Permalink to this headline"></a></h1>
<p>HP LeftHand REST Client</p>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Author:</th><td class="field-body">Kurt Martin</td>
</tr>
<tr class="field-even field"><th class="field-name">Author:</th><td class="field-body">Walter A. Boring IV</td>
</tr>
<tr class="field-odd field"><th class="field-name">Copyright:</th><td class="field-body">Copyright 2013, Hewlett Packard Development Company, L.P.</td>
</tr>
<tr class="field-even field"><th class="field-name">License:</th><td class="field-body">Apache v2.0</td>
</tr>
</tbody>
</table>
<dl class="data">
<dt id="hplefthandclient.version">
<tt class="descclassname">hplefthandclient.</tt><tt class="descname">version</tt><em class="property"> = '1.0.0'</em><a class="headerlink" href="#hplefthandclient.version" title="Permalink to this definition"></a></dt>
<dd><p>Current version of HPLeftHandClient.</p>
</dd></dl>
<p>Sub-modules:</p>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="client.html"><tt class="docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHandClient</a></li>
<li class="toctree-l1"><a class="reference internal" href="exceptions.html"><tt class="docutils literal"><span class="pre">exceptions</span></tt> &#8211; HTTP Exceptions</a></li>
<li class="toctree-l1"><a class="reference internal" href="http.html"><tt class="docutils literal"><span class="pre">http</span></tt> &#8211; HTTP REST Base Class</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h4>Previous topic</h4>
<p class="topless"><a href="../index.html"
title="previous chapter">API Documentation</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="client.html"
title="next chapter"><tt class="docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHandClient</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="../../_sources/api/hplefthandclient/index.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="../../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="client.html" title="client HPLeftHandClient"
>next</a> |</li>
<li class="right" >
<a href="../index.html" title="API Documentation"
>previous</a> |</li>
<li><a href="../../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
<li><a href="../index.html" >API Documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

130
docs/_build/html/api/index.html vendored Normal file
View File

@ -0,0 +1,130 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>API Documentation &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="../_static/default.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '../',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="../index.html" />
<link rel="next" title="client HPLeftHandClient" href="hplefthandclient/index.html" />
<link rel="prev" title="Changelog" href="../changelog.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="hplefthandclient/index.html" title="client HPLeftHandClient"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="../changelog.html" title="Changelog"
accesskey="P">previous</a> |</li>
<li><a href="../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="api-documentation">
<h1>API Documentation<a class="headerlink" href="#api-documentation" title="Permalink to this headline"></a></h1>
<p>The HP LeftHand Client package contains a <a class="reference internal" href="hplefthandclient/index.html#module-hplefthandclient" title="hplefthandclient: HP LeftHand REST Web client"><tt class="xref py py-mod docutils literal"><span class="pre">hplefthandclient</span></tt></a> class which extends a more
generic <tt class="xref py py-mod docutils literal"><span class="pre">http</span></tt> class for doing REST calls</p>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="hplefthandclient/index.html"><tt class="docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHandClient</a><ul>
<li class="toctree-l2"><a class="reference internal" href="hplefthandclient/client.html"><tt class="docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHandClient</a></li>
<li class="toctree-l2"><a class="reference internal" href="hplefthandclient/exceptions.html"><tt class="docutils literal"><span class="pre">exceptions</span></tt> &#8211; HTTP Exceptions</a></li>
<li class="toctree-l2"><a class="reference internal" href="hplefthandclient/http.html"><tt class="docutils literal"><span class="pre">http</span></tt> &#8211; HTTP REST Base Class</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h4>Previous topic</h4>
<p class="topless"><a href="../changelog.html"
title="previous chapter">Changelog</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="hplefthandclient/index.html"
title="next chapter"><tt class="docutils literal docutils literal"><span class="pre">client</span></tt> &#8211; HPLeftHandClient</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="../_sources/api/index.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="../search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="hplefthandclient/index.html" title="client HPLeftHandClient"
>next</a> |</li>
<li class="right" >
<a href="../changelog.html" title="Changelog"
>previous</a> |</li>
<li><a href="../index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

132
docs/_build/html/changelog.html vendored Normal file
View File

@ -0,0 +1,132 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Changelog &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="index.html" />
<link rel="next" title="API Documentation" href="api/index.html" />
<link rel="prev" title="Tutorial" href="tutorial.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="api/index.html" title="API Documentation"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="tutorial.html" title="Tutorial"
accesskey="P">previous</a> |</li>
<li><a href="index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="changelog">
<h1>Changelog<a class="headerlink" href="#changelog" title="Permalink to this headline"></a></h1>
<div class="section" id="changes-in-version-1-0-0">
<h2>Changes in Version 1.0.0<a class="headerlink" href="#changes-in-version-1-0-0" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li>First implementation of the REST API Client</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h3><a href="index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Changelog</a><ul>
<li><a class="reference internal" href="#changes-in-version-1-0-0">Changes in Version 1.0.0</a></li>
</ul>
</li>
</ul>
<h4>Previous topic</h4>
<p class="topless"><a href="tutorial.html"
title="previous chapter">Tutorial</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="api/index.html"
title="next chapter">API Documentation</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/changelog.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="api/index.html" title="API Documentation"
>next</a> |</li>
<li class="right" >
<a href="tutorial.html" title="Tutorial"
>previous</a> |</li>
<li><a href="index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

755
docs/_build/html/genindex.html vendored Normal file
View File

@ -0,0 +1,755 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Index &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="#" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1 id="index">Index</h1>
<div class="genindex-jumpbox">
<a href="#A"><strong>A</strong></a>
| <a href="#C"><strong>C</strong></a>
| <a href="#D"><strong>D</strong></a>
| <a href="#F"><strong>F</strong></a>
| <a href="#G"><strong>G</strong></a>
| <a href="#H"><strong>H</strong></a>
| <a href="#L"><strong>L</strong></a>
| <a href="#M"><strong>M</strong></a>
| <a href="#N"><strong>N</strong></a>
| <a href="#P"><strong>P</strong></a>
| <a href="#R"><strong>R</strong></a>
| <a href="#S"><strong>S</strong></a>
| <a href="#U"><strong>U</strong></a>
| <a href="#V"><strong>V</strong></a>
</div>
<h2 id="A">A</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.addServerAccess">addServerAccess() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.addServerAccess">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.authenticate">authenticate() (hplefthandclient.http.HTTPJSONRESTClient method)</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.AuthorizationFailure">AuthorizationFailure</a>
</dt>
</dl></td>
</tr></table>
<h2 id="C">C</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.ClientException">ClientException</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.cloneSnapshot">cloneSnapshot() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.cloneSnapshot">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.cloneVolume">cloneVolume() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.cloneVolume">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.CommandError">CommandError</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.createServer">createServer() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.createServer">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.createSnapshot">createSnapshot() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.createSnapshot">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.createVolume">createVolume() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.createVolume">[1]</a>
</dt>
</dl></td>
</tr></table>
<h2 id="D">D</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.debug_rest">debug_rest() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.debug_rest">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.delete">delete() (hplefthandclient.http.HTTPJSONRESTClient method)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.deleteServer">deleteServer() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.deleteServer">[1]</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.deleteSnapshot">deleteSnapshot() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.deleteSnapshot">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.deleteVolume">deleteVolume() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.deleteVolume">[1]</a>
</dt>
</dl></td>
</tr></table>
<h2 id="F">F</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.from_response">from_response() (in module hplefthandclient.exceptions)</a>
</dt>
</dl></td>
</tr></table>
<h2 id="G">G</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.get">get() (hplefthandclient.http.HTTPJSONRESTClient method)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.ClientException.get_code">get_code() (hplefthandclient.exceptions.ClientException method)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.ClientException.get_description">get_description() (hplefthandclient.exceptions.ClientException method)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.get_timings">get_timings() (hplefthandclient.http.HTTPJSONRESTClient method)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.__init__.get_version_string">get_version_string() (in module hplefthandclient.__init__)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getCluster">getCluster() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.getCluster">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getClusterByName">getClusterByName() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.getClusterByName">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getClusters">getClusters() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.getClusters">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getServer">getServer() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.getServer">[1]</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getServerByName">getServerByName() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.getServerByName">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getServers">getServers() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.getServers">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getSnapshot">getSnapshot() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.getSnapshot">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getSnapshotByName">getSnapshotByName() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.getSnapshotByName">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getSnapshots">getSnapshots() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.getSnapshots">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getVolume">getVolume() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.getVolume">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getVolumeByName">getVolumeByName() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.getVolumeByName">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getVolumes">getVolumes() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.getVolumes">[1]</a>
</dt>
</dl></td>
</tr></table>
<h2 id="H">H</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient">HPLeftHandClient (class in hplefthandclient.client)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient">[1]</a>
</dt>
<dt><a href="api/hplefthandclient/index.html#module-hplefthandclient">hplefthandclient (module)</a>
</dt>
<dt><a href="hplefthandclient.html#module-hplefthandclient.__init__">hplefthandclient.__init__ (module)</a>
</dt>
<dt><a href="hplefthandclient.html#module-hplefthandclient.client">hplefthandclient.client (module)</a>, <a href="api/hplefthandclient/client.html#module-hplefthandclient.client">[1]</a>
</dt>
<dt><a href="api/hplefthandclient/exceptions.html#module-hplefthandclient.exceptions">hplefthandclient.exceptions (module)</a>, <a href="hplefthandclient.html#module-hplefthandclient.exceptions">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#module-hplefthandclient.http">hplefthandclient.http (module)</a>, <a href="api/hplefthandclient/http.html#module-hplefthandclient.http">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPBadGateway.http_status">http_status (hplefthandclient.exceptions.HTTPBadGateway attribute)</a>
</dt>
<dd><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPBadRequest.http_status">(hplefthandclient.exceptions.HTTPBadRequest attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPConflict.http_status">(hplefthandclient.exceptions.HTTPConflict attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPExpectationFailed.http_status">(hplefthandclient.exceptions.HTTPExpectationFailed attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPForbidden.http_status">(hplefthandclient.exceptions.HTTPForbidden attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPGatewayTimeout.http_status">(hplefthandclient.exceptions.HTTPGatewayTimeout attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPGone.http_status">(hplefthandclient.exceptions.HTTPGone attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPLengthRequired.http_status">(hplefthandclient.exceptions.HTTPLengthRequired attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPMethodNotAllowed.http_status">(hplefthandclient.exceptions.HTTPMethodNotAllowed attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPNotAcceptable.http_status">(hplefthandclient.exceptions.HTTPNotAcceptable attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPNotFound.http_status">(hplefthandclient.exceptions.HTTPNotFound attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPNotImplemented.http_status">(hplefthandclient.exceptions.HTTPNotImplemented attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPPreconditionFailed.http_status">(hplefthandclient.exceptions.HTTPPreconditionFailed attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPProxyAuthRequired.http_status">(hplefthandclient.exceptions.HTTPProxyAuthRequired attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestEntityTooLarge.http_status">(hplefthandclient.exceptions.HTTPRequestEntityTooLarge attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestTimeout.http_status">(hplefthandclient.exceptions.HTTPRequestTimeout attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestURITooLong.http_status">(hplefthandclient.exceptions.HTTPRequestURITooLong attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestedRangeNotSatisfiable.http_status">(hplefthandclient.exceptions.HTTPRequestedRangeNotSatisfiable attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPServerError.http_status">(hplefthandclient.exceptions.HTTPServerError attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPServiceUnavailable.http_status">(hplefthandclient.exceptions.HTTPServiceUnavailable attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPTeaPot.http_status">(hplefthandclient.exceptions.HTTPTeaPot attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPUnauthorized.http_status">(hplefthandclient.exceptions.HTTPUnauthorized attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPUnsupportedMediaType.http_status">(hplefthandclient.exceptions.HTTPUnsupportedMediaType attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPVersionNotSupported.http_status">(hplefthandclient.exceptions.HTTPVersionNotSupported attribute)</a>
</dt>
</dl></dd>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPBadGateway">HTTPBadGateway</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPBadRequest">HTTPBadRequest</a>
</dt>
<dd><dl>
<dt><a href="api/hplefthandclient/exceptions.html#hplefthandclient.exceptions.HTTPBadRequest">(class in hplefthandclient.exceptions)</a>
</dt>
</dl></dd>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPConflict">HTTPConflict</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPExpectationFailed">HTTPExpectationFailed</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPForbidden">HTTPForbidden</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPGatewayTimeout">HTTPGatewayTimeout</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPGone">HTTPGone</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient">HTTPJSONRESTClient (class in hplefthandclient.http)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPLengthRequired">HTTPLengthRequired</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPMethodNotAllowed">HTTPMethodNotAllowed</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPNotAcceptable">HTTPNotAcceptable</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPNotFound">HTTPNotFound</a>
</dt>
<dd><dl>
<dt><a href="api/hplefthandclient/exceptions.html#hplefthandclient.exceptions.HTTPNotFound">(class in hplefthandclient.exceptions)</a>
</dt>
</dl></dd>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPNotImplemented">HTTPNotImplemented</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPPreconditionFailed">HTTPPreconditionFailed</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPProxyAuthRequired">HTTPProxyAuthRequired</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestedRangeNotSatisfiable">HTTPRequestedRangeNotSatisfiable</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestEntityTooLarge">HTTPRequestEntityTooLarge</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestTimeout">HTTPRequestTimeout</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestURITooLong">HTTPRequestURITooLong</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPServerError">HTTPServerError</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPServiceUnavailable">HTTPServiceUnavailable</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPTeaPot">HTTPTeaPot</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPUnauthorized">HTTPUnauthorized</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPUnsupportedMediaType">HTTPUnsupportedMediaType</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPVersionNotSupported">HTTPVersionNotSupported</a>
</dt>
</dl></td>
</tr></table>
<h2 id="L">L</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.login">login() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.login">[1]</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.logout">logout() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.logout">[1]</a>
</dt>
</dl></td>
</tr></table>
<h2 id="M">M</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPBadGateway.message">message (hplefthandclient.exceptions.HTTPBadGateway attribute)</a>
</dt>
<dd><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPBadRequest.message">(hplefthandclient.exceptions.HTTPBadRequest attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPConflict.message">(hplefthandclient.exceptions.HTTPConflict attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPExpectationFailed.message">(hplefthandclient.exceptions.HTTPExpectationFailed attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPForbidden.message">(hplefthandclient.exceptions.HTTPForbidden attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPGatewayTimeout.message">(hplefthandclient.exceptions.HTTPGatewayTimeout attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPGone.message">(hplefthandclient.exceptions.HTTPGone attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPLengthRequired.message">(hplefthandclient.exceptions.HTTPLengthRequired attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPMethodNotAllowed.message">(hplefthandclient.exceptions.HTTPMethodNotAllowed attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPNotAcceptable.message">(hplefthandclient.exceptions.HTTPNotAcceptable attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPNotFound.message">(hplefthandclient.exceptions.HTTPNotFound attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPNotImplemented.message">(hplefthandclient.exceptions.HTTPNotImplemented attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPPreconditionFailed.message">(hplefthandclient.exceptions.HTTPPreconditionFailed attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPProxyAuthRequired.message">(hplefthandclient.exceptions.HTTPProxyAuthRequired attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestEntityTooLarge.message">(hplefthandclient.exceptions.HTTPRequestEntityTooLarge attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestTimeout.message">(hplefthandclient.exceptions.HTTPRequestTimeout attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestURITooLong.message">(hplefthandclient.exceptions.HTTPRequestURITooLong attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPRequestedRangeNotSatisfiable.message">(hplefthandclient.exceptions.HTTPRequestedRangeNotSatisfiable attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPServerError.message">(hplefthandclient.exceptions.HTTPServerError attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPServiceUnavailable.message">(hplefthandclient.exceptions.HTTPServiceUnavailable attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPTeaPot.message">(hplefthandclient.exceptions.HTTPTeaPot attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPUnauthorized.message">(hplefthandclient.exceptions.HTTPUnauthorized attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPUnsupportedMediaType.message">(hplefthandclient.exceptions.HTTPUnsupportedMediaType attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.HTTPVersionNotSupported.message">(hplefthandclient.exceptions.HTTPVersionNotSupported attribute)</a>
</dt>
</dl></dd>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.modifyVolume">modifyVolume() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.modifyVolume">[1]</a>
</dt>
</dl></td>
</tr></table>
<h2 id="N">N</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.NoUniqueMatch">NoUniqueMatch</a>
</dt>
</dl></td>
</tr></table>
<h2 id="P">P</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.post">post() (hplefthandclient.http.HTTPJSONRESTClient method)</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.put">put() (hplefthandclient.http.HTTPJSONRESTClient method)</a>
</dt>
</dl></td>
</tr></table>
<h2 id="R">R</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.removeServerAccess">removeServerAccess() (hplefthandclient.client.HPLeftHandClient method)</a>, <a href="api/hplefthandclient/client.html#hplefthandclient.client.HPLeftHandClient.removeServerAccess">[1]</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.request">request() (hplefthandclient.http.HTTPJSONRESTClient method)</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.reset_timings">reset_timings() (hplefthandclient.http.HTTPJSONRESTClient method)</a>
</dt>
</dl></td>
</tr></table>
<h2 id="S">S</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.SESSION_COOKIE_NAME">SESSION_COOKIE_NAME (hplefthandclient.http.HTTPJSONRESTClient attribute)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.set_debug_flag">set_debug_flag() (hplefthandclient.http.HTTPJSONRESTClient method)</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.set_url">set_url() (hplefthandclient.http.HTTPJSONRESTClient method)</a>
</dt>
</dl></td>
</tr></table>
<h2 id="U">U</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.unauthenticate">unauthenticate() (hplefthandclient.http.HTTPJSONRESTClient method)</a>
</dt>
<dt><a href="hplefthandclient.html#hplefthandclient.exceptions.UnsupportedVersion">UnsupportedVersion</a>
</dt>
</dl></td>
<td style="width: 33%" valign="top"><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.http.HTTPJSONRESTClient.USER_AGENT">USER_AGENT (hplefthandclient.http.HTTPJSONRESTClient attribute)</a>
</dt>
</dl></td>
</tr></table>
<h2 id="V">V</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%" valign="top"><dl>
<dt><a href="api/hplefthandclient/index.html#hplefthandclient.version">version (in module hplefthandclient)</a>
</dt>
<dd><dl>
<dt><a href="hplefthandclient.html#hplefthandclient.__init__.version">(in module hplefthandclient.__init__)</a>
</dt>
</dl></dd>
</dl></td>
</tr></table>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="#" title="General Index"
>index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

1377
docs/_build/html/hplefthandclient.html vendored Normal file

File diff suppressed because it is too large Load Diff

169
docs/_build/html/index.html vendored Normal file
View File

@ -0,0 +1,169 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>HPLeftHandClient 1.0.0 Documentation &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="#" />
<link rel="next" title="Installing / Upgrading" href="installation.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="installation.html" title="Installing / Upgrading"
accesskey="N">next</a> |</li>
<li><a href="#">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="hplefthandclient-release-documentation">
<h1>HPLeftHandClient 1.0.0 Documentation<a class="headerlink" href="#hplefthandclient-release-documentation" title="Permalink to this headline"></a></h1>
<div class="section" id="overview">
<h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline"></a></h2>
<p><strong>HPLeftHandClient</strong> is a Python package containing a class that uses
HTTP REST calls to talk with an HP LeftHand/StoreVirtual drive array.
distribution containing tools for working with
<a class="reference external" href="http://www.hp.com/go/storevirtual">LeftHand/StoreVirtual Storage Arrays</a>.
. This documentation attempts to explain
everything you need to know to use <strong>HPLeftHandClient</strong>.</p>
<dl class="docutils">
<dt><a class="reference internal" href="installation.html"><em>Installing / Upgrading</em></a></dt>
<dd>Instructions on how to get the distribution.</dd>
<dt><a class="reference internal" href="tutorial.html"><em>Tutorial</em></a></dt>
<dd>Start here for a quick overview.</dd>
<dt><a class="reference internal" href="api/index.html"><em>API Documentation</em></a></dt>
<dd>The complete API documentation, organized by module.</dd>
</dl>
</div>
<div class="section" id="issues">
<h2>Issues<a class="headerlink" href="#issues" title="Permalink to this headline"></a></h2>
<p>All issues should be reported (and can be tracked / voted for /
commented on) at the main <a class="reference external" href="https://github.com/WaltHP/python-hplefthandclient/issues">github issues</a>, in the &#8220;LeftHand Python Driver&#8221;
project.</p>
</div>
<div class="section" id="changes">
<h2>Changes<a class="headerlink" href="#changes" title="Permalink to this headline"></a></h2>
<p>See the <a class="reference internal" href="changelog.html"><em>Changelog</em></a> for a full list of changes to HPLeftHandClient.</p>
</div>
<div class="section" id="about-this-documentation">
<h2>About This Documentation<a class="headerlink" href="#about-this-documentation" title="Permalink to this headline"></a></h2>
<p>This documentation is generated using the <a class="reference external" href="http://sphinx.pocoo.org/">Sphinx</a> documentation generator. The source files
for the documentation are located in the <em>doc/</em> directory of the
<strong>HPLeftHandClient</strong> distribution. To generate the docs locally run the
following command from the root directory of the <strong>HPLeftHandClient</strong></p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>python setup.py doc
</pre></div>
</div>
<div class="toctree-wrapper compound">
</div>
</div>
</div>
<div class="section" id="indices-and-tables">
<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline"></a></h1>
<ul class="simple">
<li><a class="reference internal" href="genindex.html"><em>Index</em></a></li>
<li><a class="reference internal" href="py-modindex.html"><em>Module Index</em></a></li>
<li><a class="reference internal" href="search.html"><em>Search Page</em></a></li>
</ul>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h3><a href="#">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">HPLeftHandClient 1.0.0 Documentation</a><ul>
<li><a class="reference internal" href="#overview">Overview</a></li>
<li><a class="reference internal" href="#issues">Issues</a></li>
<li><a class="reference internal" href="#changes">Changes</a></li>
<li><a class="reference internal" href="#about-this-documentation">About This Documentation</a><ul>
</ul>
</li>
</ul>
</li>
<li><a class="reference internal" href="#indices-and-tables">Indices and tables</a></li>
</ul>
<h4>Next topic</h4>
<p class="topless"><a href="installation.html"
title="next chapter">Installing / Upgrading</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/index.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="installation.html" title="Installing / Upgrading"
>next</a> |</li>
<li><a href="#">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

164
docs/_build/html/installation.html vendored Normal file
View File

@ -0,0 +1,164 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Installing / Upgrading &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="index.html" />
<link rel="next" title="Tutorial" href="tutorial.html" />
<link rel="prev" title="HPLeftHandClient 1.0.0 Documentation" href="index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="tutorial.html" title="Tutorial"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="index.html" title="HPLeftHandClient 1.0.0 Documentation"
accesskey="P">previous</a> |</li>
<li><a href="index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="installing-upgrading">
<h1>Installing / Upgrading<a class="headerlink" href="#installing-upgrading" title="Permalink to this headline"></a></h1>
<p><strong>HPLeftHandClient</strong> is in the <a class="reference external" href="http://pypi.python.org/pypi/hplefthandclient/">Python Package Index</a>.</p>
<div class="section" id="installing-with-pip">
<h2>Installing with pip<a class="headerlink" href="#installing-with-pip" title="Permalink to this headline"></a></h2>
<p>We prefer <a class="reference external" href="http://pypi.python.org/pypi/pip">pip</a>
to install hplefthandclient on platforms other than Windows:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>pip install hplefthandclient
</pre></div>
</div>
<p>To upgrade using pip:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>pip install --upgrade hplefthandclient
</pre></div>
</div>
</div>
<div class="section" id="installing-with-easy-install">
<h2>Installing with easy_install<a class="headerlink" href="#installing-with-easy-install" title="Permalink to this headline"></a></h2>
<p>If you must install hplefthandclient using
<a class="reference external" href="http://pypi.python.org/pypi/setuptools">setuptools</a> do:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>easy_install hplefthandclient
</pre></div>
</div>
<p>To upgrade do:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>easy_install -U hplefthandclient
</pre></div>
</div>
</div>
<div class="section" id="installing-from-source">
<h2>Installing from source<a class="headerlink" href="#installing-from-source" title="Permalink to this headline"></a></h2>
<p>If you&#8217;d rather install directly from the source (i.e. to stay on the
bleeding edge), install the C extension dependencies then check out the
latest source from github and install the driver from the resulting tree:</p>
<div class="highlight-bash"><div class="highlight"><pre><span class="nv">$ </span>git clone git://github.com/WaltHP/python-3parclient.git
<span class="nv">$ </span><span class="nb">cd </span>pyton-hplefthandclient/
<span class="nv">$ </span>python setup.py install
</pre></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h3><a href="index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Installing / Upgrading</a><ul>
<li><a class="reference internal" href="#installing-with-pip">Installing with pip</a></li>
<li><a class="reference internal" href="#installing-with-easy-install">Installing with easy_install</a></li>
<li><a class="reference internal" href="#installing-from-source">Installing from source</a></li>
</ul>
</li>
</ul>
<h4>Previous topic</h4>
<p class="topless"><a href="index.html"
title="previous chapter">HPLeftHandClient 1.0.0 Documentation</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="tutorial.html"
title="next chapter">Tutorial</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/installation.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="tutorial.html" title="Tutorial"
>next</a> |</li>
<li class="right" >
<a href="index.html" title="HPLeftHandClient 1.0.0 Documentation"
>previous</a> |</li>
<li><a href="index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

BIN
docs/_build/html/objects.inv vendored Normal file

Binary file not shown.

131
docs/_build/html/py-modindex.html vendored Normal file
View File

@ -0,0 +1,131 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Python Module Index &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="index.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="#" title="Python Module Index"
>modules</a> |</li>
<li><a href="index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1>Python Module Index</h1>
<div class="modindex-jumpbox">
<a href="#cap-h"><strong>h</strong></a>
</div>
<table class="indextable modindextable" cellspacing="0" cellpadding="2">
<tr class="pcap"><td></td><td>&nbsp;</td><td></td></tr>
<tr class="cap" id="cap-h"><td></td><td>
<strong>h</strong></td><td></td></tr>
<tr>
<td><img src="_static/minus.png" class="toggler"
id="toggle-1" style="display: none" alt="-" /></td>
<td>
<a href="api/hplefthandclient/index.html#module-hplefthandclient"><tt class="xref">hplefthandclient</tt></a></td><td>
<em>HP LeftHand REST Web client</em></td></tr>
<tr class="cg-1">
<td></td>
<td>&nbsp;&nbsp;&nbsp;
<a href="hplefthandclient.html#module-hplefthandclient.__init__"><tt class="xref">hplefthandclient.__init__</tt></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&nbsp;&nbsp;&nbsp;
<a href="hplefthandclient.html#module-hplefthandclient.client"><tt class="xref">hplefthandclient.client</tt></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&nbsp;&nbsp;&nbsp;
<a href="hplefthandclient.html#module-hplefthandclient.exceptions"><tt class="xref">hplefthandclient.exceptions</tt></a></td><td>
<em></em></td></tr>
<tr class="cg-1">
<td></td>
<td>&nbsp;&nbsp;&nbsp;
<a href="hplefthandclient.html#module-hplefthandclient.http"><tt class="xref">hplefthandclient.http</tt></a></td><td>
<em></em></td></tr>
</table>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="#" title="Python Module Index"
>modules</a> |</li>
<li><a href="index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

105
docs/_build/html/search.html vendored Normal file
View File

@ -0,0 +1,105 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Search &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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/searchtools.js"></script>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="index.html" />
<script type="text/javascript">
jQuery(function() { Search.loadIndex("searchindex.js"); });
</script>
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<h1 id="search-documentation">Search</h1>
<div id="fallback" class="admonition warning">
<script type="text/javascript">$('#fallback').hide();</script>
<p>
Please activate JavaScript to enable the search
functionality.
</p>
</div>
<p>
From here you can search these documents. Enter your search
words into the box below and click "search". Note that the search
function will automatically search for all of the words. Pages
containing fewer words won't appear in the result list.
</p>
<form action="" method="get">
<input type="text" name="q" value="" />
<input type="submit" value="search" />
<span id="search-progress" style="padding-left: 10px"></span>
</form>
<div id="search-results">
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li><a href="index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

1
docs/_build/html/searchindex.js vendored Normal file

File diff suppressed because one or more lines are too long

187
docs/_build/html/tutorial.html vendored Normal file
View File

@ -0,0 +1,187 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Tutorial &mdash; HP LeftHand REST Client 1.0.0 documentation</title>
<link rel="stylesheet" href="_static/default.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '1.0.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</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>
<link rel="top" title="HP LeftHand REST Client 1.0.0 documentation" href="index.html" />
<link rel="next" title="Changelog" href="changelog.html" />
<link rel="prev" title="Installing / Upgrading" href="installation.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="changelog.html" title="Changelog"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="installation.html" title="Installing / Upgrading"
accesskey="P">previous</a> |</li>
<li><a href="index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body">
<div class="section" id="tutorial">
<h1>Tutorial<a class="headerlink" href="#tutorial" title="Permalink to this headline"></a></h1>
<p>This tutorial is intended as an introduction to working with
<strong>HPLeftHandClient</strong>.</p>
<div class="section" id="prerequisites">
<h2>Prerequisites<a class="headerlink" href="#prerequisites" title="Permalink to this headline"></a></h2>
<p>Before we start, make sure that you have the <strong>HPLeftHandClient</strong> distribution
<a class="reference internal" href="installation.html"><em>installed</em></a>. In the Python shell, the following
should run without raising an exception:</p>
<div class="highlight-bash"><div class="highlight"><pre>&gt;&gt;&gt; import hplefthandclient
</pre></div>
</div>
<p>This tutorial also assumes that a LeftHand array is up and running and the
LeftHand OS is running.</p>
</div>
<div class="section" id="create-the-client-and-login">
<h2>Create the Client and login<a class="headerlink" href="#create-the-client-and-login" title="Permalink to this headline"></a></h2>
<p>The first step when working with <strong>HPLeftHandClient</strong> is to create a
<a class="reference internal" href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient" title="hplefthandclient.client.HPLeftHandClient"><tt class="xref py py-class docutils literal"><span class="pre">HPLeftHandClient</span></tt></a> to the LeftHand drive array
and logging in to create the session. You must <a class="reference internal" href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.login" title="hplefthandclient.client.HPLeftHandClient.login"><tt class="xref py py-meth docutils literal"><span class="pre">login()</span></tt></a> prior to calling the other APIs to do work on the LeftHand.
Doing so is easy:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">hplefthandclient</span> <span class="kn">import</span> <span class="n">client</span><span class="p">,</span> <span class="n">exceptions</span>
<span class="c">#this creates the client object and sets the url to the</span>
<span class="c">#LeftHand server with IP 10.10.10.10 on port 8008.</span>
<span class="n">cl</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">HPLeftHandClient</span><span class="p">(</span><span class="s">&quot;https://10.10.10.10:8008/api/v1&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">cl</span><span class="o">.</span><span class="n">login</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">)</span>
<span class="k">print</span> <span class="s">&quot;Login worked!&quot;</span>
<span class="k">except</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">HTTPUnauthorized</span> <span class="k">as</span> <span class="n">ex</span><span class="p">:</span>
<span class="k">print</span> <span class="s">&quot;Login failed.&quot;</span>
</pre></div>
</div>
<p>When you are done with the the client, it&#8217;s a good idea to logout from
the LeftHand so there isn&#8217;t a stale session sitting around.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">cl</span><span class="o">.</span><span class="n">logout</span><span class="p">()</span>
<span class="k">print</span> <span class="s">&quot;logout worked&quot;</span>
</pre></div>
</div>
</div>
<div class="section" id="getting-a-list-of-volumes">
<h2>Getting a list of Volumes<a class="headerlink" href="#getting-a-list-of-volumes" title="Permalink to this headline"></a></h2>
<p>After you have logged in, you can start making calls to the LeftHand APIs.
A simple example is getting a list of existing volumes on the array with
a call to <a class="reference internal" href="hplefthandclient.html#hplefthandclient.client.HPLeftHandClient.getVolumes" title="hplefthandclient.client.HPLeftHandClient.getVolumes"><tt class="xref py py-meth docutils literal"><span class="pre">getVolumes()</span></tt></a>.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">pprint</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">volumes</span> <span class="o">=</span> <span class="n">cl</span><span class="o">.</span><span class="n">getVolumes</span><span class="p">()</span>
<span class="n">pprint</span><span class="o">.</span><span class="n">pprint</span><span class="p">(</span><span class="n">volumes</span><span class="p">)</span>
<span class="k">except</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">HTTPUnauthorized</span> <span class="k">as</span> <span class="n">ex</span><span class="p">:</span>
<span class="k">print</span> <span class="s">&quot;You must login first&quot;</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">ex</span><span class="p">:</span>
<span class="c">#something unexpected happened</span>
<span class="k">print</span> <span class="n">ex</span>
</pre></div>
</div>
<div class="admonition note">
<p class="first admonition-title">Note</p>
<p class="last">volumes is an array of volumes in the above call</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="sphinxsidebar">
<div class="sphinxsidebarwrapper">
<h3><a href="index.html">Table Of Contents</a></h3>
<ul>
<li><a class="reference internal" href="#">Tutorial</a><ul>
<li><a class="reference internal" href="#prerequisites">Prerequisites</a></li>
<li><a class="reference internal" href="#create-the-client-and-login">Create the Client and login</a></li>
<li><a class="reference internal" href="#getting-a-list-of-volumes">Getting a list of Volumes</a></li>
</ul>
</li>
</ul>
<h4>Previous topic</h4>
<p class="topless"><a href="installation.html"
title="previous chapter">Installing / Upgrading</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="changelog.html"
title="next chapter">Changelog</a></p>
<h3>This Page</h3>
<ul class="this-page-menu">
<li><a href="_sources/tutorial.txt"
rel="nofollow">Show Source</a></li>
</ul>
<div id="searchbox" style="display: none">
<h3>Quick search</h3>
<form class="search" action="search.html" method="get">
<input type="text" name="q" />
<input type="submit" value="Go" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="changelog.html" title="Changelog"
>next</a> |</li>
<li class="right" >
<a href="installation.html" title="Installing / Upgrading"
>previous</a> |</li>
<li><a href="index.html">HP LeftHand REST Client 1.0.0 documentation</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; Copyright 2013 Hewlett Packard Development Company, L.P..
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
</div>
</body>
</html>

0
docs/_static/empty_dir vendored Normal file
View File

View File

@ -0,0 +1,34 @@
:mod:`client` -- HPLeftHandClient
=================================
.. automodule:: hplefthandclient.client
:synopsis: HP LeftHand REST Web client
.. autoclass:: hplefthandclient.client.HPLeftHandClient(api_url)
.. automethod:: debug_rest
.. automethod:: login
.. automethod:: logout
.. automethod:: getClusters
.. automethod:: getCluster
.. automethod:: getClusterByName
.. automethod:: getServers
.. automethod:: getServer
.. automethod:: getServerByName
.. automethod:: createServer
.. automethod:: deleteServer
.. automethod:: getSnapshots
.. automethod:: getSnapshot
.. automethod:: getSnapshotByName
.. automethod:: createSnapshot
.. automethod:: deleteSnapshot
.. automethod:: cloneSnapshot
.. automethod:: getVolumes
.. automethod:: getVolume
.. automethod:: getVolumeByName
.. automethod:: createVolume
.. automethod:: deleteVolume
.. automethod:: modifyVolume
.. automethod:: cloneVolume
.. automethod:: addServerAccess
.. automethod:: removeServerAccess

View File

@ -0,0 +1,8 @@
:mod:`exceptions` -- HTTP Exceptions
====================================================
.. automodule:: hplefthandclient.exceptions
:synopsis: HTTP Exceptions
.. autoclass:: hplefthandclient.exceptions.HTTPNotFound
.. autoclass:: hplefthandclient.exceptions.HTTPBadRequest

View File

@ -0,0 +1,24 @@
:mod:`http` -- HTTP REST Base Class
====================================================
.. automodule:: hplefthandclient.http
:synopsis: HTTP REST Base Class
.. autoclass::hplefthandclient.http(api_url, [insecure=False[,http_log_debug=False]])
.. automethod:: authenticate
.. automethod:: unauthenticate
.. describe:: c[db_name] || c.db_name
Get the `db_name` :class:`~pymongo.database.Database` on :class:`Connection` `c`.
Raises :class:`~pymongo.errors.InvalidName` if an invalid database name is used.
.. autoattribute:: api_url
.. autoattribute:: http_log_debug
.. automethod:: request
.. automethod:: get
.. automethod:: post
.. automethod:: put
.. automethod:: delete

View File

@ -0,0 +1,18 @@
:mod:`client` -- HPLeftHandClient
=================================
.. automodule:: hplefthandclient
:synopsis: HP LeftHand REST Web client
.. autodata:: version
Sub-modules:
.. toctree::
:maxdepth: 2
client
exceptions
http

11
docs/api/index.rst Normal file
View File

@ -0,0 +1,11 @@
API Documentation
=================
The HP LeftHand Client package contains a :mod:`hplefthandclient` class which extends a more
generic :mod:`http` class for doing REST calls
.. toctree::
:maxdepth: 2
hplefthandclient/index

9
docs/changelog.rst Normal file
View File

@ -0,0 +1,9 @@
Changelog
=========
Changes in Version 1.0.0
------------------------
- First implementation of the REST API Client

289
docs/conf.py Normal file
View File

@ -0,0 +1,289 @@
# -*- coding: utf-8 -*-
#
# hplefthandclient documentation build configuration file, created by
# sphinx-quickstart on Mon Nov 25 13:33:35 2013.
#
# This file is execfile()d with the current directory set to its containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys, os
sys.path.insert(0,os.path.realpath(os.path.abspath('../')))
import hplefthandclient
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration -----------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ['sphinx.ext.autodoc', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.viewcode']
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'HP LeftHand REST Client'
copyright = u'2013 Hewlett Packard Development Company, L.P.'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = hplefthandclient.version
# The full version, including alpha/beta/rc tags.
release = hplefthandclient.version
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# -- Options for HTML output ---------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'default'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'HPLeftHandClient' + release.replace('.','_')
# -- Options for LaTeX output --------------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('index', 'hplefthandclient.tex', u'hplefthandclient Documentation',
u'Author', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output --------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'hplefthandclient', u'hplefthandclient Documentation',
[u'Author'], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output ------------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
('index', 'hplefthandclient', u'hplefthandclient Documentation',
u'Author', 'hplefthandclient', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# -- Options for Epub output ---------------------------------------------------
# Bibliographic Dublin Core info.
epub_title = u'hplefthandclient'
epub_author = u'Author'
epub_publisher = u'Author'
epub_copyright = u'2013, Author'
# The language of the text. It defaults to the language option
# or en if the language is not set.
#epub_language = ''
# The scheme of the identifier. Typical schemes are ISBN or URL.
#epub_scheme = ''
# The unique identifier of the text. This can be a ISBN number
# or the project homepage.
#epub_identifier = ''
# A unique identification for the text.
#epub_uid = ''
# A tuple containing the cover image and cover page html template filenames.
#epub_cover = ()
# HTML files that should be inserted before the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_pre_files = []
# HTML files shat should be inserted after the pages created by sphinx.
# The format is a list of tuples containing the path and title.
#epub_post_files = []
# A list of files that should not be packed into the epub file.
#epub_exclude_files = []
# The depth of the table of contents in toc.ncx.
#epub_tocdepth = 3
# Allow duplicate toc entries.
#epub_tocdup = True

37
docs/hplefthandclient.rst Normal file
View File

@ -0,0 +1,37 @@
hplefthandclient Package
========================
:mod:`hplefthandclient` Package
-------------------------------
.. automodule:: hplefthandclient.__init__
:members:
:undoc-members:
:show-inheritance:
:mod:`client` Module
--------------------
.. automodule:: hplefthandclient.client
:members:
:undoc-members:
:show-inheritance:
:mod:`exceptions` Module
------------------------
.. automodule:: hplefthandclient.exceptions
:members:
:undoc-members:
:show-inheritance:
:mod:`http` Module
------------------
.. automodule:: hplefthandclient.http
:members:
:undoc-members:
:show-inheritance:

65
docs/index.rst Normal file
View File

@ -0,0 +1,65 @@
HPLeftHandClient |release| Documentation
========================================
Overview
--------
**HPLeftHandClient** is a Python package containing a class that uses
HTTP REST calls to talk with an HP LeftHand/StoreVirtual drive array.
distribution containing tools for working with
`LeftHand/StoreVirtual Storage Arrays <http://www.hp.com/go/storevirtual>`_.
. This documentation attempts to explain
everything you need to know to use **HPLeftHandClient**.
:doc:`installation`
Instructions on how to get the distribution.
:doc:`tutorial`
Start here for a quick overview.
:doc:`api/index`
The complete API documentation, organized by module.
Issues
------
.. todo:: create the open source website
.. todo:: create the bug tracker
All issues should be reported (and can be tracked / voted for /
commented on) at the main `github issues
<https://github.com/WaltHP/python-hplefthandclient/issues>`_, in the "LeftHand Python Driver"
project.
Changes
-------
See the :doc:`changelog` for a full list of changes to HPLeftHandClient.
About This Documentation
------------------------
This documentation is generated using the `Sphinx
<http://sphinx.pocoo.org/>`_ documentation generator. The source files
for the documentation are located in the *doc/* directory of the
**HPLeftHandClient** distribution. To generate the docs locally run the
following command from the root directory of the **HPLeftHandClient**
.. code-block:: bash
$ python setup.py doc
.. toctree::
:hidden:
installation
tutorial
changelog
api/index
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

43
docs/installation.rst Normal file
View File

@ -0,0 +1,43 @@
Installing / Upgrading
======================
.. highlight:: bash
**HPLeftHandClient** is in the `Python Package Index
<http://pypi.python.org/pypi/hplefthandclient/>`_.
Installing with pip
-------------------
We prefer `pip <http://pypi.python.org/pypi/pip>`_
to install hplefthandclient on platforms other than Windows::
$ pip install hplefthandclient
To upgrade using pip::
$ pip install --upgrade hplefthandclient
Installing with easy_install
----------------------------
If you must install hplefthandclient using
`setuptools <http://pypi.python.org/pypi/setuptools>`_ do::
$ easy_install hplefthandclient
To upgrade do::
$ easy_install -U hplefthandclient
Installing from source
----------------------
If you'd rather install directly from the source (i.e. to stay on the
bleeding edge), install the C extension dependencies then check out the
latest source from github and install the driver from the resulting tree::
$ git clone git://github.com/WaltHP/python-3parclient.git
$ cd pyton-hplefthandclient/
$ python setup.py install

190
docs/make.bat Normal file
View File

@ -0,0 +1,190 @@
@ECHO OFF
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set BUILDDIR=_build
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
set I18NSPHINXOPTS=%SPHINXOPTS% .
if NOT "%PAPER%" == "" (
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
)
if "%1" == "" goto help
if "%1" == "help" (
:help
echo.Please use `make ^<target^>` where ^<target^> is one of
echo. html to make standalone HTML files
echo. dirhtml to make HTML files named index.html in directories
echo. singlehtml to make a single large HTML file
echo. pickle to make pickle files
echo. json to make JSON files
echo. htmlhelp to make HTML files and a HTML help project
echo. qthelp to make HTML files and a qthelp project
echo. devhelp to make HTML files and a Devhelp project
echo. epub to make an epub
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
echo. text to make text files
echo. man to make manual pages
echo. texinfo to make Texinfo files
echo. gettext to make PO message catalogs
echo. changes to make an overview over all changed/added/deprecated items
echo. linkcheck to check all external links for integrity
echo. doctest to run all doctests embedded in the documentation if enabled
goto end
)
if "%1" == "clean" (
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
del /q /s %BUILDDIR%\*
goto end
)
if "%1" == "html" (
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
goto end
)
if "%1" == "dirhtml" (
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
goto end
)
if "%1" == "singlehtml" (
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
goto end
)
if "%1" == "pickle" (
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the pickle files.
goto end
)
if "%1" == "json" (
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the JSON files.
goto end
)
if "%1" == "htmlhelp" (
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run HTML Help Workshop with the ^
.hhp project file in %BUILDDIR%/htmlhelp.
goto end
)
if "%1" == "qthelp" (
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run "qcollectiongenerator" with the ^
.qhcp project file in %BUILDDIR%/qthelp, like this:
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\hplefthandclient.qhcp
echo.To view the help file:
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\hplefthandclient.ghc
goto end
)
if "%1" == "devhelp" (
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished.
goto end
)
if "%1" == "epub" (
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The epub file is in %BUILDDIR%/epub.
goto end
)
if "%1" == "latex" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
if errorlevel 1 exit /b 1
echo.
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "text" (
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The text files are in %BUILDDIR%/text.
goto end
)
if "%1" == "man" (
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The manual pages are in %BUILDDIR%/man.
goto end
)
if "%1" == "texinfo" (
%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
goto end
)
if "%1" == "gettext" (
%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
goto end
)
if "%1" == "changes" (
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
if errorlevel 1 exit /b 1
echo.
echo.The overview file is in %BUILDDIR%/changes.
goto end
)
if "%1" == "linkcheck" (
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
if errorlevel 1 exit /b 1
echo.
echo.Link check complete; look for any errors in the above output ^
or in %BUILDDIR%/linkcheck/output.txt.
goto end
)
if "%1" == "doctest" (
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
if errorlevel 1 exit /b 1
echo.
echo.Testing of doctests in the sources finished, look at the ^
results in %BUILDDIR%/doctest/output.txt.
goto end
)
:end

68
docs/tutorial.rst Normal file
View File

@ -0,0 +1,68 @@
Tutorial
========
This tutorial is intended as an introduction to working with
**HPLeftHandClient**.
Prerequisites
-------------
Before we start, make sure that you have the **HPLeftHandClient** distribution
:doc:`installed <installation>`. In the Python shell, the following
should run without raising an exception:
.. code-block:: bash
>>> import hplefthandclient
This tutorial also assumes that a LeftHand array is up and running and the
LeftHand OS is running.
Create the Client and login
---------------------------
The first step when working with **HPLeftHandClient** is to create a
:class:`~hplefthandclient.client.HPLeftHandClient` to the LeftHand drive array
and logging in to create the session. You must :meth:`~hplefthandclient.client.HPLeftHandClient.login` prior to calling the other APIs to do work on the LeftHand.
Doing so is easy:
.. code-block:: python
from hplefthandclient import client, exceptions
#this creates the client object and sets the url to the
#LeftHand server with IP 10.10.10.10 on port 8008.
cl = client.HPLeftHandClient("https://10.10.10.10:8008/api/v1")
try:
cl.login(username, password)
print "Login worked!"
except exceptions.HTTPUnauthorized as ex:
print "Login failed."
When you are done with the the client, it's a good idea to logout from
the LeftHand so there isn't a stale session sitting around.
.. code-block:: python
cl.logout()
print "logout worked"
Getting a list of Volumes
-------------------------
After you have logged in, you can start making calls to the LeftHand APIs.
A simple example is getting a list of existing volumes on the array with
a call to :meth:`~hplefthandclient.client.HPLeftHandClient.getVolumes`.
.. code-block:: python
import pprint
try:
volumes = cl.getVolumes()
pprint.pprint(volumes)
except exceptions.HTTPUnauthorized as ex:
print "You must login first"
except Exception as ex:
#something unexpected happened
print ex
.. note:: volumes is an array of volumes in the above call

View File

@ -0,0 +1,36 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright 2013 Hewlett Packard Development Company, L.P.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
HP LeftHand REST Client
:Author: Kurt Martin
:Author: Walter A. Boring IV
:Copyright: Copyright 2013, Hewlett Packard Development Company, L.P.
:License: Apache v2.0
"""
version_tuple = (1, 0, 0)
def get_version_string():
if isinstance(version_tuple[-1], basestring):
return '.'.join(map(str, version_tuple[:-1])) + version_tuple[-1]
return '.'.join(map(str, version_tuple))
version = get_version_string()
"""Current version of HPLeftHandClient."""

497
hplefthandclient/client.py Normal file
View File

@ -0,0 +1,497 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright 2012 Hewlett Packard Development Company, L.P.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
HPLeftHand REST Client
.. module: HPLeftHandClient
.. moduleauthor: Kurt Martin
:Author: Kurt Martin
:Description: This is the LeftHand/StoreVirtual Client that talks to the
LeftHand OS REST Service.
This client requires and works with version 11.5 of the LeftHand firmware
"""
from hplefthandclient import http
class HPLeftHandClient:
def __init__(self, api_url):
self.api_url = api_url
self.http = http.HTTPJSONRESTClient(self.api_url)
def debug_rest(self, flag):
"""
This is useful for debugging requests to LeftHand
:param flag: set to True to enable debugging
:type flag: bool
"""
self.http.set_debug_flag(flag)
def login(self, username, password):
"""
This authenticates against the LH OS REST server and creates a session.
:param username: The username
:type username: str
:param password: The password
:type password: str
:returns: None
"""
self.http.authenticate(username, password)
def logout(self):
"""
This destroys the session and logs out from the LH OS server
:returns: None
"""
self.http.unauthenticate()
def getClusters(self):
"""
Get the list of Clusters
:returns: list of Clusters
"""
response, body = self.http.get('/clusters')
return body
def getCluster(self, cluster_id):
"""
Get information about a Cluster
:param cluster_id: The id of the cluster to find
:type cluster_id: str
:returns: cluster
"""
response, body = self.http.get('/clusters/%s' % cluster_id)
return body
def getClusterByName(self, name):
"""
Get information about a cluster by name
:param name: The name of the cluster to find
:type name: str
:returns: cluster
:raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -
NON_EXISTENT_CLUSTER - cluster doesn't exist
"""
response, body = self.http.get('/clusters?name=%s' % name)
return body
def getServers(self):
"""
Get the list of Servers
:returns: list of Servers
"""
response, body = self.http.get('/servers')
return body
def getServer(self, server_id):
"""
Get information about a server
:param server_id: The id of the server to find
:type server_id: str
:returns: server
:raises: :class:`~hplefthandclient.exceptions.HTTPServerError`
"""
response, body = self.http.get('/servers/%s' % server_id)
return body
def getServerByName(self, name):
"""
Get information about a server by name
:param name: The name of the server to find
:type name: str
:returns: server
:raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -
NON_EXISTENT_SERVER - server doesn't exist
"""
response, body = self.http.get('/servers?name=%s' % name)
return body
def createServer(self, name, iqn, optional=None):
"""
Create a server by name
:param name: The name of the server to create
:type name: str
:param iqn: The iSCSI qualified name
:type name: str
:param optional: Dictionary of optional params
:type optional: dict
.. code-block:: python
optional = {
'description' : "some comment",
'iscsiEnabled' : True,
'chapName': "some chap name",
'chapAuthenticationRequired': False,
'chapInitiatorSecret': "initiator secret",
'chapTargetSecret': "target secret",
'iscsiLoadBalancingEnabled': True,
'controllingServerName': "server name",
'fibreChannelEnabled': False,
'inServerCluster": True
}
:returns: server
:raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -
NON_EXISTENT_SERVER - server doesn't exist
"""
info = {'name': name, 'iscsiIQN': iqn}
if optional:
info = self._mergeDict(info, optional)
response, body = self.http.post('/servers', body=info)
return body
def deleteServer(self, server_id):
"""
Delete a Server
:param server_id: the server ID to delete
:raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -
NON_EXISTENT_SERVER - The server does not exist
"""
response, body = self.http.delete('/servers/%s' % server_id)
return body
def getSnapshots(self):
"""
Get the list of Snapshots
:returns: list of Snapshots
"""
response, body = self.http.get('/snapshots')
return body
def getSnapshot(self, snapshot_id):
"""
Get information about a Snapshot
:returns: snapshot
:raises: :class:`~hplefthandclient.exceptions.HTTPServerError`
"""
response, body = self.http.get('/snapshots/%s' % snapshot_id)
return body
def getSnapshotByName(self, name):
"""
Get information about a snapshot by name
:param name: The name of the snapshot to find
:returns: volume
:raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -
NON_EXISTENT_SNAP - shapshot doesn't exist
"""
response, body = self.http.get('/snapshots?name=%s' % name)
return body
def createSnapshot(self, name, source_volume_id, optional=None):
"""
Create a snapshot of an existing Volume
:param name: Name of the Snapshot
:type name: str
:param source_volume_id: The volume you want to snapshot
:type source_volume_id: int
:param optional: Dictionary of optional params
:type optional: dict
.. code-block:: python
optional = {
'description' : "some comment",
'inheritAccess' : false
}
"""
parameters = {'name': name}
if optional:
parameters = self._mergeDict(parameters, optional)
info = {'action': 'createSnapshot',
'parameters': parameters}
response, body = self.http.post('/volumes/%s' % source_volume_id,
body=info)
return body
def deleteSnapshot(self, snapshot_id):
"""
Delete a Snapshot
:param snapshot_id: the snapshot ID to delete
:raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -
NON_EXISTENT_SNAPSHOT - The snapshot does not exist
"""
response, body = self.http.delete('/snapshots/%s' % snapshot_id)
return body
def cloneSnapshot(self, name, source_snapshot_id, optional=None):
"""
Create a clone of an existing Shapshot
:param name: Name of the Snapshot clone
:type name: str
:param source_snapshot_id: The snapshot you want to clone
:type source_snapshot_id: int
:param optional: Dictionary of optional params
:type optional: dict
.. code-block:: python
optional = {
'description' : "some comment"
}
"""
parameters = {'name': name}
if optional:
parameters = self._mergeDict(parameters, optional)
info = {'action': 'createSmartClone',
'parameters': parameters}
response, body = self.http.post('/snapshots/%s' % source_snapshot_id,
body=info)
return body
def getVolumes(self):
"""
Get the list of Volumes
:returns: list of Volumes
"""
response, body = self.http.get('/volumes')
return body
def getVolume(self, volume_id):
"""
Get information about a volume
:param volume_id: The id of the volume to find
:type volume_id: str
:returns: volume
:raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -
NON_EXISTENT_VOL - volume doesn't exist
"""
response, body = self.http.get('/volumes/%s' % volume_id)
return body
def getVolumeByName(self, name):
"""
Get information about a volume by name
:param name: The name of the volume to find
:type volume_id: str
:returns: volume
:raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -
NON_EXISTENT_VOL - volume doesn't exist
"""
response, body = self.http.get('/volumes?name=%s' % name)
return body
def createVolume(self, name, cluster_id, size, optional=None):
""" Create a new volume
:param name: the name of the volume
:type name: str
:param cluster_id: the cluster Id
:type cluster_id: int
:param sizeKB: size in KB for the volume
:type sizeKB: int
:param optional: dict of other optional items
:type optional: dict
.. code-block:: python
optional = {
'description': 'some comment',
'isThinProvisioned': 'true',
'autogrowSeconds': 200,
'clusterName': 'somename',
'isAdaptiveOptimizationEnabled': 'true',
'dataProtectionLevel': 2,
}
:returns: List of Volumes
:raises: :class:`~hplefthandclient.exceptions.HTTPConflict` -
EXISTENT_SV - Volume Exists already
"""
info = {'name': name, 'clusterID': cluster_id, 'size': size}
if optional:
info = self._mergeDict(info, optional)
response, body = self.http.post('/volumes', body=info)
return body
def deleteVolume(self, volume_id):
"""
Delete a volume
:param name: the name of the volume
:type name: str
:raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -
NON_EXISTENT_VOL - The volume does not exist
"""
response, body = self.http.delete('/volumes/%s' % volume_id)
return body
def modifyVolume(self, volume_id, optional):
"""Modify an existing volume.
:param volume_id: The id of the volume to find
:type volume_id: str
:returns: volume
:raises: :class:`~hplefthandclient.exceptions.HTTPNotFound` -
NON_EXISTENT_VOL - volume doesn't exist
"""
info = {'volume_id': volume_id}
info = self._mergeDict(info, optional)
response, body = self.http.put('/volumes/%s' % volume_id, body=info)
return body
def cloneVolume(self, name, source_volume_id, optional=None):
"""
Create a clone of an existing Volume
:param name: Name of the Volume clone
:type name: str
:param source_volume_id: The Volume you want to clone
:type source_volume_id: int
:param optional: Dictionary of optional params
:type optional: dict
.. code-block:: python
optional = {
'description' : "some comment"
}
"""
parameters = {'name': name}
if optional:
parameters = self._mergeDict(parameters, optional)
info = {'action': 'createSmartClone',
'parameters': parameters}
response, body = self.http.post('/volumes/%s' % source_volume_id,
body=info)
return body
def addServerAccess(self, volume_id, server_id, optional=None):
"""
Assign a Volume to a Server
:param volume_id: Volume ID of the volume
:type name: int
:param server_id: Server ID of the server to add the volume to
:type source_volume_id: int
:param optional: Dictionary of optional params
:type optional: dict
.. code-block:: python
optional = {
'Transport' : 0,
'Lun' : 1,
}
"""
parameters = {'serverID': server_id,
'exclusiveAccess': True,
'readAccess': True,
'writeAccess': True}
if optional:
parameters = self._mergeDict(parameters, optional)
info = {'action': 'addServerAccess',
'parameters': parameters}
response, body = self.http.post('/volumes/%s' % volume_id,
body=info)
return body
def removeServerAccess(self, volume_id, server_id):
"""
Unassign a Volume from a Server
:param volume_id: Volume ID of the volume
:type name: int
:param server_id: Server ID of the server to remove the volume fom
:type source_volume_id: int
"""
parameters = {'serverID': server_id}
info = {'action': 'removeServerAccess',
'parameters': parameters}
response, body = self.http.post('/volumes/%s' % volume_id,
body=info)
return body
def _mergeDict(self, dict1, dict2):
"""
Safely merge 2 dictionaries together
:param dict1: The first dictionary
:type dict1: dict
:param dict2: The second dictionary
:type dict2: dict
:returns: dict
:raises Exception: dict1, dict2 is not a dictionary
"""
if type(dict1) is not dict:
raise Exception("dict1 is not a dictionary")
if type(dict2) is not dict:
raise Exception("dict2 is not a dictionary")
dict3 = dict1.copy()
dict3.update(dict2)
return dict3

View File

@ -0,0 +1,308 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright 2012 Hewlett Packard Development Company, L.P.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
Exceptions for the client
.. module: Exceptions
:Author: Walter A. Boring IV
:Description: This contains the HTTP exceptions that can come back from the REST calls
"""
class UnsupportedVersion(Exception):
"""
Indicates that the user is trying to use an unsupported version of the API
"""
pass
class CommandError(Exception):
pass
class AuthorizationFailure(Exception):
pass
class NoUniqueMatch(Exception):
pass
class ClientException(Exception):
"""
The base exception class for all exceptions this library raises.
:param error: The error array
:type error: array
"""
_error_code = None
_error_desc = None
_debug1 = None
_debug2 = None
def __init__(self, error=None):
if error:
if 'messageID' in error:
self._error_code = error['messageID']
if 'message' in error:
self._error_desc = error['message']
if 'debug1' in error:
self._debug1 = error['debug1']
if 'debug2' in error:
self._debug2 = error['debug2']
def get_code(self):
return self._error_code
def get_description(self):
return self._error_desc
def __str__(self):
formatted_string = "%s (HTTP %s)" % (self.message, self.http_status)
if self._error_code:
formatted_string += " %s" % self._error_code
if self._error_desc:
formatted_string += " - %s" % self._error_desc
if self._debug1:
formatted_string += " (1: '%s')" % self._debug1
if self._debug2:
formatted_string += " (2: '%s')" % self._debug2
return formatted_string
##
## 400 Errors
##
class HTTPBadRequest(ClientException):
"""
HTTP 400 - Bad request: you sent some malformed data.
"""
http_status = 400
message = "Bad request"
class HTTPUnauthorized(ClientException):
"""
HTTP 401 - Unauthorized: bad credentials.
"""
http_status = 401
message = "Unauthorized"
class HTTPForbidden(ClientException):
"""
HTTP 403 - Forbidden: your credentials don't give you access to this
resource.
"""
http_status = 403
message = "Forbidden"
class HTTPNotFound(ClientException):
"""
HTTP 404 - Not found
"""
http_status = 404
message = "Not found"
class HTTPMethodNotAllowed(ClientException):
"""
HTTP 405 - Method not Allowed
"""
http_status = 405
message = "Method Not Allowed"
class HTTPNotAcceptable(ClientException):
"""
HTTP 406 - Method not Acceptable
"""
http_status = 406
message = "Method Not Acceptable"
class HTTPProxyAuthRequired(ClientException):
"""
HTTP 407 - The client must first authenticate itself with the proxy.
"""
http_status = 407
message = "Proxy Authentication Required"
class HTTPRequestTimeout(ClientException):
"""
HTTP 408 - The server timed out waiting for the request.
"""
http_status = 408
message = "Request Timeout"
class HTTPConflict(ClientException):
"""
HTTP 409 - Conflict: A Conflict happened on the server
"""
http_status = 409
message = "Conflict"
class HTTPGone(ClientException):
"""
HTTP 410 - Indicates that the resource requested is no longer available and will not be available again.
"""
http_status = 410
message = "Gone"
class HTTPLengthRequired(ClientException):
"""
HTTP 411 - The request did not specify the length of its content, which is required by the requested resource.
"""
http_status = 411
message = "Length Required"
class HTTPPreconditionFailed(ClientException):
"""
HTTP 412 - The server does not meet one of the preconditions that the requester put on the request.
"""
http_status = 412
message = "Over limit"
class HTTPRequestEntityTooLarge(ClientException):
"""
HTTP 413 - The request is larger than the server is willing or able to process
"""
http_status = 413
message = "Request Entity Too Large"
class HTTPRequestURITooLong(ClientException):
"""
HTTP 414 - The URI provided was too long for the server to process.
"""
http_status = 414
message = "Request URI Too Large"
class HTTPUnsupportedMediaType(ClientException):
"""
HTTP 415 - The request entity has a media type which the server or resource does not support.
"""
http_status = 415
message = "Unsupported Media Type"
class HTTPRequestedRangeNotSatisfiable(ClientException):
"""
HTTP 416 - The client has asked for a portion of the file, but the server cannot supply that portion.
"""
http_status = 416
message = "Requested Range Not Satisfiable"
class HTTPExpectationFailed(ClientException):
"""
HTTP 417 - The server cannot meet the requirements of the Expect request-header field.
"""
http_status = 417
message = "Expectation Failed"
class HTTPTeaPot(ClientException):
"""
HTTP 418 - I'm a Tea Pot
"""
http_status = 418
message = "I'm A Teapot. (RFC 2324)"
##
## 500 Errors
##
class HTTPServerError(ClientException):
"""
HTTP 500 -
"""
http_status = 500
message = "Error"
# NotImplemented is a python keyword.
class HTTPNotImplemented(ClientException):
"""
HTTP 501 - Not Implemented: the server does not support this operation.
"""
http_status = 501
message = "Not Implemented"
class HTTPBadGateway(ClientException):
"""
HTTP 502 - The server was acting as a gateway or proxy and received an invalid response from the upstream server.
"""
http_status = 502
message = "Bad Gateway"
class HTTPServiceUnavailable(ClientException):
"""
HTTP 503 - The server is currently unavailable
"""
http_status = 503
message = "Service Unavailable"
class HTTPGatewayTimeout(ClientException):
"""
HTTP 504 - The server was acting as a gateway or proxy and did not receive a timely response from the upstream server.
"""
http_status = 504
message = "Gateway Timeout"
class HTTPVersionNotSupported(ClientException):
"""
HTTP 505 - The server does not support the HTTP protocol version used in the request.
"""
http_status = 505
message = "Version Not Supported"
# In Python 2.4 Exception is old-style and thus doesn't have a __subclasses__()
# so we can do this:
# _code_map = dict((c.http_status, c)
# for c in ClientException.__subclasses__())
#
# Instead, we have to hardcode it:
_code_map = dict((c.http_status, c) for c in [HTTPBadRequest, HTTPUnauthorized,
HTTPForbidden, HTTPNotFound, HTTPMethodNotAllowed,
HTTPNotAcceptable, HTTPProxyAuthRequired, HTTPRequestTimeout,
HTTPConflict, HTTPGone, HTTPLengthRequired,
HTTPPreconditionFailed, HTTPRequestEntityTooLarge,
HTTPRequestURITooLong, HTTPUnsupportedMediaType,
HTTPRequestedRangeNotSatisfiable, HTTPExpectationFailed,
HTTPTeaPot, HTTPServerError,
HTTPNotImplemented, HTTPBadGateway,
HTTPServiceUnavailable, HTTPGatewayTimeout,
HTTPVersionNotSupported])
def from_response(response, body):
"""
Return an instance of an ClientException or subclass
based on an httplib2 response.
Usage::
resp, body = http.request(...)
if resp.status != 200:
raise exception_from_response(resp, body)
"""
cls = _code_map.get(response.status, ClientException)
return cls(body)

331
hplefthandclient/http.py Normal file
View File

@ -0,0 +1,331 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright 2013 Hewlett Packard Development Company, L.P.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
HPLeftHand HTTP Client
:Author: Walter A. Boring IV
:Description: This is the HTTP Client that is used to make the actual calls.
It includes the authentication that knows the cookie name for LH.
"""
import logging
import httplib2
import time
import pprint
try:
import json
except ImportError:
import simplejson as json
from hplefthandclient import exceptions
class HTTPJSONRESTClient(httplib2.Http):
"""
An HTTP REST Client that sends and recieves JSON data as the body of the
HTTP request.
:param api_url: The url to the LH OS REST service
ie. https://<hostname or IP>:<port>/lhos
:type api_url: str
:param insecure: Use https? requires a local certificate
:type insecure: bool
"""
USER_AGENT = 'python-hplefthandclient'
SESSION_COOKIE_NAME = 'Authorization'
#API_VERSION = 'X-API-Version'
#CHRP_VERSION = 'X_HP-CHRP-Client-Version'
def __init__(self, api_url, insecure=False, http_log_debug=False):
super(HTTPJSONRESTClient,
self).__init__(disable_ssl_certificate_validation=True)
self.session_key = None
#should be http://<Server:Port>/lhos
self.set_url(api_url)
self.set_debug_flag(http_log_debug)
self.times = [] # [("item", starttime, endtime), ...]
# httplib2 overrides
self.force_exception_to_status_code = True
#self.disable_ssl_certificate_validation = insecure
self._logger = logging.getLogger(__name__)
def set_url(self, api_url):
#should be http://<Server:Port>/lhos
self.api_url = api_url.rstrip('/')
self.api_url = self.api_url
def set_debug_flag(self, flag):
"""
This turns on/off http request/response debugging output to console
:param flag: Set to True to enable debugging output
:type flag: bool
"""
self.http_log_debug = flag
if self.http_log_debug:
ch = logging.StreamHandler()
self._logger.setLevel(logging.DEBUG)
self._logger.addHandler(ch)
def authenticate(self, user, password, optional=None):
"""
This tries to create an authenticated session with the LH OS server
:param user: The username
:type user: str
:param password: The password
:type password: str
"""
#this prevens re-auth attempt if auth fails
self.auth_try = 1
self.session_key = None
info = {'user': user, 'password': password}
self._auth_optional = None
if optional:
self._auth_optional = optional
info.update(optional)
resp, body = self.post('/credentials', body=info)
if body and 'authToken' in body:
self.session_key = body['authToken']
self.auth_try = 0
self.user = user
self.password = password
def _reauth(self):
self.authenticate(self.user, self.password, self._auth_optional)
def unauthenticate(self):
"""
This clears the authenticated session with the LH server. It logs out.
"""
#delete the session on the LH
self.delete('/credentials/%s' % self.session_key)
self.session_key = None
def get_timings(self):
"""
Ths gives an array of the request timings since last reset_timings call
"""
return self.times
def reset_timings(self):
"""
This resets the request/response timings array
"""
self.times = []
def _http_log_req(self, args, kwargs):
if not self.http_log_debug:
return
string_parts = ['curl -i']
for element in args:
if element in ('GET', 'POST'):
string_parts.append(' -X %s' % element)
else:
string_parts.append(' %s' % element)
for element in kwargs['headers']:
header = ' -H "%s: %s"' % (element, kwargs['headers'][element])
string_parts.append(header)
self._logger.debug("\nREQ: %s\n" % "".join(string_parts))
if 'body' in kwargs:
self._logger.debug("REQ BODY: %s\n" % (kwargs['body']))
def _http_log_resp(self, resp, body):
if not self.http_log_debug:
return
self._logger.debug("RESP:%s\n", pprint.pformat(resp))
self._logger.debug("RESP BODY:%s\n", body)
def request(self, *args, **kwargs):
"""
This makes an HTTP Request to the LH server. You should use get, post,
delete instead.
"""
if self.session_key and self.auth_try != 1:
kwargs.setdefault('headers',
{})[self.SESSION_COOKIE_NAME] = self.session_key
kwargs.setdefault('headers', kwargs.get('headers', {}))
kwargs['headers']['User-Agent'] = self.USER_AGENT
kwargs['headers']['Accept'] = 'application/json'
if 'body' in kwargs:
kwargs['headers']['Content-Type'] = 'application/json'
kwargs['body'] = json.dumps(kwargs['body'])
self._http_log_req(args, kwargs)
resp, body = super(HTTPJSONRESTClient, self).request(*args, **kwargs)
self._http_log_resp(resp, body)
# Try and conver the body response to an object
# This assumes the body of the reply is JSON
if body:
try:
body = json.loads(body)
except ValueError:
#pprint.pprint("failed to decode json\n")
pass
else:
body = None
if resp.status >= 400:
raise exceptions.from_response(resp, body)
return resp, body
def _time_request(self, url, method, **kwargs):
start_time = time.time()
resp, body = self.request(url, method, **kwargs)
self.times.append(("%s %s" % (method, url),
start_time, time.time()))
return resp, body
def _do_reauth(self, url, method, ex, **kwargs):
print "_do_reauth called"
try:
if self.auth_try != 1:
self._reauth()
resp, body = self._time_request(self.api_url + url,
method, **kwargs)
return resp, body
else:
raise ex
except exceptions.HTTPUnauthorized:
raise ex
def _cs_request(self, url, method, **kwargs):
# Perform the request once. If we get a 401 back then it
# might be because the auth token expired, so try to
# re-authenticate and try again. If it still fails, bail.
try:
resp, body = self._time_request(self.api_url + url, method,
**kwargs)
return resp, body
except exceptions.HTTPUnauthorized, ex:
print "_CS_REQUEST HTTPUnauthorized"
resp, body = self._do_reauth(url, method, ex, **kwargs)
return resp, body
except exceptions.HTTPForbidden, ex:
print "_CS_REQUEST HTTPForbidden"
resp, body = self._do_reauth(url, method, ex, **kwargs)
return resp, body
def get(self, url, **kwargs):
"""
Make an HTTP GET request to the server.
.. code-block:: python
#example call
try {
headers, body = http.get('/volumes')
} except exceptions.HTTPUnauthorized as ex:
print "Not logged in"
}
:param url: The relative url from the LH api_url
:type url: str
:returns: headers - dict of HTTP Response headers
:returns: body - the body of the response. If the body was JSON,
it will be an object
"""
return self._cs_request(url, 'GET', **kwargs)
def post(self, url, **kwargs):
"""
Make an HTTP POST request to the server.
.. code-block:: python
#example call
try {
info = {'name': 'new volume name', 'sizeMiB': 300}
headers, body = http.post('/volumes', body=info)
} except exceptions.HTTPUnauthorized as ex:
print "Not logged in"
}
:param url: The relative url from the LH api_url
:type url: str
:returns: headers - dict of HTTP Response headers
:returns: body - the body of the response. If the body was JSON,
it will be an object
"""
return self._cs_request(url, 'POST', **kwargs)
def put(self, url, **kwargs):
"""
Make an HTTP PUT request to the server.
.. code-block:: python
#example call
try {
info = {'name': 'something'}
headers, body = http.put('/volumes', body=info)
} except exceptions.HTTPUnauthorized as ex:
print "Not logged in"
}
:param url: The relative url from the LH api_url
:type url: str
:returns: headers - dict of HTTP Response headers
:returns: body - the body of the response. If the body was JSON,
it will be an object
"""
return self._cs_request(url, 'PUT', **kwargs)
def delete(self, url, **kwargs):
"""
Make an HTTP DELETE request to the server.
.. code-block:: python
#example call
try {
headers, body = http.delete('/volumes/%s' % name)
} except exceptions.HTTPUnauthorized as ex:
print "Not logged in"
}
:param url: The relative url from the LH api_url
:type url: str
:returns: headers - dict of HTTP Response headers
:returns: body - the body of the response. If the body was JSON,
it will be an object
"""
return self._cs_request(url, 'DELETE', **kwargs)

20
samples/README.rst Normal file
View File

@ -0,0 +1,20 @@
This directory is going away.....
The unit tests are in 'test'
This directory contains unit tests
flask_server.py -- is a sample server that acts like a LeftHand OS API server.
This requires python-flask
How to run the tests
* First run the api server
python flask_server.py
* Now run the test client.
python test_client.py
for overriding error content in flask
http://flask.pocoo.org/snippets/83/
http://flask.pocoo.org/docs/api/?highlight=abort#flask.Flask.errorhandler

233
samples/test_client.py Normal file
View File

@ -0,0 +1,233 @@
import argparse
from os import sys
import os
import pprint
# this is a hack to get the hp driver module
# and it's utils module on the search path.
cmd_folder = os.path.realpath(os.path.abspath(".."))
if cmd_folder not in sys.path:
sys.path.insert(0, cmd_folder)
from hplefthandclient import client, exceptions
parser = argparse.ArgumentParser()
parser.add_argument("-debug", help="Turn on http debugging", default=False,
action="store_true")
args = parser.parse_args()
cl = client.HPLeftHandClient("http://10.10.22.7:8080/lhos")
# This is the local flask server url
#cl = client.HPLeftHandClient("http://127.0.0.1:5000/lhos")
if "debug" in args and args.debug == True:
cl.debug_rest(True)
def test_login():
print "Test Login"
try:
cl.login("administrator", "hpinvent")
pprint.pprint("Login worked")
except exceptions.HTTPUnauthorized:
pprint.pprint("Login Failed")
def test_logout():
print "Test Logout"
try:
cl.login("administrator", "hpinvent")
pprint.pprint("Login worked")
except exceptions.HTTPUnauthorized:
pprint.pprint("Login Failed")
try:
cl.logout()
pprint.pprint("Logout worked")
except exceptions.HTTPUnauthorized:
pprint.pprint("Logout Failed")
def test_get_snapshot(snap_id):
print "Get Snapshot"
try:
cl.login("administrator", "hpinvent")
snap = cl.getSnapshot(snap_id)
pprint.pprint(snap)
except exceptions.HTTPUnauthorized as ex:
pprint.pprint("You must login first")
except Exception as ex:
pprint.pprint(ex)
def test_get_snapshot_by_name(name):
print "Get Snapshot By Name"
try:
cl.login("administrator", "hpinvent")
snap = cl.getSnapshotByName(name)
pprint.pprint(snap)
except exceptions.HTTPUnauthorized as ex:
pprint.pprint("You must login first")
except Exception as ex:
pprint.pprint(ex)
def test_create_snapshot():
print "Create Snapshot"
try:
cl.login("administrator", "hpinvent")
vol = cl.createVolume("VolumeSource", 20, 1048576)
snapshot = cl.createSnapshot('VolumeSnapshot', vol['id'])
pprint.pprint(snapshot)
cl.deleteSnapshot(snapshot['id'])
cl.deleteVolume(vol['id'])
except exceptions.HTTPUnauthorized:
pprint.pprint("You must login first")
def test_get_snapshots():
print "Get Snapshots"
try:
cl.login("administrator", "hpinvent")
snapshots = cl.getSnapshots()
pprint.pprint(snapshots)
except exceptions.HTTPUnauthorized:
pprint.pprint("You must login first")
def test_get_servers():
print "Get Servers"
try:
cl.login("administrator", "hpinvent")
servers = cl.getServers()
pprint.pprint(servers)
except exceptions.HTTPUnauthorized:
pprint.pprint("You must login first")
def test_get_server(server_id):
print "Get Server"
try:
cl.login("administrator", "hpinvent")
server = cl.getServer(server_id)
pprint.pprint(server)
except exceptions.HTTPUnauthorized:
pprint.pprint("You must login first")
def test_get_server_by_name(name):
print "Get Server By Name"
try:
cl.login("administrator", "hpinvent")
server = cl.getServerByName(name)
pprint.pprint(server)
except exceptions.HTTPUnauthorized:
pprint.pprint("You must login first")
def test_get_volume(volume_id):
print "Get Volumes"
try:
cl.login("administrator", "hpinvent")
volume = cl.getVolume(volume_id)
return volume
except exceptions.HTTPUnauthorized:
pprint.pprint("You must login first")
def test_get_volume_by_name(name):
print "Get Volume By Name"
try:
cl.login("administrator", "hpinvent")
volume = cl.getVolumeByName(name)
return volume
except exceptions.HTTPUnauthorized:
pprint.pprint("You must login first")
def test_get_volumes():
print "Get Volumes"
try:
cl.login("administrator", "hpinvent")
volumes = cl.getVolumes()
pprint.pprint(volumes)
except exceptions.HTTPUnauthorized:
pprint.pprint("You must login first")
def test_get_clusters():
print "Get Clusters"
try:
cl.login("administrator", "hpinvent")
volumes = cl.getClusters()
pprint.pprint(volumes)
except exceptions.HTTPUnauthorized:
pprint.pprint("You must login first")
def test_get_cluster_by_name(name):
print "Get Cluster By Name"
try:
cl.login("administrator", "hpinvent")
volumes = cl.getClusterByName(name)
pprint.pprint(volumes)
except exceptions.HTTPUnauthorized:
pprint.pprint("You must login first")
def test_create_volume():
print "Create Volumes"
try:
cl.login("administrator", "hpinvent")
vol = cl.createVolume("Volume1", 20, 1048576)
return vol
except exceptions.HTTPUnauthorized:
pprint.pprint("You must login first")
def test_delete_volume(volume_id):
print "Delete a Volume"
try:
cl.login("administrator", "hpinvent")
vol = cl.deleteVolume(volume_id)
return vol
except exceptions.HTTPUnauthorized:
pprint.pprint("You must login first")
def test_error():
print "test Error"
try:
cl.login("administrator", "hpinvent")
resp, body = cl.http.get('/throwerror')
pprint.pprint(resp)
pprint.pprint(body)
except Exception as ex:
print ex
#test_login()
#test_logout()
#vols = test_get_volumes()
#vol = test_get_volume_by_name("vol1_test")
#vols = test_get_clusters()
#snap = test_get_snapshot("25")
#snap = test_get_snapshot_by_name("vol1_test_SS_1")
snaps = test_get_snapshots()
#clusters = test_get_clusters()
#cluster = test_get_cluster_by_name("ClusterVSA309")
#servers = test_get_servers()
#server = test_get_server_by_name("jim-devstack")
#vol = test_get_volume(23)
#pprint.pprint(vol)
#test_delete_volume(400)
#test_create_snapshot()
#test_error()

148
samples/utils.py Normal file
View File

@ -0,0 +1,148 @@
import argparse
from os import sys
import random
from sys import path
from os import getcwd
import os, sys, inspect, pprint
# this is a hack to get the hp driver module
# and it's utils module on the search path.
cmd_folder = os.path.realpath(os.path.abspath("..") )
if cmd_folder not in sys.path:
sys.path.insert(0, cmd_folder)
from hplefthandclient import client, exceptions
def get_volumes(cl):
print "Get Volumes"
try:
volumes = cl.getVolumes()
if volumes:
for volume in volumes['members']:
print "Found '%s'" % volume['name']
except exceptions.HTTPUnauthorized as ex:
print "You must login first"
except Exception as ex:
print ex
print "Complete\n"
def get_volume(cl, name):
print "Get Volume %s" % name
try:
vol = cl.getVolume(name)
pprint.pprint(vol)
except exceptions.HTTPUnauthorized as ex:
print "You must login first"
except Exception as ex:
print ex
print "Complete\n"
def get_hosts(cl):
print "Get Hosts"
try:
hosts = cl.getHosts()
if hosts:
for host in hosts['members']:
pprint.pprint(host)
# print "Found '%s'" % host['name']
except exceptions.HTTPUnauthorized as ex:
print "You must login first"
except Exception as ex:
print ex
def get_host(cl,hostname):
try:
host = cl.getHost(hostname)
pprint.pprint(host)
except exceptions.HTTPUnauthorized as ex:
print "You must login first"
except Exception as ex:
print ex
def delete_host(cl,hostname):
try:
host = cl.deleteHost(hostname)
except exceptions.HTTPUnauthorized as ex:
print "You must login first"
except Exception as ex:
print ex
def get_host_vluns(cl,hostname):
try:
host = cl.getHostVLUNs(hostname)
pprint.pprint(host)
except exceptions.HTTPUnauthorized as ex:
print "You must login first"
except Exception as ex:
print ex
def delete_host_vluns(cl, hostName):
try:
vluns = cl.getHostVLUNs(hostName)
if vluns:
for vlun in vluns:
print "Deleting VLUN %s " % vlun['volumeName']
cl.deleteVLUN(vlun['volumeName'], vlun['lun'],
vlun['hostname'], vlun['portPos'])
except exceptions.HTTPUnauthorized as ex:
print "You must login"
except Exception as ex:
print ex
def get_ports(cl):
try:
ports = cl.getPorts()
pprint.pprint(ports)
except exceptions.HTTPUnauthorized as ex:
print "You must login first"
except Exception as ex:
print ex
def get_vluns(cl):
print "Get VLUNs"
try:
vluns = cl.getVLUNs()
if vluns:
pprint.pprint(vluns)
for vlun in vluns['members']:
pprint.pprint(vlun)
print "Found VLUN '%s'" % vlun['volumeName']
except exceptions.HTTPUnauthorized as ex:
print "You must login first"
except Exception as ex:
print ex
def get_vlun(cl,vlunname):
try:
vlun = cl.getVLUN(vlunname)
pprint.pprint(vlun)
except exceptions.HTTPUnauthorized as ex:
print "You must login first"
except Exception as ex:
print ex
def get_cpgs(cl):
print "Get CPGs"
try:
cpgs = cl.getCPGs()
if cpgs:
for cpg in cpgs['members']:
print "Found CPG '%s'" % cpg['name']
except exceptions.HTTPUnauthorized as ex:
print "You must login first"
except Exception as ex:
print ex
def get_cpg(cl, name):
try:
cpg = cl.getCPG(name)
pprint.pprint(cpg)
except exceptions.HTTPUnauthorized as ex:
print "You must login first"
except Exception as ex:
print ex

36
setup.py Normal file
View File

@ -0,0 +1,36 @@
import hplefthandclient
try:
from setuptools import setup, find_packages
except ImportError:
from distutils.core import setup, find_packages
import sys
setup(
name='hplefthandclient',
version=hplefthandclient.version,
description="HP LeftHand/StoreVirtual HTTP REST Client",
author="Kurt Martin",
author_email="kurt.f.martin@hp.com",
maintainer="Kurt Martin",
keywords=["hp", "lefthand", "storevirtual", "rest"],
requires=['httplib2(>=0.6.0)'],
install_requires=['httplib2 >= 0.6.0'],
tests_require=["nose", "werkzeug", "nose-testconfig"],
license="Apache License, Version 2.0",
packages=find_packages(),
provides=['hplefthandclient'],
url="http://packages.python.org/hplefthandclient",
classifiers=[
'Development Status :: 3 - Alpha',
'Intended Audience :: Developers',
'License :: OSI Approved :: Apache Software License',
'Environment :: Web Environment',
'Programming Language :: Python',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Topic :: Internet :: WWW/HTTP',
]
)

7
test/README.rst Normal file
View File

@ -0,0 +1,7 @@
Unit tests
==========
1. pip install nose
2. pip install nose-testconfig
3. use config.ini to configure unit tests
3. run tests with nosetests --tc-file config.ini

9
test/config.ini Normal file
View File

@ -0,0 +1,9 @@
[TEST]
flask_url=http://localhost:5001/lhos
user=administrator
pass=hpinvent
unit=false
debug=false
start_flask_server=true
cluster=ClusterVSA309
lhos_url=http://10.10.22.7:8080/lhos

View File

@ -0,0 +1,102 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2009-2012 10gen, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Test base class of LeftHand Client"""
import sys
import os
sys.path.insert(0, os.path.realpath(os.path.abspath('../')))
from hplefthandclient import client
import unittest
import subprocess
import time
import inspect
from testconfig import config
from urlparse import urlparse
# pip install nose-testconfig
# e.g.
# nosetests test_HPLeftHandClient_volume.py -v --tc-file config.ini
class HPLeftHandClientBaseTestCase(unittest.TestCase):
user = config['TEST']['user']
password = config['TEST']['pass']
cluster = config['TEST']['cluster']
flask_url = config['TEST']['flask_url']
url_lhos = config['TEST']['lhos_url']
debug = config['TEST']['debug'].lower() == 'true'
unitTest = config['TEST']['unit'].lower() == 'true'
startFlask = config['TEST']['start_flask_server'].lower() == 'true'
def setUp(self):
cwd = os.path.dirname(os.path.abspath(
inspect.getfile(inspect.currentframe())))
if self.unitTest:
self.printHeader('Using flask ' + self.flask_url)
self.cl = client.HPLeftHandClient(self.flask_url)
parsed_url = urlparse(self.flask_url)
userArg = '-user=%s' % self.user
passwordArg = '-password=%s' % self.password
portArg = '-port=%s' % parsed_url.port
script = 'test_HPLeftHandMockServer_flask.py'
path = "%s/%s" % (cwd, script)
try:
if self.startFlask:
self.mockServer = subprocess.Popen([sys.executable,
path,
userArg,
passwordArg,
portArg],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE)
else:
pass
except Exception:
pass
time.sleep(1)
else:
self.printHeader('Using LeftHand ' + self.url_lhos)
self.cl = client.HPLeftHandClient(self.url_lhos)
if self.debug:
self.cl.debug_rest(True)
self.cl.login(self.user, self.password)
def tearDown(self):
self.cl.logout()
if self.unitTest and self.startFlask:
#TODO: it seems to kill all the process except the last one...
#don't know why
self.mockServer.kill()
def printHeader(self, name):
print "\n##Start testing '%s'" % name
def printFooter(self, name):
print "##Compeleted testing '%s\n" % name
def findInDict(self, dic, key, value):
for i in dic:
if key in i and i[key] == value:
return True

View File

@ -0,0 +1,259 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2009-2012 10gen, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Test class of LeftHand Client handling volumes & snapshots """
import sys
import os
sys.path.insert(0, os.path.realpath(os.path.abspath('../')))
from hplefthandclient import exceptions
import test_HPLeftHandClient_base
VOLUME_NAME1 = 'VOLUME1_UNIT_TEST'
VOLUME_NAME2 = 'VOLUME2_UNIT_TEST'
VOLUME_NAME3 = 'VOLUME3_UNIT_TEST'
SNAP_NAME1 = 'SNAP_UNIT_TEST'
class HPLeftHandClientVolumeTestCase(test_HPLeftHandClient_base.
HPLeftHandClientBaseTestCase):
cluster_id = 0
GB_TO_BYTES = 1073741824
def setUp(self):
super(HPLeftHandClientVolumeTestCase, self).setUp()
try:
cluster_info = self.cl.getClusterByName(
test_HPLeftHandClient_base.
HPLeftHandClientBaseTestCase.cluster)
self.cluster_id = cluster_info['id']
except Exception:
pass
def tearDown(self):
try:
volume_info = self.cl.getVolumeByName(VOLUME_NAME1)
self.cl.deleteVolume(volume_info['id'])
except Exception as ex:
print ex
pass
try:
volume_info = self.cl.getVolumeByName(VOLUME_NAME2)
self.cl.deleteVolume(volume_info['id'])
except Exception as ex:
print ex
pass
super(HPLeftHandClientVolumeTestCase, self).tearDown()
def test_1_create_volume(self):
self.printHeader('create_volume')
try:
#add one
optional = {'description': 'test volume',
'isThinProvisioned': True}
self.cl.createVolume(VOLUME_NAME1, self.cluster_id,
1 * self.GB_TO_BYTES, optional)
except Exception as ex:
print ex
self.fail('Failed to create volume')
return
try:
#check
vol1 = self.cl.getVolumeByName(VOLUME_NAME1)
self.assertIsNotNone(vol1)
volName = vol1['name']
self.assertEqual(VOLUME_NAME1, volName)
except Exception as ex:
print ex
self.fail('Failed to get volume')
return
try:
#add another
optional = {'description': 'test volume2',
'isThinProvisioned': True}
self.cl.createVolume(VOLUME_NAME2, self.cluster_id,
1 * self.GB_TO_BYTES, optional)
except Exception as ex:
print ex
self.fail('Failed to create volume')
return
try:
#check
vol2 = self.cl.getVolumeByName(VOLUME_NAME2)
self.assertIsNotNone(vol2)
volName = vol2['name']
self.assertEqual(VOLUME_NAME2, volName)
except Exception as ex:
print ex
self.fail("Failed to get volume")
self.printFooter('create_volume')
def test_1_create_volume_duplicate_name(self):
self.printHeader('create_volume_duplicate_name')
#add one and check
try:
optional = {'description': 'test volume',
'isThinProvisioned': True}
self.cl.createVolume(VOLUME_NAME1, self.cluster_id,
2 * self.GB_TO_BYTES, optional)
except Exception as ex:
print ex
self.fail("Failed to create volume")
self.assertRaises(exceptions.HTTPServerError,
self.cl.createVolume,
VOLUME_NAME1,
self.cluster_id,
2 * self.GB_TO_BYTES,
optional)
self.printFooter('create_volume_duplicate_name')
def test_1_create_volume_tooLarge(self):
self.printHeader('create_volume_tooLarge')
optional = {'description': 'test volume',
'isThinProvisioned': False}
self.assertRaises(exceptions.HTTPServerError,
self.cl.createVolume,
VOLUME_NAME1,
self.cluster_id,
16777218 * self.GB_TO_BYTES,
optional)
self.printFooter('create_volume_tooLarge')
def test_2_get_volume_bad(self):
self.printHeader('get_volume_bad')
self.assertRaises(exceptions.HTTPNotFound,
self.cl.getVolumeByName,
'NoSuchVolume')
self.printFooter('get_volume_bad')
def test_2_get_volumes(self):
self.printHeader('get_volumes')
self.cl.createVolume(VOLUME_NAME1, self.cluster_id,
3 * self.GB_TO_BYTES)
self.cl.createVolume(VOLUME_NAME2, self.cluster_id,
3 * self.GB_TO_BYTES)
vol1 = self.cl.getVolumeByName(VOLUME_NAME1)
vol2 = self.cl.getVolumeByName(VOLUME_NAME2)
vols = self.cl.getVolumes()
self.assertTrue(self.findInDict(vols['members'], 'name', vol1['name']))
self.assertTrue(self.findInDict(vols['members'], 'name', vol2['name']))
self.printFooter('get_volumes')
def test_3_delete_volume_nonExist(self):
self.printHeader('delete_volume_nonExist')
volume_id = -1
self.assertRaises(exceptions.HTTPServerError,
self.cl.deleteVolume,
volume_id)
self.printFooter('delete_volume_nonExist')
def test_3_delete_volumes(self):
self.printHeader('delete_volumes')
try:
optional = {'description': 'Made by flask.'}
self.cl.createVolume(VOLUME_NAME1, self.cluster_id,
1 * self.GB_TO_BYTES, optional)
vol1 = self.cl.getVolumeByName(VOLUME_NAME1)
self.printHeader('vol1 id %s' % vol1['id'])
self.printHeader('members %s' % vol1)
except Exception as ex:
print ex
self.fail('Failed to create volume %s' % VOLUME_NAME1)
try:
optional = {'description': 'Made by flask.'}
self.cl.createVolume(VOLUME_NAME2, self.cluster_id,
1 * self.GB_TO_BYTES, optional)
vol2 = self.cl.getVolumeByName(VOLUME_NAME2)
self.printHeader('vol2 id %s' % vol2['id'])
except Exception as ex:
print ex
self.fail('Failed to create volume %s' % VOLUME_NAME2)
try:
self.cl.deleteVolume(vol1['id'])
except Exception as ex:
print ex
self.fail('Failed to delete %s' % vol1['id'])
self.assertRaises(exceptions.HTTPNotFound,
self.cl.getVolumeByName,
VOLUME_NAME1)
try:
self.cl.deleteVolume(vol2['id'])
except Exception as ex:
print ex
self.fail('Failed to delete %s' % vol2['id'])
self.assertRaises(exceptions.HTTPNotFound,
self.cl.getVolumeByName,
VOLUME_NAME2)
self.printFooter('delete_volumes')
def test_4_create_snapshot(self):
self.printHeader('create_snapshot')
try:
self.cl.createVolume(VOLUME_NAME1, self.cluster_id,
1 * self.GB_TO_BYTES)
volume_info = self.cl.getVolumeByName(VOLUME_NAME1)
option = {'inheritAccess': True}
self.cl.createSnapshot(SNAP_NAME1, volume_info['id'], option)
except Exception as ex:
print ex
self.fail("Failed with unexpected exception")
snap_info = self.cl.getSnapshotByName(SNAP_NAME1)
self.cl.deleteSnapshot(snap_info['id'])
self.printFooter('create_snapshot')
def test_4_create_snapshot_nonExistVolume(self):
self.printHeader('create_snapshot_nonExistVolume')
optional = {'description': 'test snapshot'}
self.assertRaises(exceptions.HTTPServerError,
self.cl.createSnapshot,
'UnitTestSnapshot',
-1,
optional)
self.printFooter('create_snapshot_nonExistVolume')
#testing
#suite = unittest.TestLoader().loadTestsFromTestCase(HPLeftHandClientVolumeTestCase)
#unittest.TextTestRunner(verbosity=2).run(suite)

View File

@ -0,0 +1,391 @@
import pprint
import json
import random
import string
import argparse
from werkzeug.exceptions import default_exceptions
from werkzeug.exceptions import HTTPException
parser = argparse.ArgumentParser()
parser.add_argument("-debug", help="Turn on http debugging",
default=False, action="store_true")
parser.add_argument("-user", help="User name", default='administrator')
parser.add_argument("-password", help="User password", default='hpinvent')
parser.add_argument("-port", help="Port to listen on", type=int, default=5001)
args = parser.parse_args()
user_name = args.user
user_pass = args.password
debugRequests = False
if "debug" in args and args.debug is True:
debugRequests = True
#__all__ = ['make_json_app']
def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for x in range(size))
def make_json_app(import_name, **kwargs):
"""
Creates a JSON-oriented Flask app.
All error responses that you don't specifically
manage yourself will have application/json content
type, and will contain JSON like this (just an example):
{ "message": "405: Method Not Allowed" }
"""
def make_json_error(ex):
pprint.pprint(ex)
pprint.pprint(ex.code)
#response = jsonify(message=str(ex))
response = jsonify(ex)
response.status_code = (ex.code
if isinstance(ex, HTTPException)
else 500)
return response
app = Flask(import_name, **kwargs)
#app.debug = True
app.secret_key = id_generator(24)
for code in default_exceptions.iterkeys():
app.error_handler_spec[None][code] = make_json_error
return app
app = make_json_app(__name__)
session_key = id_generator(24)
def debugRequest(request):
if debugRequests:
print "\n"
pprint.pprint(request)
pprint.pprint(request.headers)
pprint.pprint(request.data)
def throw_error(http_code, error_code=None,
desc=None, debug1=None, debug2=None):
if error_code:
info = {'code': error_code, 'desc': desc}
if debug1:
info['debug1'] = debug1
if debug2:
info['debug2'] = debug2
abort(Response(json.dumps(info), status=http_code))
else:
abort(http_code)
@app.route('/')
def index():
debugRequest(request)
if 'username' in session:
return 'Logged in as %s' % escape(session['username'])
abort(401)
@app.route('/lhos/throwerror')
def errtest():
debugRequest(request)
throw_error(405, 'ERR_TEST', 'testing throwing an error',
'debug1 message', 'debug2 message')
@app.errorhandler(404)
def not_found(error):
debugRequest(request)
return Response("%s has not been implemented" % request.path, status=501)
@app.route('/lhos/credentials', methods=['GET', 'POST'])
def credentials():
debugRequest(request)
if request.method == 'GET':
return 'GET credentials called'
elif request.method == 'POST':
data = json.loads(request.data)
if data['user'] == user_name and data['password'] == user_pass:
#do something good here
try:
resp = make_response(json.dumps({'key': session_key}), 201)
resp.headers['Location'] = '/lhos/credentials/%s' % session_key
session['username'] = data['user']
session['password'] = data['password']
session['session_key'] = session_key
return resp
except Exception as ex:
pprint.pprint(ex)
else:
#authentication failed!
throw_error(401, "HTTP_AUTH_FAIL",
"Username and or Password was incorrect")
@app.route('/lhos/credentials/<session_key>', methods=['DELETE'])
def logout_credentials(session_key):
debugRequest(request)
session.clear()
return 'DELETE credentials called'
#### CLUSTER INFO ####
@app.route('/lhos/clusters', methods=['GET'])
def get_cluster_by_name():
debugRequest(request)
cluster_name = request.args.get('name')
for cluster in clusters['members']:
if cluster['name'] == cluster_name:
resp = make_response(json.dumps(cluster), 200)
return resp
throw_error(404, 'NON_EXISTENT_CLUSTER', "cluster doesn't exist")
### VOLUMES & SNAPSHOTS ####
@app.route('/lhos/volumes', methods=['GET'])
def get_volume():
debugRequest(request)
volume_name = None
volume_name = request.args.get('name')
if volume_name is not None:
for volume in volumes['members']:
if volume['name'] == volume_name:
resp = make_response(json.dumps(volume), 200)
return resp
throw_error(404, 'NON_EXISTENT_VOLUME', "volume doesn't exist")
else:
resp = make_response(json.dumps(volumes), 200)
return resp
@app.route('/lhos/snapshots', methods=['GET'])
def get_snapshot():
debugRequest(request)
snapshot_name = None
snapshot_name = request.args.get('name')
if snapshot_name is not None:
pprint.pprint('snapshot name %s' % snapshot_name)
for snapshot in snapshots['members']:
if snapshot['name'] == snapshot_name:
pprint.pprint('snapshot namei inside %s' % snapshot['name'])
resp = make_response(json.dumps(snapshot), 200)
return resp
throw_error(404, 'NON_EXISTENT_SNAPSHOT', "snapshot doesn't exist")
else:
resp = make_response(json.dumps(snapshots), 200)
return resp
@app.route('/lhos/volumes/<volume_id>', methods=['POST'])
def create_snapshot(volume_id):
debugRequest(request)
data = json.loads(request.data)
valid_keys = {'action': None, 'parameters': None}
## do some fake errors here depending on data
for key in data.keys():
if key not in valid_keys.keys():
throw_error(400, 'INV_INPUT', "Invalid Parameter '%s'" % key)
for volume in volumes['members']:
if volume['id'] == int(volume_id):
snapshots['members'].append({'name': data['parameters'].get('name'),
'id': random.randint(1, 2000)})
pprint.pprint(snapshots)
return make_response("", 200)
throw_error(500, 'SERVER_ERROR', "volume doesn't exist")
@app.route('/lhos/volumes', methods=['POST'])
def create_volumes():
debugRequest(request)
data = json.loads(request.data)
valid_keys = {'name': None, 'isThinProvisioned': None, 'size': None,
'description': None, 'clusterID': None}
for key in data.keys():
if key not in valid_keys.keys():
throw_error(500, 'SERVER_ERROR', "Invalid Parameter '%s'" % key)
if 'name' in data.keys():
for vol in volumes['members']:
if vol['name'] == data['name']:
throw_error(500, 'SERVER_ERROR',
'The volume already exists.')
else:
throw_error(500, 'SERVER_ERROR',
'No volume name provided.')
if 'size' in data.keys():
if data['size'] > 17592188141567:
throw_error(500, 'SERVER_ERROR', 'Volume to larger')
data['id'] = random.randint(1, 2000)
volumes['members'].append(data)
return make_response("", 200)
@app.route('/lhos/volumes/<volume_id>', methods=['DELETE'])
def delete_volumes(volume_id):
debugRequest(request)
for volume in volumes['members']:
if volume['id'] == int(volume_id):
volumes['members'].remove(volume)
return make_response("", 200)
throw_error(500, 'SERVER_ERROR',
"The volume id '%s' does not exists." % volume_id)
@app.route('/lhos/snapshots/<snapshot_id>', methods=['DELETE'])
def delete_snapshots(snapshot_id):
debugRequest(request)
for snapshot in snapshots['members']:
if snapshot['id'] == int(snapshot_id):
snapshots['members'].remove(snapshot)
return make_response("", 200)
throw_error(404, 'NON_EXISTENT_SNAPSHOT',
"The snapshot id '%s' does not exists." % snapshot_id)
if __name__ == "__main__":
#fake volumes
global volumes
volumes = {'members': [{
'autogrowSeconds': 2,
'bytesWritten': 0,
'clusterId': 21,
'clusterName': 'ClusterVSA309',
'created': '2013-10-23T16:58:58Z',
'dataProtectionLevel': 0,
'dataWritten': 0,
'description': 'test volume',
'fcTransportStatus': 0,
'fibreChannelPaths': None,
'friendlyName': '',
'hasUnrecoverableIOErrors': False,
'id': 24,
'isAdaptiveOptimizationEnabled': True,
'isAvailable': True,
'isDeleting': False,
'isLicensed': True,
'isMigrating': False,
'isPrimary': True,
'isThinProvisioned': False,
'isVIPRebalancing': False,
'iscsiIqn': 'iqn.2003-10.com.lefthandnetworks:mgvsa309:24:vol1',
'iscsiSessions': None,
'migrationStatus': 'none',
'modified': '',
'name': 'VOLUME0_UNIT_TEST',
'numberOfReplicas': 1,
'provisionedSpace': 4194304,
'replicationStatus': 'normal',
'restripePendingStatus': 'none',
'resynchronizationStatus': 'none',
'scsiLUNStatus': 'available',
'serialNumber': '27d18c785f81e91f36a5073fff9233720000000000000018',
'size': 1048576,
'snapshots': {'name': 'snapshots',
'resource': None,
'type': 'snapshot',
'uri': '/snapshots?volumeName=VOLUME1_UNIT_TEST'},
'transport': 0,
'transportServerId': 0,
'type': 'volume',
'uri': '/lhos/volumes/24',
'volumeACL': None}],
'total': 4}
#fake snapshots
global snapshots
snapshots = {'members': [{
'autogrowSeconds': 2,
'bytesWritten': 0,
'clusterId': 21,
'clusterName': 'ClusterVSA309',
'created': '2013-10-23T16:59:19Z',
'dataWritten': 0,
'description': '',
'fcTransportStatus': 0,
'fibreChannelPaths': None,
'hasUnrecoverableIOErrors': False,
'id': 26,
'isAutomatic': False,
'isAvailable': True,
'isDeleting': False,
'isLicensed': True,
'isMigrating': False,
'isPrimary': True,
'isThinProvisioned': True,
'iscsiIqn': 'iqn.2003-10.com.lefthandnetworks:mgvsa309:26:vol1-ss-1',
'managedBy': 0,
'migrationStatus': 'none',
'modified': '',
'name': 'vol1_SS_1',
'provisionedSpace': 528384,
'replicationStatus': 'normal',
'restripePendingStatus': 'none',
'resynchronizationStatus': 'none',
'scsiLUNStatus': 'available',
'serialNumber': '27d18c785f81e91f36a5073fff923372000000000000001a',
'sessions': None,
'size': 4194304,
'snapshotACL': None,
'transport': 0,
'transportServerId': 0,
'type': 'snapshot',
'uri': '/lhos/snapshots/26',
'writableSpaceUsed': 0}],
'total': 4}
#fake clusters
global clusters
clusters = {'members': [{'adaptiveOptimizationCapable': False,
'created': 'N/A',
'description': '',
'id': 21,
'modified': 'N/A',
'moduleCount': 1,
'name': 'ClusterVSA309',
'spaceAvailable': 13457408,
'spaceTotal': 40728576,
'storageModuleIPAddresses': ['10.10.30.165'],
'supportedFeatures': [''],
'type': 'cluster',
'uri': '/lhos/clusters/21',
'virtualIPAddresses': [{'ipV4Address': '10.10.22.7',
'ipV4NetMask': '255.255.224.0'}],
'virtualIPEnabled': True,
'volumeCreationSpace': [{'availableSpace': 13457408,
'replicationLevel': 1}],
'volumes': {'name': 'volumes',
'resource': None,
'type': 'volume',
'uri': '/volumes?clusterName=ClusterVSA309'}}],
'name': 'Clusters Collection',
'total': 1,
'type': 'cluster',
'uri': '/lhos/clusters'}
app.run(port=args.port, debug=debugRequests)