Add cli utility for updating pricing file.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/30500fed Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/30500fed Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/30500fed Branch: refs/heads/0.13.x Commit: 30500fedd0a48273b4a45ec9147d3f670b6e9710 Parents: 5fa1610 Author: Tomaz Muraus <[email protected]> Authored: Mon Jul 29 21:28:50 2013 +0200 Committer: Tomaz Muraus <[email protected]> Committed: Thu Aug 1 20:28:49 2013 +0200 ---------------------------------------------------------------------- bin/libcloud | 30 ++++++++++++++ libcloud/cli/__init__.py | 0 libcloud/cli/pricing.py | 84 +++++++++++++++++++++++++++++++++++++++ libcloud/utils/connection.py | 31 +++++++++++++++ 4 files changed, 145 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/30500fed/bin/libcloud ---------------------------------------------------------------------- diff --git a/bin/libcloud b/bin/libcloud new file mode 100755 index 0000000..270922e --- /dev/null +++ b/bin/libcloud @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 __future__ import with_statement + +import argparse + +from libcloud.cli.pricing import add_subparser, update_pricing + +parser = argparse.ArgumentParser(prog='libcloud', usage='%(prog)s') +subparsers = parser.add_subparsers(dest='subparser_name') +add_subparser(subparsers=subparsers) + +args = parser.parse_args() + +if args.subparser_name == 'update-pricing': + update_pricing(file_url=args.file_url, file_path=args.file_path) http://git-wip-us.apache.org/repos/asf/libcloud/blob/30500fed/libcloud/cli/__init__.py ---------------------------------------------------------------------- diff --git a/libcloud/cli/__init__.py b/libcloud/cli/__init__.py new file mode 100644 index 0000000..e69de29 http://git-wip-us.apache.org/repos/asf/libcloud/blob/30500fed/libcloud/cli/pricing.py ---------------------------------------------------------------------- diff --git a/libcloud/cli/pricing.py b/libcloud/cli/pricing.py new file mode 100644 index 0000000..584d292 --- /dev/null +++ b/libcloud/cli/pricing.py @@ -0,0 +1,84 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 + +try: + import simplejson as json +except ImportError: + import json + + +from libcloud.pricing import CUSTOM_PRICING_FILE_PATH +from libcloud.utils.connection import get_response_object + +__all__ = [ + 'add_subparser', + 'update_pricing' +] + +# Default URL to the pricing file +DEFAULT_FILE_URL = 'https://git-wip-us.apache.org/repos/asf?p=libcloud.git;a=blob_plain;f=libcloud/data/pricing.json' + + +def add_subparser(subparsers): + parser = subparsers.add_parser('update-pricing', + help='Update Libcloud pricing file') + parser.add_argument('--file-path', dest='file_path', action='store', + default=CUSTOM_PRICING_FILE_PATH, + help='Path where the file will be saved') + parser.add_argument('--file-url', dest='file_url', action='store', + default=DEFAULT_FILE_URL, + help='URL to the pricing file') + return parser + + +def update_pricing(file_url, file_path): + dir_name = os.path.dirname(file_path) + + if not os.path.exists(dir_name): + # Verify a valid path is provided + sys.stderr.write('Can\'t write to %s, directory %s, doesn\'t exist\n' % + (file_path, dir_name)) + sys.exit(2) + + if os.path.exists(file_path) and os.path.isdir(file_path): + sys.stderr.write('Can\'t write to %s file path because it\'s a' + ' directory\n' % + (file_path)) + sys.exit(2) + + response = get_response_object(file_url) + body = response.body + + # Verify pricing file is valid + try: + data = json.loads(body) + except json.decoder.JSONDecodeError: + sys.stderr.write('Provided URL doesn\'t contain valid pricing' + ' data\n') + sys.exit(3) + + if not data.get('updated', None): + sys.stderr.write('Provided URL doesn\'t contain valid pricing' + ' data\n') + sys.exit(3) + + # No need to stream it since file is small + with open(file_path, 'w') as file_handle: + file_handle.write(response.body) + + print('Pricing file saved to %s' % (file_path)) http://git-wip-us.apache.org/repos/asf/libcloud/blob/30500fed/libcloud/utils/connection.py ---------------------------------------------------------------------- diff --git a/libcloud/utils/connection.py b/libcloud/utils/connection.py new file mode 100644 index 0000000..bd2b50d --- /dev/null +++ b/libcloud/utils/connection.py @@ -0,0 +1,31 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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 libcloud.utils.py3 import urlparse, parse_qs +from libcloud.common.base import Connection + +__all__ = [ + 'get_response_object' +] + + +def get_response_object(url): + parsed_url = urlparse.urlparse(url) + parsed_qs = parse_qs(parsed_url.query) + secure = parsed_url.scheme == 'https' + + con = Connection(secure=secure, host=parsed_url.netloc) + response = con.request(method='GET', action=parsed_url.path, params=parsed_qs) + return response
