Added setup.py.
* Added the CLI tool from reddwarf to this repo, made it available as a script. * Added a gitignore.
This commit is contained in:
parent
17911cb64f
commit
1faea31c95
|
@ -0,0 +1,2 @@
|
|||
*.pyc
|
||||
python_reddwarfclient.egg*
|
|
@ -0,0 +1,313 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
# Copyright 2011 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
|
||||
#
|
||||
# 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.
|
||||
|
||||
"""
|
||||
Reddwarf Command line tool
|
||||
"""
|
||||
|
||||
import json
|
||||
import optparse
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
# If ../reddwarf/__init__.py exists, add ../ to Python search path, so that
|
||||
# it will override what happens to be installed in /usr/(local/)lib/python...
|
||||
possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
|
||||
os.pardir,
|
||||
os.pardir))
|
||||
if os.path.exists(os.path.join(possible_topdir, 'reddwarfclient',
|
||||
'__init__.py')):
|
||||
sys.path.insert(0, possible_topdir)
|
||||
if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
||||
sys.path.insert(0, possible_topdir)
|
||||
|
||||
|
||||
from reddwarfclient import common
|
||||
|
||||
|
||||
oparser = None
|
||||
|
||||
|
||||
def _pretty_print(info):
|
||||
print json.dumps(info, sort_keys=True, indent=4)
|
||||
|
||||
|
||||
class InstanceCommands(object):
|
||||
"""Commands to perform various instances operations and actions"""
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def create(self, name, volume_size,
|
||||
flavorRef="http://localhost:8775/v1.0/flavors/1"):
|
||||
"""Create a new instance"""
|
||||
dbaas = common.get_client()
|
||||
volume = {"size": volume_size}
|
||||
try:
|
||||
result = dbaas.instances.create(name, flavorRef, volume)
|
||||
_pretty_print(result._info)
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
def delete(self, id):
|
||||
"""Delete the specified instance"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
result = dbaas.instances.delete(id)
|
||||
if result:
|
||||
print result
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
def get(self, id):
|
||||
"""Get details for the specified instance"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
_pretty_print(dbaas.instances.get(id)._info)
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
def list(self):
|
||||
"""List all instances for account"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
for instance in dbaas.instances.list():
|
||||
_pretty_print(instance._info)
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
def resize_volume(self, id, size):
|
||||
"""Resize an instance volume"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
result = dbaas.instances.resize_volume(id, size)
|
||||
if result:
|
||||
print result
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
def resize_instance(self, id, flavor_id):
|
||||
"""Resize an instance flavor"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
result = dbaas.instances.resize_instance(id, flavor_id)
|
||||
if result:
|
||||
print result
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
def restart(self, id):
|
||||
"""Restart the database"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
result = dbaas.instances.restart(id)
|
||||
if result:
|
||||
print result
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
|
||||
class FlavorsCommands(object):
|
||||
"""Commands for listing Flavors"""
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def list(self):
|
||||
"""List the available flavors"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
for flavor in dbaas.flavors.list():
|
||||
_pretty_print(flavor._info)
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
|
||||
class DatabaseCommands(object):
|
||||
"""Database CRUD operations on an instance"""
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def create(self, id, dbname):
|
||||
"""Create a database"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
databases = [{'name': dbname}]
|
||||
dbaas.databases.create(id, databases)
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
def delete(self, id, dbname):
|
||||
"""Delete a database"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
dbaas.databases.delete(id, dbname)
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
def list(self, id):
|
||||
"""List the databases"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
for database in dbaas.databases.list(id):
|
||||
_pretty_print(database._info)
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
|
||||
class UserCommands(object):
|
||||
"""User CRUD operations on an instance"""
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def create(self, id, username, password, dbname, *args):
|
||||
"""Create a user in instance, with access to one or more databases"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
databases = [{'name': dbname}]
|
||||
[databases.append({"name": db}) for db in args]
|
||||
users = [{'name': username, 'password': password,
|
||||
'databases': databases}]
|
||||
dbaas.users.create(id, users)
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
def delete(self, id, user):
|
||||
"""Delete the specified user"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
dbaas.users.delete(id, user)
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
def list(self, id):
|
||||
"""List all the users for an instance"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
for user in dbaas.users.list(id):
|
||||
_pretty_print(user._info)
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
|
||||
class RootCommands(object):
|
||||
"""Root user related operations on an instance"""
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def create(self, id):
|
||||
"""Enable the instance's root user."""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
user, password = dbaas.root.create(id)
|
||||
print "User:\t\t%s\nPassword:\t%s" % (user, password)
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
def enabled(self, id):
|
||||
"""Check the instance for root access"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
_pretty_print(dbaas.root.is_root_enabled(id))
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
|
||||
class VersionCommands(object):
|
||||
"""List available versions"""
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def list(self, url):
|
||||
"""List all the supported versions"""
|
||||
dbaas = common.get_client()
|
||||
try:
|
||||
versions = dbaas.versions.index(url)
|
||||
for version in versions:
|
||||
_pretty_print(version._info)
|
||||
except:
|
||||
print sys.exc_info()[1]
|
||||
|
||||
|
||||
def config_options():
|
||||
global oparser
|
||||
oparser.add_option("-u", "--url", default="http://localhost:5000/v1.1",
|
||||
help="Auth API endpoint URL with port and version. \
|
||||
Default: http://localhost:5000/v1.1")
|
||||
|
||||
|
||||
COMMANDS = {'auth': common.Auth,
|
||||
'instance': InstanceCommands,
|
||||
'flavor': FlavorsCommands,
|
||||
'database': DatabaseCommands,
|
||||
'user': UserCommands,
|
||||
'root': RootCommands,
|
||||
'version': VersionCommands}
|
||||
|
||||
|
||||
def main():
|
||||
# Parse arguments
|
||||
global oparser
|
||||
oparser = optparse.OptionParser("%prog [options] <cmd> <action> <args>",
|
||||
version='1.0')
|
||||
config_options()
|
||||
(options, args) = oparser.parse_args()
|
||||
|
||||
if not args:
|
||||
common.print_commands(COMMANDS)
|
||||
|
||||
# Pop the command and check if it's in the known commands
|
||||
cmd = args.pop(0)
|
||||
if cmd in COMMANDS:
|
||||
fn = COMMANDS.get(cmd)
|
||||
command_object = fn()
|
||||
|
||||
# Get a list of supported actions for the command
|
||||
actions = common.methods_of(command_object)
|
||||
|
||||
if len(args) < 1:
|
||||
common.print_actions(cmd, actions)
|
||||
|
||||
# Check for a valid action and perform that action
|
||||
action = args.pop(0)
|
||||
if action in actions:
|
||||
fn = actions.get(action)
|
||||
|
||||
try:
|
||||
fn(*args)
|
||||
sys.exit(0)
|
||||
except TypeError as err:
|
||||
print "Possible wrong number of arguments supplied."
|
||||
print "%s %s: %s" % (cmd, action, fn.__doc__)
|
||||
print "\t\t", [fn.func_code.co_varnames[i] for i in
|
||||
range(fn.func_code.co_argcount)]
|
||||
print "ERROR: %s" % err
|
||||
except Exception:
|
||||
print "Command failed, please check the log for more info."
|
||||
raise
|
||||
else:
|
||||
common.print_actions(cmd, actions)
|
||||
else:
|
||||
common.print_commands(COMMANDS)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -0,0 +1,55 @@
|
|||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||
|
||||
# Copyright 2010 United States Government as represented by the
|
||||
# Administrator of the National Aeronautics and Space Administration.
|
||||
# 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.
|
||||
|
||||
import os
|
||||
import setuptools
|
||||
import sys
|
||||
|
||||
|
||||
requirements = ["python-novaclient"]
|
||||
|
||||
|
||||
def read_file(file_name):
|
||||
return open(os.path.join(os.path.dirname(__file__), file_name)).read()
|
||||
|
||||
|
||||
setuptools.setup(
|
||||
name="python-reddwarfclient",
|
||||
version="2012.3",
|
||||
author="Rackspace",
|
||||
description="Rich client bindings for Reddwarf REST API.",
|
||||
long_description=read_file("README.rst"),
|
||||
license="Apache License, Version 2.0",
|
||||
url="https://github.com/openstack/python-reddwarfclient",
|
||||
packages=["reddwarfclient"],
|
||||
install_requires=requirements,
|
||||
tests_require=["nose", "mock"],
|
||||
test_suite="nose.collector",
|
||||
classifiers=[
|
||||
"Development Status :: 5 - Production/Stable",
|
||||
"Environment :: Console",
|
||||
"Intended Audience :: Developers",
|
||||
"Intended Audience :: Information Technology",
|
||||
"License :: OSI Approved :: Apache Software License",
|
||||
"Operating System :: OS Independent",
|
||||
"Programming Language :: Python"
|
||||
],
|
||||
entry_points={
|
||||
"console_scripts": ["reddwarf-cli = reddwarfclient.cli:main"]
|
||||
}
|
||||
)
|
Loading…
Reference in New Issue