diff --git a/scripts/constants.py b/scripts/constants.py new file mode 100644 index 000000000..68ccee59b --- /dev/null +++ b/scripts/constants.py @@ -0,0 +1,27 @@ +# Copyright 2016 The Kubernetes Authors. +# +# 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. + +# Kubernetes branch to get the OpenAPI spec from. +KUBERNETES_BRANCH = "release-1.5" + +# Spec version will be set in downloaded spec and all +# generated code will refer to it. +SPEC_VERSION = "v1.5.0-beta.3" + +# client version for packaging and releasing. It can +# be different than SPEC_VERSION. +CLIENT_VERSION = "1.0.0-alpha.2" + +# Name of the release package +PACKAGE_NAME = "kubernetes" diff --git a/scripts/preprocess_spec.py b/scripts/preprocess_spec.py index bf8d9509d..d36cb484f 100644 --- a/scripts/preprocess_spec.py +++ b/scripts/preprocess_spec.py @@ -18,6 +18,9 @@ import os.path import sys from collections import OrderedDict +import urllib3 +from constants import KUBERNETES_BRANCH, SPEC_VERSION + # these four constants are shown as part of this example in []: # "[watch]Pod[List]" is the deprecated version of "[list]Pod?[watch]=True" WATCH_OP_PREFIX = "watch" @@ -25,6 +28,10 @@ WATCH_OP_SUFFIX = "List" LIST_OP_PREFIX = "list" WATCH_QUERY_PARAM_NAME = "watch" +SPEC_URL = 'https://raw.githubusercontent.com/kubernetes/kubernetes/' \ + '%s/api/openapi-spec/swagger.json' % KUBERNETES_BRANCH + +OUTPUT_PATH = os.path.join(os.path.dirname(__file__), 'swagger.json') _ops = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch'] @@ -94,37 +101,38 @@ def strip_tags_from_operation_id(operation, _): operation['operationId'] = operation_id -def process_swagger(infile, outfile): - with open(infile, 'r') as f: - spec = json.load(f, object_pairs_hook=OrderedDict) +def process_swagger(spec): + apply_func_to_spec_operations(spec, strip_tags_from_operation_id) - apply_func_to_spec_operations(spec, strip_tags_from_operation_id) + operation_ids = {} + apply_func_to_spec_operations(spec, lambda op, _: operator.setitem( + operation_ids, op['operationId'], op)) - operation_ids = {} - apply_func_to_spec_operations(spec, lambda op, _: operator.setitem( - operation_ids, op['operationId'], op)) + try: + apply_func_to_spec_operations( + spec, remove_watch_operations, operation_ids) + except PreprocessingException as e: + print(e.message) - try: - apply_func_to_spec_operations( - spec, remove_watch_operations, operation_ids) - except PreprocessingException as e: - print(e.message) + # TODO: Kubernetes does not set a version for OpenAPI spec yet, + # remove this when that is fixed. + spec['info']['version'] = SPEC_VERSION - # TODO: Kubernetes does not set a version for OpenAPI spec yet, - # remove this when that is fixed. - spec['info']['version'] = "v1.5.0-beta.1" - - with open(outfile, 'w') as out: - json.dump(spec, out, sort_keys=False, indent=2, - separators=(',', ': '), ensure_ascii=True) + return spec def main(): - if len(sys.argv) < 3: - print "Usage:\n\tpython %s infile outfile.\n" % sys.argv[0] - sys.exit(0) - if not os.path.isfile(sys.argv[1]): - print "Input file %s does not exist." % sys.argv[1] - process_swagger(sys.argv[1], sys.argv[2]) + pool = urllib3.PoolManager() + with pool.request('GET', SPEC_URL, preload_content=False) as response: + if response.status != 200: + print "Error downloading spec file. Reason: %s" % response.reason + return 1 + in_spec = json.load(response, object_pairs_hook=OrderedDict) + out_spec = process_swagger(in_spec) + with open(OUTPUT_PATH, 'w') as out: + json.dump(out_spec, out, sort_keys=False, indent=2, + separators=(',', ': '), ensure_ascii=True) + return 0 -main() + +sys.exit(main()) diff --git a/scripts/generate.sh b/scripts/update-client.sh similarity index 84% rename from scripts/generate.sh rename to scripts/update-client.sh index 89f797a41..c991ed3b3 100755 --- a/scripts/generate.sh +++ b/scripts/update-client.sh @@ -39,16 +39,8 @@ popd > /dev/null PACKAGE_NAME=${PACKAGE_NAME:-client} -if [[ ! -n ${SWAGGER_FILE-} ]]; then - if [[ ! -n ${KUBE_ROOT-} ]]; then - echo "\${KUBE_ROOT} variable is not set" - exit - fi - SWAGGER_FILE="${KUBE_ROOT}/api/openapi-spec/swagger.json" -fi - -echo "--- Preprocessing OpenAPI spec to script directory" -python "${SCRIPT_ROOT}/preprocess_spec.py" "$SWAGGER_FILE" "${SCRIPT_ROOT}/swagger.json" +echo "--- Downloading and processing OpenAPI spec" +python "${SCRIPT_ROOT}/preprocess_spec.py" echo "--- Cleaning up previously generated folders" rm -rf "${CLIENT_ROOT}/${PACKAGE_NAME}" diff --git a/setup.py b/setup.py index 88802fce0..688ff7c5c 100644 --- a/setup.py +++ b/setup.py @@ -12,12 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -import sys - from setuptools import find_packages, setup -NAME = "kubernetes" -VERSION = "1.0.0-alpha.2" +from scripts.constants import CLIENT_VERSION, PACKAGE_NAME # To install the library, run the following # @@ -36,8 +33,8 @@ REQUIRES = [ "ipaddress"] setup( - name=NAME, - version=VERSION, + name=PACKAGE_NAME, + version=CLIENT_VERSION, description="Kubernetes python client", author_email="", author="Kubernetes",