diff options
101 files changed, 1 insertions, 5967 deletions
diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index 3c12922..0000000 --- a/.coveragerc +++ /dev/null @@ -1,7 +0,0 @@ -[run] -branch = True -source = os_client_config -omit = os_client_config/tests/*,os_client_config/openstack/* - -[report] -ignore_errors = True diff --git a/.mailmap b/.mailmap deleted file mode 100644 index cc92f17..0000000 --- a/.mailmap +++ /dev/null @@ -1,3 +0,0 @@ -# Format is: -# <preferred e-mail> <other e-mail 1> -# <preferred e-mail> <other e-mail 2>
\ No newline at end of file diff --git a/.stestr.conf b/.stestr.conf deleted file mode 100644 index 7923822..0000000 --- a/.stestr.conf +++ /dev/null @@ -1,3 +0,0 @@ -[DEFAULT] -test_path=. -top_dir=./ diff --git a/.zuul.yaml b/.zuul.yaml deleted file mode 100644 index 9850aea..0000000 --- a/.zuul.yaml +++ /dev/null @@ -1,41 +0,0 @@ -- job: - name: os-client-config-tox-py37-tips - parent: openstack-tox-py37 - description: | - Run tox python 37 unittests against master of important libs - vars: - tox_install_siblings: true - zuul_work_dir: src/opendev.org/openstack/os-client-config - required-projects: - - openstack/keystoneauth - - openstack/openstacksdk - - openstack/os-client-config - -- project-template: - name: os-client-config-tox-tips - check: - jobs: - - os-client-config-tox-py37-tips - gate: - jobs: - - os-client-config-tox-py37-tips - -- project: - templates: - - check-requirements - - lib-forward-testing-python3 - - openstack-lower-constraints-jobs - - openstack-python3-ussuri-jobs - - os-client-config-tox-tips - - publish-openstack-docs-pti - - release-notes-jobs-python3 - - shade-functional-tips - - shade-tox-tips - check: - jobs: - - openstack-tox-pep8 - - osc-functional-devstack-tips - gate: - jobs: - - openstack-tox-pep8 - - osc-functional-devstack-tips diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index fff8d65..0000000 --- a/AUTHORS +++ /dev/null @@ -1,82 +0,0 @@ -Alex Gaynor <alex.gaynor@gmail.com> -Alexander D <maniac@pzskc383.dp.ua> -Alvaro Lopez Garcia <aloga@ifca.unican.es> -Andreas Jaeger <aj@suse.com> -Andy Botting <andy@andybotting.com> -Anita Kuno <anteaya@anteaya.info> -Arie Bregman <abregman@redhat.com> -Artem Goncharov <artem.goncharov@gmail.com> -Cao Xuan Hoang <hoangcx@vn.fujitsu.com> -Cedric Brandily <zzelle@gmail.com> -ChangBo Guo(gcb) <eric.guo@easystack.cn> -Charles Short <chucks@redhat.com> -Chris Church <chris@ninemoreminutes.com> -Christian Berendt <berendt@betacloud-solutions.de> -Clark Boylan <clark.boylan@gmail.com> -Clint Byrum <clint@fewbar.com> -Colleen Murphy <colleen@gazlene.net> -Corey Bryant <corey.bryant@canonical.com> -Dao Cong Tien <tiendc@vn.fujitsu.com> -David Shrewsbury <shrewsbury.dave@gmail.com> -Davide Guerri <davide.guerri@gmail.com> -Dean Troyer <dtroyer@gmail.com> -Dean Troyer <dtroyer@users.noreply.github.com> -Dirk Mueller <dirk@dmllr.de> -Dmitry Tantsur <dtantsur@protonmail.com> -Doug Hellmann <doug@doughellmann.com> -Doug Wiegley <doug@parksidesoftware.com> -Eric Harney <eharney@redhat.com> -Flavio Percoco <flaper87@gmail.com> -Ghe Rivero <ghe.rivero@hp.com> -Gregory Haynes <greg@greghaynes.net> -Ilya Shakhat <ishakhat@mirantis.com> -James E. Blair <jeblair@linux.vnet.ibm.com> -James E. Blair <jeblair@redhat.com> -Jamie Lennox <jamielennox@gmail.com> -Javier Pena <jpena@redhat.com> -Jeremy Stanley <fungi@yuggoth.org> -Jim Rollenhagen <jim@jimrollenhagen.com> -John Dennis <jdennis@redhat.com> -Jordan Pittier <jordan.pittier@scality.com> -Joshua Harlow <jxharlow@godaddy.com> -Julia Kreger <juliaashleykreger@gmail.com> -LiuNanke <nanke.liu@easystack.cn> -Logan V <logan2211@gmail.com> -Mathieu Gagné <mgagne@iweb.com> -Matthew Booth <mbooth@redhat.com> -Mohammed Naser <mnaser@vexxhost.com> -Monty Taylor <mordred@inaugust.com> -Nick Jones <nick@stackhpc.com> -OpenStack Release Bot <infra-root@openstack.org> -Paulo Matias <matias@ufscar.br> -Pavlo Shchelokovskyy <shchelokovskyy@gmail.com> -Saju <sanjufoss@gmail.com> -Sean Handley <sean.handley@gmail.com> -Sean McGinnis <sean.mcginnis@gmail.com> -Shuquan Huang <huang.shuquan@99cloud.net> -Simon Leinen <simon.leinen@switch.ch> -Spencer Krum <nibz@spencerkrum.com> -Steve Martinelli <s.martinelli@gmail.com> -Steve Martinelli <stevemar@ca.ibm.com> -TerryHowe <terrylhowe@gmail.com> -Thomas Bechtold <tbechtold@suse.com> -Tim Burke <tim.burke@gmail.com> -Tony Xu <hhktony@gmail.com> -Vieri <15050873171@163.com> -Xav Paice <xav@catalyst.net.nz> -XiaojueGuan <guanalbertjone@gmail.com> -Yaguang Tang <yaguang@umcloud.com> -Yuriy Taraday <yorik.sar@gmail.com> -ZhijunWei <wzj334965317@outlook.com> -avnish <avnish.pal@nectechnologies.in> -brandonzhao <zhaolong@inspur.com> -jacky06 <zhang.min@99cloud.net> -lifeless <robertc@robertcollins.net> -lingyongxu <lyxu@fiberhome.com> -malei <malei@maleideMacBook-Pro.local> -pengyuesheng <pengyuesheng@gohighsec.com> -qingszhao <zhao.daqing@99cloud.net> -ricolin <rico.lin@easystack.cn> -xhzhf <guoyongxhzhf@163.com> -zhouxinyong <zhouxinyong@inspur.com> -zhulingjie <easyzlj@gmail.com> diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst deleted file mode 100644 index 1990ecf..0000000 --- a/CONTRIBUTING.rst +++ /dev/null @@ -1,16 +0,0 @@ -If you would like to contribute to the development of OpenStack, -you must follow the steps in this page: - - http://docs.openstack.org/infra/manual/developers.html - -Once those steps have been completed, changes to OpenStack -should be submitted for review via the Gerrit tool, following -the workflow documented at: - - http://docs.openstack.org/infra/manual/developers.html#development-workflow - -Pull requests submitted through GitHub will be ignored. - -Bugs should be filed on Launchpad, not GitHub: - - https://bugs.launchpad.net/os-client-config
\ No newline at end of file diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index c6e5e67..0000000 --- a/ChangeLog +++ /dev/null @@ -1,711 +0,0 @@ -CHANGES -======= - -2.1.0 ------ - -* Use unittest.mock instead of third party mock -* Uncap jsonschema - -2.0.0 ------ - -* Add a release note for Python 2 support removal -* Fix pep8 issue in o\_c\_c/\_\_init\_\_ -* Stop testing python2.7 -* Update the constraints url -* Update master for stable/train - -1.33.0 ------- - -* Fix broken link to openstacksdk -* Add Python 3 Train unit tests -* Update for opendev -* OpenDev Migration Patch -* Update master for stable/stein -* Update hacking version - -1.32.0 ------- - -* Applying the HTTPS protocal in configuration.rst -* Use template for lower-constraints -* Change openstack-dev to openstack-discuss -* Update min tox version to 2.0 -* Fix the conflict of urlparse between python2 and python3 -* Remove setup.py check from pep8 job -* Change python3.5 job to python3.7 job on Stein+ -* fix bug link in readme -* fix bug link in readme -* add lib-forward-testing-python3 test job -* add python 3.6 unit test job -* switch documentation job to new PTI -* import zuul job settings from project-config -* Update reno for stable/rocky -* Invalid link of doc reference -* Add release note link in README -* Shift Limestone Networks profile to openstacksdk -* Update links in README - -1.31.2 ------- - -* fix tox python3 overrides -* Remove app\_name config tests -* Add release note for the vendor data regression -* fix saltstack breakage introduced in v1.31.0 -* Remove service-type override tests -* Fix F405 additional strictness - -1.31.1 ------- - -* Add cache methods back to OpenSackConfig -* fix link to openstacksdk in deprecation block - -1.31.0 ------- - -* Replace guts with openstack.config - -1.30.0 ------- - -* Remove DataCentred from list of vendors -* add lower-constraints job -* Add Limestone Networks vendor info -* Rename python-openstacksdk to openstacksdk -* pypy is not checked at gate -* Add image\_format for VEXXHOST profile -* Updated from global requirements -* Use 'none' auth plugin -* Updated from global requirements -* Add os-client-config tips jobs -* Updated from global requirements -* Add osc tips jobs back -* Add missing auth url from betacloud to docs -* Update reno for stable/queens -* Updated from global requirements - -1.29.0 ------- - -* Updated from global requirements -* Split docs requirements and update tox.ini -* Zuul: Remove project name -* Add betacloud to the vendors -* Make the get\_service\_type() overrides tolernat of no defaults -* Remove osc devstack tips jobs -* Do not apply format expansions to passwords -* Updated from global requirements -* Remove setting of version/release from releasenotes -* Add shade-functional-tips jobs -* Consume the osc-functional-devstack-tips job -* Fix doc typo -* Added nat\_source flag for networks -* Add shade-tox-tips jobs -* Update make\_rest\_client to work with version discovery -* Protect against p\_opt not having prompt attribute -* Treat clouds.yaml with one cloud like envvars -* Updated from global requirements -* Fix requires\_floating\_ip -* Updates for stestr -* Updated from global requirements -* Updated from global requirements -* Updated from global requirements -* Updated from global requirements -* DataCentred supports Keystone V3 and Glance V2 -* Update globals safely -* Update the documentation link for doc migration -* Remove OSIC -* Update reno for stable/pike -* Updated from global requirements -* Manually sync with g-r - -1.28.0 ------- - -* use openstackdocstheme html context -* switch from oslosphinx to openstackdocstheme -* turn on warning-is-error in documentation build -* rearrange existing documentation to follow the new standard layout -* Don't pop from os.environ -* Keep a singleton to support multiple get\_config calls -* Revert "Revert "Use interface not endpoint\_type for keystoneclient"" -* Revert "Use interface not endpoint\_type for keystoneclient" -* Add ironicclient to constructors list -* Add helper method to fetch service catalog -* Fix interactions with keystoneauth from newton - -1.27.0 ------- - -* Make \_fix\_argv() somewhat compatible with Argparse action='append' -* Add ability to pass in user\_agent -* Docs: add a note about rackspace API keys -* Remove out of date comment -* Stop special-casing idenity catalog lookups -* Add designateclient to constructors list -* OVH supports qcow2 -* Use interface not endpoint\_type for keystoneclient -* Add support for bailing on invalid service versions -* modify test-requirement according to requirements project -* [Fix gate]Update test requirement -* Pass ironic microversion through from api\_version -* Add ability to skip yaml loading -* Remove the keystoneclient auth fallback -* Add support for overriding mistral service type -* Add helper scripts to print version discovery info -* Add support for indicating required floating IPs -* Update reno for stable/ocata -* fix location of team tags in README -* Fix typo for baremetal\_service\_type - -1.26.0 ------- - -* Revert "Fix interface\_key for identity clients" -* Add support for Murano - -1.25.0 ------- - -* Add OpenTelekomCloud to the vendors -* Remove 3.4 from tox envlist -* Use upper-constraints for tox envs -* Update swift constructor to be Session aware -* Magnum's service\_type is container\_infra -* Add docutils contraint on 0.13.1 to fix building -* Fix interface\_key for identity clients -* Show team and repo badges on README - -1.24.0 ------- - -* Revert "Remove validate\_auth\_ksc" - -1.23.0 ------- - -* Remove validate\_auth\_ksc -* Add fuga.io to vendors -* Support token\_endpoint as an auth\_type -* Add support for volumev3 service type -* Normalize cloud config before osc-lib call -* Fix a bunch of tests -* Clarify how to set SSL settings -* Update ECS image\_api\_version to 1 - -1.22.0 ------- - -* Revert "Split auth plugin loading into its own method" -* Add setter for session constructor -* Enable release notes translation -* cloud\_config:get\_session\_endpoint: catch Keystone EndpointNotFound -* Using assertIsNone() instead of assertEqual(None, ...) -* Update homepage with developer documentation page -* List py35 in the default tox env list -* Fix AttributeError in \`get\_config\` -* modify the home-page info with the developer documentation -* Don't create envvars cloud if cloud or region are set -* Don't build releasenotes in normal docs build -* Update reno for stable/newton -* Add ability to configure Session constructor -* Split auth plugin loading into its own method - -1.21.1 ------- - -* Go ahead and handle YAML list in region\_name - -1.21.0 ------- - -* Add prompting for KSA options -* Clean up vendor support list - -1.20.1 ------- - -* Precedence final solution - -1.20.0 ------- - -* Add support for configuring split-stack networks -* Pop domain-id from the config if we infer values -* Update Internap information - -1.19.1 ------- - -* Add test for precedence rules -* Pass the argparse data into to validate\_auth -* Revert "Fix precedence for pass-in options" - -1.19.0 ------- - -* Add release notes for 1.19.0 release -* Add the new DreamCompute cloud -* Fix precedence for pass-in options -* Update citycloud to list new regions -* Add support for listing a cloud as shut down -* Add support for deprecating cloud profiles -* Refactor fix magic in get\_one\_cloud() - -1.18.0 ------- - -* Reword the entries in the README a bit -* Add shade constructor helper method -* Rename session\_client to make\_rest\_client -* Add helper method for OpenStack SDK constructor -* Add missing "cloud" argument to \_validate\_auth\_ksc -* Workaround bad required params in troveclient -* Trivial: Remove 'MANIFEST.in' -* Trivial: remove openstack/common from flake8 exclude list -* drop python3.3 support in classifier -* Fix formatting in readme file -* Remove discover from test-requirements.txt -* Add version string - -1.17.0 ------- - -* Pull the network settings from the actual dict -* Clarify one-per-cloud network values -* Flesh out netowrk config list -* Change network info indication to a generic list -* Update reno for stable/mitaka -* Add osic vendor profile - -1.16.0 ------- - -* Update the README a bit -* Allow session\_client to take the same args as make\_client -* Fix formulation - -1.15.0 ------- - -* Add release notes -* Send swiftclient username/password and token -* Remove HP and RunAbove from vendor profiles -* Added SSL support for VEXXHOST -* Add support for zetta.io -* Stop ignoring v2password plugin -* Go ahead and remove final excludes -* Don't set project\_domain if not project scoped -* Clean up removed hacking rule from [flake8] ignore lists -* set up release notes build - -1.14.0 ------- - -* Fix a precedence problem with auth arguments -* Return empty dict instead of None for lack of file -* Pass version arg by name not position -* Use \_get\_client in make\_client helper function -* Add barbicanclient support -* Remove openstack-common.conf -* Add IBM Public Cloud -* Replace assertEqual(None, \*) with assertIsNone in tests -* Update auth urls and identity API versions -* Stop hardcoding compute in simple\_client -* Update volume API default version from v1 to v2 -* Debug log a deferred keystone exception, else we mask some useful diag -* Fix README.rst, add a check for it to fit PyPI rules -* Use reno for release notes -* add URLs for release announcement tools -* Allow filtering clouds on command line - -1.13.1 ------- - -* Munge region\_name to '' if set to None -* Fix some README typos -* Fix token\_endpoint usage -* remove python 2.6 os-client-config classifier -* If cloud doesn't list regions expand passed name - -1.13.0 ------- - -* Fix glance endpoints with endpoint\_override -* Allow passing in explicit version for legacy\_client -* Pass endpoint override to constructors -* Support backwards compat for \_ args -* Add backwards compat mapping for auth-token -* Replace assertEqual(None, \*) with assertIsNone in tests -* Allow arbitrary client-specific options -* Add ceilometer constructor to known constructors -* Add support for generalized per-region settings -* Fix a README typo - hepler is not actually a thing -* Make client constructor optional -* Updated README to clarify legacy client usage -* Add simple helper function for client construction -* Add method for registering argparse options -* Update vexxhost to Identity v3 -* Make sure that cloud always has a name -* Remove optional keystoneauth1 imports - -1.12.0 ------- - -* Add BHS1 to OVH -* Handle cinder v2 -* Add support for secure.yaml file for auth info - -1.11.1 ------- - -* Fix lack of parenthesis around boolean logic - -1.11.0 ------- - -* Only pass timeout to swift if we have a value -* Fix name of the object-store api key -* Refactor per-service key making -* Add support for legacy envvar prefixes -* Fix JSON schema - -1.10.2 ------- - -* Workaround a dispute between osc and neutronclient -* Workaround for int value with verbose\_level -* Remove unneeded workaround for ksc -* Add default API version for magnum service - -1.10.1 ------- - -* Work around a bug in keystoneclient constructor -* Return cache settings as numbers not strings -* Add method to get a mounted session from config - -1.10.0 ------- - -* Convert floats to string -* Don't assume pass\_version\_arg=False for network -* Update network api version in defaults.json -* Dont turn bools into strings -* Use requestsexceptions for urllib squelching -* Normalize int config values to string -* Disable spurious urllib warnings -* Add logging module support -* Add methods for getting Session and Client objects -* Update conoha's vendor profile to include SJC -* Use json for in-tree cloud data -* Update auro to indicate move to neutron -* Copy values in backwards\_interface differently -* Fix typo in Catalyst region configs -* Aligned a few words in the docs -* Sort vendor list -* Add conoha public cloud -* Allow for templated variables in auth\_url -* Use assertDictEqual to test dict equality -* Always pull regions from vendor profiles - -1.9.0 ------ - -* Clean up cache interface, add support for services -* Add Rackspace LON region -* Validate requested region against region list -* Fix documentation around regions -* Add an API reference to the docs -* Pass OpenStackConfig in to CloudConfig for caches -* Add auth hook for OpenStackClient -* Adds some lines to complete table formatting - -1.8.1 ------ - -* Add universal=1 to setup.cfg to build python 3 wheels -* Some cleanup - -1.8.0 ------ - -* Fix two typos -* Put in override for Rackspace broken neutron -* Support passing force\_ipv4 to the constructor -* identity version is 2.0 -* Handle OS\_CLOUD and OS\_REGION\_NAME friendly-like -* Added SWITCHengines vendor file -* update RST for readme so pypi looks pretty - -1.7.5 ------ - -* Fix a little error with the None auth type -* Add support for Catalyst as vendor -* Change ignore-errors to ignore\_errors - -1.7.4 ------ - -* Handle ksa opt with no deprecated field - -1.7.3 ------ - -* Fall back to keystoneclient arg processing -* Fix typo in ovh region names - -1.7.2 ------ - -* Move plugin loader creation to try block - -1.7.1 ------ - -* Convert auth kwargs '-' to '\_' -* Properly handle os- prefixed args in fix\_args -* Test kwargs passing not just argparse - -1.7.0 ------ - -* Allow configuring domain id once -* Add internap to the vendor list -* Fix typo in comment - we use ksa not ksc -* Defer plugin validation to keystoneauth - -1.6.4 ------ - -* Remove an extra line -* Add Datacentred to the vendor list -* Add ultimum to list of vendors -* Add Enter Cloud Suite to vendors list -* Add elastx to vendor support matrix -* Switch the image default to v2 -* Update auro auth\_url and region information -* Add citycloud to the vendors list -* Return keystoneauth plugins based on auth args -* Remove duplicate lines that are the same as default -* Add default version number for heat -* Update OVH public cloud information -* Handle empty defaults.yaml file -* Do not treat project\_name and project\_id the same -* Revert "Revert "Use the correct auth\_plugin for token authentication"" - -1.6.3 ------ - -* Revert "Use the correct auth\_plugin for token authentication" - -1.6.2 ------ - -* Ignore infra CI env vars -* Use the correct auth\_plugin for token authentication - -1.6.1 ------ - -* Align to generic password auth-type - -1.6.0 ------ - -* Clarify floating ip use for vendors -* Add per-service endpoint overrides - -1.5.0 ------ - -* Remove requirements.txt from tox.ini -* Remove py26 and py33 from tox.ini -* Rename 'endpoint\_type' to 'interface' -* Have service name default to None -* Remove region list from single cloud -* Fix set\_default() when used before config init -* Specify the config file with environment variable -* Add support for configuring region lists with yaml -* Fix rendering issue in Readme -* Clean up vendor data -* Add support for indicating preference for IPv6 -* Normalize project\_name aliases - -1.4.0 ------ - -* Add some accessor methods to CloudConfig -* Add missing tests -* Add test to check cert and key as a tuple -* Use one yaml file per vendor -* Raise warning when a vendor profile is missing -* Some cleanup in the README.rst -* Add support for OVH Public Cloud -* Add SSL documentation to README.rst -* Stringify project details -* Raise a warning with conflicting SSL params -* Change references of "clouds.yaml" for real file -* Raise a warning when using 'cloud' in config -* Add cloud vendor files config in doc - -1.3.0 ------ - -* Provide a helper method to get requests ssl values -* Add more defaults to our defaults file -* Change naming in vendor doc to match vendors.py -* Add auro to list of known vendors -* Add list of image params needed to disable agents - -1.2.0 ------ - -* Add set\_one\_cloud method -* Add tests for get\_cloud\_names -* Add flag to indicate handling of security groups -* Don't normalize too deeply - -1.1.0 ------ - -* Add tests for cloud config comparison -* Add inequality method -* Add an equality method for CloudConfig -* Capture the filename used for config -* Normalize all keys down to \_ instead of - -* Expose method for getting a list of cloud names -* Rename cloud to profile -* Don't pass None as the cloud name - -1.0.0 ------ - -* Change overriding defaults to kwarg -* Add tests for OSC usage -* Use appdirs for platform-independent locations -* Add UnitedStack -* Expose function to get defaults dict -* Add default versions for trove and ironic -* Sort defaults list for less conflicts -* Only add fall through cloud as a fall through - -0.8.2 ------ - -* Add flag to indicate where floating ips come from -* get\_one\_cloud should use auth merge -* Also accept .yml as a suffix -* Remove crufty lines from README -* Update vendor support to reflect v2 non-task - -0.8.1 ------ - -* Add flag to trigger task interface for rackspace - -0.8.0 ------ - -* Document vendor support information -* Reset cache default to 0 -* add .venv to gitignore -* Move region\_names out of auth dict -* Add runabove to vendors -* Add image information to vexxhost account -* Add vexxhost -* Add DreamCompute to vendors list -* Allow overriding envvars as the name of the cloud -* Put env vars into their own cloud config -* Add keystoneclient to test-requirements -* Actually put some content into our sphinx docs - -0.7.0 ------ - -* Update .gitreview for git section rename -* Change dogpile cache defaults -* Add cover to .gitignore - -0.6.0 ------ - -* Flesh out api version defaults -* Handle project\_name/tenant\_name in the auth dict -* Add two newlines to the ends of files -* Rename auth\_plugin to auth\_type - -0.5.0 ------ - -* Add support for configuring dogpile.cache -* Fix coverage report -* Add more testing of vendor yaml loading -* More comprehensive unit tests for os-client-config -* Allow keystone validation bypass for noauth usage -* Add basic unit test for config - -0.4.3 ------ - -* Prefer dest value when option is depricated -* Allow region\_name to be None - -0.4.2 ------ - -* Don't return the auth dict inside the loop -* Make sure we're deep-copying the auth dict - -0.4.1 ------ - -* Remove runtime depend on pbr -* Provide Rackspace service\_name override - -0.4.0 ------ - -* Start keeping default versions for all services -* Support keystone auth plugins in a generic way -* Replace defaults\_dict with scanning env vars -* Workflow documentation is now in infra-manual -* Corrections to readme -* Use yaml.safe\_load instead of load -* Throw error if a non-existent cloud is requested - -0.3.0 ------ - -* Fix a missed argument from a previous refactor -* Map CloudConfig attributes to CloudConfig.config -* Add support for argparse Namespace objects -* Add support for command line argument processing -* Handle lack of username for project\_name defaults -* Handle the project/tenant nonesense more cleanly -* Add cache control settings -* Handle no vendor clouds config files -* Remove unused class method get\_services -* Add clouds-public.yaml -* Prep for move to stackforge - -0.2.0 ------ - -* Handle missing vendor key -* Make env vars lowest priority -* Handle null region -* Update the README file for more completeness - -0.1.0 ------ - -* Get rid of extra complexity with service values -* Remove babel and add pyyaml -* Port in config reading from shade -* Initial Cookiecutter Commit diff --git a/HACKING.rst b/HACKING.rst deleted file mode 100644 index aab08e3..0000000 --- a/HACKING.rst +++ /dev/null @@ -1,4 +0,0 @@ -os-client-config Style Commandments -=============================================== - -Read the OpenStack Style Commandments https://docs.openstack.org/hacking/latest diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 67db858..0000000 --- a/LICENSE +++ /dev/null @@ -1,175 +0,0 @@ - - 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. diff --git a/PKG-INFO b/PKG-INFO deleted file mode 100644 index 0cd5ebf..0000000 --- a/PKG-INFO +++ /dev/null @@ -1,53 +0,0 @@ -Metadata-Version: 1.1 -Name: os-client-config -Version: 2.1.0 -Summary: OpenStack Client Configuation Library -Home-page: https://docs.openstack.org/os-client-config/latest -Author: OpenStack -Author-email: openstack-discuss@lists.openstack.org -License: UNKNOWN -Description: ================ - os-client-config - ================ - - .. image:: https://governance.openstack.org/tc/badges/os-client-config.svg - :target: https://governance.openstack.org/tc/reference/tags/index.html - - .. warning:: - `os-client-config` has been superceded by `openstacksdk`_. While - `os-client-config` will continue to exist, it is highly recommended that - users transition to using `openstacksdk`_ directly. - - `os-client-config` is a library for collecting client configuration for - using an OpenStack cloud in a consistent and comprehensive manner. It - will find cloud config for as few as 1 cloud and as many as you want to - put in a config file. It will read environment variables and config files, - and it also contains some vendor specific default values so that you don't - have to know extra info to use OpenStack - - * If you have a config file, you will get the clouds listed in it - * If you have environment variables, you will get a cloud named `envvars` - * If you have neither, you will get a cloud named `defaults` with base defaults - - Source - ------ - - * Free software: Apache license - * Documentation: http://docs.openstack.org/os-client-config/latest - * Source: http://opendev.org/openstack/os-client-config - * Bugs: https://storyboard.openstack.org/#!/project/openstack/os-client-config - * Release Notes https://docs.openstack.org/releasenotes/os-client-config - - .. _openstacksdk: http://docs.openstack.org/openstacksdk/latest - - -Platform: UNKNOWN -Classifier: Environment :: OpenStack -Classifier: Intended Audience :: Information Technology -Classifier: Intended Audience :: System Administrators -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Operating System :: POSIX :: Linux -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 diff --git a/README.md b/README.md new file mode 100644 index 0000000..cf21f81 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +MOVED. This repository has moved to https://code.launchpad.net/~ubuntu-openstack-dev/ubuntu/+source/python-os-client-config/+git/python-os-client-config. diff --git a/README.rst b/README.rst deleted file mode 100644 index fede141..0000000 --- a/README.rst +++ /dev/null @@ -1,33 +0,0 @@ -================ -os-client-config -================ - -.. image:: https://governance.openstack.org/tc/badges/os-client-config.svg - :target: https://governance.openstack.org/tc/reference/tags/index.html - -.. warning:: - `os-client-config` has been superceded by `openstacksdk`_. While - `os-client-config` will continue to exist, it is highly recommended that - users transition to using `openstacksdk`_ directly. - -`os-client-config` is a library for collecting client configuration for -using an OpenStack cloud in a consistent and comprehensive manner. It -will find cloud config for as few as 1 cloud and as many as you want to -put in a config file. It will read environment variables and config files, -and it also contains some vendor specific default values so that you don't -have to know extra info to use OpenStack - -* If you have a config file, you will get the clouds listed in it -* If you have environment variables, you will get a cloud named `envvars` -* If you have neither, you will get a cloud named `defaults` with base defaults - -Source ------- - -* Free software: Apache license -* Documentation: http://docs.openstack.org/os-client-config/latest -* Source: http://opendev.org/openstack/os-client-config -* Bugs: https://storyboard.openstack.org/#!/project/openstack/os-client-config -* Release Notes https://docs.openstack.org/releasenotes/os-client-config - -.. _openstacksdk: http://docs.openstack.org/openstacksdk/latest diff --git a/debian/changelog b/debian/changelog deleted file mode 100644 index e9c4854..0000000 --- a/debian/changelog +++ /dev/null @@ -1,266 +0,0 @@ -python-os-client-config (2.1.0-0ubuntu3) groovy; urgency=medium - - [ Chris MacNaughton ] - * d/rules: Move to pybuild. - - -- Corey Bryant <corey.bryant@canonical.com> Wed, 29 Jul 2020 13:56:09 -0400 - -python-os-client-config (2.1.0-0ubuntu2) groovy; urgency=medium - - [ Chris MacNaughton ] - * New upstream release for OpenStack Victoria. - * d/control: Align (Build-)Depends with upstream. - - [ Corey Bryant ] - * d/control: Drop remaining py2 Build-Depends. - - -- Corey Bryant <corey.bryant@canonical.com> Tue, 28 Jul 2020 13:28:45 -0400 - -python-os-client-config (1.31.2-0ubuntu2) eoan; urgency=medium - - * d/control: Drop BDI's on python-* packages. - * d/control: Drop python-os-client-config binary package. - * d/rules: Tweak to stop build and install of Python 2 parts. - - -- Sahid Orentino Ferdjaoui <sahid.ferdjaoui@canonical.com> Thu, 11 Jul 2019 11:12:26 +0200 - -python-os-client-config (1.31.2-0ubuntu1) cosmic; urgency=medium - - * Merge from Debian unstable. Remaining changes: - - d/gbp.conf: Retain for gbp and pristine-tar config. - - d/control, d/tests/*: Enable autopkgtest-pkg-python testsuite - and drop deprecated 'XS-Testsuite: autopkgtest'. - - d/control, d/compat: Bump debhelper compat to 10. - - d/rules: Run tests via pkgos-dh_auto_test. - - d/watch: Get tarball from tarballs.openstack.org. - * New upstream release for OpenStack Rocky. - * d/control: Align (Build-)Depends with upstream. - - -- Corey Bryant <corey.bryant@canonical.com> Mon, 06 Aug 2018 15:55:37 -0400 - -python-os-client-config (1.29.0-0ubuntu1) bionic; urgency=medium - - * New upstream release. - * d/*: wrap-and-sort -bast. - * d/control: Update Standards-Version to 4.1.2. - * d/control: Bump debhelper compat to 10. - * d/control: Align (Build-)Depends with upstream. - * d/rules: Run tests with stestr. - - -- Corey Bryant <corey.bryant@canonical.com> Wed, 28 Feb 2018 16:11:37 -0500 - -python-os-client-config (1.28.0-4) unstable; urgency=medium - - * Fixed debian/copyright missing holders. - * Now build-depends on version 1.16.1 of openstackdocstheme. The sphinx doc - just fails to build with 1.5.0 (Closes: #876489). - * Uploading to unstable. - * Fixed typo in short desc. - * Fixed watch file. - * Standards-Version is now 4.1.1. - - -- Thomas Goirand <zigo@debian.org> Wed, 01 Nov 2017 21:33:01 +0000 - -python-os-client-config (1.28.0-3) experimental; urgency=medium - - * Add missing defaults.json. - - -- Thomas Goirand <zigo@debian.org> Tue, 03 Oct 2017 12:24:32 +0000 - -python-os-client-config (1.28.0-2) experimental; urgency=medium - - * Add missing python-openstackdocstheme build-depends (Closes: #876489). - - -- Thomas Goirand <zigo@debian.org> Sat, 23 Sep 2017 22:05:45 +0000 - -python-os-client-config (1.28.0-1) experimental; urgency=medium - - [ Ondřej Nový ] - * d/rules: Changed UPSTREAM_GIT to new URL - * d/copyright: Changed source URL to new one - - [ Daniel Baumann ] - * Updating vcs fields. - * Updating copyright format url. - * Running wrap-and-sort -bast. - * Updating maintainer field. - * Updating standards version to 4.0.0. - * Removing gbp.conf, not used anymore or should be specified in the - developers dotfiles. - * Updating standards version to 4.0.1. - * Updating standards version to 4.1.0. - - [ Thomas Goirand ] - * New upstream release. - * Fixed (build-)depends for this release. - * Now using pkgos-dh_auto_install. - - -- Thomas Goirand <zigo@debian.org> Wed, 20 Sep 2017 21:35:42 +0200 - -python-os-client-config (1.28.0-0ubuntu1) artful; urgency=medium - - * New upstream release. - * d/control: Align (Build-)Depends with upstream. - * d/p/remove-the-use-of-reno.patch: Rebased. - * d/p/drop-openstackdoctheme.patch: Temporarily drop openstackdocstheme - sphinx extension until sphinx>=1.6.2 is available. - - -- Corey Bryant <corey.bryant@canonical.com> Fri, 28 Jul 2017 12:52:12 -0400 - -python-os-client-config (1.27.0-0ubuntu1) artful; urgency=medium - - * d/watch: Use tarballs.openstack.org for releases. - * New upstream release for OpenStack Pike. - - -- James Page <james.page@ubuntu.com> Mon, 15 May 2017 17:24:00 +0100 - -python-os-client-config (1.26.0-0ubuntu1) zesty; urgency=medium - - * New upstream release. - - -- Corey Bryant <corey.bryant@canonical.com> Thu, 19 Jan 2017 10:32:17 -0500 - -python-os-client-config (1.25.0-0ubuntu1) zesty; urgency=medium - - * New upstream version. - * d/control: Bump version dependencies. - - -- Chuck Short <zulcss@ubuntu.com> Wed, 18 Jan 2017 09:31:19 -0500 - -python-os-client-config (1.24.0-0ubuntu1) zesty; urgency=medium - - * d/gbp.conf: Update gbp configuration file. - * d/control: Update Vcs-* links and maintainers. - * debian/tests: Add autopkgtest - * New upstream version. - - -- Chuck Short <zulcss@ubuntu.com> Tue, 22 Nov 2016 09:54:37 -0500 - -python-os-client-config (1.18.0-0ubuntu3) yakkety; urgency=medium - - * d/rules: Manually install json files for py3 as well (for real this time). - - -- Corey Bryant <corey.bryant@canonical.com> Thu, 18 Aug 2016 16:31:55 -0400 - -python-os-client-config (1.18.0-0ubuntu2) yakkety; urgency=medium - - * d/rules: Manually install json files for py3 as well. - - -- Corey Bryant <corey.bryant@canonical.com> Thu, 18 Aug 2016 11:54:21 -0400 - -python-os-client-config (1.18.0-0ubuntu1) yakkety; urgency=medium - - * d/rules: Use https for UPSTREAM_GIT. - * New upstream release. - * d/gbp.conf: Update debian-branch for Newton. - * d/p/also-package-json-files.patch: Dropped since upstream has removed - MANIFEST.in. - * d/rules: Manually install json files. - - -- Corey Bryant <corey.bryant@canonical.com> Wed, 17 Aug 2016 11:22:15 -0400 - -python-os-client-config (1.16.0-1) unstable; urgency=medium - - [ Corey Bryant ] - * d/control: Drop dependency on python-reno as it's not needed for package - builds. - - [ Thomas Goirand ] - * New upstream release. - * Fixed short description typo. - * Standards-Version: 3.9.7 (no change) - * HTTPS VCS URLs and Homepage. - - -- Thomas Goirand <zigo@debian.org> Mon, 04 Apr 2016 13:35:19 +0200 - -python-os-client-config (1.14.0-2) unstable; urgency=medium - - * Uploading to unstable. - - -- Thomas Goirand <zigo@debian.org> Mon, 04 Apr 2016 11:32:10 +0000 - -python-os-client-config (1.14.0-1) experimental; urgency=medium - - * New upstream release. - * Fixed (build-)depends for this release. - * Added patch to stop using reno. - * Fixed debian/copyright ordering. - * Also running Py3 tests. - - -- Thomas Goirand <zigo@debian.org> Sat, 16 Jan 2016 06:14:32 +0000 - -python-os-client-config (1.12.0-2) unstable; urgency=medium - - * Uploading to unstable. - - -- Thomas Goirand <zigo@debian.org> Wed, 16 Dec 2015 17:48:52 +0000 - -python-os-client-config (1.12.0-1) experimental; urgency=medium - - * New upstream release. - * Fixed (build-)depends for this release. - * Added support for DEB_BUILD_OPTIONS=nodocs. - * Config files are now .json and not .yaml: fixing the patch. - - -- Thomas Goirand <zigo@debian.org> Fri, 27 Nov 2015 12:15:09 +0100 - -python-os-client-config (1.6.0-4) unstable; urgency=medium - - * Uploading to unstable. - * Black list TestBackwardsCompatibility.test_set_no_default which fails in - Python 3.5. - - -- Thomas Goirand <zigo@debian.org> Fri, 16 Oct 2015 19:56:30 +0000 - -python-os-client-config (1.6.0-3) experimental; urgency=medium - - * Add 2 failed test in blacklist (failing to build in Jessie): - - test_environ.TestEnviron.test_environ_exists - - test_environ.TestEnviron.test_envvar_name_override - * Failed in Python 3.4 (in Experimental): - - test_config.TestConfig.test_get_all_clouds - - -- Thomas Goirand <zigo@debian.org> Tue, 15 Sep 2015 09:51:03 +0200 - -python-os-client-config (1.6.0-2) experimental; urgency=medium - - * Also includes all yaml files. - * Watch file using github and not broken PyPi. - * Also testing with Python 3. - - -- Thomas Goirand <zigo@debian.org> Thu, 10 Sep 2015 08:48:43 +0000 - -python-os-client-config (1.6.0-1) experimental; urgency=medium - - * New upstream release. - - -- Thomas Goirand <zigo@debian.org> Thu, 30 Jul 2015 15:12:25 +0000 - -python-os-client-config (1.3.0-1) experimental; urgency=medium - - * Team upload - * New upstream release: - - d/control: Add new dependency on python{3}-appdirs. - - -- James Page <james.page@ubuntu.com> Thu, 11 Jun 2015 09:41:52 +0100 - -python-os-client-config (0.8.1-1) unstable; urgency=medium - - * New upstream release. - * Uploading to unstable. - * Fixed (build-)depends for this release. - - -- Thomas Goirand <zigo@debian.org> Mon, 04 May 2015 15:19:45 +0200 - -python-os-client-config (0.3.0-2) experimental; urgency=medium - - * Do not use python 2.6. - * Added HP as copyright holder. - - -- Thomas Goirand <zigo@debian.org> Tue, 25 Nov 2014 21:36:37 +0800 - -python-os-client-config (0.3.0-1) experimental; urgency=medium - - * Initial release. (Closes: #770846) - - -- Thomas Goirand <zigo@debian.org> Tue, 25 Nov 2014 00:05:58 +0800 diff --git a/debian/compat b/debian/compat deleted file mode 100644 index f599e28..0000000 --- a/debian/compat +++ /dev/null @@ -1 +0,0 @@ -10 diff --git a/debian/control b/debian/control deleted file mode 100644 index b2c5d29..0000000 --- a/debian/control +++ /dev/null @@ -1,95 +0,0 @@ -Source: python-os-client-config -Section: python -Priority: optional -Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> -XSBC-Original-Maintainer: Debian OpenStack <openstack-devel@lists.alioth.debian.org> -Uploaders: - Thomas Goirand <zigo@debian.org>, -Build-Depends: - debhelper (>= 10~), - dh-python, - openstack-pkg-tools, - python3-all, - python3-pbr, - python3-setuptools, - python3-sphinx (>= 1.6.2), -Build-Depends-Indep: - python3-coverage (>= 4.0), - python3-docutils (>= 0.11), - python3-extras (>= 1.0.0), - python3-fixtures (>= 3.0.0), - python3-glanceclient (>= 1:2.8.0), - python3-hacking (>= 1.1.0), - python3-jsonschema (>= 2.6.0), - python3-keystoneauth1 (>= 3.3.0), - python3-keystoneclient (>= 1:1.1.0), - python3-mock (>= 2.0.0), - python3-openstackdocstheme (>= 1.18.1), - python3-openstacksdk (>= 0.13.0), - python3-oslotest (>= 1:3.2.0), - python3-reno (>= 2.5.0), - python3-requestsexceptions (>= 1.2.0), - python3-stestr (>= 1.0.0), - python3-subunit (>= 1.0.0), - python3-testrepository, - python3-testscenarios (>= 0.4), - python3-testtools (>= 2.2.0), - python3-yaml (>= 3.10), -Standards-Version: 4.1.2 -Vcs-Browser: https://git.launchpad.net/~ubuntu-server-dev/ubuntu/+source/python-os-client-config -Vcs-Git: https://git.launchpad.net/~ubuntu-server-dev/ubuntu/+source/python-os-client-config -Homepage: https://github.com/stackforge/os-client-config -Testsuite: autopkgtest-pkg-python - -Package: python-os-client-config-doc -Section: doc -Architecture: all -Depends: - ${misc:Depends}, - ${sphinxdoc:Depends}, -Description: OpenStack client configuration library - doc - Os-client-config is a library for collecting client configuration for using an - OpenStack cloud in a consistent and comprehensive manner. It will find cloud - config for as few as 1 cloud and as many as you want to put in a config file. - It will read environment variables and config files, and it also contains some - vendor specific default values so that you don't have to know extra info to - use OpenStack - . - os-client-config honors all of the normal OS_* variables. It does not provide - backwards compatibility to service-specific variables such as NOVA_USERNAME. - . - If you have environment variables and no config files, os-client-config will - produce a cloud config object named "openstack" containing your values from - the environment. - . - This package contains the documentation. - -Package: python3-os-client-config -Architecture: all -Depends: - python3-appdirs (>= 1.3.0), - python3-keystoneauth1 (>= 3.3.0), - python3-openstacksdk (>= 0.13.0), - python3-pbr, - python3-requestsexceptions (>= 1.2.0), - python3-yaml (>= 3.10), - ${misc:Depends}, - ${python3:Depends}, -Suggests: - python-os-client-config-doc, -Description: OpenStack client configuration library - Python 3.x - Os-client-config is a library for collecting client configuration for using an - OpenStack cloud in a consistent and comprehensive manner. It will find cloud - config for as few as 1 cloud and as many as you want to put in a config file. - It will read environment variables and config files, and it also contains some - vendor specific default values so that you don't have to know extra info to - use OpenStack - . - os-client-config honors all of the normal OS_* variables. It does not provide - backwards compatibility to service-specific variables such as NOVA_USERNAME. - . - If you have environment variables and no config files, os-client-config will - produce a cloud config object named "openstack" containing your values from - the environment. - . - This package contains the Python 3.x module. diff --git a/debian/copyright b/debian/copyright deleted file mode 100644 index 7d2fabd..0000000 --- a/debian/copyright +++ /dev/null @@ -1,30 +0,0 @@ -Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: os-client-config -Source: https://github.com/openstack/os-client-config.git - -Files: * -Copyright: (c) 2014, OpenStack Foundation - (c) 2014, Hewlett-Packard Development Company, L.P. - (c) 2017, Red Hat, Inc. - (c) 2015, IBM Corp. -License: Apache-2 - -Files: debian/* -Copyright: (c) 2014-2017, Thomas Goirand <zigo@debian.org> -License: Apache-2 - -License: Apache-2 - 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. - . - On Debian-based systems the full text of the Apache version 2.0 license - can be found in /usr/share/common-licenses/Apache-2.0. diff --git a/debian/gbp.conf b/debian/gbp.conf deleted file mode 100644 index 24f9139..0000000 --- a/debian/gbp.conf +++ /dev/null @@ -1,7 +0,0 @@ -[DEFAULT] -debian-branch = master -upstream-tag = %(version)s -pristine-tar = True - -[buildpackage] -export-dir = ../build-area diff --git a/debian/python-os-client-config-doc.doc-base b/debian/python-os-client-config-doc.doc-base deleted file mode 100644 index cf6a1e5..0000000 --- a/debian/python-os-client-config-doc.doc-base +++ /dev/null @@ -1,9 +0,0 @@ -Document: python-os-client-config-doc -Title: os-client-config Documentation -Author: N/A -Abstract: Sphinx documentation for os-client-config -Section: Programming/Python - -Format: HTML -Index: /usr/share/doc/python-os-client-config-doc/html/index.html -Files: /usr/share/doc/python-os-client-config-doc/html/* diff --git a/debian/rules b/debian/rules deleted file mode 100755 index 335e659..0000000 --- a/debian/rules +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/make -f - -export PYBUILD_NAME=os_client_config - -UPSTREAM_GIT := https://github.com/openstack/os-client-config.git -include /usr/share/openstack-pkg-tools/pkgos.make - -%: - dh $@ --buildsystem=pybuild --with python3,sphinxdoc - -override_dh_auto_install: - pkgos-dh_auto_install --no-py2 - cp os_client_config/defaults.json $(CURDIR)/debian/python3-os-client-config/usr/lib/python3/dist-packages/os_client_config/defaults.json - -override_dh_auto_test: -ifeq (,$(findstring nocheck, $(DEB_BUILD_OPTIONS))) - pkgos-dh_auto_test --no-py2 'tests\.(?!.*OptsTestCase.test_entry_point.*)' -endif - -override_dh_clean: - dh_clean -O--buildsystem=pybuild - rm -rf build - -override_dh_sphinxdoc: - sphinx-build -b html doc/source debian/python-os-client-config-doc/usr/share/doc/python-os-client-config-doc/html - dh_sphinxdoc -O--buildsystem=pybuild - -# Commands not to run -override_dh_installcatalogs: -override_dh_installemacsen override_dh_installifupdown: -override_dh_installinfo override_dh_installmenu override_dh_installmime: -override_dh_installmodules override_dh_installlogcheck: -override_dh_installpam override_dh_installppp override_dh_installudev override_dh_installwm: -override_dh_installxfonts override_dh_gconf override_dh_icons override_dh_perl override_dh_usrlocal: -override_dh_installcron override_dh_installdebconf: -override_dh_installlogrotate override_dh_installgsettings: diff --git a/debian/source/format b/debian/source/format deleted file mode 100644 index 163aaf8..0000000 --- a/debian/source/format +++ /dev/null @@ -1 +0,0 @@ -3.0 (quilt) diff --git a/debian/source/options b/debian/source/options deleted file mode 100644 index cb61fa5..0000000 --- a/debian/source/options +++ /dev/null @@ -1 +0,0 @@ -extend-diff-ignore = "^[^/]*[.]egg-info/" diff --git a/debian/watch b/debian/watch deleted file mode 100644 index 9c032ae..0000000 --- a/debian/watch +++ /dev/null @@ -1,3 +0,0 @@ -version=3 -opts="uversionmangle=s/\.(b|rc)/~$1/" \ - http://tarballs.openstack.org/os-client-config/ os-client-config-(\d.*)\.tar\.gz diff --git a/doc/requirements.txt b/doc/requirements.txt deleted file mode 100644 index bd99db7..0000000 --- a/doc/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. -docutils>=0.11 # OSI-Approved Open Source, Public Domain -sphinx!=1.6.6,!=1.6.7,>=1.6.2 # BSD -openstackdocstheme>=1.18.1 # Apache-2.0 -reno>=2.5.0 # Apache-2.0 diff --git a/doc/source/conf.py b/doc/source/conf.py deleted file mode 100755 index cbd9888..0000000 --- a/doc/source/conf.py +++ /dev/null @@ -1,86 +0,0 @@ -# -*- coding: utf-8 -*- -# 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 sys - -import openstackdocstheme - -sys.path.insert(0, os.path.abspath('../..')) -# -- General configuration ---------------------------------------------------- - -# 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.intersphinx', - 'reno.sphinxext', - 'openstackdocstheme', -] - -# openstackdocstheme options -repository_name = 'openstack/os-client-config' -bug_project = 'os-client-config' -bug_tag = '' -html_last_updated_fmt = '%Y-%m-%d %H:%M' - -# autodoc generation is a bit aggressive and a nuisance when doing heavy -# text edit cycles. -# execute "export SPHINX_DEBUG=1" in your terminal to disable - -# The suffix of source filenames. -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'os-client-config' -copyright = u'2015, various OpenStack developers' - -# 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 - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# -- Options for HTML output -------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. Major themes that come with -# Sphinx are currently 'default' and 'sphinxdoc'. -# html_theme_path = ["."] -# html_theme = '_theme' -# html_static_path = ['static'] -html_theme = 'openstackdocs' -html_theme_path = [openstackdocstheme.get_html_theme_path()] - -# Output file base name for HTML help builder. -htmlhelp_basename = '%sdoc' % project - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto/manual]). -latex_documents = [ - ('index', - '%s.tex' % project, - u'%s Documentation' % project, - u'OpenStack Foundation', 'manual'), -] - -# Example configuration for intersphinx: refer to the Python standard library. -#intersphinx_mapping = {'http://docs.python.org/': None} diff --git a/doc/source/contributor/index.rst b/doc/source/contributor/index.rst deleted file mode 100644 index 2aa0707..0000000 --- a/doc/source/contributor/index.rst +++ /dev/null @@ -1,4 +0,0 @@ -============ -Contributing -============ -.. include:: ../../../CONTRIBUTING.rst diff --git a/doc/source/index.rst b/doc/source/index.rst deleted file mode 100644 index e40b2d9..0000000 --- a/doc/source/index.rst +++ /dev/null @@ -1,39 +0,0 @@ -================ -os-client-config -================ - -.. image:: https://governance.openstack.org/tc/badges/os-client-config.svg - :target: https://governance.openstack.org/tc/reference/tags/index.html - -.. warning:: - `os-client-config` has been superceded by `openstacksdk`_. While - `os-client-config` will continue to exist, it is highly recommended that - users transition to using `openstacksdk`_ directly. - -.. _openstacksdk: https://docs.openstack.org/openstacksdk/latest - -`os-client-config` is a library for collecting client configuration for -using an OpenStack cloud in a consistent and comprehensive manner. It -will find cloud config for as few as 1 cloud and as many as you want to -put in a config file. It will read environment variables and config files, -and it also contains some vendor specific default values so that you don't -have to know extra info to use OpenStack - -* If you have a config file, you will get the clouds listed in it -* If you have environment variables, you will get a cloud named `envvars` -* If you have neither, you will get a cloud named `defaults` with base defaults - -.. toctree:: - :maxdepth: 2 - - install/index - user/index - reference/index - contributor/index - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/doc/source/install/index.rst b/doc/source/install/index.rst deleted file mode 100644 index cb31b25..0000000 --- a/doc/source/install/index.rst +++ /dev/null @@ -1,12 +0,0 @@ -============ -Installation -============ - -At the command line:: - - $ pip install os-client-config - -Or, if you have virtualenvwrapper installed:: - - $ mkvirtualenv os-client-config - $ pip install os-client-config diff --git a/doc/source/reference/index.rst b/doc/source/reference/index.rst deleted file mode 100644 index dfa7f31..0000000 --- a/doc/source/reference/index.rst +++ /dev/null @@ -1,10 +0,0 @@ -============= -API Reference -============= - -.. module:: os_client_config - :synopsis: OpenStack client configuration - -.. autoclass:: os_client_config.OpenStackConfig - :members: - :inherited-members: diff --git a/doc/source/user/configuration.rst b/doc/source/user/configuration.rst deleted file mode 100644 index 54a829a..0000000 --- a/doc/source/user/configuration.rst +++ /dev/null @@ -1,303 +0,0 @@ -=========================================== - Configuring os-client-config Applications -=========================================== - -Environment Variables ---------------------- - -`os-client-config` honors all of the normal `OS_*` variables. It does not -provide backwards compatibility to service-specific variables such as -`NOVA_USERNAME`. - -If you have OpenStack environment variables set, `os-client-config` will -produce a cloud config object named `envvars` containing your values from the -environment. If you don't like the name `envvars`, that's ok, you can override -it by setting `OS_CLOUD_NAME`. - -Service specific settings, like the nova service type, are set with the -default service type as a prefix. For instance, to set a special service_type -for trove set - -.. code-block:: bash - - export OS_DATABASE_SERVICE_TYPE=rax:database - -Config Files ------------- - -`os-client-config` will look for a file called `clouds.yaml` in the following -locations: - -* Current Directory -* ~/.config/openstack -* /etc/openstack - -The first file found wins. - -You can also set the environment variable `OS_CLIENT_CONFIG_FILE` to an -absolute path of a file to look for and that location will be inserted at the -front of the file search list. - -The keys are all of the keys you'd expect from `OS_*` - except lower case -and without the OS prefix. So, region name is set with `region_name`. - -Service specific settings, like the nova service type, are set with the -default service type as a prefix. For instance, to set a special service_type -for trove (because you're using Rackspace) set: - -.. code-block:: yaml - - database_service_type: 'rax:database' - - -Site Specific File Locations -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -In addition to `~/.config/openstack` and `/etc/openstack` - some platforms -have other locations they like to put things. `os-client-config` will also -look in an OS specific config dir - -* `USER_CONFIG_DIR` -* `SITE_CONFIG_DIR` - -`USER_CONFIG_DIR` is different on Linux, OSX and Windows. - -* Linux: `~/.config/openstack` -* OSX: `~/Library/Application Support/openstack` -* Windows: `C:\\Users\\USERNAME\\AppData\\Local\\OpenStack\\openstack` - -`SITE_CONFIG_DIR` is different on Linux, OSX and Windows. - -* Linux: `/etc/openstack` -* OSX: `/Library/Application Support/openstack` -* Windows: `C:\\ProgramData\\OpenStack\\openstack` - -An example config file is probably helpful: - -.. code-block:: yaml - - clouds: - mtvexx: - profile: vexxhost - auth: - username: mordred@inaugust.com - password: XXXXXXXXX - project_name: mordred@inaugust.com - region_name: ca-ymq-1 - dns_api_version: 1 - mordred: - region_name: RegionOne - auth: - username: 'mordred' - password: XXXXXXX - project_name: 'shade' - auth_url: 'https://montytaylor-sjc.openstack.blueboxgrid.com:5001/v2.0' - infra: - profile: rackspace - auth: - username: openstackci - password: XXXXXXXX - project_id: 610275 - regions: - - DFW - - ORD - - IAD - -You may note a few things. First, since `auth_url` settings are silly -and embarrassingly ugly, known cloud vendor profile information is included and -may be referenced by name. One of the benefits of that is that `auth_url` -isn't the only thing the vendor defaults contain. For instance, since -Rackspace lists `rax:database` as the service type for trove, `os-client-config` -knows that so that you don't have to. In case the cloud vendor profile is not -available, you can provide one called `clouds-public.yaml`, following the same -location rules previously mentioned for the config files. - -`regions` can be a list of regions. When you call `get_all_clouds`, -you'll get a cloud config object for each cloud/region combo. - -As seen with `dns_service_type`, any setting that makes sense to be -per-service, like `service_type` or `endpoint` or `api_version` can be set by -prefixing the setting with the default service type. That might strike you -funny when setting `service_type` and it does me too - but that's just the -world we live in. - -Auth Settings -------------- - -Keystone has auth plugins - which means it's not possible to know ahead of time -which auth settings are needed. `os-client-config` sets the default plugin type -to `password`, which is what things all were before plugins came about. In -order to facilitate validation of values, all of the parameters that exist -as a result of a chosen plugin need to go into the auth dict. For password -auth, this includes `auth_url`, `username` and `password` as well as anything -related to domains, projects and trusts. - -Splitting Secrets ------------------ - -In some scenarios, such as configuration management controlled environments, -it might be easier to have secrets in one file and non-secrets in another. -This is fully supported via an optional file `secure.yaml` which follows all -the same location rules as `clouds.yaml`. It can contain anything you put -in `clouds.yaml` and will take precedence over anything in the `clouds.yaml` -file. - -.. code-block:: yaml - - # clouds.yaml - clouds: - internap: - profile: internap - auth: - username: api-55f9a00fb2619 - project_name: inap-17037 - regions: - - ams01 - - nyj01 - # secure.yaml - clouds: - internap: - auth: - password: XXXXXXXXXXXXXXXXX - -SSL Settings ------------- - -When the access to a cloud is done via a secure connection, `os-client-config` -will always verify the SSL cert by default. This can be disabled by setting -`verify` to `False`. In case the cert is signed by an unknown CA, a specific -cacert can be provided via `cacert`. **WARNING:** `verify` will always have -precedence over `cacert`, so when setting a CA cert but disabling `verify`, the -cloud cert will never be validated. - -Client certs are also configurable. `cert` will be the client cert file -location. In case the cert key is not included within the client cert file, -its file location needs to be set via `key`. - -.. code-block:: yaml - - # clouds.yaml - clouds: - secure: - auth: ... - key: /home/myhome/client-cert.key - cert: /home/myhome/client-cert.crt - cacert: /home/myhome/ca.crt - insecure: - auth: ... - verify: False - -Cache Settings --------------- - -Accessing a cloud is often expensive, so it's quite common to want to do some -client-side caching of those operations. To facilitate that, `os-client-config` -understands passing through cache settings to dogpile.cache, with the following -behaviors: - -* Listing no config settings means you get a null cache. -* `cache.expiration_time` and nothing else gets you memory cache. -* Otherwise, `cache.class` and `cache.arguments` are passed in - -Different cloud behaviors are also differently expensive to deal with. If you -want to get really crazy and tweak stuff, you can specify different expiration -times on a per-resource basis by passing values, in seconds to an expiration -mapping keyed on the singular name of the resource. A value of `-1` indicates -that the resource should never expire. - -`os-client-config` does not actually cache anything itself, but it collects -and presents the cache information so that your various applications that -are connecting to OpenStack can share a cache should you desire. - -.. code-block:: yaml - - cache: - class: dogpile.cache.pylibmc - expiration_time: 3600 - arguments: - url: - - 127.0.0.1 - expiration: - server: 5 - flavor: -1 - clouds: - mtvexx: - profile: vexxhost - auth: - username: mordred@inaugust.com - password: XXXXXXXXX - project_name: mordred@inaugust.com - region_name: ca-ymq-1 - dns_api_version: 1 - - -IPv6 ----- - -IPv6 is the future, and you should always use it if your cloud supports it and -if your local network supports it. Both of those are easily detectable and all -friendly software should do the right thing. However, sometimes you might -exist in a location where you have an IPv6 stack, but something evil has -caused it to not actually function. In that case, there is a config option -you can set to unbreak you `force_ipv4`, or `OS_FORCE_IPV4` boolean -environment variable. - -.. code-block:: yaml - - client: - force_ipv4: true - clouds: - mtvexx: - profile: vexxhost - auth: - username: mordred@inaugust.com - password: XXXXXXXXX - project_name: mordred@inaugust.com - region_name: ca-ymq-1 - dns_api_version: 1 - monty: - profile: rax - auth: - username: mordred@inaugust.com - password: XXXXXXXXX - project_name: mordred@inaugust.com - region_name: DFW - -The above snippet will tell client programs to prefer returning an IPv4 -address. - -Per-region settings -------------------- - -Sometimes you have a cloud provider that has config that is common to the -cloud, but also with some things you might want to express on a per-region -basis. For instance, Internap provides a public and private network specific -to the user in each region, and putting the values of those networks into -config can make consuming programs more efficient. - -To support this, the region list can actually be a list of dicts, and any -setting that can be set at the cloud level can be overridden for that -region. - -.. code-block:: yaml - - clouds: - internap: - profile: internap - auth: - password: XXXXXXXXXXXXXXXXX - username: api-55f9a00fb2619 - project_name: inap-17037 - regions: - - name: ams01 - values: - networks: - - name: inap-17037-WAN1654 - routes_externally: true - - name: inap-17037-LAN6745 - - name: nyj01 - values: - networks: - - name: inap-17037-WAN1654 - routes_externally: true - - name: inap-17037-LAN6745 diff --git a/doc/source/user/index.rst b/doc/source/user/index.rst deleted file mode 100644 index ec31c10..0000000 --- a/doc/source/user/index.rst +++ /dev/null @@ -1,12 +0,0 @@ -======================== - Using os-client-config -======================== - -.. toctree:: - :maxdepth: 2 - - configuration - using - vendor-support - network-config - releasenotes diff --git a/doc/source/user/network-config.rst b/doc/source/user/network-config.rst deleted file mode 100644 index ea85414..0000000 --- a/doc/source/user/network-config.rst +++ /dev/null @@ -1,67 +0,0 @@ -============== -Network Config -============== - -There are several different qualities that networks in OpenStack might have -that might not be able to be automatically inferred from the available -metadata. To help users navigate more complex setups, `os-client-config` -allows configuring a list of network metadata. - -.. code-block:: yaml - - clouds: - amazing: - networks: - - name: blue - routes_externally: true - - name: purple - routes_externally: true - default_interface: true - - name: green - routes_externally: false - - name: yellow - routes_externally: false - nat_destination: true - - name: chartreuse - routes_externally: false - routes_ipv6_externally: true - - name: aubergine - routes_ipv4_externally: false - routes_ipv6_externally: true - -Every entry must have a name field, which can hold either the name or the id -of the network. - -`routes_externally` is a boolean field that labels the network as handling -north/south traffic off of the cloud. In a public cloud this might be thought -of as the "public" network, but in private clouds it's possible it might -be an RFC1918 address. In either case, it's provides IPs to servers that -things not on the cloud can use. This value defaults to `false`, which -indicates only servers on the same network can talk to it. - -`routes_ipv4_externally` and `routes_ipv6_externally` are boolean fields to -help handle `routes_externally` in the case where a network has a split stack -with different values for IPv4 and IPv6. Either entry, if not given, defaults -to the value of `routes_externally`. - -`default_interface` is a boolean field that indicates that the network is the -one that programs should use. It defaults to false. An example of needing to -use this value is a cloud with two private networks, and where a user is -running ansible in one of the servers to talk to other servers on the private -network. Because both networks are private, there would otherwise be no way -to determine which one should be used for the traffic. There can only be one -`default_interface` per cloud. - -`nat_destination` is a boolean field that indicates which network floating -ips should be attached to. It defaults to false. Normally this can be inferred -by looking for a network that has subnets that have a gateway_ip. But it's -possible to have more than one network that satisfies that condition, so the -user might want to tell programs which one to pick. There can be only one -`nat_destination` per cloud. - -`nat_source` is a boolean field that indicates which network floating -ips should be requested from. It defaults to false. Normally this can be -inferred by looking for a network that is attached to a router. But it's -possible to have more than one network that satisfies that condition, so the -user might want to tell programs which one to pick. There can be only one -`nat_source` per cloud. diff --git a/doc/source/user/releasenotes.rst b/doc/source/user/releasenotes.rst deleted file mode 100644 index 9cb5195..0000000 --- a/doc/source/user/releasenotes.rst +++ /dev/null @@ -1,6 +0,0 @@ -============= -Release Notes -============= - -Release notes for `os-client-config` can be found at -https://docs.openstack.org/releasenotes/os-client-config/ diff --git a/doc/source/user/using.rst b/doc/source/user/using.rst deleted file mode 100644 index 4d9d1e0..0000000 --- a/doc/source/user/using.rst +++ /dev/null @@ -1,182 +0,0 @@ -========================================== - Using os-client-config in an Application -========================================== - -Usage ------ - -The simplest and least useful thing you can do is: - -.. code-block:: python - - python -m os_client_config.config - -Which will print out whatever if finds for your config. If you want to use -it from python, which is much more likely what you want to do, things like: - -Get a named cloud. - -.. code-block:: python - - import os_client_config - - cloud_config = os_client_config.OpenStackConfig().get_one_cloud( - 'internap', region_name='ams01') - print(cloud_config.name, cloud_config.region, cloud_config.config) - -Or, get all of the clouds. - -.. code-block:: python - - import os_client_config - - cloud_config = os_client_config.OpenStackConfig().get_all_clouds() - for cloud in cloud_config: - print(cloud.name, cloud.region, cloud.config) - -argparse --------- - -If you're using os-client-config from a program that wants to process -command line options, there is a registration function to register the -arguments that both os-client-config and keystoneauth know how to deal -with - as well as a consumption argument. - -.. code-block:: python - - import argparse - import sys - - import os_client_config - - cloud_config = os_client_config.OpenStackConfig() - parser = argparse.ArgumentParser() - cloud_config.register_argparse_arguments(parser, sys.argv) - - options = parser.parse_args() - - cloud = cloud_config.get_one_cloud(argparse=options) - -Constructing OpenStack SDK object ---------------------------------- - -If what you want to do is get an OpenStack SDK Connection and you want it to -do all the normal things related to clouds.yaml, `OS_` environment variables, -a helper function is provided. The following will get you a fully configured -`openstack.connection.Connection` instance. - -.. code-block:: python - - import os_client_config - - sdk = os_client_config.make_sdk() - -If you want to do the same thing but on a named cloud. - -.. code-block:: python - - import os_client_config - - sdk = os_client_config.make_sdk(cloud='mtvexx') - -If you want to do the same thing but also support command line parsing. - -.. code-block:: python - - import argparse - - import os_client_config - - sdk = os_client_config.make_sdk(options=argparse.ArgumentParser()) - -It should be noted that OpenStack SDK has ways to construct itself that allow -for additional flexibility. If the helper function here does not meet your -needs, you should see the `from_config` method of -`openstack.connection.Connection <https://docs.openstack.org/openstacksdk/latest//user/guides/connect_from_config.html>`_ - -Constructing shade objects --------------------------- - -If what you want to do is get a -`shade <https://docs.openstack.org/infra/shade/>`_ OpenStackCloud object, a -helper function that honors clouds.yaml and `OS_` environment variables is -provided. The following will get you a fully configured `OpenStackCloud` -instance. - -.. code-block:: python - - import os_client_config - - cloud = os_client_config.make_shade() - -If you want to do the same thing but on a named cloud. - -.. code-block:: python - - import os_client_config - - cloud = os_client_config.make_shade(cloud='mtvexx') - -If you want to do the same thing but also support command line parsing. - -.. code-block:: python - - import argparse - - import os_client_config - - cloud = os_client_config.make_shade(options=argparse.ArgumentParser()) - -Constructing REST API Clients ------------------------------ - -What if you want to make direct REST calls via a Session interface? You're -in luck. A similar interface is available as with `openstacksdk` and `shade`. -The main difference is that you need to specify which service you want to -talk to and `make_rest_client` will return you a keystoneauth Session object -that is mounted on the endpoint for the service you're looking for. - -.. code-block:: python - - import os_client_config - - session = os_client_config.make_rest_client('compute', cloud='vexxhost') - - response = session.get('/servers') - server_list = response.json()['servers'] - -Constructing Legacy Client objects ----------------------------------- - -If you want get an old-style Client object from a python-\*client library, -and you want it to do all the normal things related to clouds.yaml, `OS_` -environment variables, a helper function is also provided. The following -will get you a fully configured `novaclient` instance. - -.. code-block:: python - - import os_client_config - - nova = os_client_config.make_client('compute') - -If you want to do the same thing but on a named cloud. - -.. code-block:: python - - import os_client_config - - nova = os_client_config.make_client('compute', cloud='mtvexx') - -If you want to do the same thing but also support command line parsing. - -.. code-block:: python - - import argparse - - import os_client_config - - nova = os_client_config.make_client( - 'compute', options=argparse.ArgumentParser()) - -If you want to get fancier than that in your python, then the rest of the -API is available to you. But often times, you just want to do the one thing. diff --git a/doc/source/user/vendor-support.rst b/doc/source/user/vendor-support.rst deleted file mode 100644 index 2e2f882..0000000 --- a/doc/source/user/vendor-support.rst +++ /dev/null @@ -1,6 +0,0 @@ -============== -Vendor Support -============== - -Please see -https://docs.openstack.org/openstacksdk/latest/user/config/vendor-support.html diff --git a/lower-constraints.txt b/lower-constraints.txt deleted file mode 100644 index d27b6b0..0000000 --- a/lower-constraints.txt +++ /dev/null @@ -1,55 +0,0 @@ -appdirs==1.3.0 -asn1crypto==0.23.0 -Babel==2.3.4 -certifi==2018.1.18 -cffi==1.7.0 -chardet==3.0.4 -coverage==4.0 -cryptography==2.1 -debtcollector==1.2.0 -extras==1.0.0 -fixtures==3.0.0 -flake8==2.5.5 -future==0.16.0 -hacking==0.12.0 -idna==2.6 -iso8601==0.1.12 -jsonpatch==1.16 -jsonpointer==1.13 -jsonschema==2.6.0 -keystoneauth1==3.4.0 -linecache2==1.0.0 -mccabe==0.2.1 -monotonic==0.6 -mox3==0.20.0 -netaddr==0.7.18 -netifaces==0.10.4 -openstacksdk==0.13.0 -oslo.i18n==3.15.3 -oslo.utils==3.33.0 -oslotest==3.2.0 -pbr==3.1.1 -pep8==1.5.7 -prettytable==0.7.2 -pycparser==2.18 -pyflakes==0.8.1 -pyOpenSSL==17.1.0 -pyparsing==2.1.0 -python-glanceclient==2.8.0 -python-mimeparse==1.6.0 -python-subunit==1.0.0 -pytz==2013.6 -PyYAML==3.12 -requests==2.18.4 -requestsexceptions==1.2.0 -six==1.11.0 -stestr==1.0.0 -stevedore==1.28.0 -testrepository==0.0.18 -testscenarios==0.4 -testtools==2.2.0 -traceback2==1.4.0 -unittest2==1.1.0 -urllib3==1.22 -warlock==1.2.0 -wrapt==1.7.0 diff --git a/os_client_config.egg-info/PKG-INFO b/os_client_config.egg-info/PKG-INFO deleted file mode 100644 index 0cd5ebf..0000000 --- a/os_client_config.egg-info/PKG-INFO +++ /dev/null @@ -1,53 +0,0 @@ -Metadata-Version: 1.1 -Name: os-client-config -Version: 2.1.0 -Summary: OpenStack Client Configuation Library -Home-page: https://docs.openstack.org/os-client-config/latest -Author: OpenStack -Author-email: openstack-discuss@lists.openstack.org -License: UNKNOWN -Description: ================ - os-client-config - ================ - - .. image:: https://governance.openstack.org/tc/badges/os-client-config.svg - :target: https://governance.openstack.org/tc/reference/tags/index.html - - .. warning:: - `os-client-config` has been superceded by `openstacksdk`_. While - `os-client-config` will continue to exist, it is highly recommended that - users transition to using `openstacksdk`_ directly. - - `os-client-config` is a library for collecting client configuration for - using an OpenStack cloud in a consistent and comprehensive manner. It - will find cloud config for as few as 1 cloud and as many as you want to - put in a config file. It will read environment variables and config files, - and it also contains some vendor specific default values so that you don't - have to know extra info to use OpenStack - - * If you have a config file, you will get the clouds listed in it - * If you have environment variables, you will get a cloud named `envvars` - * If you have neither, you will get a cloud named `defaults` with base defaults - - Source - ------ - - * Free software: Apache license - * Documentation: http://docs.openstack.org/os-client-config/latest - * Source: http://opendev.org/openstack/os-client-config - * Bugs: https://storyboard.openstack.org/#!/project/openstack/os-client-config - * Release Notes https://docs.openstack.org/releasenotes/os-client-config - - .. _openstacksdk: http://docs.openstack.org/openstacksdk/latest - - -Platform: UNKNOWN -Classifier: Environment :: OpenStack -Classifier: Intended Audience :: Information Technology -Classifier: Intended Audience :: System Administrators -Classifier: License :: OSI Approved :: Apache Software License -Classifier: Operating System :: POSIX :: Linux -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 diff --git a/os_client_config.egg-info/SOURCES.txt b/os_client_config.egg-info/SOURCES.txt deleted file mode 100644 index 88e51ef..0000000 --- a/os_client_config.egg-info/SOURCES.txt +++ /dev/null @@ -1,89 +0,0 @@ -.coveragerc -.mailmap -.stestr.conf -.zuul.yaml -AUTHORS -CONTRIBUTING.rst -ChangeLog -HACKING.rst -LICENSE -README.rst -lower-constraints.txt -requirements.txt -setup.cfg -setup.py -test-requirements.txt -tox.ini -doc/requirements.txt -doc/source/conf.py -doc/source/index.rst -doc/source/contributor/index.rst -doc/source/install/index.rst -doc/source/reference/index.rst -doc/source/user/configuration.rst -doc/source/user/index.rst -doc/source/user/network-config.rst -doc/source/user/releasenotes.rst -doc/source/user/using.rst -doc/source/user/vendor-support.rst -os_client_config/__init__.py -os_client_config/cloud_config.py -os_client_config/config.py -os_client_config/constructors.json -os_client_config/constructors.py -os_client_config/defaults.json -os_client_config/defaults.py -os_client_config/exceptions.py -os_client_config.egg-info/PKG-INFO -os_client_config.egg-info/SOURCES.txt -os_client_config.egg-info/dependency_links.txt -os_client_config.egg-info/not-zip-safe -os_client_config.egg-info/pbr.json -os_client_config.egg-info/requires.txt -os_client_config.egg-info/top_level.txt -os_client_config/tests/__init__.py -os_client_config/tests/base.py -os_client_config/tests/test_cloud_config.py -os_client_config/tests/test_config.py -os_client_config/tests/test_environ.py -os_client_config/tests/test_import_vendors.py -os_client_config/tests/test_init.py -os_client_config/vendors/__init__.py -releasenotes/notes/catch-up-release-notes-e385fad34e9f3d6e.yaml -releasenotes/notes/cloud-profile-status-e0d29b5e2f10e95c.yaml -releasenotes/notes/default-cloud-7ee0bcb9e5dd24b9.yaml -releasenotes/notes/fix-compat-with-old-keystoneauth-66e11ee9d008b962.yaml -releasenotes/notes/fix-vendor-import-ebd4ade0d5c17146.yaml -releasenotes/notes/goodbye-python2-40feeeb4be3e06c5.yaml -releasenotes/notes/ironic-microversion-ba5b0f36f11196a6.yaml -releasenotes/notes/load-yaml-3177efca78e5c67a.yaml -releasenotes/notes/magic-fixes-dca4ae4dac2441a8.yaml -releasenotes/notes/make-rest-client-dd3d365632a26fa0.yaml -releasenotes/notes/make-rest-client-version-discovery-84125700f159491a.yaml -releasenotes/notes/min-max-legacy-version-301242466ddefa93.yaml -releasenotes/notes/nat-source-field-7c7db2a724616d59.yaml -releasenotes/notes/network-list-e6e9dafdd8446263.yaml -releasenotes/notes/option-precedence-1fecab21fdfb2c33.yaml -releasenotes/notes/sdk-helper-41f8d815cfbcfb00.yaml -releasenotes/notes/session-client-b581a6e5d18c8f04.yaml -releasenotes/notes/shade-helper-568f8cb372eef6d9.yaml -releasenotes/notes/started-using-reno-242e2b0cd27f9480.yaml -releasenotes/notes/thin-shim-62c8e6f6942b83a5.yaml -releasenotes/notes/vendor-add-betacloud-03872c3485104853.yaml -releasenotes/notes/vendor-add-limestonenetworks-99b2ffab9fc23b08.yaml -releasenotes/notes/vendor-updates-f11184ba56bb27cf.yaml -releasenotes/source/conf.py -releasenotes/source/index.rst -releasenotes/source/mitaka.rst -releasenotes/source/newton.rst -releasenotes/source/ocata.rst -releasenotes/source/pike.rst -releasenotes/source/queens.rst -releasenotes/source/rocky.rst -releasenotes/source/stein.rst -releasenotes/source/train.rst -releasenotes/source/unreleased.rst -releasenotes/source/_static/.placeholder -releasenotes/source/_templates/.placeholder -tools/keystone_version.py -tools/nova_version.py
\ No newline at end of file diff --git a/os_client_config.egg-info/dependency_links.txt b/os_client_config.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/os_client_config.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/os_client_config.egg-info/not-zip-safe b/os_client_config.egg-info/not-zip-safe deleted file mode 100644 index 8b13789..0000000 --- a/os_client_config.egg-info/not-zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/os_client_config.egg-info/pbr.json b/os_client_config.egg-info/pbr.json deleted file mode 100644 index 1a63ba1..0000000 --- a/os_client_config.egg-info/pbr.json +++ /dev/null @@ -1 +0,0 @@ -{"git_version": "bc96c23", "is_release": true}
\ No newline at end of file diff --git a/os_client_config.egg-info/requires.txt b/os_client_config.egg-info/requires.txt deleted file mode 100644 index 6ff58e6..0000000 --- a/os_client_config.egg-info/requires.txt +++ /dev/null @@ -1 +0,0 @@ -openstacksdk>=0.13.0 diff --git a/os_client_config.egg-info/top_level.txt b/os_client_config.egg-info/top_level.txt deleted file mode 100644 index aaa1b5b..0000000 --- a/os_client_config.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -os_client_config diff --git a/os_client_config/__init__.py b/os_client_config/__init__.py deleted file mode 100644 index 1b4da7d..0000000 --- a/os_client_config/__init__.py +++ /dev/null @@ -1,114 +0,0 @@ -# Copyright (c) 2014 Hewlett-Packard Development Company, L.P. -# -# 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 sys - -import pbr.version - -from os_client_config import cloud_config -from os_client_config.config import OpenStackConfig # noqa -from os_client_config import vendors # noqa - - -__version__ = pbr.version.VersionInfo('os_client_config').version_string() -_config = None - - -def get_config( - service_key=None, options=None, - app_name=None, app_version=None, - **kwargs): - load_yaml_config = kwargs.pop('load_yaml_config', True) - global _config - if not _config: - _config = OpenStackConfig( - load_yaml_config=load_yaml_config, - app_name=app_name, app_version=app_version) - if options: - _config.register_argparse_arguments(options, sys.argv, service_key) - parsed_options = options.parse_known_args(sys.argv) - else: - parsed_options = None - - return _config.get_one_cloud(options=parsed_options, **kwargs) - - -def make_rest_client( - service_key, options=None, - app_name=None, app_version=None, version=None, - **kwargs): - """Simple wrapper function. It has almost no features. - - This will get you a raw requests Session Adapter that is mounted - on the given service from the keystone service catalog. If you leave - off cloud and region_name, it will assume that you've got env vars - set, but if you give them, it'll use clouds.yaml as you'd expect. - - This function is deliberately simple. It has no flexibility. If you - want flexibility, you can make a cloud config object and call - get_session_client on it. This function is to make it easy to poke - at OpenStack REST APIs with a properly configured keystone session. - """ - cloud = get_config( - service_key=service_key, options=options, - app_name=app_name, app_version=app_version, - **kwargs) - return cloud.get_session_client(service_key, version=version) - - -# Backwards compat - simple_client was a terrible name -simple_client = make_rest_client -# Backwards compat - session_client was a terrible name -session_client = make_rest_client - - -def make_client(service_key, constructor=None, options=None, **kwargs): - """Simple wrapper for getting a client instance from a client lib. - - OpenStack Client Libraries all have a fairly consistent constructor - interface which os-client-config supports. In the simple case, there - is one and only one right way to construct a client object. If as a user - you don't want to do fancy things, just use this. It honors OS_ environment - variables and clouds.yaml - and takes as **kwargs anything you'd expect - to pass in. - """ - cloud = get_config(service_key=service_key, options=options, **kwargs) - if not constructor: - constructor = cloud_config._get_client(service_key) - return cloud.get_legacy_client(service_key, constructor) - - -def make_sdk(options=None, **kwargs): - """Simple wrapper for getting an OpenStack SDK Connection. - - For completeness, provide a mechanism that matches make_client and - make_rest_client. The heavy lifting here is done in openstacksdk. - - :rtype: :class:`~openstack.connection.Connection` - """ - from openstack import connection - cloud = get_config(options=options, **kwargs) - return connection.from_config(cloud_config=cloud, options=options) - - -def make_shade(options=None, **kwargs): - """Simple wrapper for getting a Shade OpenStackCloud object - - A mechanism that matches make_sdk, make_client and make_rest_client. - - :rtype: :class:`~shade.OpenStackCloud` - """ - import shade - cloud = get_config(options=options, **kwargs) - return shade.OpenStackCloud(cloud_config=cloud, **kwargs) diff --git a/os_client_config/cloud_config.py b/os_client_config/cloud_config.py deleted file mode 100644 index 88fe060..0000000 --- a/os_client_config/cloud_config.py +++ /dev/null @@ -1,230 +0,0 @@ -# Copyright (c) 2014 Hewlett-Packard Development Company, L.P. -# -# 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 importlib - -from openstack import _log -from openstack.config import cloud_region - -import os_client_config -from os_client_config import constructors -from os_client_config import exceptions - - -def _get_client(service_key): - class_mapping = constructors.get_constructor_mapping() - if service_key not in class_mapping: - raise exceptions.OpenStackConfigException( - "Service {service_key} is unkown. Please pass in a client" - " constructor or submit a patch to os-client-config".format( - service_key=service_key)) - mod_name, ctr_name = class_mapping[service_key].rsplit('.', 1) - lib_name = mod_name.split('.')[0] - try: - mod = importlib.import_module(mod_name) - except ImportError: - raise exceptions.OpenStackConfigException( - "Client for '{service_key}' was requested, but" - " {mod_name} was unable to be imported. Either import" - " the module yourself and pass the constructor in as an argument," - " or perhaps you do not have python-{lib_name} installed.".format( - service_key=service_key, - mod_name=mod_name, - lib_name=lib_name)) - try: - ctr = getattr(mod, ctr_name) - except AttributeError: - raise exceptions.OpenStackConfigException( - "Client for '{service_key}' was requested, but although" - " {mod_name} imported fine, the constructor at {fullname}" - " as not found. Please check your installation, we have no" - " clue what is wrong with your computer.".format( - service_key=service_key, - mod_name=mod_name, - fullname=class_mapping[service_key])) - return ctr - - -class CloudConfig(cloud_region.CloudRegion): - def __init__(self, *args, **kwargs): - super(CloudConfig, self).__init__(*args, **kwargs) - self.log = _log.setup_logging(__name__) - - def __getattr__(self, key): - """Return arbitrary attributes.""" - - if key.startswith('os_'): - key = key[3:] - - if key in [attr.replace('-', '_') for attr in self.config]: - return self.config[key] - else: - return None - - def insert_user_agent(self): - self._keystone_session.additional_user_agent.append( - ('os-client-config', os_client_config.__version__)) - super(CloudConfig, self).insert_user_agent() - - @property - def region(self): - return self.region_name - - def get_region_name(self, *args): - return self.region_name - - def get_cache_expiration(self): - return self.get_cache_expirations() - - def get_legacy_client( - self, service_key, client_class=None, interface_key=None, - pass_version_arg=True, version=None, min_version=None, - max_version=None, **kwargs): - """Return a legacy OpenStack client object for the given config. - - Most of the OpenStack python-*client libraries have the same - interface for their client constructors, but there are several - parameters one wants to pass given a :class:`CloudConfig` object. - - In the future, OpenStack API consumption should be done through - the OpenStack SDK, but that's not ready yet. This is for getting - Client objects from python-*client only. - - :param service_key: Generic key for service, such as 'compute' or - 'network' - :param client_class: Class of the client to be instantiated. This - should be the unversioned version if there - is one, such as novaclient.client.Client, or - the versioned one, such as - neutronclient.v2_0.client.Client if there isn't - :param interface_key: (optional) Some clients, such as glanceclient - only accept the parameter 'interface' instead - of 'endpoint_type' - this is a get-out-of-jail - parameter for those until they can be aligned. - os-client-config understands this to be the - case if service_key is image, so this is really - only for use with other unknown broken clients. - :param pass_version_arg: (optional) If a versioned Client constructor - was passed to client_class, set this to - False, which will tell get_client to not - pass a version parameter. os-client-config - already understand that this is the - case for network, so it can be omitted in - that case. - :param version: (optional) Version string to override the configured - version string. - :param min_version: (options) Minimum version acceptable. - :param max_version: (options) Maximum version acceptable. - :param kwargs: (optional) keyword args are passed through to the - Client constructor, so this is in case anything - additional needs to be passed in. - """ - if not client_class: - client_class = _get_client(service_key) - - interface = self.get_interface(service_key) - # trigger exception on lack of service - endpoint = self.get_session_endpoint( - service_key, min_version=min_version, max_version=max_version) - endpoint_override = self.get_endpoint(service_key) - - if service_key == 'object-store': - constructor_kwargs = dict( - session=self.get_session(), - os_options=dict( - service_type=self.get_service_type(service_key), - object_storage_url=endpoint_override, - region_name=self.region)) - else: - constructor_kwargs = dict( - session=self.get_session(), - service_name=self.get_service_name(service_key), - service_type=self.get_service_type(service_key), - endpoint_override=endpoint_override, - region_name=self.region) - - if service_key == 'image': - # os-client-config does not depend on glanceclient, but if - # the user passed in glanceclient.client.Client, which they - # would need to do if they were requesting 'image' - then - # they necessarily have glanceclient installed - from glanceclient.common import utils as glance_utils - endpoint, detected_version = glance_utils.strip_version(endpoint) - # If the user has passed in a version, that's explicit, use it - if not version: - version = detected_version - # If the user has passed in or configured an override, use it. - # Otherwise, ALWAYS pass in an endpoint_override becuase - # we've already done version stripping, so we don't want version - # reconstruction to happen twice - if not endpoint_override: - constructor_kwargs['endpoint_override'] = endpoint - constructor_kwargs.update(kwargs) - if pass_version_arg and service_key != 'object-store': - if not version: - version = self.get_api_version(service_key) - if not version and service_key == 'volume': - from cinderclient import client as cinder_client - version = cinder_client.get_volume_api_from_url(endpoint) - # Temporary workaround while we wait for python-openstackclient - # to be able to handle 2.0 which is what neutronclient expects - if service_key == 'network' and version == '2': - version = '2.0' - if service_key == 'identity': - # Workaround for bug#1513839 - if 'endpoint' not in constructor_kwargs: - endpoint = self.get_session_endpoint('identity') - constructor_kwargs['endpoint'] = endpoint - if service_key == 'network': - constructor_kwargs['api_version'] = version - elif service_key == 'baremetal': - if version != '1': - # Set Ironic Microversion - constructor_kwargs['os_ironic_api_version'] = version - # Version arg is the major version, not the full microstring - constructor_kwargs['version'] = version[0] - else: - constructor_kwargs['version'] = version - if min_version and min_version > float(version): - raise exceptions.OpenStackConfigVersionException( - "Minimum version {min_version} requested but {version}" - " found".format(min_version=min_version, version=version), - version=version) - if max_version and max_version < float(version): - raise exceptions.OpenStackConfigVersionException( - "Maximum version {max_version} requested but {version}" - " found".format(max_version=max_version, version=version), - version=version) - if service_key == 'database': - # TODO(mordred) Remove when https://review.openstack.org/314032 - # has landed and released. We're passing in a Session, but the - # trove Client object has username and password as required - # args - constructor_kwargs['username'] = None - constructor_kwargs['password'] = None - - if not interface_key: - if service_key in ('image', 'key-manager'): - interface_key = 'interface' - elif (service_key == 'identity' - and version and version.startswith('3')): - interface_key = 'interface' - else: - interface_key = 'endpoint_type' - if service_key == 'object-store': - constructor_kwargs['os_options'][interface_key] = interface - else: - constructor_kwargs[interface_key] = interface - - return client_class(**constructor_kwargs) diff --git a/os_client_config/config.py b/os_client_config/config.py deleted file mode 100644 index e4a6ed7..0000000 --- a/os_client_config/config.py +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright (c) 2014 Hewlett-Packard Development Company, L.P. -# -# 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 copy -import sys - -from openstack.config import loader -from openstack.config.loader import * # noqa - -from os_client_config import cloud_config -from os_client_config import defaults - - -class OpenStackConfig(loader.OpenStackConfig): - - _cloud_region_class = cloud_config.CloudConfig - _defaults_module = defaults - - get_one_cloud = loader.OpenStackConfig.get_one - get_all_clouds = loader.OpenStackConfig.get_all - - def get_cache_expiration_time(self): - return int(self._cache_expiration_time) - - def get_cache_interval(self): - return self.get_cache_expiration_time() - - def get_cache_max_age(self): - return self.get_cache_expiration_time() - - def get_cache_path(self): - return self._cache_path - - def get_cache_class(self): - return self._cache_class - - def get_cache_arguments(self): - return copy.deepcopy(self._cache_arguments) - - def get_cache_expiration(self): - return copy.deepcopy(self._cache_expiration) - - -if __name__ == '__main__': - config = OpenStackConfig().get_all_clouds() - for cloud in config: - print_cloud = False - if len(sys.argv) == 1: - print_cloud = True - elif len(sys.argv) == 3 and ( - sys.argv[1] == cloud.name and sys.argv[2] == cloud.region): - print_cloud = True - elif len(sys.argv) == 2 and ( - sys.argv[1] == cloud.name): - print_cloud = True - - if print_cloud: - print(cloud.name, cloud.region, cloud.config) diff --git a/os_client_config/constructors.json b/os_client_config/constructors.json deleted file mode 100644 index 9acb7cf..0000000 --- a/os_client_config/constructors.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "application-catalog": "muranoclient.client.Client", - "baremetal": "ironicclient.client.Client", - "compute": "novaclient.client.Client", - "container-infra": "magnumclient.client.Client", - "database": "troveclient.client.Client", - "dns": "designateclient.client.Client", - "identity": "keystoneclient.client.Client", - "image": "glanceclient.Client", - "key-manager": "barbicanclient.client.Client", - "metering": "ceilometerclient.client.Client", - "network": "neutronclient.neutron.client.Client", - "object-store": "swiftclient.client.Connection", - "orchestration": "heatclient.client.Client", - "volume": "cinderclient.client.Client" -} diff --git a/os_client_config/constructors.py b/os_client_config/constructors.py deleted file mode 100644 index 579bb2d..0000000 --- a/os_client_config/constructors.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (c) 2014 Hewlett-Packard Development Company, L.P. -# -# 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 json -import os -import threading - -_json_path = os.path.join( - os.path.dirname(os.path.realpath(__file__)), 'constructors.json') -_class_mapping = None -_class_mapping_lock = threading.Lock() - - -def get_constructor_mapping(): - global _class_mapping - if _class_mapping is not None: - return _class_mapping.copy() - with _class_mapping_lock: - if _class_mapping is not None: - return _class_mapping.copy() - tmp_class_mapping = {} - with open(_json_path, 'r') as json_file: - tmp_class_mapping.update(json.load(json_file)) - _class_mapping = tmp_class_mapping - return tmp_class_mapping.copy() diff --git a/os_client_config/defaults.json b/os_client_config/defaults.json deleted file mode 100644 index 2a195c4..0000000 --- a/os_client_config/defaults.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "application_catalog_api_version": "1", - "auth_type": "password", - "baremetal_api_version": "1", - "container_api_version": "1", - "container_infra_api_version": "1", - "compute_api_version": "2", - "database_api_version": "1.0", - "disable_vendor_agent": {}, - "dns_api_version": "2", - "interface": "public", - "floating_ip_source": "neutron", - "identity_api_version": "2.0", - "image_api_use_tasks": false, - "image_api_version": "2", - "image_format": "qcow2", - "key_manager_api_version": "v1", - "message": "", - "metering_api_version": "2", - "network_api_version": "2", - "object_store_api_version": "1", - "orchestration_api_version": "1", - "secgroup_source": "neutron", - "status": "active", - "volume_api_version": "2", - "workflow_api_version": "2" -} diff --git a/os_client_config/defaults.py b/os_client_config/defaults.py deleted file mode 100644 index 3256478..0000000 --- a/os_client_config/defaults.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) 2014 Hewlett-Packard Development Company, L.P. -# -# 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 - -from openstack.config import defaults - -_json_path = os.path.join( - os.path.dirname(os.path.realpath(__file__)), 'defaults.json') - - -def get_defaults(): - return defaults.get_defaults(json_path=_json_path) diff --git a/os_client_config/exceptions.py b/os_client_config/exceptions.py deleted file mode 100644 index 898292a..0000000 --- a/os_client_config/exceptions.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (c) 2014 Hewlett-Packard Development Company, L.P. -# -# 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. - -from openstack import exceptions - -OpenStackConfigException = exceptions.ConfigException - - -class OpenStackConfigVersionException(OpenStackConfigException): - """A version was requested that is different than what was found.""" - - def __init__(self, version): - super(OpenStackConfigVersionException, self).__init__() - self.version = version diff --git a/os_client_config/tests/__init__.py b/os_client_config/tests/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/os_client_config/tests/__init__.py +++ /dev/null diff --git a/os_client_config/tests/base.py b/os_client_config/tests/base.py deleted file mode 100644 index abbd256..0000000 --- a/os_client_config/tests/base.py +++ /dev/null @@ -1,247 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright 2010-2011 OpenStack Foundation -# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. -# -# 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 copy -import os -import tempfile - -from os_client_config import cloud_config - -import extras -import fixtures -from oslotest import base -import yaml - - -VENDOR_CONF = { - 'public-clouds': { - '_test_cloud_in_our_cloud': { - 'auth': { - 'auth_url': 'http://example.com/v2', - 'username': 'testotheruser', - 'project_name': 'testproject', - }, - }, - } -} -USER_CONF = { - 'cache': { - 'max_age': '1', - 'expiration': { - 'server': 5, - 'image': '7', - }, - }, - 'client': { - 'force_ipv4': True, - }, - 'clouds': { - '_test-cloud_': { - 'profile': '_test_cloud_in_our_cloud', - 'auth': { - 'auth_url': 'http://example.com/v2', - 'username': 'testuser', - 'password': 'testpass', - }, - 'region_name': 'test-region', - }, - '_test_cloud_no_vendor': { - 'profile': '_test_non_existant_cloud', - 'auth': { - 'auth_url': 'http://example.com/v2', - 'username': 'testuser', - 'project_name': 'testproject', - }, - 'region-name': 'test-region', - }, - '_test-cloud-int-project_': { - 'auth': { - 'username': 'testuser', - 'password': 'testpass', - 'domain_id': 'awesome-domain', - 'project_id': 12345, - 'auth_url': 'http://example.com/v2', - }, - 'region_name': 'test-region', - }, - '_test-cloud-domain-id_': { - 'auth': { - 'username': 'testuser', - 'password': 'testpass', - 'project_id': 12345, - 'auth_url': 'http://example.com/v2', - 'domain_id': '6789', - 'project_domain_id': '123456789', - }, - 'region_name': 'test-region', - }, - '_test-cloud-networks_': { - 'auth': { - 'username': 'testuser', - 'password': 'testpass', - 'project_id': 12345, - 'auth_url': 'http://example.com/v2', - 'domain_id': '6789', - 'project_domain_id': '123456789', - }, - 'networks': [{ - 'name': 'a-public', - 'routes_externally': True, - 'nat_source': True, - }, { - 'name': 'another-public', - 'routes_externally': True, - 'default_interface': True, - }, { - 'name': 'a-private', - 'routes_externally': False, - }, { - 'name': 'another-private', - 'routes_externally': False, - 'nat_destination': True, - }, { - 'name': 'split-default', - 'routes_externally': True, - 'routes_ipv4_externally': False, - }, { - 'name': 'split-no-default', - 'routes_ipv6_externally': False, - 'routes_ipv4_externally': True, - }], - 'region_name': 'test-region', - }, - '_test_cloud_regions': { - 'auth': { - 'username': 'testuser', - 'password': 'testpass', - 'project-id': 'testproject', - 'auth_url': 'http://example.com/v2', - }, - 'regions': [ - { - 'name': 'region1', - 'values': { - 'external_network': 'region1-network', - } - }, - { - 'name': 'region2', - 'values': { - 'external_network': 'my-network', - } - } - ], - }, - '_test_cloud_hyphenated': { - 'auth': { - 'username': 'testuser', - 'password': 'testpass', - 'project-id': '12345', - 'auth_url': 'http://example.com/v2', - }, - 'region_name': 'test-region', - }, - '_test-cloud_no_region': { - 'profile': '_test_cloud_in_our_cloud', - 'auth': { - 'auth_url': 'http://example.com/v2', - 'username': 'testuser', - 'password': 'testpass', - }, - }, - '_test-cloud-domain-scoped_': { - 'auth': { - 'auth_url': 'http://example.com/v2', - 'username': 'testuser', - 'password': 'testpass', - 'domain-id': '12345', - }, - }, - }, - 'ansible': { - 'expand-hostvars': False, - 'use_hostnames': True, - }, -} -SECURE_CONF = { - 'clouds': { - '_test_cloud_no_vendor': { - 'auth': { - 'password': 'testpass', - }, - } - } -} -NO_CONF = { - 'cache': {'max_age': 1}, -} - - -def _write_yaml(obj): - # Assume NestedTempfile so we don't have to cleanup - with tempfile.NamedTemporaryFile(delete=False) as obj_yaml: - obj_yaml.write(yaml.safe_dump(obj).encode('utf-8')) - return obj_yaml.name - - -class TestCase(base.BaseTestCase): - """Test case base class for all unit tests.""" - - def setUp(self): - super(TestCase, self).setUp() - - self.useFixture(fixtures.NestedTempfile()) - conf = copy.deepcopy(USER_CONF) - tdir = self.useFixture(fixtures.TempDir()) - conf['cache']['path'] = tdir.path - self.cloud_yaml = _write_yaml(conf) - self.secure_yaml = _write_yaml(SECURE_CONF) - self.vendor_yaml = _write_yaml(VENDOR_CONF) - self.no_yaml = _write_yaml(NO_CONF) - self.useFixture(fixtures.MonkeyPatch( - 'os_client_config.__version__', '1.2.3')) - self.useFixture(fixtures.MonkeyPatch( - 'openstack.version.__version__', '3.4.5')) - - # Isolate the test runs from the environment - # Do this as two loops because you can't modify the dict in a loop - # over the dict in 3.4 - keys_to_isolate = [] - for env in os.environ.keys(): - if env.startswith('OS_'): - keys_to_isolate.append(env) - for env in keys_to_isolate: - self.useFixture(fixtures.EnvironmentVariable(env)) - - def _assert_cloud_details(self, cc): - self.assertIsInstance(cc, cloud_config.CloudConfig) - self.assertTrue(extras.safe_hasattr(cc, 'auth')) - self.assertIsInstance(cc.auth, dict) - self.assertIsNone(cc.cloud) - self.assertIn('username', cc.auth) - self.assertEqual('testuser', cc.auth['username']) - self.assertEqual('testpass', cc.auth['password']) - self.assertFalse(cc.config['image_api_use_tasks']) - self.assertTrue('project_name' in cc.auth or 'project_id' in cc.auth) - if 'project_name' in cc.auth: - self.assertEqual('testproject', cc.auth['project_name']) - elif 'project_id' in cc.auth: - self.assertEqual('testproject', cc.auth['project_id']) - self.assertEqual(cc.get_cache_expiration_time(), 1) - self.assertEqual(cc.get_cache_resource_expiration('server'), 5.0) - self.assertEqual(cc.get_cache_resource_expiration('image'), 7.0) diff --git a/os_client_config/tests/test_cloud_config.py b/os_client_config/tests/test_cloud_config.py deleted file mode 100644 index 2e80163..0000000 --- a/os_client_config/tests/test_cloud_config.py +++ /dev/null @@ -1,508 +0,0 @@ -# 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 copy -from unittest import mock - -from keystoneauth1 import exceptions as ksa_exceptions -from keystoneauth1 import session as ksa_session - -from openstack.config import cloud_region - -from os_client_config import cloud_config -from os_client_config import defaults -from os_client_config import exceptions -from os_client_config.tests import base - - -fake_config_dict = {'a': 1, 'os_b': 2, 'c': 3, 'os_c': 4} -fake_services_dict = { - 'compute_api_version': '2', - 'compute_endpoint_override': 'http://compute.example.com', - 'telemetry_endpoint': 'http://telemetry.example.com', - 'interface': 'public', - 'image_service_type': 'mage', - 'identity_interface': 'admin', - 'identity_service_name': 'locks', - 'volume_api_version': '1', - 'auth': {'password': 'hunter2', 'username': 'AzureDiamond'}, -} - - -class TestCloudConfig(base.TestCase): - - def test_arbitrary_attributes(self): - cc = cloud_config.CloudConfig("test1", "region-al", fake_config_dict) - self.assertEqual("test1", cc.name) - self.assertEqual("region-al", cc.region) - - # Look up straight value - self.assertEqual('1', cc.a) - - # Look up prefixed attribute, fail - returns None - self.assertIsNone(cc.os_b) - - # Look up straight value, then prefixed value - self.assertEqual('3', cc.c) - self.assertEqual('3', cc.os_c) - - # Lookup mystery attribute - self.assertIsNone(cc.x) - - # Test default ipv6 - self.assertFalse(cc.force_ipv4) - - def test_iteration(self): - cc = cloud_config.CloudConfig("test1", "region-al", fake_config_dict) - self.assertTrue('a' in cc) - self.assertFalse('x' in cc) - - def test_equality(self): - cc1 = cloud_config.CloudConfig("test1", "region-al", fake_config_dict) - cc2 = cloud_config.CloudConfig("test1", "region-al", fake_config_dict) - self.assertEqual(cc1, cc2) - - def test_inequality(self): - cc1 = cloud_config.CloudConfig("test1", "region-al", fake_config_dict) - - cc2 = cloud_config.CloudConfig("test2", "region-al", fake_config_dict) - self.assertNotEqual(cc1, cc2) - - cc2 = cloud_config.CloudConfig("test1", "region-xx", fake_config_dict) - self.assertNotEqual(cc1, cc2) - - cc2 = cloud_config.CloudConfig("test1", "region-al", {}) - self.assertNotEqual(cc1, cc2) - - def test_verify(self): - config_dict = copy.deepcopy(fake_config_dict) - config_dict['cacert'] = None - - config_dict['verify'] = False - cc = cloud_config.CloudConfig("test1", "region-xx", config_dict) - (verify, cert) = cc.get_requests_verify_args() - self.assertFalse(verify) - - config_dict['verify'] = True - cc = cloud_config.CloudConfig("test1", "region-xx", config_dict) - (verify, cert) = cc.get_requests_verify_args() - self.assertTrue(verify) - - def test_verify_cacert(self): - config_dict = copy.deepcopy(fake_config_dict) - config_dict['cacert'] = "certfile" - - config_dict['verify'] = False - cc = cloud_config.CloudConfig("test1", "region-xx", config_dict) - (verify, cert) = cc.get_requests_verify_args() - self.assertFalse(verify) - - config_dict['verify'] = True - cc = cloud_config.CloudConfig("test1", "region-xx", config_dict) - (verify, cert) = cc.get_requests_verify_args() - self.assertEqual("certfile", verify) - - def test_cert_with_key(self): - config_dict = copy.deepcopy(fake_config_dict) - config_dict['cacert'] = None - config_dict['verify'] = False - - config_dict['cert'] = 'cert' - config_dict['key'] = 'key' - - cc = cloud_config.CloudConfig("test1", "region-xx", config_dict) - (verify, cert) = cc.get_requests_verify_args() - self.assertEqual(("cert", "key"), cert) - - def test_ipv6(self): - cc = cloud_config.CloudConfig( - "test1", "region-al", fake_config_dict, force_ipv4=True) - self.assertTrue(cc.force_ipv4) - - def test_getters(self): - cc = cloud_config.CloudConfig("test1", "region-al", fake_services_dict) - - self.assertEqual(['compute', 'identity', 'image', 'volume'], - sorted(cc.get_services())) - self.assertEqual({'password': 'hunter2', 'username': 'AzureDiamond'}, - cc.get_auth_args()) - self.assertEqual('public', cc.get_interface()) - self.assertEqual('public', cc.get_interface('compute')) - self.assertEqual('admin', cc.get_interface('identity')) - self.assertEqual('region-al', cc.get_region_name()) - self.assertEqual('region-al', cc.get_region_name('image')) - self.assertIsNone(cc.get_api_version('image')) - self.assertEqual('2', cc.get_api_version('compute')) - self.assertEqual('mage', cc.get_service_type('image')) - self.assertEqual('compute', cc.get_service_type('compute')) - self.assertEqual('1', cc.get_api_version('volume')) - self.assertIn( - cc.get_service_type('volume'), ['block-storage', 'volume']) - self.assertEqual('http://compute.example.com', - cc.get_endpoint('compute')) - self.assertIsNone(cc.get_endpoint('image')) - self.assertIsNone(cc.get_service_name('compute')) - self.assertEqual('locks', cc.get_service_name('identity')) - - def test_get_session_no_auth(self): - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - cc = cloud_config.CloudConfig("test1", "region-al", config_dict) - self.assertRaises( - exceptions.OpenStackConfigException, - cc.get_session) - - @mock.patch.object(ksa_session, 'Session') - def test_override_session_endpoint_override(self, mock_session): - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - self.assertEqual( - cc.get_session_endpoint('compute'), - fake_services_dict['compute_endpoint_override']) - - @mock.patch.object(ksa_session, 'Session') - def test_override_session_endpoint(self, mock_session): - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - self.assertEqual( - cc.get_session_endpoint('telemetry'), - fake_services_dict['telemetry_endpoint']) - - @mock.patch.object(cloud_region.CloudRegion, 'get_session') - def test_session_endpoint(self, mock_get_session): - mock_session = mock.Mock() - mock_get_session.return_value = mock_session - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - cc.get_session_endpoint('orchestration') - mock_session.get_endpoint.assert_called_with( - interface='public', - service_name=None, - region_name='region-al', - service_type='orchestration') - - @mock.patch.object(cloud_region.CloudRegion, 'get_session') - def test_session_endpoint_not_found(self, mock_get_session): - exc_to_raise = ksa_exceptions.catalog.EndpointNotFound - mock_get_session.return_value.get_endpoint.side_effect = exc_to_raise - cc = cloud_config.CloudConfig( - "test1", "region-al", {}, auth_plugin=mock.Mock()) - self.assertIsNone(cc.get_session_endpoint('notfound')) - - @mock.patch.object(cloud_region.CloudRegion, 'get_api_version') - @mock.patch.object(cloud_region.CloudRegion, 'get_auth_args') - @mock.patch.object(cloud_region.CloudRegion, 'get_session_endpoint') - def test_legacy_client_object_store_password( - self, - mock_get_session_endpoint, - mock_get_auth_args, - mock_get_api_version): - mock_client = mock.Mock() - mock_get_session_endpoint.return_value = 'http://swift.example.com' - mock_get_api_version.return_value = '3' - mock_get_auth_args.return_value = dict( - username='testuser', - password='testpassword', - project_name='testproject', - auth_url='http://example.com', - ) - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - cc.get_legacy_client('object-store', mock_client) - mock_client.assert_called_with( - session=mock.ANY, - os_options={ - 'region_name': 'region-al', - 'service_type': 'object-store', - 'object_storage_url': None, - 'endpoint_type': 'public', - }) - - @mock.patch.object(cloud_region.CloudRegion, 'get_auth_args') - @mock.patch.object(cloud_region.CloudRegion, 'get_session_endpoint') - def test_legacy_client_object_store_password_v2( - self, mock_get_session_endpoint, mock_get_auth_args): - mock_client = mock.Mock() - mock_get_session_endpoint.return_value = 'http://swift.example.com' - mock_get_auth_args.return_value = dict( - username='testuser', - password='testpassword', - project_name='testproject', - auth_url='http://example.com', - ) - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - cc.get_legacy_client('object-store', mock_client) - mock_client.assert_called_with( - session=mock.ANY, - os_options={ - 'region_name': 'region-al', - 'service_type': 'object-store', - 'object_storage_url': None, - 'endpoint_type': 'public', - }) - - @mock.patch.object(cloud_region.CloudRegion, 'get_auth_args') - @mock.patch.object(cloud_region.CloudRegion, 'get_session_endpoint') - def test_legacy_client_object_store( - self, mock_get_session_endpoint, mock_get_auth_args): - mock_client = mock.Mock() - mock_get_session_endpoint.return_value = 'http://example.com/v2' - mock_get_auth_args.return_value = {} - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - cc.get_legacy_client('object-store', mock_client) - mock_client.assert_called_with( - session=mock.ANY, - os_options={ - 'region_name': 'region-al', - 'service_type': 'object-store', - 'object_storage_url': None, - 'endpoint_type': 'public', - }) - - @mock.patch.object(cloud_region.CloudRegion, 'get_auth_args') - @mock.patch.object(cloud_region.CloudRegion, 'get_session_endpoint') - def test_legacy_client_object_store_timeout( - self, mock_get_session_endpoint, mock_get_auth_args): - mock_client = mock.Mock() - mock_get_session_endpoint.return_value = 'http://example.com/v2' - mock_get_auth_args.return_value = {} - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - config_dict['api_timeout'] = 9 - cc = cloud_config.CloudConfig( - name="test1", region_name="region-al", config=config_dict, - auth_plugin=mock.Mock()) - cc.get_legacy_client('object-store', mock_client) - mock_client.assert_called_with( - session=mock.ANY, - os_options={ - 'region_name': 'region-al', - 'service_type': 'object-store', - 'object_storage_url': None, - 'endpoint_type': 'public', - }) - - @mock.patch.object(cloud_region.CloudRegion, 'get_auth_args') - def test_legacy_client_object_store_endpoint( - self, mock_get_auth_args): - mock_client = mock.Mock() - mock_get_auth_args.return_value = {} - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - config_dict['object_store_endpoint'] = 'http://example.com/swift' - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - cc.get_legacy_client('object-store', mock_client) - mock_client.assert_called_with( - session=mock.ANY, - os_options={ - 'region_name': 'region-al', - 'service_type': 'object-store', - 'object_storage_url': 'http://example.com/swift', - 'endpoint_type': 'public', - }) - - @mock.patch.object(cloud_region.CloudRegion, 'get_session_endpoint') - def test_legacy_client_image(self, mock_get_session_endpoint): - mock_client = mock.Mock() - mock_get_session_endpoint.return_value = 'http://example.com/v2' - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - cc.get_legacy_client('image', mock_client) - mock_client.assert_called_with( - version=2.0, - service_name=None, - endpoint_override='http://example.com', - region_name='region-al', - interface='public', - session=mock.ANY, - # Not a typo - the config dict above overrides this - service_type='mage' - ) - - @mock.patch.object(cloud_region.CloudRegion, 'get_session_endpoint') - def test_legacy_client_image_override(self, mock_get_session_endpoint): - mock_client = mock.Mock() - mock_get_session_endpoint.return_value = 'http://example.com/v2' - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - config_dict['image_endpoint_override'] = 'http://example.com/override' - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - cc.get_legacy_client('image', mock_client) - mock_client.assert_called_with( - version=2.0, - service_name=None, - endpoint_override='http://example.com/override', - region_name='region-al', - interface='public', - session=mock.ANY, - # Not a typo - the config dict above overrides this - service_type='mage' - ) - - @mock.patch.object(cloud_region.CloudRegion, 'get_session_endpoint') - def test_legacy_client_image_versioned(self, mock_get_session_endpoint): - mock_client = mock.Mock() - mock_get_session_endpoint.return_value = 'http://example.com/v2' - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - # v2 endpoint was passed, 1 requested in config, endpoint wins - config_dict['image_api_version'] = '1' - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - cc.get_legacy_client('image', mock_client) - mock_client.assert_called_with( - version=2.0, - service_name=None, - endpoint_override='http://example.com', - region_name='region-al', - interface='public', - session=mock.ANY, - # Not a typo - the config dict above overrides this - service_type='mage' - ) - - @mock.patch.object(cloud_region.CloudRegion, 'get_session_endpoint') - def test_legacy_client_image_unversioned(self, mock_get_session_endpoint): - mock_client = mock.Mock() - mock_get_session_endpoint.return_value = 'http://example.com/' - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - # Versionless endpoint, config wins - config_dict['image_api_version'] = '1' - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - cc.get_legacy_client('image', mock_client) - mock_client.assert_called_with( - version='1', - service_name=None, - endpoint_override='http://example.com', - region_name='region-al', - interface='public', - session=mock.ANY, - # Not a typo - the config dict above overrides this - service_type='mage' - ) - - @mock.patch.object(cloud_region.CloudRegion, 'get_session_endpoint') - def test_legacy_client_image_argument(self, mock_get_session_endpoint): - mock_client = mock.Mock() - mock_get_session_endpoint.return_value = 'http://example.com/v3' - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - # Versionless endpoint, config wins - config_dict['image_api_version'] = '6' - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - cc.get_legacy_client('image', mock_client, version='beef') - mock_client.assert_called_with( - version='beef', - service_name=None, - endpoint_override='http://example.com', - region_name='region-al', - interface='public', - session=mock.ANY, - # Not a typo - the config dict above overrides this - service_type='mage' - ) - - @mock.patch.object(cloud_region.CloudRegion, 'get_session_endpoint') - def test_legacy_client_network(self, mock_get_session_endpoint): - mock_client = mock.Mock() - mock_get_session_endpoint.return_value = 'http://example.com/v2' - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - cc.get_legacy_client('network', mock_client) - mock_client.assert_called_with( - api_version='2.0', - endpoint_type='public', - endpoint_override=None, - region_name='region-al', - service_type='network', - session=mock.ANY, - service_name=None) - - @mock.patch.object(cloud_region.CloudRegion, 'get_session_endpoint') - def test_legacy_client_compute(self, mock_get_session_endpoint): - mock_client = mock.Mock() - mock_get_session_endpoint.return_value = 'http://example.com/v2' - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - cc.get_legacy_client('compute', mock_client) - mock_client.assert_called_with( - version='2', - endpoint_type='public', - endpoint_override='http://compute.example.com', - region_name='region-al', - service_type='compute', - session=mock.ANY, - service_name=None) - - @mock.patch.object(cloud_region.CloudRegion, 'get_session_endpoint') - def test_legacy_client_identity(self, mock_get_session_endpoint): - mock_client = mock.Mock() - mock_get_session_endpoint.return_value = 'http://example.com/v2' - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - cc.get_legacy_client('identity', mock_client) - mock_client.assert_called_with( - version='2.0', - endpoint='http://example.com/v2', - endpoint_type='admin', - endpoint_override=None, - region_name='region-al', - service_type='identity', - session=mock.ANY, - service_name='locks') - - @mock.patch.object(cloud_region.CloudRegion, 'get_session_endpoint') - def test_legacy_client_identity_v3(self, mock_get_session_endpoint): - mock_client = mock.Mock() - mock_get_session_endpoint.return_value = 'http://example.com' - config_dict = defaults.get_defaults() - config_dict.update(fake_services_dict) - config_dict['identity_api_version'] = '3' - cc = cloud_config.CloudConfig( - "test1", "region-al", config_dict, auth_plugin=mock.Mock()) - cc.get_legacy_client('identity', mock_client) - mock_client.assert_called_with( - version='3', - endpoint='http://example.com', - interface='admin', - endpoint_override=None, - region_name='region-al', - service_type='identity', - session=mock.ANY, - service_name='locks') diff --git a/os_client_config/tests/test_config.py b/os_client_config/tests/test_config.py deleted file mode 100644 index 09f603b..0000000 --- a/os_client_config/tests/test_config.py +++ /dev/null @@ -1,1096 +0,0 @@ -# Copyright (c) 2014 Hewlett-Packard Development Company, L.P. -# -# 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 argparse -import copy -import os - -import extras -import fixtures -import testtools -import yaml - -from openstack.config import defaults - -from os_client_config import cloud_config -from os_client_config import config -from os_client_config import exceptions -from os_client_config.tests import base - - -def prompt_for_password(prompt=None): - """Fake prompt function that just returns a constant string""" - return 'promptpass' - - -class TestConfig(base.TestCase): - - def test_get_all_clouds(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - secure_files=[self.no_yaml]) - clouds = c.get_all_clouds() - # We add one by hand because the regions cloud is going to exist - # twice since it has two regions in it - user_clouds = [ - cloud for cloud in base.USER_CONF['clouds'].keys() - ] + ['_test_cloud_regions'] - configured_clouds = [cloud.name for cloud in clouds] - self.assertItemsEqual(user_clouds, configured_clouds) - - def test_get_one_cloud(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cloud = c.get_one_cloud(validate=False) - self.assertIsInstance(cloud, cloud_config.CloudConfig) - self.assertEqual(cloud.name, '') - - def test_get_one_cloud_default_cloud_from_file(self): - single_conf = base._write_yaml({ - 'clouds': { - 'single': { - 'auth': { - 'auth_url': 'http://example.com/v2', - 'username': 'testuser', - 'password': 'testpass', - 'project_name': 'testproject', - }, - 'region_name': 'test-region', - } - } - }) - c = config.OpenStackConfig(config_files=[single_conf], - vendor_files=[self.vendor_yaml]) - cc = c.get_one_cloud() - self.assertEqual(cc.name, 'single') - - def test_get_one_cloud_auth_defaults(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml]) - cc = c.get_one_cloud(cloud='_test-cloud_', auth={'username': 'user'}) - self.assertEqual('user', cc.auth['username']) - self.assertEqual( - defaults._defaults['auth_type'], - cc.auth_type, - ) - self.assertEqual( - defaults._defaults['identity_api_version'], - cc.identity_api_version, - ) - - def test_get_one_cloud_auth_override_defaults(self): - default_options = {'compute_api_version': '4'} - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - override_defaults=default_options) - cc = c.get_one_cloud(cloud='_test-cloud_', auth={'username': 'user'}) - self.assertEqual('user', cc.auth['username']) - self.assertEqual('4', cc.compute_api_version) - self.assertEqual( - defaults._defaults['identity_api_version'], - cc.identity_api_version, - ) - - def test_get_one_cloud_with_config_files(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - secure_files=[self.secure_yaml]) - self.assertIsInstance(c.cloud_config, dict) - self.assertIn('cache', c.cloud_config) - self.assertIsInstance(c.cloud_config['cache'], dict) - self.assertIn('max_age', c.cloud_config['cache']) - self.assertIn('path', c.cloud_config['cache']) - cc = c.get_one_cloud('_test-cloud_') - self._assert_cloud_details(cc) - cc = c.get_one_cloud('_test_cloud_no_vendor') - self._assert_cloud_details(cc) - - def test_get_one_cloud_with_int_project_id(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cc = c.get_one_cloud('_test-cloud-int-project_') - self.assertEqual('12345', cc.auth['project_id']) - - def test_get_one_cloud_with_domain_id(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cc = c.get_one_cloud('_test-cloud-domain-id_') - self.assertEqual('6789', cc.auth['user_domain_id']) - self.assertEqual('123456789', cc.auth['project_domain_id']) - self.assertNotIn('domain_id', cc.auth) - self.assertNotIn('domain-id', cc.auth) - self.assertNotIn('domain_id', cc) - - def test_get_one_cloud_domain_scoped(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cc = c.get_one_cloud('_test-cloud-domain-scoped_') - self.assertEqual('12345', cc.auth['domain_id']) - self.assertNotIn('user_domain_id', cc.auth) - self.assertNotIn('project_domain_id', cc.auth) - - def test_get_one_cloud_infer_user_domain(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cc = c.get_one_cloud('_test-cloud-int-project_') - self.assertEqual('awesome-domain', cc.auth['user_domain_id']) - self.assertEqual('awesome-domain', cc.auth['project_domain_id']) - self.assertNotIn('domain_id', cc.auth) - self.assertNotIn('domain_id', cc) - - def test_get_one_cloud_with_hyphenated_project_id(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cc = c.get_one_cloud('_test_cloud_hyphenated') - self.assertEqual('12345', cc.auth['project_id']) - - def test_get_one_cloud_with_hyphenated_kwargs(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - args = { - 'auth': { - 'username': 'testuser', - 'password': 'testpass', - 'project-id': '12345', - 'auth-url': 'http://example.com/v2', - }, - 'region_name': 'test-region', - } - cc = c.get_one_cloud(**args) - self.assertEqual('http://example.com/v2', cc.auth['auth_url']) - - def test_no_environ(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - self.assertRaises( - exceptions.OpenStackConfigException, c.get_one_cloud, 'envvars') - - def test_fallthrough(self): - c = config.OpenStackConfig(config_files=[self.no_yaml], - vendor_files=[self.no_yaml], - secure_files=[self.no_yaml]) - for k in os.environ.keys(): - if k.startswith('OS_'): - self.useFixture(fixtures.EnvironmentVariable(k)) - c.get_one_cloud(cloud='defaults', validate=False) - - def test_prefer_ipv6_true(self): - c = config.OpenStackConfig(config_files=[self.no_yaml], - vendor_files=[self.no_yaml], - secure_files=[self.no_yaml]) - cc = c.get_one_cloud(cloud='defaults', validate=False) - self.assertTrue(cc.prefer_ipv6) - - def test_prefer_ipv6_false(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cc = c.get_one_cloud(cloud='_test-cloud_') - self.assertFalse(cc.prefer_ipv6) - - def test_force_ipv4_true(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cc = c.get_one_cloud(cloud='_test-cloud_') - self.assertTrue(cc.force_ipv4) - - def test_force_ipv4_false(self): - c = config.OpenStackConfig(config_files=[self.no_yaml], - vendor_files=[self.no_yaml], - secure_files=[self.no_yaml]) - cc = c.get_one_cloud(cloud='defaults', validate=False) - self.assertFalse(cc.force_ipv4) - - def test_get_one_cloud_auth_merge(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml]) - cc = c.get_one_cloud(cloud='_test-cloud_', auth={'username': 'user'}) - self.assertEqual('user', cc.auth['username']) - self.assertEqual('testpass', cc.auth['password']) - - def test_get_one_cloud_networks(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cc = c.get_one_cloud('_test-cloud-networks_') - self.assertEqual( - ['a-public', 'another-public', 'split-default'], - cc.get_external_networks()) - self.assertEqual( - ['a-private', 'another-private', 'split-no-default'], - cc.get_internal_networks()) - self.assertEqual('a-public', cc.get_nat_source()) - self.assertEqual('another-private', cc.get_nat_destination()) - self.assertEqual('another-public', cc.get_default_network()) - self.assertEqual( - ['a-public', 'another-public', 'split-no-default'], - cc.get_external_ipv4_networks()) - self.assertEqual( - ['a-public', 'another-public', 'split-default'], - cc.get_external_ipv6_networks()) - - def test_get_one_cloud_no_networks(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cc = c.get_one_cloud('_test-cloud-domain-scoped_') - self.assertEqual([], cc.get_external_networks()) - self.assertEqual([], cc.get_internal_networks()) - self.assertIsNone(cc.get_nat_source()) - self.assertIsNone(cc.get_nat_destination()) - self.assertIsNone(cc.get_default_network()) - - def test_only_secure_yaml(self): - c = config.OpenStackConfig(config_files=['nonexistent'], - vendor_files=['nonexistent'], - secure_files=[self.secure_yaml]) - cc = c.get_one_cloud(cloud='_test_cloud_no_vendor', validate=False) - self.assertEqual('testpass', cc.auth['password']) - - def test_get_cloud_names(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - secure_files=[self.no_yaml]) - self.assertEqual( - ['_test-cloud-domain-id_', - '_test-cloud-domain-scoped_', - '_test-cloud-int-project_', - '_test-cloud-networks_', - '_test-cloud_', - '_test-cloud_no_region', - '_test_cloud_hyphenated', - '_test_cloud_no_vendor', - '_test_cloud_regions', - ], - sorted(c.get_cloud_names())) - c = config.OpenStackConfig(config_files=[self.no_yaml], - vendor_files=[self.no_yaml], - secure_files=[self.no_yaml]) - for k in os.environ.keys(): - if k.startswith('OS_'): - self.useFixture(fixtures.EnvironmentVariable(k)) - c.get_one_cloud(cloud='defaults', validate=False) - self.assertEqual(['defaults'], sorted(c.get_cloud_names())) - - def test_set_one_cloud_creates_file(self): - config_dir = fixtures.TempDir() - self.useFixture(config_dir) - config_path = os.path.join(config_dir.path, 'clouds.yaml') - config.OpenStackConfig.set_one_cloud(config_path, '_test_cloud_') - self.assertTrue(os.path.isfile(config_path)) - with open(config_path) as fh: - self.assertEqual({'clouds': {'_test_cloud_': {}}}, - yaml.safe_load(fh)) - - def test_set_one_cloud_updates_cloud(self): - new_config = { - 'cloud': 'new_cloud', - 'auth': { - 'password': 'newpass' - } - } - - resulting_cloud_config = { - 'auth': { - 'password': 'newpass', - 'username': 'testuser', - 'auth_url': 'http://example.com/v2', - }, - 'cloud': 'new_cloud', - 'profile': '_test_cloud_in_our_cloud', - 'region_name': 'test-region' - } - resulting_config = copy.deepcopy(base.USER_CONF) - resulting_config['clouds']['_test-cloud_'] = resulting_cloud_config - config.OpenStackConfig.set_one_cloud(self.cloud_yaml, '_test-cloud_', - new_config) - with open(self.cloud_yaml) as fh: - written_config = yaml.safe_load(fh) - # We write a cache config for testing - written_config['cache'].pop('path', None) - self.assertEqual(written_config, resulting_config) - - def test_get_region_no_region_default(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - secure_files=[self.no_yaml]) - region = c._get_region(cloud='_test-cloud_no_region') - self.assertEqual(region, {'name': '', 'values': {}}) - - def test_get_region_no_region(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - secure_files=[self.no_yaml]) - region = c._get_region(cloud='_test-cloud_no_region', - region_name='override-region') - self.assertEqual(region, {'name': 'override-region', 'values': {}}) - - def test_get_region_region_is_none(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - secure_files=[self.no_yaml]) - region = c._get_region(cloud='_test-cloud_no_region', region_name=None) - self.assertEqual(region, {'name': '', 'values': {}}) - - def test_get_region_region_set(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - secure_files=[self.no_yaml]) - region = c._get_region(cloud='_test-cloud_', region_name='test-region') - self.assertEqual(region, {'name': 'test-region', 'values': {}}) - - def test_get_region_many_regions_default(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - secure_files=[self.no_yaml]) - region = c._get_region(cloud='_test_cloud_regions', - region_name='') - self.assertEqual(region, {'name': 'region1', 'values': - {'external_network': 'region1-network'}}) - - def test_get_region_many_regions(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - secure_files=[self.no_yaml]) - region = c._get_region(cloud='_test_cloud_regions', - region_name='region2') - self.assertEqual(region, {'name': 'region2', 'values': - {'external_network': 'my-network'}}) - - def test_get_region_invalid_region(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - secure_files=[self.no_yaml]) - self.assertRaises( - exceptions.OpenStackConfigException, c._get_region, - cloud='_test_cloud_regions', region_name='invalid-region') - - def test_get_region_no_cloud(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - secure_files=[self.no_yaml]) - region = c._get_region(region_name='no-cloud-region') - self.assertEqual(region, {'name': 'no-cloud-region', 'values': {}}) - - -class TestExcludedFormattedConfigValue(base.TestCase): - # verify LaunchPad bug #1635696 - # - # get_one_cloud() and get_one_cloud_osc() iterate over config - # values and try to expand any variables in those values by - # calling value.format(), however some config values - # (e.g. password) should never have format() applied to them, not - # only might that change the password but it will also cause the - # format() function to raise an exception if it can not parse the - # format string. Examples would be single brace (e.g. 'foo{') - # which raises an ValueError because it's looking for a matching - # end brace or a brace pair with a key value that cannot be found - # (e.g. 'foo{bar}') which raises a KeyError. - - def setUp(self): - super(TestExcludedFormattedConfigValue, self).setUp() - - self.args = dict( - auth_url='http://example.com/v2', - username='user', - project_name='project', - region_name='region2', - snack_type='cookie', - os_auth_token='no-good-things', - ) - - self.options = argparse.Namespace(**self.args) - - def test_get_one_cloud_password_brace(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - password = 'foo{' # Would raise ValueError, single brace - self.options.password = password - cc = c.get_one_cloud( - cloud='_test_cloud_regions', argparse=self.options, validate=False) - self.assertEqual(cc.password, password) - - password = 'foo{bar}' # Would raise KeyError, 'bar' not found - self.options.password = password - cc = c.get_one_cloud( - cloud='_test_cloud_regions', argparse=self.options, validate=False) - self.assertEqual(cc.password, password) - - def test_get_one_cloud_osc_password_brace(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - password = 'foo{' # Would raise ValueError, single brace - self.options.password = password - cc = c.get_one_cloud_osc( - cloud='_test_cloud_regions', argparse=self.options, validate=False) - self.assertEqual(cc.password, password) - - password = 'foo{bar}' # Would raise KeyError, 'bar' not found - self.options.password = password - cc = c.get_one_cloud_osc( - cloud='_test_cloud_regions', argparse=self.options, validate=False) - self.assertEqual(cc.password, password) - - -class TestConfigArgparse(base.TestCase): - - def setUp(self): - super(TestConfigArgparse, self).setUp() - - self.args = dict( - auth_url='http://example.com/v2', - username='user', - password='password', - project_name='project', - region_name='region2', - snack_type='cookie', - os_auth_token='no-good-things', - ) - - self.options = argparse.Namespace(**self.args) - - def test_get_one_cloud_bad_region_argparse(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - self.assertRaises( - exceptions.OpenStackConfigException, c.get_one_cloud, - cloud='_test-cloud_', argparse=self.options) - - def test_get_one_cloud_argparse(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - cc = c.get_one_cloud( - cloud='_test_cloud_regions', argparse=self.options, validate=False) - self.assertEqual(cc.region_name, 'region2') - self.assertEqual(cc.snack_type, 'cookie') - - def test_get_one_cloud_precedence(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - kwargs = { - 'auth': { - 'username': 'testuser', - 'password': 'authpass', - 'project-id': 'testproject', - 'auth_url': 'http://example.com/v2', - }, - 'region_name': 'kwarg_region', - 'password': 'ansible_password', - 'arbitrary': 'value', - } - - args = dict( - auth_url='http://example.com/v2', - username='user', - password='argpass', - project_name='project', - region_name='region2', - snack_type='cookie', - ) - - options = argparse.Namespace(**args) - cc = c.get_one_cloud( - argparse=options, **kwargs) - self.assertEqual(cc.region_name, 'region2') - self.assertEqual(cc.auth['password'], 'authpass') - self.assertEqual(cc.snack_type, 'cookie') - - def test_get_one_cloud_precedence_osc(self): - c = config.OpenStackConfig( - config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - ) - - kwargs = { - 'auth': { - 'username': 'testuser', - 'password': 'authpass', - 'project-id': 'testproject', - 'auth_url': 'http://example.com/v2', - }, - 'region_name': 'kwarg_region', - 'password': 'ansible_password', - 'arbitrary': 'value', - } - - args = dict( - auth_url='http://example.com/v2', - username='user', - password='argpass', - project_name='project', - region_name='region2', - snack_type='cookie', - ) - - options = argparse.Namespace(**args) - cc = c.get_one_cloud_osc( - argparse=options, - **kwargs - ) - self.assertEqual(cc.region_name, 'region2') - self.assertEqual(cc.auth['password'], 'argpass') - self.assertEqual(cc.snack_type, 'cookie') - - def test_get_one_cloud_precedence_no_argparse(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - kwargs = { - 'auth': { - 'username': 'testuser', - 'password': 'authpass', - 'project-id': 'testproject', - 'auth_url': 'http://example.com/v2', - }, - 'region_name': 'kwarg_region', - 'password': 'ansible_password', - 'arbitrary': 'value', - } - - cc = c.get_one_cloud(**kwargs) - self.assertEqual(cc.region_name, 'kwarg_region') - self.assertEqual(cc.auth['password'], 'authpass') - self.assertIsNone(cc.password) - - def test_get_one_cloud_just_argparse(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - cc = c.get_one_cloud(argparse=self.options, validate=False) - self.assertIsNone(cc.cloud) - self.assertEqual(cc.region_name, 'region2') - self.assertEqual(cc.snack_type, 'cookie') - - def test_get_one_cloud_just_kwargs(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - cc = c.get_one_cloud(validate=False, **self.args) - self.assertIsNone(cc.cloud) - self.assertEqual(cc.region_name, 'region2') - self.assertEqual(cc.snack_type, 'cookie') - - def test_get_one_cloud_dash_kwargs(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - args = { - 'auth-url': 'http://example.com/v2', - 'username': 'user', - 'password': 'password', - 'project_name': 'project', - 'region_name': 'other-test-region', - 'snack_type': 'cookie', - } - cc = c.get_one_cloud(**args) - self.assertIsNone(cc.cloud) - self.assertEqual(cc.region_name, 'other-test-region') - self.assertEqual(cc.snack_type, 'cookie') - - def test_get_one_cloud_no_argparse(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - cc = c.get_one_cloud(cloud='_test-cloud_', argparse=None) - self._assert_cloud_details(cc) - self.assertEqual(cc.region_name, 'test-region') - self.assertIsNone(cc.snack_type) - - def test_get_one_cloud_no_argparse_regions(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - cc = c.get_one_cloud(cloud='_test_cloud_regions', argparse=None) - self._assert_cloud_details(cc) - self.assertEqual(cc.region_name, 'region1') - self.assertIsNone(cc.snack_type) - - def test_get_one_cloud_bad_region(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - self.assertRaises( - exceptions.OpenStackConfigException, - c.get_one_cloud, - cloud='_test_cloud_regions', region_name='bad') - - def test_get_one_cloud_bad_region_no_regions(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - self.assertRaises( - exceptions.OpenStackConfigException, - c.get_one_cloud, - cloud='_test-cloud_', region_name='bad_region') - - def test_get_one_cloud_no_argparse_region2(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - cc = c.get_one_cloud( - cloud='_test_cloud_regions', region_name='region2', argparse=None) - self._assert_cloud_details(cc) - self.assertEqual(cc.region_name, 'region2') - self.assertIsNone(cc.snack_type) - - def test_get_one_cloud_network(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - cc = c.get_one_cloud( - cloud='_test_cloud_regions', region_name='region1', argparse=None) - self._assert_cloud_details(cc) - self.assertEqual(cc.region_name, 'region1') - self.assertEqual('region1-network', cc.config['external_network']) - - def test_get_one_cloud_per_region_network(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - cc = c.get_one_cloud( - cloud='_test_cloud_regions', region_name='region2', argparse=None) - self._assert_cloud_details(cc) - self.assertEqual(cc.region_name, 'region2') - self.assertEqual('my-network', cc.config['external_network']) - - def test_get_one_cloud_no_yaml_no_cloud(self): - c = config.OpenStackConfig(load_yaml_config=False) - - self.assertRaises( - exceptions.OpenStackConfigException, - c.get_one_cloud, - cloud='_test_cloud_regions', region_name='region2', argparse=None) - - def test_get_one_cloud_no_yaml(self): - c = config.OpenStackConfig(load_yaml_config=False) - - cc = c.get_one_cloud( - region_name='region2', argparse=None, - **base.USER_CONF['clouds']['_test_cloud_regions']) - # Not using assert_cloud_details because of cache settings which - # are not present without the file - self.assertIsInstance(cc, cloud_config.CloudConfig) - self.assertTrue(extras.safe_hasattr(cc, 'auth')) - self.assertIsInstance(cc.auth, dict) - self.assertIsNone(cc.cloud) - self.assertIn('username', cc.auth) - self.assertEqual('testuser', cc.auth['username']) - self.assertEqual('testpass', cc.auth['password']) - self.assertFalse(cc.config['image_api_use_tasks']) - self.assertTrue('project_name' in cc.auth or 'project_id' in cc.auth) - if 'project_name' in cc.auth: - self.assertEqual('testproject', cc.auth['project_name']) - elif 'project_id' in cc.auth: - self.assertEqual('testproject', cc.auth['project_id']) - self.assertEqual(cc.region_name, 'region2') - - def test_fix_env_args(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - env_args = {'os-compute-api-version': 1} - fixed_args = c._fix_args(env_args) - - self.assertDictEqual({'compute_api_version': 1}, fixed_args) - - def test_extra_config(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - defaults = {'use_hostnames': False, 'other-value': 'something'} - ansible_options = c.get_extra_config('ansible', defaults) - - # This should show that the default for use_hostnames above is - # overridden by the value in the config file defined in base.py - # It should also show that other-value key is normalized and passed - # through even though there is no corresponding value in the config - # file, and that expand-hostvars key is normalized and the value - # from the config comes through even though there is no default. - self.assertDictEqual( - { - 'expand_hostvars': False, - 'use_hostnames': True, - 'other_value': 'something', - }, - ansible_options) - - def test_register_argparse_cloud(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - parser = argparse.ArgumentParser() - c.register_argparse_arguments(parser, []) - opts, _remain = parser.parse_known_args(['--os-cloud', 'foo']) - self.assertEqual(opts.os_cloud, 'foo') - - def test_env_argparse_precedence(self): - self.useFixture(fixtures.EnvironmentVariable( - 'OS_TENANT_NAME', 'tenants-are-bad')) - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - cc = c.get_one_cloud( - cloud='envvars', argparse=self.options, validate=False) - self.assertEqual(cc.auth['project_name'], 'project') - - def test_argparse_default_no_token(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - parser = argparse.ArgumentParser() - c.register_argparse_arguments(parser, []) - # novaclient will add this - parser.add_argument('--os-auth-token') - opts, _remain = parser.parse_known_args() - cc = c.get_one_cloud( - cloud='_test_cloud_regions', argparse=opts) - self.assertEqual(cc.config['auth_type'], 'password') - self.assertNotIn('token', cc.config['auth']) - - def test_argparse_token(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - - parser = argparse.ArgumentParser() - c.register_argparse_arguments(parser, []) - # novaclient will add this - parser.add_argument('--os-auth-token') - opts, _remain = parser.parse_known_args( - ['--os-auth-token', 'very-bad-things', - '--os-auth-type', 'token']) - cc = c.get_one_cloud(argparse=opts, validate=False) - self.assertEqual(cc.config['auth_type'], 'token') - self.assertEqual(cc.config['auth']['token'], 'very-bad-things') - - def test_argparse_underscores(self): - c = config.OpenStackConfig(config_files=[self.no_yaml], - vendor_files=[self.no_yaml], - secure_files=[self.no_yaml]) - parser = argparse.ArgumentParser() - parser.add_argument('--os_username') - argv = [ - '--os_username', 'user', '--os_password', 'pass', - '--os-auth-url', 'auth-url', '--os-project-name', 'project'] - c.register_argparse_arguments(parser, argv=argv) - opts, _remain = parser.parse_known_args(argv) - cc = c.get_one_cloud(argparse=opts) - self.assertEqual(cc.config['auth']['username'], 'user') - self.assertEqual(cc.config['auth']['password'], 'pass') - self.assertEqual(cc.config['auth']['auth_url'], 'auth-url') - - def test_argparse_action_append_no_underscore(self): - c = config.OpenStackConfig(config_files=[self.no_yaml], - vendor_files=[self.no_yaml], - secure_files=[self.no_yaml]) - parser = argparse.ArgumentParser() - parser.add_argument('--foo', action='append') - argv = ['--foo', '1', '--foo', '2'] - c.register_argparse_arguments(parser, argv=argv) - opts, _remain = parser.parse_known_args(argv) - self.assertEqual(opts.foo, ['1', '2']) - - def test_argparse_underscores_duplicate(self): - c = config.OpenStackConfig(config_files=[self.no_yaml], - vendor_files=[self.no_yaml], - secure_files=[self.no_yaml]) - parser = argparse.ArgumentParser() - parser.add_argument('--os_username') - argv = [ - '--os_username', 'user', '--os_password', 'pass', - '--os-username', 'user1', '--os-password', 'pass1', - '--os-auth-url', 'auth-url', '--os-project-name', 'project'] - self.assertRaises( - exceptions.OpenStackConfigException, - c.register_argparse_arguments, - parser=parser, argv=argv) - - def test_register_argparse_bad_plugin(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - parser = argparse.ArgumentParser() - self.assertRaises( - exceptions.OpenStackConfigException, - c.register_argparse_arguments, - parser, ['--os-auth-type', 'foo']) - - def test_register_argparse_not_password(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - parser = argparse.ArgumentParser() - args = [ - '--os-auth-type', 'v3token', - '--os-token', 'some-secret', - ] - c.register_argparse_arguments(parser, args) - opts, _remain = parser.parse_known_args(args) - self.assertEqual(opts.os_token, 'some-secret') - - def test_register_argparse_password(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - parser = argparse.ArgumentParser() - args = [ - '--os-password', 'some-secret', - ] - c.register_argparse_arguments(parser, args) - opts, _remain = parser.parse_known_args(args) - self.assertEqual(opts.os_password, 'some-secret') - with testtools.ExpectedException(AttributeError): - opts.os_token - - def test_register_argparse_service_type(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - parser = argparse.ArgumentParser() - args = [ - '--os-service-type', 'network', - '--os-endpoint-type', 'admin', - '--http-timeout', '20', - ] - c.register_argparse_arguments(parser, args) - opts, _remain = parser.parse_known_args(args) - self.assertEqual(opts.os_service_type, 'network') - self.assertEqual(opts.os_endpoint_type, 'admin') - self.assertEqual(opts.http_timeout, '20') - with testtools.ExpectedException(AttributeError): - opts.os_network_service_type - cloud = c.get_one_cloud(argparse=opts, validate=False) - self.assertEqual(cloud.config['service_type'], 'network') - self.assertEqual(cloud.config['interface'], 'admin') - self.assertEqual(cloud.config['api_timeout'], '20') - self.assertNotIn('http_timeout', cloud.config) - - def test_register_argparse_network_service_type(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - parser = argparse.ArgumentParser() - args = [ - '--os-endpoint-type', 'admin', - '--network-api-version', '4', - ] - c.register_argparse_arguments(parser, args, ['network']) - opts, _remain = parser.parse_known_args(args) - self.assertEqual(opts.os_service_type, 'network') - self.assertEqual(opts.os_endpoint_type, 'admin') - self.assertIsNone(opts.os_network_service_type) - self.assertIsNone(opts.os_network_api_version) - self.assertEqual(opts.network_api_version, '4') - cloud = c.get_one_cloud(argparse=opts, validate=False) - self.assertEqual(cloud.config['service_type'], 'network') - self.assertEqual(cloud.config['interface'], 'admin') - self.assertEqual(cloud.config['network_api_version'], '4') - self.assertNotIn('http_timeout', cloud.config) - - def test_register_argparse_network_service_types(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - parser = argparse.ArgumentParser() - args = [ - '--os-compute-service-name', 'cloudServers', - '--os-network-service-type', 'badtype', - '--os-endpoint-type', 'admin', - '--network-api-version', '4', - ] - c.register_argparse_arguments( - parser, args, ['compute', 'network', 'volume']) - opts, _remain = parser.parse_known_args(args) - self.assertEqual(opts.os_network_service_type, 'badtype') - self.assertIsNone(opts.os_compute_service_type) - self.assertIsNone(opts.os_volume_service_type) - self.assertEqual(opts.os_service_type, 'compute') - self.assertEqual(opts.os_compute_service_name, 'cloudServers') - self.assertEqual(opts.os_endpoint_type, 'admin') - self.assertIsNone(opts.os_network_api_version) - self.assertEqual(opts.network_api_version, '4') - cloud = c.get_one_cloud(argparse=opts, validate=False) - self.assertEqual(cloud.config['service_type'], 'compute') - self.assertEqual(cloud.config['network_service_type'], 'badtype') - self.assertEqual(cloud.config['interface'], 'admin') - self.assertEqual(cloud.config['network_api_version'], '4') - self.assertNotIn('volume_service_type', cloud.config) - self.assertNotIn('http_timeout', cloud.config) - - -class TestConfigPrompt(base.TestCase): - - def setUp(self): - super(TestConfigPrompt, self).setUp() - - self.args = dict( - auth_url='http://example.com/v2', - username='user', - project_name='project', - # region_name='region2', - auth_type='password', - ) - - self.options = argparse.Namespace(**self.args) - - def test_get_one_cloud_prompt(self): - c = config.OpenStackConfig( - config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - pw_func=prompt_for_password, - ) - - # This needs a cloud definition without a password. - # If this starts failing unexpectedly check that the cloud_yaml - # and/or vendor_yaml do not have a password in the selected cloud. - cc = c.get_one_cloud( - cloud='_test_cloud_no_vendor', - argparse=self.options, - ) - self.assertEqual('promptpass', cc.auth['password']) - - -class TestConfigDefault(base.TestCase): - - def setUp(self): - super(TestConfigDefault, self).setUp() - - # Reset defaults after each test so that other tests are - # not affected by any changes. - self.addCleanup(self._reset_defaults) - - def _reset_defaults(self): - defaults._defaults = None - - def test_set_no_default(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cc = c.get_one_cloud(cloud='_test-cloud_', argparse=None) - self._assert_cloud_details(cc) - self.assertEqual('password', cc.auth_type) - - -class TestBackwardsCompatibility(base.TestCase): - - def test_set_no_default(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cloud = { - 'identity_endpoint_type': 'admin', - 'compute_endpoint_type': 'private', - 'endpoint_type': 'public', - 'auth_type': 'v3password', - } - result = c._fix_backwards_interface(cloud) - expected = { - 'identity_interface': 'admin', - 'compute_interface': 'private', - 'interface': 'public', - 'auth_type': 'v3password', - } - self.assertDictEqual(expected, result) - - def test_project_v2password(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cloud = { - 'auth_type': 'v2password', - 'auth': { - 'project-name': 'my_project_name', - 'project-id': 'my_project_id' - } - } - result = c._fix_backwards_project(cloud) - expected = { - 'auth_type': 'v2password', - 'auth': { - 'tenant_name': 'my_project_name', - 'tenant_id': 'my_project_id' - } - } - self.assertEqual(expected, result) - - def test_project_password(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cloud = { - 'auth_type': 'password', - 'auth': { - 'project-name': 'my_project_name', - 'project-id': 'my_project_id' - } - } - result = c._fix_backwards_project(cloud) - expected = { - 'auth_type': 'password', - 'auth': { - 'project_name': 'my_project_name', - 'project_id': 'my_project_id' - } - } - self.assertEqual(expected, result) - - def test_backwards_network_fail(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cloud = { - 'external_network': 'public', - 'networks': [ - {'name': 'private', 'routes_externally': False}, - ] - } - self.assertRaises( - exceptions.OpenStackConfigException, - c._fix_backwards_networks, cloud) - - def test_backwards_network(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cloud = { - 'external_network': 'public', - 'internal_network': 'private', - } - result = c._fix_backwards_networks(cloud) - expected = { - 'external_network': 'public', - 'internal_network': 'private', - 'networks': [ - {'name': 'public', 'routes_externally': True, - 'nat_destination': False, 'default_interface': True}, - {'name': 'private', 'routes_externally': False, - 'nat_destination': True, 'default_interface': False}, - ] - } - self.assertEqual(expected, result) - - def test_normalize_network(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cloud = { - 'networks': [ - {'name': 'private'} - ] - } - result = c._fix_backwards_networks(cloud) - expected = { - 'networks': [ - {'name': 'private', 'routes_externally': False, - 'nat_destination': False, 'default_interface': False, - 'nat_source': False, - 'routes_ipv4_externally': False, - 'routes_ipv6_externally': False}, - ] - } - self.assertEqual(expected, result) - - def test_single_default_interface(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cloud = { - 'networks': [ - {'name': 'blue', 'default_interface': True}, - {'name': 'purple', 'default_interface': True}, - ] - } - self.assertRaises( - exceptions.OpenStackConfigException, - c._fix_backwards_networks, cloud) diff --git a/os_client_config/tests/test_environ.py b/os_client_config/tests/test_environ.py deleted file mode 100644 index 35ce2f2..0000000 --- a/os_client_config/tests/test_environ.py +++ /dev/null @@ -1,185 +0,0 @@ -# Copyright (c) 2014 Hewlett-Packard Development Company, L.P. -# -# 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. - - -from os_client_config import cloud_config -from os_client_config import config -from os_client_config import exceptions -from os_client_config.tests import base - -import fixtures - - -class TestEnviron(base.TestCase): - - def setUp(self): - super(TestEnviron, self).setUp() - self.useFixture( - fixtures.EnvironmentVariable('OS_AUTH_URL', 'https://example.com')) - self.useFixture( - fixtures.EnvironmentVariable('OS_USERNAME', 'testuser')) - self.useFixture( - fixtures.EnvironmentVariable('OS_PASSWORD', 'testpass')) - self.useFixture( - fixtures.EnvironmentVariable('OS_PROJECT_NAME', 'testproject')) - self.useFixture( - fixtures.EnvironmentVariable('NOVA_PROJECT_ID', 'testnova')) - - def test_get_one_cloud(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - self.assertIsInstance(c.get_one_cloud(), cloud_config.CloudConfig) - - def test_no_fallthrough(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - self.assertRaises( - exceptions.OpenStackConfigException, c.get_one_cloud, 'openstack') - - def test_envvar_name_override(self): - self.useFixture( - fixtures.EnvironmentVariable('OS_CLOUD_NAME', 'override')) - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cc = c.get_one_cloud('override') - self._assert_cloud_details(cc) - - def test_envvar_prefer_ipv6_override(self): - self.useFixture( - fixtures.EnvironmentVariable('OS_PREFER_IPV6', 'false')) - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - secure_files=[self.secure_yaml]) - cc = c.get_one_cloud('_test-cloud_') - self.assertFalse(cc.prefer_ipv6) - - def test_environ_exists(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - secure_files=[self.secure_yaml]) - cc = c.get_one_cloud('envvars') - self._assert_cloud_details(cc) - self.assertNotIn('auth_url', cc.config) - self.assertIn('auth_url', cc.config['auth']) - self.assertNotIn('project_id', cc.config['auth']) - self.assertNotIn('auth_url', cc.config) - cc = c.get_one_cloud('_test-cloud_') - self._assert_cloud_details(cc) - cc = c.get_one_cloud('_test_cloud_no_vendor') - self._assert_cloud_details(cc) - - def test_environ_prefix(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - envvar_prefix='NOVA_', - secure_files=[self.secure_yaml]) - cc = c.get_one_cloud('envvars') - self._assert_cloud_details(cc) - self.assertNotIn('auth_url', cc.config) - self.assertIn('auth_url', cc.config['auth']) - self.assertIn('project_id', cc.config['auth']) - self.assertNotIn('auth_url', cc.config) - cc = c.get_one_cloud('_test-cloud_') - self._assert_cloud_details(cc) - cc = c.get_one_cloud('_test_cloud_no_vendor') - self._assert_cloud_details(cc) - - def test_get_one_cloud_with_config_files(self): - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - secure_files=[self.secure_yaml]) - self.assertIsInstance(c.cloud_config, dict) - self.assertIn('cache', c.cloud_config) - self.assertIsInstance(c.cloud_config['cache'], dict) - self.assertIn('max_age', c.cloud_config['cache']) - self.assertIn('path', c.cloud_config['cache']) - cc = c.get_one_cloud('_test-cloud_') - self._assert_cloud_details(cc) - cc = c.get_one_cloud('_test_cloud_no_vendor') - self._assert_cloud_details(cc) - - def test_config_file_override(self): - self.useFixture( - fixtures.EnvironmentVariable( - 'OS_CLIENT_CONFIG_FILE', self.cloud_yaml)) - c = config.OpenStackConfig(config_files=[], - vendor_files=[self.vendor_yaml]) - cc = c.get_one_cloud('_test-cloud_') - self._assert_cloud_details(cc) - - -class TestEnvvars(base.TestCase): - - def test_no_envvars(self): - self.useFixture( - fixtures.EnvironmentVariable('NOVA_USERNAME', 'nova')) - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - self.assertRaises( - exceptions.OpenStackConfigException, c.get_one_cloud, 'envvars') - - def test_test_envvars(self): - self.useFixture( - fixtures.EnvironmentVariable('NOVA_USERNAME', 'nova')) - self.useFixture( - fixtures.EnvironmentVariable('OS_STDERR_CAPTURE', 'True')) - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - self.assertRaises( - exceptions.OpenStackConfigException, c.get_one_cloud, 'envvars') - - def test_incomplete_envvars(self): - self.useFixture( - fixtures.EnvironmentVariable('NOVA_USERNAME', 'nova')) - self.useFixture( - fixtures.EnvironmentVariable('OS_USERNAME', 'user')) - config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - # This is broken due to an issue that's fixed in a subsequent patch - # commenting it out in this patch to keep the patch size reasonable - # self.assertRaises( - # keystoneauth1.exceptions.auth_plugins.MissingRequiredOptions, - # c.get_one_cloud, 'envvars') - - def test_have_envvars(self): - self.useFixture( - fixtures.EnvironmentVariable('NOVA_USERNAME', 'nova')) - self.useFixture( - fixtures.EnvironmentVariable('OS_AUTH_URL', 'http://example.com')) - self.useFixture( - fixtures.EnvironmentVariable('OS_USERNAME', 'user')) - self.useFixture( - fixtures.EnvironmentVariable('OS_PASSWORD', 'password')) - self.useFixture( - fixtures.EnvironmentVariable('OS_PROJECT_NAME', 'project')) - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml]) - cc = c.get_one_cloud('envvars') - self.assertEqual(cc.config['auth']['username'], 'user') - - def test_old_envvars(self): - self.useFixture( - fixtures.EnvironmentVariable('NOVA_USERNAME', 'nova')) - self.useFixture( - fixtures.EnvironmentVariable( - 'NOVA_AUTH_URL', 'http://example.com')) - self.useFixture( - fixtures.EnvironmentVariable('NOVA_PASSWORD', 'password')) - self.useFixture( - fixtures.EnvironmentVariable('NOVA_PROJECT_NAME', 'project')) - c = config.OpenStackConfig(config_files=[self.cloud_yaml], - vendor_files=[self.vendor_yaml], - envvar_prefix='NOVA_') - cc = c.get_one_cloud('envvars') - self.assertEqual(cc.config['auth']['username'], 'nova') diff --git a/os_client_config/tests/test_import_vendors.py b/os_client_config/tests/test_import_vendors.py deleted file mode 100644 index ba8800a..0000000 --- a/os_client_config/tests/test_import_vendors.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2014 Hewlett-Packard Development Company, L.P. -# -# 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. - -from os_client_config.tests import base - - -class TestImportVendors(base.TestCase): - - def test_get_profile(self): - import os_client_config # noqa - os_client_config.vendors.get_profile(profile_name="dummy") diff --git a/os_client_config/tests/test_init.py b/os_client_config/tests/test_init.py deleted file mode 100644 index 5b4fab9..0000000 --- a/os_client_config/tests/test_init.py +++ /dev/null @@ -1,35 +0,0 @@ -# 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 argparse - -import os_client_config -from os_client_config.tests import base - - -class TestInit(base.TestCase): - def test_get_config_without_arg_parser(self): - cloud_config = os_client_config.get_config( - options=None, validate=False) - self.assertIsInstance( - cloud_config, - os_client_config.cloud_config.CloudConfig - ) - - def test_get_config_with_arg_parser(self): - cloud_config = os_client_config.get_config( - options=argparse.ArgumentParser(), - validate=False) - self.assertIsInstance( - cloud_config, - os_client_config.cloud_config.CloudConfig - ) diff --git a/os_client_config/vendors/__init__.py b/os_client_config/vendors/__init__.py deleted file mode 100644 index 231f619..0000000 --- a/os_client_config/vendors/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2014 Hewlett-Packard Development Company, L.P. -# -# 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. - -from openstack.config.vendors import get_profile # noqa diff --git a/releasenotes/notes/catch-up-release-notes-e385fad34e9f3d6e.yaml b/releasenotes/notes/catch-up-release-notes-e385fad34e9f3d6e.yaml deleted file mode 100644 index e7b98af..0000000 --- a/releasenotes/notes/catch-up-release-notes-e385fad34e9f3d6e.yaml +++ /dev/null @@ -1,22 +0,0 @@ ---- -prelude: > - Swiftclient instantiation now provides authentication - information so that long lived swiftclient objects can - reauthenticate if necessary. This should be a temporary - situation until swiftclient supports keystoneauth - sessions at which point os-client-config will instantiate - swiftclient with a keystoneauth session. -features: - - Swiftclient instantiation now provides authentication - information so that long lived swiftclient objects can - reauthenticate if necessary. - - Add support for explicit v2password auth type. - - Add SSL support to VEXXHOST vendor profile. - - Add zetta.io cloud vendor profile. -fixes: - - Fix bug where project_domain_{name,id} was set even - if project_{name,id} was not set. -other: - - HPCloud vendor profile removed due to cloud shutdown. - - RunAbove vendor profile removed due to migration to - OVH. diff --git a/releasenotes/notes/cloud-profile-status-e0d29b5e2f10e95c.yaml b/releasenotes/notes/cloud-profile-status-e0d29b5e2f10e95c.yaml deleted file mode 100644 index b447ed0..0000000 --- a/releasenotes/notes/cloud-profile-status-e0d29b5e2f10e95c.yaml +++ /dev/null @@ -1,6 +0,0 @@ ---- -features: - - Add a field to vendor cloud profiles to indicate - active, deprecated and shutdown status. A message to - the user is triggered when attempting to use cloud - with either deprecated or shutdown status. diff --git a/releasenotes/notes/default-cloud-7ee0bcb9e5dd24b9.yaml b/releasenotes/notes/default-cloud-7ee0bcb9e5dd24b9.yaml deleted file mode 100644 index 49aba3c..0000000 --- a/releasenotes/notes/default-cloud-7ee0bcb9e5dd24b9.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -issues: - - If there was only one cloud defined in clouds.yaml - os-client-config was requiring the cloud parameter - be passed. This is inconsistent with how the envvars - cloud works which WILL work without setting the cloud - parameter if it's the only cloud. diff --git a/releasenotes/notes/fix-compat-with-old-keystoneauth-66e11ee9d008b962.yaml b/releasenotes/notes/fix-compat-with-old-keystoneauth-66e11ee9d008b962.yaml deleted file mode 100644 index 80d09fb..0000000 --- a/releasenotes/notes/fix-compat-with-old-keystoneauth-66e11ee9d008b962.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -issues: - - Fixed a regression when using latest os-client-config with - the keystoneauth from stable/newton. Although this isn't a - super common combination, the added feature that broke the - interaction is really not worthy of the incompatibility, so - a workaround was added. diff --git a/releasenotes/notes/fix-vendor-import-ebd4ade0d5c17146.yaml b/releasenotes/notes/fix-vendor-import-ebd4ade0d5c17146.yaml deleted file mode 100644 index af221b9..0000000 --- a/releasenotes/notes/fix-vendor-import-ebd4ade0d5c17146.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- -fixes: - - | - Fixed regression in vendor data importing caused by the merge with - openstacksdk. diff --git a/releasenotes/notes/goodbye-python2-40feeeb4be3e06c5.yaml b/releasenotes/notes/goodbye-python2-40feeeb4be3e06c5.yaml deleted file mode 100644 index c0af997..0000000 --- a/releasenotes/notes/goodbye-python2-40feeeb4be3e06c5.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- -upgrade: - - | - Python 2.7 support has been dropped. The minimum version of Python now - supported by os-client-config is Python 3.6. diff --git a/releasenotes/notes/ironic-microversion-ba5b0f36f11196a6.yaml b/releasenotes/notes/ironic-microversion-ba5b0f36f11196a6.yaml deleted file mode 100644 index 62e3627..0000000 --- a/releasenotes/notes/ironic-microversion-ba5b0f36f11196a6.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -features: - - Add support for passing Ironic microversion to the ironicclient - constructor in get_legacy_client. diff --git a/releasenotes/notes/load-yaml-3177efca78e5c67a.yaml b/releasenotes/notes/load-yaml-3177efca78e5c67a.yaml deleted file mode 100644 index 2438f83..0000000 --- a/releasenotes/notes/load-yaml-3177efca78e5c67a.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -features: - - Added a flag, 'load_yaml_config' that defaults to True. - If set to false, no clouds.yaml files will be loaded. This - is beneficial if os-client-config wants to be used inside of - a service where end-user clouds.yaml files would make things - more confusing. diff --git a/releasenotes/notes/magic-fixes-dca4ae4dac2441a8.yaml b/releasenotes/notes/magic-fixes-dca4ae4dac2441a8.yaml deleted file mode 100644 index 570e4dc..0000000 --- a/releasenotes/notes/magic-fixes-dca4ae4dac2441a8.yaml +++ /dev/null @@ -1,6 +0,0 @@ ---- -fixes: - - Refactor ``OpenStackConfig._fix_backward_madness()`` into - ``OpenStackConfig.magic_fixes()`` that allows subclasses - to inject more fixup magic into the flow during - ``get_one_cloud()`` processing. diff --git a/releasenotes/notes/make-rest-client-dd3d365632a26fa0.yaml b/releasenotes/notes/make-rest-client-dd3d365632a26fa0.yaml deleted file mode 100644 index 8e34e51..0000000 --- a/releasenotes/notes/make-rest-client-dd3d365632a26fa0.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -deprecations: - - Renamed session_client to make_rest_client. session_client - will continue to be supported for backwards compatability. diff --git a/releasenotes/notes/make-rest-client-version-discovery-84125700f159491a.yaml b/releasenotes/notes/make-rest-client-version-discovery-84125700f159491a.yaml deleted file mode 100644 index 7326978..0000000 --- a/releasenotes/notes/make-rest-client-version-discovery-84125700f159491a.yaml +++ /dev/null @@ -1,6 +0,0 @@ ---- -features: - - Add version argument to make_rest_client and plumb - version discovery through get_session_client so that - versioned endpoints are properly found if unversioned - are in the catalog. diff --git a/releasenotes/notes/min-max-legacy-version-301242466ddefa93.yaml b/releasenotes/notes/min-max-legacy-version-301242466ddefa93.yaml deleted file mode 100644 index 30a3802..0000000 --- a/releasenotes/notes/min-max-legacy-version-301242466ddefa93.yaml +++ /dev/null @@ -1,15 +0,0 @@ ---- -features: - - Add min_version and max_version to get_legacy_client - and to get_session_endpoint. At the moment this is only - really fully plumbed through for cinder, which has extra - special fun around volume, volumev2 and volumev3. Min and max - versions to both methods will look through the options available - in the service catalog and try to return the latest one available - from the span of requested versions. This means a user can say - volume_api_version=None, min_version=2, max_version=3 will get - an endpoint from get_session_endpoint or a Client from cinderclient - that will be either v2 or v3 but not v1. In the future, min and max - version for get_session_endpoint should be able to sort out - appropriate endpoints via version discovery, but that does not - currently exist. diff --git a/releasenotes/notes/nat-source-field-7c7db2a724616d59.yaml b/releasenotes/notes/nat-source-field-7c7db2a724616d59.yaml deleted file mode 100644 index 3341c9f..0000000 --- a/releasenotes/notes/nat-source-field-7c7db2a724616d59.yaml +++ /dev/null @@ -1,6 +0,0 @@ ---- -features: - - Added nat_source flag for networks. In some more complex clouds there - can not only be more than one valid network on a server that NAT can - attach to, there can also be more than one valid network from which to - get a NAT address. Allow flagging a network so that it can be found. diff --git a/releasenotes/notes/network-list-e6e9dafdd8446263.yaml b/releasenotes/notes/network-list-e6e9dafdd8446263.yaml deleted file mode 100644 index 8f793c2..0000000 --- a/releasenotes/notes/network-list-e6e9dafdd8446263.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -features: - - Support added for configuring metadata about networks - for a cloud in a list of dicts, rather than in the - external_network and internal_network entries. The dicts - support a name, a routes_externally field, a nat_destination - field and a default_interface field. -deprecations: - - external_network and internal_network are deprecated and - should be replaced with the list of network dicts. diff --git a/releasenotes/notes/option-precedence-1fecab21fdfb2c33.yaml b/releasenotes/notes/option-precedence-1fecab21fdfb2c33.yaml deleted file mode 100644 index 06e6bd2..0000000 --- a/releasenotes/notes/option-precedence-1fecab21fdfb2c33.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -fixes: - - Reverse the order of option selction in - ``OpenStackConfig._validate_auth()`` to prefer auth options - passed in (from argparse) over those found in clouds.yaml. - This allows the application to override config profile - auth settings. diff --git a/releasenotes/notes/sdk-helper-41f8d815cfbcfb00.yaml b/releasenotes/notes/sdk-helper-41f8d815cfbcfb00.yaml deleted file mode 100644 index a18b57d..0000000 --- a/releasenotes/notes/sdk-helper-41f8d815cfbcfb00.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -features: - - Added helper method for constructing OpenStack SDK - Connection objects. diff --git a/releasenotes/notes/session-client-b581a6e5d18c8f04.yaml b/releasenotes/notes/session-client-b581a6e5d18c8f04.yaml deleted file mode 100644 index 1121901..0000000 --- a/releasenotes/notes/session-client-b581a6e5d18c8f04.yaml +++ /dev/null @@ -1,6 +0,0 @@ ---- -features: - - Added kwargs and argparse processing for session_client. -deprecations: - - Renamed simple_client to session_client. simple_client - will remain as an alias for backwards compat. diff --git a/releasenotes/notes/shade-helper-568f8cb372eef6d9.yaml b/releasenotes/notes/shade-helper-568f8cb372eef6d9.yaml deleted file mode 100644 index 70aab0a..0000000 --- a/releasenotes/notes/shade-helper-568f8cb372eef6d9.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -features: - - Added helper method for constructing shade - OpenStackCloud objects. diff --git a/releasenotes/notes/started-using-reno-242e2b0cd27f9480.yaml b/releasenotes/notes/started-using-reno-242e2b0cd27f9480.yaml deleted file mode 100644 index d7cfb51..0000000 --- a/releasenotes/notes/started-using-reno-242e2b0cd27f9480.yaml +++ /dev/null @@ -1,3 +0,0 @@ ---- -other: -- Started using reno for release notes. diff --git a/releasenotes/notes/thin-shim-62c8e6f6942b83a5.yaml b/releasenotes/notes/thin-shim-62c8e6f6942b83a5.yaml deleted file mode 100644 index 32298fa..0000000 --- a/releasenotes/notes/thin-shim-62c8e6f6942b83a5.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -prelude: > - os-client-config is now a thin shim around openstacksdk. It exists and - will continue to exist provide backward compatibility. -upgrade: - - | - ``get_region_name`` no longer supports pre-service region name overrides. - An ``os_client_config.cloud_config.CloudConfig`` object represents a region - of a cloud. The support was originally added for compatibility with the - similar feature in openstacksdk's ``Profile``. Both the support for - service regions and the ``Profile`` object have been removed from - openstacksdk, so there is no need to attempt to add a compatibility layer - here as there is nothing that has the ability to consume it. diff --git a/releasenotes/notes/vendor-add-betacloud-03872c3485104853.yaml b/releasenotes/notes/vendor-add-betacloud-03872c3485104853.yaml deleted file mode 100644 index 8fdded4..0000000 --- a/releasenotes/notes/vendor-add-betacloud-03872c3485104853.yaml +++ /dev/null @@ -1,3 +0,0 @@ ---- -other: - - Add betacloud region for Germany diff --git a/releasenotes/notes/vendor-add-limestonenetworks-99b2ffab9fc23b08.yaml b/releasenotes/notes/vendor-add-limestonenetworks-99b2ffab9fc23b08.yaml deleted file mode 100644 index d0e8332..0000000 --- a/releasenotes/notes/vendor-add-limestonenetworks-99b2ffab9fc23b08.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -other: - - | - Add Limestone Networks vendor info for us-dfw-1 and us-slc regions diff --git a/releasenotes/notes/vendor-updates-f11184ba56bb27cf.yaml b/releasenotes/notes/vendor-updates-f11184ba56bb27cf.yaml deleted file mode 100644 index e1d6d41..0000000 --- a/releasenotes/notes/vendor-updates-f11184ba56bb27cf.yaml +++ /dev/null @@ -1,4 +0,0 @@ ---- -other: - - Add citycloud regions for Buffalo, Frankfurt, Karlskrona and Los Angles - - Add new DreamCompute cloud and deprecate DreamHost cloud diff --git a/releasenotes/source/_static/.placeholder b/releasenotes/source/_static/.placeholder deleted file mode 100644 index e69de29..0000000 --- a/releasenotes/source/_static/.placeholder +++ /dev/null diff --git a/releasenotes/source/_templates/.placeholder b/releasenotes/source/_templates/.placeholder deleted file mode 100644 index e69de29..0000000 --- a/releasenotes/source/_templates/.placeholder +++ /dev/null diff --git a/releasenotes/source/conf.py b/releasenotes/source/conf.py deleted file mode 100644 index 776088d..0000000 --- a/releasenotes/source/conf.py +++ /dev/null @@ -1,261 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Os-Client-Config Release Notes documentation build configuration file, created by -# sphinx-quickstart on Thu Nov 5 11:50:32 2015. -# -# 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. - -# 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' -import openstackdocstheme - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'reno.sphinxext', -] - -# 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'os-client-config Release Notes' -copyright = u'2015, os-client-config developers' - -# Release notes do not need a version in the title, they span -# multiple versions. -# The short X.Y version. -version = '' -# The full version, including alpha/beta/rc tags. -release = '' - -# 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 = [] - -# 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 = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False - - -# -- 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 = 'openstackdocs' - -# 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 = [] -html_theme_path = [openstackdocstheme.get_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'] - -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -#html_extra_path = [] - -# 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 = 'OCCReleaseNotesdoc' - - -# -- 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, or own class]). -latex_documents = [ - ('index', 'OCCReleaseNotes.tex', u'os-client-config Release Notes Documentation', - u'os-client-config developers', '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', 'occreleasenotes', u'os-client-config Release Notes Documentation', - [u'os-client-config developers'], 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', 'OCCReleaseNotes', u'os-client-config Release Notes Documentation', - u'os-client-config developers', 'OCCReleaseNotes', - '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' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False - -# -- Options for Internationalization output ------------------------------ -locale_dirs = ['locale/'] diff --git a/releasenotes/source/index.rst b/releasenotes/source/index.rst deleted file mode 100644 index 8e85ea1..0000000 --- a/releasenotes/source/index.rst +++ /dev/null @@ -1,25 +0,0 @@ -================================ - os-client-config Release Notes -================================ - -Contents -======== - -.. toctree:: - :maxdepth: 2 - - unreleased - train - stein - rocky - queens - pike - ocata - newton - mitaka - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`search` diff --git a/releasenotes/source/mitaka.rst b/releasenotes/source/mitaka.rst deleted file mode 100644 index e545609..0000000 --- a/releasenotes/source/mitaka.rst +++ /dev/null @@ -1,6 +0,0 @@ -=================================== - Mitaka Series Release Notes -=================================== - -.. release-notes:: - :branch: origin/stable/mitaka diff --git a/releasenotes/source/newton.rst b/releasenotes/source/newton.rst deleted file mode 100644 index 97036ed..0000000 --- a/releasenotes/source/newton.rst +++ /dev/null @@ -1,6 +0,0 @@ -=================================== - Newton Series Release Notes -=================================== - -.. release-notes:: - :branch: origin/stable/newton diff --git a/releasenotes/source/ocata.rst b/releasenotes/source/ocata.rst deleted file mode 100644 index ebe62f4..0000000 --- a/releasenotes/source/ocata.rst +++ /dev/null @@ -1,6 +0,0 @@ -=================================== - Ocata Series Release Notes -=================================== - -.. release-notes:: - :branch: origin/stable/ocata diff --git a/releasenotes/source/pike.rst b/releasenotes/source/pike.rst deleted file mode 100644 index e43bfc0..0000000 --- a/releasenotes/source/pike.rst +++ /dev/null @@ -1,6 +0,0 @@ -=================================== - Pike Series Release Notes -=================================== - -.. release-notes:: - :branch: stable/pike diff --git a/releasenotes/source/queens.rst b/releasenotes/source/queens.rst deleted file mode 100644 index 36ac616..0000000 --- a/releasenotes/source/queens.rst +++ /dev/null @@ -1,6 +0,0 @@ -=================================== - Queens Series Release Notes -=================================== - -.. release-notes:: - :branch: stable/queens diff --git a/releasenotes/source/rocky.rst b/releasenotes/source/rocky.rst deleted file mode 100644 index 40dd517..0000000 --- a/releasenotes/source/rocky.rst +++ /dev/null @@ -1,6 +0,0 @@ -=================================== - Rocky Series Release Notes -=================================== - -.. release-notes:: - :branch: stable/rocky diff --git a/releasenotes/source/stein.rst b/releasenotes/source/stein.rst deleted file mode 100644 index efaceb6..0000000 --- a/releasenotes/source/stein.rst +++ /dev/null @@ -1,6 +0,0 @@ -=================================== - Stein Series Release Notes -=================================== - -.. release-notes:: - :branch: stable/stein diff --git a/releasenotes/source/train.rst b/releasenotes/source/train.rst deleted file mode 100644 index 5839003..0000000 --- a/releasenotes/source/train.rst +++ /dev/null @@ -1,6 +0,0 @@ -========================== -Train Series Release Notes -========================== - -.. release-notes:: - :branch: stable/train diff --git a/releasenotes/source/unreleased.rst b/releasenotes/source/unreleased.rst deleted file mode 100644 index 875030f..0000000 --- a/releasenotes/source/unreleased.rst +++ /dev/null @@ -1,5 +0,0 @@ -============================ -Current Series Release Notes -============================ - -.. release-notes:: diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 5bfd5d8..0000000 --- a/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. -openstacksdk>=0.13.0 # Apache-2.0 diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index a250f75..0000000 --- a/setup.cfg +++ /dev/null @@ -1,36 +0,0 @@ -[metadata] -name = os-client-config -summary = OpenStack Client Configuation Library -description-file = - README.rst -author = OpenStack -author-email = openstack-discuss@lists.openstack.org -home-page = https://docs.openstack.org/os-client-config/latest -classifier = - Environment :: OpenStack - Intended Audience :: Information Technology - Intended Audience :: System Administrators - License :: OSI Approved :: Apache Software License - Operating System :: POSIX :: Linux - Programming Language :: Python - Programming Language :: Python :: 3 - Programming Language :: Python :: 3.6 - Programming Language :: Python :: 3.7 - -[files] -packages = - os_client_config - -[build_sphinx] -source-dir = doc/source -build-dir = doc/build -all_files = 1 -warning-is-error = 1 - -[upload_sphinx] -upload-dir = doc/build/html - -[egg_info] -tag_build = -tag_date = 0 - diff --git a/setup.py b/setup.py deleted file mode 100644 index 566d844..0000000 --- a/setup.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. -# -# 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. - -# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT -import setuptools - -# In python < 2.7.4, a lazy loading of package `pbr` will break -# setuptools if some other modules registered functions in `atexit`. -# solution from: http://bugs.python.org/issue15881#msg170215 -try: - import multiprocessing # noqa -except ImportError: - pass - -setuptools.setup( - setup_requires=['pbr>=2.0.0'], - pbr=True) diff --git a/test-requirements.txt b/test-requirements.txt deleted file mode 100644 index 8a6808e..0000000 --- a/test-requirements.txt +++ /dev/null @@ -1,16 +0,0 @@ -# The order of packages is significant, because pip processes them in the order -# of appearance. Changing the order has an impact on the overall integration -# process, which may cause wedges in the gate later. - -hacking>=1.1.0,<1.2.0 # Apache-2.0 - -coverage!=4.4,>=4.0 # Apache-2.0 -extras>=1.0.0 # MIT -fixtures>=3.0.0 # Apache-2.0/BSD -jsonschema>=2.6.0 # MIT -python-glanceclient>=2.8.0 # Apache-2.0 -python-subunit>=1.0.0 # Apache-2.0/BSD -oslotest>=3.2.0 # Apache-2.0 -stestr>=1.0.0 # Apache-2.0 -testscenarios>=0.4 # Apache-2.0/BSD -testtools>=2.2.0 # MIT diff --git a/tools/keystone_version.py b/tools/keystone_version.py deleted file mode 100644 index ea77bcd..0000000 --- a/tools/keystone_version.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (c) 2017 Red Hat, 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. - -import os_client_config -import pprint -import sys -import six.moves.urllib.parse as urlparse - - -def print_versions(r): - if 'version' in r: - for version in r['version']: - print_version(version) - if 'values' in r: - for version in r['values']: - print_version(version) - if isinstance(r, list): - for version in r: - print_version(version) - - -def print_version(version): - if version['status'] in ('CURRENT', 'stable'): - print( - "\tVersion ID: {id} updated {updated}".format( - id=version.get('id'), - updated=version.get('updated'))) - - -verbose = '-v' in sys.argv -ran = [] -for cloud in os_client_config.OpenStackConfig().get_all_clouds(): - if cloud.name in ran: - continue - ran.append(cloud.name) - # We don't actually need a compute client - but we'll be getting full urls - # anyway. Without this SSL cert info becomes wrong. - c = cloud.get_session_client('compute') - endpoint = cloud.config['auth']['auth_url'] - try: - print(endpoint) - r = c.get(endpoint).json() - if verbose: - pprint.pprint(r) - except Exception as e: - print("Error with {cloud}: {e}".format(cloud=cloud.name, e=str(e))) - continue - if 'version' in r: - print_version(r['version']) - url = urlparse.urlparse(endpoint) - parts = url.path.split(':') - if len(parts) == 2: - path, port = parts - else: - path = url.path - port = None - stripped = path.rsplit('/', 2)[0] - if port: - stripped = '{stripped}:{port}'.format(stripped=stripped, port=port) - endpoint = urlparse.urlunsplit( - (url.scheme, url.netloc, stripped, url.params, url.query)) - print(" also {endpoint}".format(endpoint=endpoint)) - try: - r = c.get(endpoint).json() - if verbose: - pprint.pprint(r) - except Exception: - print("\tUnauthorized") - continue - if 'version' in r: - print_version(r) - elif 'versions' in r: - print_versions(r['versions']) - else: - print("\n\nUNKNOWN\n\n{r}".format(r=r)) - else: - print_versions(r['versions']) diff --git a/tools/nova_version.py b/tools/nova_version.py deleted file mode 100644 index 20603db..0000000 --- a/tools/nova_version.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright (c) 2017 Red Hat, 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. - -import os_client_config - -ran = [] -for cloud in os_client_config.OpenStackConfig().get_all_clouds(): - if cloud.name in ran: - continue - ran.append(cloud.name) - c = cloud.get_session_client('compute') - try: - raw_endpoint = c.get_endpoint() - have_current = False - endpoint = raw_endpoint.rsplit('/', 2)[0] - print(endpoint) - r = c.get(endpoint).json() - except Exception: - print("Error with %s" % cloud.name) - continue - for version in r['versions']: - if version['status'] == 'CURRENT': - have_current = True - print( - "\tVersion ID: {id} updated {updated}".format( - id=version.get('id'), - updated=version.get('updated'))) - print( - "\tVersion Max: {max}".format(max=version.get('version'))) - print( - "\tVersion Min: {min}".format(min=version.get('min_version'))) - if not have_current: - for version in r['versions']: - if version['status'] == 'SUPPORTED': - have_current = True - print( - "\tVersion ID: {id} updated {updated}".format( - id=version.get('id'), - updated=version.get('updated'))) - print( - "\tVersion Max: {max}".format(max=version.get('version'))) - print( - "\tVersion Min: {min}".format( - min=version.get('min_version'))) diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 4e8687b..0000000 --- a/tox.ini +++ /dev/null @@ -1,78 +0,0 @@ -[tox] -minversion = 2.0 -envlist = py37,pep8 -skipsdist = True - -[testenv] -usedevelop = True -passenv = UPPER_CONSTRAINTS_FILE -install_command = pip install -U {opts} {packages} -basepython = python3 -setenv = - VIRTUAL_ENV={envdir} - LANG=en_US.UTF-8 - LANGUAGE=en_US:en - LC_ALL=C - OS_STDOUT_CAPTURE=1 - OS_STDERR_CAPTURE=1 - OS_TEST_TIMEOUT=60 -deps = - -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} - -r{toxinidir}/requirements.txt - -r{toxinidir}/test-requirements.txt -commands = stestr run {posargs} - stestr slowest - -[testenv:pep8] -usedevelop = False -skip_install = True -deps = - -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} - doc8 - hacking - pygments - readme -commands = - doc8 doc/source - flake8 os_client_config - -[testenv:venv] -commands = {posargs} - -[testenv:cover] -setenv = - {[testenv]setenv} - PYTHON=coverage run --source os_client_config --parallel-mode -commands = - stestr run {posargs} - coverage combine - coverage html -d cover - coverage xml -o cover/coverage.xml - -[testenv:docs] -skip_install = True -deps = - -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} - -r{toxinidir}/requirements.txt - -r{toxinidir}/doc/requirements.txt -commands = - sphinx-build -W -d doc/build/doctrees -b html doc/source/ doc/build/html - -[testenv:releasenotes] -skip_install = True -deps = - -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} - -r{toxinidir}/doc/requirements.txt -commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html - -[flake8] -show-source = True -builtins = _ -exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build,releasenotes/source/conf.py - - -[testenv:lower-constraints] -deps = - -c{toxinidir}/lower-constraints.txt - -r{toxinidir}/test-requirements.txt - -r{toxinidir}/requirements.txt |
