Further cleanup

* README is now relevant
* Auth now properly skipped with os-image-url and os-auth-token provided
This commit is contained in:
Brian Waldon 2012-03-26 23:29:20 -07:00
parent c530de6389
commit 883d22d032
4 changed files with 66 additions and 115 deletions

@ -1,10 +1,8 @@
Python bindings to the OpenStack Glance API
Python bindings to the OpenStack Image API
=============================================
This is a client for the OpenStack Glance API. There's a Python API (the
``glanceclient`` module), and a command-line script (``glance``). The
Glance 2.0 API is still a moving target, so this module will remain in
"Beta" status until the API is finalized and fully implemented.
This is a client for the Glance which uses the OpenStack Image API. There's a
Python API (the ``glanceclient`` module), and a command-line script (``glance``).
Development takes place via the usual OpenStack processes as outlined in
the `OpenStack wiki`_. The master repository is on GitHub__.
@ -12,10 +10,12 @@ the `OpenStack wiki`_. The master repository is on GitHub__.
__ http://wiki.openstack.org/HowToContribute
__ http://github.com/openstack/python-glanceclient
This code a fork of `Rackspace's python-novaclient`__ which is in turn a fork of
This code is based on `OpenStack's python-keystoneclient`__ which is based on
`Rackspace's python-novaclient`__ which is in turn a fork of
`Jacobian's python-cloudservers`__. The python-glanceclient is licensed under
the Apache License like the rest of OpenStack.
__ http://github.com/openstack/python-keystoneclient
__ http://github.com/rackspace/python-novaclient
__ http://github.com/jacobian/python-cloudservers
@ -25,11 +25,12 @@ __ http://github.com/jacobian/python-cloudservers
Python API
----------
By way of a quick-start::
If you wish to use the internal python api directly, you must obtain an auth
token and identify which endpoint you wish to speak to manually. Once you have
done so, you can use the API::
# use v2.0 auth with http://example.com:5000/v2.0")
>>> from glanceclient.v1 import client
>>> glance = client.Client(username=USERNAME, password=PASSWORD, tenant_name=TENANT, auth_url=KEYSTONE_URL)
>>> glance = client.Client(endpoint=OS_IMAGE_ENDPOINT, token=OS_AUTH_TOKEN)
>>> glance.images.list()
>>> image = glance.images.create(name="My Test Image")
>>> print image.status
@ -48,54 +49,29 @@ Command-line API
----------------
Installing this package gets you a command-line tool, ``glance``, that you
can use to interact with Glance's Identity API.
can use to interact with Glance through the OpenStack Image API.
You'll need to provide your OpenStack username, password, tenant, and auth
endpoint. You can do this with the ``--tenant_id``, ``--username``,
``--password``, and ``--auth_url`` params, but it's easier to just set them
endpoint. You can do this with the ``--os-tenant-id``, ``--os-username``,
``--os-password``, and ``--os-auth-url`` params, but it's easier to just set them
as environment variables::
export OS_TENANT_id=
export OS_USERNAME=user
export OS_PASSWORD=pass
export OS_AUTH_URL=http://example.com:5000/v2.0
export OS_TENANT_ID=b363706f891f48019483f8bd6503c54b
export OS_AUTH_URL=http://auth.example.com:5000/v2.0
Since the Identity service that Glance uses can return multiple regional image
endpoints in the Service Catalog, you can specify the one you want with
``--region_name`` (or ``export OS_REGION_NAME``).
It defaults to the first in the list returned.
You'll find complete documentation on the shell by running
``glance help``::
If you already have an auth token and endpoint, you may manually pass them
in to skip automatic authentication with your identity service. Either define
them in command-line flags (``--os-image-url`` and ``--os-auth-token``) or in
environment variables::
usage: glance [--username USERNAME] [--password PASSWORD]
[--tenant_id TENANT_id]
[--auth_url AUTH_URL] [--region_name REGION_NAME]
<subcommand> ...
export OS_IMAGE_URL=http://glance.example.org:5000/v1
export OS_AUTH_TOKEN=3bcc3d3a03f44e3d8377f9247b0ad155
Command-line interface to the OpenStack Identity API.
Positional arguments:
<subcommand>
catalog List all image services in service catalog
image-create Create new image
image-delete Delete image
image-list List images
image-update Update image's name and other properties
image-upload Upload an image file
image-download Download an image file
help Display help about this program or one of its
subcommands.
Optional arguments:
--username USERNAME Defaults to env[OS_USERNAME]
--password PASSWORD Defaults to env[OS_PASSWORD]
--tenant_name TENANT_NAME
Defaults to env[OS_TENANT_NAME]
--tenant_id TENANT_ID
Defaults to env[OS_TENANT_ID]
--auth_url AUTH_URL Defaults to env[OS_AUTH_URL]
--region_name REGION_NAME
Defaults to env[OS_REGION_NAME]
See "glance help COMMAND" for help on a specific command.
You'll find complete documentation on the shell by running ``glance help``.

@ -153,8 +153,8 @@ class OpenStackImagesShell(object):
self.do_help(args)
return 0
auth_reqd = (utils.is_authentication_required(args.func) or
not (args.os_auth_token and args.os_image_url))
auth_reqd = (utils.is_authentication_required(args.func) and
not (args.os_auth_token and args.os_image_url))
if not auth_reqd:
endpoint = args.os_image_url

