From 01a5ff6d3234457fd0f8268be13fca487a1793c2 Mon Sep 17 00:00:00 2001 From: Dean Troyer Date: Sun, 12 Oct 2014 22:55:41 -0500 Subject: [PATCH] Add more session/api examples * examples/object_api.py - Example of using the Object_Store API * examples/osc-lib.py - Minimal client to use ClientManager as a library Also add matching functional tests Change-Id: I4243a21141a821420951d4b6352d41029cdcccbc --- examples/object_api.py | 106 ++++++++++++++++++++++++++++++ examples/osc-lib.py | 102 ++++++++++++++++++++++++++++ functional/tests/test_examples.py | 6 ++ 3 files changed, 214 insertions(+) create mode 100755 examples/object_api.py create mode 100755 examples/osc-lib.py diff --git a/examples/object_api.py b/examples/object_api.py new file mode 100755 index 0000000000..5c6bd9f053 --- /dev/null +++ b/examples/object_api.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python +# object_api.py - Example object-store API usage + +# 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. + +""" +Object Store API Examples + +This script shows the basic use of the low-level Object Store API + +""" + +import argparse +import logging +import sys + +import common + + +from openstackclient.api import object_store_v1 as object_store +from openstackclient.identity import client as identity_client + + +LOG = logging.getLogger('') + + +def run(opts): + """Run the examples""" + + # Set up certificate verification and CA bundle + # NOTE(dtroyer): This converts from the usual OpenStack way to the single + # requests argument and is an app-specific thing because + # we want to be like OpenStackClient. + if opts.os_cacert: + verify = opts.os_cacert + else: + verify = not opts.insecure + + # get a session + # common.make_session() does all the ugly work of mapping + # CLI options/env vars to the required plugin arguments. + # The returned session will have a configured auth object + # based on the selected plugin's available options. + # So to do...oh, just go to api.auth.py and look at what it does. + session = common.make_session(opts, verify=verify) + + # Extract an endpoint + auth_ref = session.auth.get_auth_ref(session) + + if opts.os_url: + endpoint = opts.os_url + else: + endpoint = auth_ref.service_catalog.url_for( + service_type='object-store', + endpoint_type='public', + ) + + # At this point we have a working session with a configured authentication + # plugin. From here on it is the app making the decisions. Need to + # talk to two clouds? Go back and make another session but with opts + # set to different credentials. Or use a config file and load it + # directly into the plugin. This example doesn't show that (yet). + # Want to work ahead? Look into the plugin load_from_*() methods + # (start in keystoneclient/auth/base.py). + + # This example is for the Object Store API so make one + obj_api = object_store.APIv1( + session=session, + service_type='object-store', + endpoint=endpoint, + ) + + # Do useful things with it + + c_list = obj_api.container_list() + print("Name\tCount\tBytes") + for c in c_list: + print("%s\t%d\t%d" % (c['name'], c['count'], c['bytes'])) + + if len(c_list) > 0: + # See what is in the first container + o_list = obj_api.object_list(c_list[0]['name']) + print("\nObject") + for o in o_list: + print("%s" % o) + + +if __name__ == "__main__": + opts = common.base_parser( + identity_client.build_option_parser( + argparse.ArgumentParser(description='Object API Example') + ) + ).parse_args() + + common.configure_logging(opts) + sys.exit(common.main(opts, run)) diff --git a/examples/osc-lib.py b/examples/osc-lib.py new file mode 100755 index 0000000000..69fc5d9849 --- /dev/null +++ b/examples/osc-lib.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +# osc-lib.py - Example using OSC as a library + +# 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. + +""" +OpenStackClient Library Examples + +This script shows the basic use of the OpenStackClient ClientManager +as a library. + +""" + +import argparse +import logging +import sys + +import common + +from openstackclient.common import clientmanager + + +LOG = logging.getLogger('') + + +def run(opts): + """Run the examples""" + + # Loop through extensions to get API versions + # Currently API versions are statically selected. Once discovery + # is working this can go away... + api_version = {} + for mod in clientmanager.PLUGIN_MODULES: + version_opt = getattr(opts, mod.API_VERSION_OPTION, None) + if version_opt: + api = mod.API_NAME + api_version[api] = version_opt + + # Set up certificate verification and CA bundle + # NOTE(dtroyer): This converts from the usual OpenStack way to the single + # requests argument and is an app-specific thing because + # we want to be like OpenStackClient. + if opts.os_cacert: + verify = opts.os_cacert + else: + verify = not opts.insecure + + # Get a ClientManager + # Collect the auth and config options together and give them to + # ClientManager and it will wrangle all of the goons into place. + client_manager = clientmanager.ClientManager( + auth_options=opts, + verify=verify, + api_version=api_version, + ) + + # At this point we have a working client manager with a configured + # session and authentication plugin. From here on it is the app + # making the decisions. Need to talk to two clouds? Make another + # client manager with different opts. Or use a config file and load it + # directly into the plugin. This example doesn't show that (yet). + + # Do useful things with it + + # Look in the object store + c_list = client_manager.object_store.container_list() + print("Name\tCount\tBytes") + for c in c_list: + print("%s\t%d\t%d" % (c['name'], c['count'], c['bytes'])) + + if len(c_list) > 0: + # See what is in the first container + o_list = client_manager.object_store.object_list(c_list[0]['name']) + print("\nObject") + for o in o_list: + print("%s" % o) + + # Look at the compute flavors + flavor_list = client_manager.compute.flavors.list() + print("\nFlavors:") + for f in flavor_list: + print("%s" % f) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='ClientManager Example') + opts = common.base_parser( + clientmanager.build_plugin_option_parser(parser), + ).parse_args() + + common.configure_logging(opts) + sys.exit(common.main(opts, run)) diff --git a/functional/tests/test_examples.py b/functional/tests/test_examples.py index fdaa26b8d4..6e0e586724 100644 --- a/functional/tests/test_examples.py +++ b/functional/tests/test_examples.py @@ -20,3 +20,9 @@ class ExampleTests(test.TestCase): # NOTE(stevemar): If an examples has a non-zero return # code, then execute will raise an error by default. test.execute('python', test.EXAMPLE_DIR + '/common.py --debug') + + def test_object_api(self): + test.execute('python', test.EXAMPLE_DIR + '/object_api.py --debug') + + def test_osc_lib(self): + test.execute('python', test.EXAMPLE_DIR + '/osc-lib.py --debug')