@ -20,7 +20,7 @@ def read(fname):
setuptools.setup(
name="python-glanceclient",
version="2012.1",
description="Client library for OpenStack Glance API",
description="Client library for OpenStack Image API",
long_description=read('README.rst'),
url='https://github.com/openstack/python-glanceclient',
license='Apache',
@ -36,8 +36,7 @@ setuptools.setup(
'Operating System :: OS Independent',
'Programming Language :: Python',
],
#install_requires=requires,
install_requires=[],
install_requires=requires,
dependency_links=dependency_links,
test_suite="nose.collector",
entry_points={'console_scripts': ['glance = glanceclient.shell:main']},

@ -1,25 +1,21 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2010 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# Copyright 2012 OpenStack LLC
# All Rights Reserved.
#
# Copyright 2010 OpenStack LLC.
# 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
#
# 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
#
# 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.
# 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.
"""
Installation script for Glance's development virtualenv
virtualenv installation script
"""
import os
@ -31,13 +27,19 @@ ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
VENV = os.path.join(ROOT, '.venv')
PIP_REQUIRES = os.path.join(ROOT, 'tools', 'pip-requires')
TEST_REQUIRES = os.path.join(ROOT, 'tools', 'test-requires')
PY_VERSION = "python%s.%s" % (sys.version_info[0], sys.version_info[1])
def die(message, *args):
print >> sys.stderr, message % args
print >>sys.stderr, message % args
sys.exit(1)
def check_python_version():
if sys.version_info < (2, 6):
die("Need Python Version >= 2.6")
def run_command(cmd, redirect_output=True, check_exit_code=True):
"""
Runs a command in an out-of-process shell, returning the
@ -56,94 +58,68 @@ def run_command(cmd, redirect_output=True, check_exit_code=True):
HAS_EASY_INSTALL = bool(run_command(['which', 'easy_install'],
check_exit_code=False).strip())
check_exit_code=False).strip())
HAS_VIRTUALENV = bool(run_command(['which', 'virtualenv'],
check_exit_code=False).strip())
check_exit_code=False).strip())
def check_dependencies():
"""Make sure virtualenv is in the path."""
print 'Checking for virtualenv...'
if not HAS_VIRTUALENV:
print 'not found.'
# Try installing it via easy_install...
if HAS_EASY_INSTALL:
print 'Installing virtualenv via easy_install...',
if not run_command(['which', 'easy_install']):
die('ERROR: virtualenv not found.\n\n'
'Glance development requires virtualenv, please install'
' it using your favorite package management tool')
if not (run_command(['which', 'easy_install']) and
run_command(['easy_install', 'virtualenv'])):
die('ERROR: virtualenv not found.\n\nNova development'
' requires virtualenv, please install it using your'
' favorite package management tool')
print 'done.'
print 'done.'
def create_virtualenv(venv=VENV):
"""
Creates the virtual environment and installs PIP only into the
"""Creates the virtual environment and installs PIP only into the
virtual environment
"""
print 'Creating venv...',
run_command(['virtualenv', '-q', '--no-site-packages', VENV])
print 'done.'
print 'Installing pip in virtualenv...',
if not run_command(['tools/with_venv.sh', 'easy_install',
'pip>1.0']).strip():
if not run_command(['tools/with_venv.sh', 'easy_install', 'pip']).strip():
die("Failed to install pip.")
print 'done.'
def pip_install(*args):
run_command(['tools/with_venv.sh',
'pip', 'install', '--upgrade'] + list(args),
redirect_output=False)
def install_dependencies(venv=VENV):
print 'Installing dependencies with pip (this can take a while)...'
pip_install('pip')
pip_install('-r', PIP_REQUIRES)
pip_install('-r', TEST_REQUIRES)
# Tell the virtual env how to "import glance"
py_ver = _detect_python_version(venv)
pthfile = os.path.join(venv, "lib", py_ver, "site-packages", "glance.pth")
f = open(pthfile, 'w')
f.write("%s\n" % ROOT)
def _detect_python_version(venv):
lib_dir = os.path.join(venv, "lib")
for pathname in os.listdir(lib_dir):
if pathname.startswith('python'):
return pathname
raise Exception('Unable to detect Python version')
run_command(['tools/with_venv.sh', 'pip', 'install', '-r',
PIP_REQUIRES, '-r', TEST_REQUIRES], redirect_output=False)
def print_help():
help = """
Glance development environment setup is complete.
Virtual environment configuration complete.
Glance development uses virtualenv to track and manage Python dependencies
while in development and testing.
To activate the virtualenv for the extent of your current shell
session you can run:
To activate the Glance virtualenv for the extent of your current shell session
you can run:
$ source %s/bin/activate
$ source .venv/bin/activate
Or, if you prefer, you can run commands in the virtualenv on a case by case
basis by running:
Or, if you prefer, you can run commands in the virtualenv on a case by case
basis by running:
$ tools/with_venv.sh <your command>
$ tools/with_venv.sh <your command>
Also, make test will automatically use the virtualenv.
"""
""" % VENV
print help
def main(argv):
check_python_version()
check_dependencies()
create_virtualenv()
install_dependencies()