From f4db6375de91d5d77a0a98064c31af8590d82b4d Mon Sep 17 00:00:00 2001 From: SerenaFeng Date: Mon, 11 Jul 2016 17:29:03 +0800 Subject: auto update of testAPI using ansible-playbook rename db related files write ansible file update README.md JIRA: FUNCTEST-360 Change-Id: Ib1a1a5ad846ed003cf90da770d94ceb7c011d39d Signed-off-by: SerenaFeng --- utils/test/result_collection_api/update/README.md | 158 +++++++++++++-------- utils/test/result_collection_api/update/backup.py | 44 ------ utils/test/result_collection_api/update/changes.py | 47 ------ utils/test/result_collection_api/update/restore.py | 38 ----- .../update/templates/__init__.py | 0 .../update/templates/backup_mongodb.py | 44 ++++++ .../update/templates/changes_in_mongodb.py | 47 ++++++ .../update/templates/restore_mongodb.py | 38 +++++ .../update/templates/rm_olds.sh | 15 ++ .../update/templates/update_mongodb.py | 86 +++++++++++ .../update/templates/utils.py | 48 +++++++ utils/test/result_collection_api/update/update.py | 86 ----------- utils/test/result_collection_api/update/update.yml | 41 ++++++ utils/test/result_collection_api/update/utils.py | 48 ------- 14 files changed, 421 insertions(+), 319 deletions(-) delete mode 100644 utils/test/result_collection_api/update/backup.py delete mode 100644 utils/test/result_collection_api/update/changes.py delete mode 100644 utils/test/result_collection_api/update/restore.py create mode 100644 utils/test/result_collection_api/update/templates/__init__.py create mode 100644 utils/test/result_collection_api/update/templates/backup_mongodb.py create mode 100644 utils/test/result_collection_api/update/templates/changes_in_mongodb.py create mode 100644 utils/test/result_collection_api/update/templates/restore_mongodb.py create mode 100644 utils/test/result_collection_api/update/templates/rm_olds.sh create mode 100644 utils/test/result_collection_api/update/templates/update_mongodb.py create mode 100644 utils/test/result_collection_api/update/templates/utils.py delete mode 100644 utils/test/result_collection_api/update/update.py create mode 100644 utils/test/result_collection_api/update/update.yml delete mode 100644 utils/test/result_collection_api/update/utils.py diff --git a/utils/test/result_collection_api/update/README.md b/utils/test/result_collection_api/update/README.md index 41b7fffa3..d3aef7efe 100644 --- a/utils/test/result_collection_api/update/README.md +++ b/utils/test/result_collection_api/update/README.md @@ -1,59 +1,105 @@ -# opnfv-testapi update - -## How to use: - -# backup mongodb, -# arguments: -# -u/--url: Mongo DB URL, default = mongodb://127.0.0.1:27017/ -# -o/--output_dir: Output directory for the backup, default = ./ -# the backup output will be put under dir/db__XXXX_XX_XX_XXXXXX/db -# -d/--db: database for the backup, default = test_results_collection -``` -python backup.py -``` - -# restore mongodb -# arguments: -# -u/--url: Mongo DB URL, default = mongodb://127.0.0.1:27017/ -# -i/--input_dir: Input directory for the Restore, must be specified -# the restore input must be specified to dir/db__XXXX_XX_XX_XXXXXX/db -# -d/--db: database name after the restore, default = basename of input_dir -``` -python restore.py -``` - -# update mongodb -# arguments: -# -u/--url: Mongo DB URL, default = mongodb://127.0.0.1:27017/ -# -d/--db: database name to be updated, default = test_results_collection -# changes need to be done: -# change collection name, modify changes.collections_old2New -# collections_old2New = { -# 'old_collection': 'new_collection', -# } -# change field name, modify changes.fields_old2New -# fields_old2New = { -# 'collection': [(query, {'old_field': 'new_field'})] -# } -# change the doc, modify changes.docs_old2New -# docs_old2New = { -# 'test_results': [ -# ({'field': 'old_value'}, {'field': 'new_value'}), -# (query, {'field': 'new_value'}), -# ] -# } -``` -python update.py -``` - -# update opnfv-testapi process -# this script must be run right in this directory -# and remember to change ../etc/config.ini before running this script -# operations includes: -# kill running test_collection_api & opnfv-testapi -# install or update dependencies according to ../requirements.txt -# install opnfv-testapi -# run opnfv-testapi +Welcome to TESTAPI Update! +======================== + + +This file is used to describe how testapi update works + +---------- +How to use +--------------- + +#### backup mongodb + +arguments: +: -u/--url: Mongo DB URL, default = mongodb://127.0.0.1:27017/ +the backup output will be put under dir/db__XXXX_XX_XX_XXXXXX/db +-d/--db: database for the backup, default = test_results_collection + +usage: +``` +python backup_mongodb.py +``` + +#### restore mongodb + +arguments: +: -u/--url: Mongo DB URL, default = mongodb://127.0.0.1:27017/ + -i/--input_dir: Input directory for the Restore, must be specified, + the restore input must be specified to dir/db__XXXX_XX_XX_XXXXXX/db + -d/--db: database name after the restore, default = basename of input_dir + +usage: +``` +python restore_mongodb.py +``` +#### update mongodb + + arguments: +: -u/--url: Mongo DB URL, default = mongodb://127.0.0.1:27017/ + -d/--db: database name to be updated, default = test_results_collection + +changes need to be done: +change collection name, modify changes.collections_old2New + > collections_old2New = { + 'old_collection': 'new_collection', + } + + change field name, modify changes.fields_old2New + > fields_old2New = { + 'collection': [(query, {'old_field': 'new_field'})] + } + + change the doc, modify changes.docs_old2New + > docs_old2New = { + 'test_results': [ + ({'field': 'old_value'}, {'field': 'new_value'}), + (query, {'field': 'new_value'}), + ] + } + +#### update opnfv-testapi process +This script must be run right in this directory and remember to +change ../etc/config.ini before running this script. + +operations includes: +: kill running test_collection_api & opnfv-testapi +install or update dependencies according to ../requirements.txt +install opnfv-testapi +run opnfv-testapi + +usage: ``` python update_api.py ``` +#### update opnfv/testapi container +Here ansible-playbook is used to implement auto update. +Please make sure that the remote server is accessible via ssh. + +install ansible, please refer: +``` +http://docs.ansible.com/ansible/intro_installation.html +``` +run update.yml +arguments: +: host: remote server, must provide +user: user used to access to remote server, default to root +port: exposed port used to access to testapi, default to 8000 +image: testapi's docker image, default to opnfv/testapi:latest +update_path: templates directory in remote server, default to /tmp/testapi +mongodb_url: url of mongodb, default to 172.17.0.1, docker0 ip +swagger_url: swagger access url, default to http://host:port + +usage: +``` +ansible-playbook update.yml --extra-vars " +host=10.63.243.17 +user=zte +port=8000 +image=opnfv/testapi +update_path=/tmp/testapi +mongodb_url=mongodb://172.17.0.1:27017 +swagger_url=http://10.63.243.17:8000"``` +> **Note:** + +> - If documents need to be changed, please modify file +templates/changes_in_mongodb.py, and refer section **update mongodb** diff --git a/utils/test/result_collection_api/update/backup.py b/utils/test/result_collection_api/update/backup.py deleted file mode 100644 index faa4fd410..000000000 --- a/utils/test/result_collection_api/update/backup.py +++ /dev/null @@ -1,44 +0,0 @@ -############################################################################## -# Copyright (c) 2016 ZTE Corporation -# feng.xiaowei@zte.com.cn -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## -import os -import argparse -import datetime - -from utils import execute, main, get_abspath - -parser = argparse.ArgumentParser(description='Backup MongoDBs') - -parser.add_argument('-u', '--url', - type=str, - required=False, - default='mongodb://127.0.0.1:27017/', - help='Mongo DB URL for Backups') -parser.add_argument('-o', '--output_dir', - type=str, - required=False, - default='./', - help='Output directory for the backup.') - -parser.add_argument('-d', '--db', - type=str, - required=False, - default='test_results_collection', - help='database for the backup.') - - -def backup(args): - db = args.db - out = get_abspath(args.output_dir) - now = datetime.datetime.now() - out = os.path.join(out, '%s__%s' % (db, now.strftime('%Y_%m_%d_%H%M%S'))) - cmd = ['mongodump', '-o', '%s' % out] - execute(cmd, args) - -if __name__ == '__main__': - main(backup, parser) diff --git a/utils/test/result_collection_api/update/changes.py b/utils/test/result_collection_api/update/changes.py deleted file mode 100644 index b3e23803d..000000000 --- a/utils/test/result_collection_api/update/changes.py +++ /dev/null @@ -1,47 +0,0 @@ -############################################################################## -# Copyright (c) 2016 ZTE Corporation -# feng.xiaowei@zte.com.cn -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -# 09/06/2016: change for migration after refactoring -# 16/06/2016: Alignment of test name (JIRA: FUNCTEST-304) -############################################################################## -collections_old2New = { - # 'pod': 'pods', - # 'test_projects': 'projects', - # 'test_testcases': 'testcases', - # 'test_results': 'results' -} - -fields_old2New = { - # 'test_results': [({}, {'creation_date': 'start_date'})] -} - -docs_old2New = { - # 'test_results': [ - # ({'criteria': 'failed'}, {'criteria': 'FAILED'}), - # ({'criteria': 'passed'}, {'criteria': 'PASS'}) - # ] - 'testcases': [ - ({'name': 'vPing'}, {'name': 'vping_ssh'}), - ({'name': 'Tempest'}, {'name': 'tempest_smoke_serial'}), - ({'name': 'Rally'}, {'name': 'rally_sanity'}), - ({'name': 'ODL'}, {'name': 'odl'}), - ({'name': 'vIMS'}, {'name': 'vims'}), - ({'name': 'ONOS'}, {'name': 'onos'}), - ({'name': 'vPing_userdata'}, {'name': 'vping_userdata'}), - ({'name': 'ovno'}, {'name': 'ocl'}) - ], - 'results': [ - ({'case_name': 'vPing'}, {'case_name': 'vping_ssh'}), - ({'case_name': 'Tempest'}, {'case_name': 'tempest_smoke_serial'}), - ({'case_name': 'Rally'}, {'case_name': 'rally_sanity'}), - ({'case_name': 'ODL'}, {'case_name': 'odl'}), - ({'case_name': 'vIMS'}, {'case_name': 'vims'}), - ({'case_name': 'ONOS'}, {'case_name': 'onos'}), - ({'case_name': 'vPing_userdata'}, {'case_name': 'vping_userdata'}), - ({'case_name': 'ovno'}, {'case_name': 'ocl'}) - ] -} diff --git a/utils/test/result_collection_api/update/restore.py b/utils/test/result_collection_api/update/restore.py deleted file mode 100644 index c45a0e621..000000000 --- a/utils/test/result_collection_api/update/restore.py +++ /dev/null @@ -1,38 +0,0 @@ -############################################################################## -# Copyright (c) 2016 ZTE Corporation -# feng.xiaowei@zte.com.cn -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## -import argparse - -from utils import execute, main, get_abspath - -parser = argparse.ArgumentParser(description='Restore MongoDBs') - -parser.add_argument('-u', '--url', - type=str, - required=False, - default='mongodb://127.0.0.1:27017/', - help='Mongo DB URL for Backup') -parser.add_argument('-i', '--input_dir', - type=str, - required=True, - help='Input directory for the Restore.') -parser.add_argument('-d', '--db', - type=str, - required=False, - default='test_results_collection', - help='database name after the restore.') - - -def restore(args): - input_dir = get_abspath(args.input_dir) - cmd = ['mongorestore', '%s' % input_dir] - execute(cmd, args) - - -if __name__ == '__main__': - main(restore, parser) diff --git a/utils/test/result_collection_api/update/templates/__init__.py b/utils/test/result_collection_api/update/templates/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/utils/test/result_collection_api/update/templates/backup_mongodb.py b/utils/test/result_collection_api/update/templates/backup_mongodb.py new file mode 100644 index 000000000..7e0dd5545 --- /dev/null +++ b/utils/test/result_collection_api/update/templates/backup_mongodb.py @@ -0,0 +1,44 @@ +############################################################################## +# Copyright (c) 2016 ZTE Corporation +# feng.xiaowei@zte.com.cn +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import argparse +import datetime +import os + +from utils import execute, main, get_abspath + +parser = argparse.ArgumentParser(description='Backup MongoDBs') + +parser.add_argument('-u', '--url', + type=str, + required=False, + default='mongodb://127.0.0.1:27017/', + help='Mongo DB URL for Backups') +parser.add_argument('-o', '--output_dir', + type=str, + required=False, + default='./', + help='Output directory for the backup.') + +parser.add_argument('-d', '--db', + type=str, + required=False, + default='test_results_collection', + help='database for the backup.') + + +def backup(args): + db = args.db + out = get_abspath(args.output_dir) + now = datetime.datetime.now() + out = os.path.join(out, '%s__%s' % (db, now.strftime('%Y_%m_%d_%H%M%S'))) + cmd = ['mongodump', '-o', '%s' % out] + execute(cmd, args) + +if __name__ == '__main__': + main(backup, parser) diff --git a/utils/test/result_collection_api/update/templates/changes_in_mongodb.py b/utils/test/result_collection_api/update/templates/changes_in_mongodb.py new file mode 100644 index 000000000..b3e23803d --- /dev/null +++ b/utils/test/result_collection_api/update/templates/changes_in_mongodb.py @@ -0,0 +1,47 @@ +############################################################################## +# Copyright (c) 2016 ZTE Corporation +# feng.xiaowei@zte.com.cn +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +# 09/06/2016: change for migration after refactoring +# 16/06/2016: Alignment of test name (JIRA: FUNCTEST-304) +############################################################################## +collections_old2New = { + # 'pod': 'pods', + # 'test_projects': 'projects', + # 'test_testcases': 'testcases', + # 'test_results': 'results' +} + +fields_old2New = { + # 'test_results': [({}, {'creation_date': 'start_date'})] +} + +docs_old2New = { + # 'test_results': [ + # ({'criteria': 'failed'}, {'criteria': 'FAILED'}), + # ({'criteria': 'passed'}, {'criteria': 'PASS'}) + # ] + 'testcases': [ + ({'name': 'vPing'}, {'name': 'vping_ssh'}), + ({'name': 'Tempest'}, {'name': 'tempest_smoke_serial'}), + ({'name': 'Rally'}, {'name': 'rally_sanity'}), + ({'name': 'ODL'}, {'name': 'odl'}), + ({'name': 'vIMS'}, {'name': 'vims'}), + ({'name': 'ONOS'}, {'name': 'onos'}), + ({'name': 'vPing_userdata'}, {'name': 'vping_userdata'}), + ({'name': 'ovno'}, {'name': 'ocl'}) + ], + 'results': [ + ({'case_name': 'vPing'}, {'case_name': 'vping_ssh'}), + ({'case_name': 'Tempest'}, {'case_name': 'tempest_smoke_serial'}), + ({'case_name': 'Rally'}, {'case_name': 'rally_sanity'}), + ({'case_name': 'ODL'}, {'case_name': 'odl'}), + ({'case_name': 'vIMS'}, {'case_name': 'vims'}), + ({'case_name': 'ONOS'}, {'case_name': 'onos'}), + ({'case_name': 'vPing_userdata'}, {'case_name': 'vping_userdata'}), + ({'case_name': 'ovno'}, {'case_name': 'ocl'}) + ] +} diff --git a/utils/test/result_collection_api/update/templates/restore_mongodb.py b/utils/test/result_collection_api/update/templates/restore_mongodb.py new file mode 100644 index 000000000..c45a0e621 --- /dev/null +++ b/utils/test/result_collection_api/update/templates/restore_mongodb.py @@ -0,0 +1,38 @@ +############################################################################## +# Copyright (c) 2016 ZTE Corporation +# feng.xiaowei@zte.com.cn +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import argparse + +from utils import execute, main, get_abspath + +parser = argparse.ArgumentParser(description='Restore MongoDBs') + +parser.add_argument('-u', '--url', + type=str, + required=False, + default='mongodb://127.0.0.1:27017/', + help='Mongo DB URL for Backup') +parser.add_argument('-i', '--input_dir', + type=str, + required=True, + help='Input directory for the Restore.') +parser.add_argument('-d', '--db', + type=str, + required=False, + default='test_results_collection', + help='database name after the restore.') + + +def restore(args): + input_dir = get_abspath(args.input_dir) + cmd = ['mongorestore', '%s' % input_dir] + execute(cmd, args) + + +if __name__ == '__main__': + main(restore, parser) diff --git a/utils/test/result_collection_api/update/templates/rm_olds.sh b/utils/test/result_collection_api/update/templates/rm_olds.sh new file mode 100644 index 000000000..c6bca1867 --- /dev/null +++ b/utils/test/result_collection_api/update/templates/rm_olds.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +proc_number=`ps -ef | grep opnfv-testapi | grep -v grep | wc -l` +if [ $proc_number -gt 0 ]; then + procs=`ps -ef | grep opnfv-testapi | grep -v grep` + echo "begin to kill opnfv-testapi $procs" + ps -ef | grep opnfv-testapi | grep -v grep | awk '{print $2}' | xargs kill -kill &>/dev/null +fi + +number=`docker ps -a | awk 'NR != 1' | grep testapi | wc -l` +if [ $number -gt 0 ]; then + containers=number=`docker ps -a | awk 'NR != 1' | grep testapi` + echo "begin to rm containers $containers" + docker ps -a | awk 'NR != 1' | grep testapi | awk '{print $1}' | xargs docker rm -f &>/dev/null +fi diff --git a/utils/test/result_collection_api/update/templates/update_mongodb.py b/utils/test/result_collection_api/update/templates/update_mongodb.py new file mode 100644 index 000000000..b1e378dd7 --- /dev/null +++ b/utils/test/result_collection_api/update/templates/update_mongodb.py @@ -0,0 +1,86 @@ +############################################################################## +# Copyright (c) 2016 ZTE Corporation +# feng.xiaowei@zte.com.cn +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import argparse + +from pymongo import MongoClient + +from changes_in_mongodb import collections_old2New, fields_old2New, docs_old2New +from utils import main, parse_mongodb_url + +parser = argparse.ArgumentParser(description='Update MongoDBs') + +parser.add_argument('-u', '--url', + type=str, + required=False, + default='mongodb://127.0.0.1:27017/', + help='Mongo DB URL for Backups') + +parser.add_argument('-d', '--db', + type=str, + required=False, + default='test_results_collection', + help='database for the update.') + + +def assert_collections(a_dict): + if a_dict is not None: + collections = eval_db('collection_names') + no_collections = [] + for collection in a_dict.keys(): + if collection not in collections: + no_collections.append(collection) + assert len(no_collections) == 0, \ + 'collections {} not exist'.format(no_collections) + + +def rename_collections(a_dict): + if a_dict is not None: + for collection, new_name in a_dict.iteritems(): + eval_collection(collection, 'rename', new_name) + + +def rename_fields(a_dict): + collection_update(a_dict, '$rename') + + +def change_docs(a_dict): + collection_update(a_dict, '$set') + + +def eval_db(method, *args, **kwargs): + return eval('db.%s(*args, **kwargs)' % method) + + +def eval_collection(collection, method, *args, **kwargs): + return eval('db.%s.%s(*args, **kwargs)' % (collection, method)) + + +def collection_update(a_dict, operator): + if a_dict is not None: + for collection, updates in a_dict.iteritems(): + for (query, doc) in updates: + doc_dict = {operator: doc} + eval_collection(collection, 'update', query, + doc_dict, upsert=False, multi=True) + + +def update(args): + parse_mongodb_url(args.url) + client = MongoClient(args.url) + global db + db = client[args.db] + assert_collections(docs_old2New) + assert_collections(fields_old2New) + assert_collections(collections_old2New) + change_docs(docs_old2New) + rename_fields(fields_old2New) + rename_collections(collections_old2New) + +if __name__ == '__main__': + main(update, parser) diff --git a/utils/test/result_collection_api/update/templates/utils.py b/utils/test/result_collection_api/update/templates/utils.py new file mode 100644 index 000000000..a18ff0389 --- /dev/null +++ b/utils/test/result_collection_api/update/templates/utils.py @@ -0,0 +1,48 @@ +############################################################################## +# Copyright (c) 2016 ZTE Corporation +# feng.xiaowei@zte.com.cn +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +import os +import urlparse +import subprocess + + +def get_abspath(path): + assert os.path.isdir(path), 'Path %s can\'t be found.' % path + return os.path.abspath(path) + + +def parse_mongodb_url(url): + url = urlparse.urlparse(url) + assert url.scheme == 'mongodb', 'URL must be a MongoDB URL' + return url + + +def url_parse(url): + url = parse_mongodb_url(url) + return url.username, url.password, url.hostname, url.port + + +def execute(cmd, args): + (username, password, hostname, port) = url_parse(args.url) + cmd.extend(['--host', '%s' % hostname, '--port', '%s' % port]) + db = args.db + if db is not None: + cmd.extend(['--db', '%s' % db]) + if username is not None: + cmd.extend(['-u', '%s' % username, '-p', '%s' % password]) + print('execute: %s' % cmd) + execute_output = subprocess.check_output(cmd) + print(execute_output) + + +def main(method, parser): + args = parser.parse_args() + try: + method(args) + except AssertionError, msg: + print(msg) diff --git a/utils/test/result_collection_api/update/update.py b/utils/test/result_collection_api/update/update.py deleted file mode 100644 index 8b385a0b3..000000000 --- a/utils/test/result_collection_api/update/update.py +++ /dev/null @@ -1,86 +0,0 @@ -############################################################################## -# Copyright (c) 2016 ZTE Corporation -# feng.xiaowei@zte.com.cn -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## -import argparse - -from pymongo import MongoClient - -from utils import main, parse_mongodb_url -from changes import collections_old2New, fields_old2New, docs_old2New - -parser = argparse.ArgumentParser(description='Update MongoDBs') - -parser.add_argument('-u', '--url', - type=str, - required=False, - default='mongodb://127.0.0.1:27017/', - help='Mongo DB URL for Backups') - -parser.add_argument('-d', '--db', - type=str, - required=False, - default='test_results_collection', - help='database for the update.') - - -def assert_collections(a_dict): - if a_dict is not None: - collections = eval_db('collection_names') - no_collections = [] - for collection in a_dict.keys(): - if collection not in collections: - no_collections.append(collection) - assert len(no_collections) == 0, \ - 'collections {} not exist'.format(no_collections) - - -def rename_collections(a_dict): - if a_dict is not None: - for collection, new_name in a_dict.iteritems(): - eval_collection(collection, 'rename', new_name) - - -def rename_fields(a_dict): - collection_update(a_dict, '$rename') - - -def change_docs(a_dict): - collection_update(a_dict, '$set') - - -def eval_db(method, *args, **kwargs): - return eval('db.%s(*args, **kwargs)' % method) - - -def eval_collection(collection, method, *args, **kwargs): - return eval('db.%s.%s(*args, **kwargs)' % (collection, method)) - - -def collection_update(a_dict, operator): - if a_dict is not None: - for collection, updates in a_dict.iteritems(): - for (query, doc) in updates: - doc_dict = {operator: doc} - eval_collection(collection, 'update', query, - doc_dict, upsert=False, multi=True) - - -def update(args): - parse_mongodb_url(args.url) - client = MongoClient(args.url) - global db - db = client[args.db] - assert_collections(docs_old2New) - assert_collections(fields_old2New) - assert_collections(collections_old2New) - change_docs(docs_old2New) - rename_fields(fields_old2New) - rename_collections(collections_old2New) - -if __name__ == '__main__': - main(update, parser) diff --git a/utils/test/result_collection_api/update/update.yml b/utils/test/result_collection_api/update/update.yml new file mode 100644 index 000000000..08839564a --- /dev/null +++ b/utils/test/result_collection_api/update/update.yml @@ -0,0 +1,41 @@ +--- +- hosts: "{{ host }}" + remote_user: "{{ user }}" + become: yes + become_method: sudo + vars: + user: "root" + port: "8000" + update_path: "/tmp/testapi" + image: "opnfv/testapi" + mongodb_url: "mongodb://172.17.0.1:27017" + swagger_url: "http://{{ host }}:{{ port }}" + tasks: + - name: create temporary update directory + file: + path: "{{ update_path }}" + state: directory + - name: transfer files in templates + copy: + src: templates/ + dest: "{{ update_path }}" + - name: backup mongodb database + command: "python {{ update_path }}/backup_mongodb.py -u {{ mongodb_url }} -o {{ update_path }}" + - name: stop and remove old versions + command: bash "{{ update_path }}/rm_olds.sh" + register: rm_result + - debug: msg="{{ rm_result.stderr }}" + - name: delete old docker images + command: docker rmi "{{ image }}" + ignore_errors: true + - name: update mongodb + command: "python {{ update_path }}/update_mongodb.py -u {{ mongodb_url }}" + - name: docker start testapi server + command: docker run -dti -p "{{ port }}:8000" + -e "mongodb_url={{ mongodb_url }}" + -e "swagger_url={{ swagger_url }}" + "{{ image }}" + - name: remove temporary update directory + file: + path: "{{ update_path }}" + state: absent \ No newline at end of file diff --git a/utils/test/result_collection_api/update/utils.py b/utils/test/result_collection_api/update/utils.py deleted file mode 100644 index a18ff0389..000000000 --- a/utils/test/result_collection_api/update/utils.py +++ /dev/null @@ -1,48 +0,0 @@ -############################################################################## -# Copyright (c) 2016 ZTE Corporation -# feng.xiaowei@zte.com.cn -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## -import os -import urlparse -import subprocess - - -def get_abspath(path): - assert os.path.isdir(path), 'Path %s can\'t be found.' % path - return os.path.abspath(path) - - -def parse_mongodb_url(url): - url = urlparse.urlparse(url) - assert url.scheme == 'mongodb', 'URL must be a MongoDB URL' - return url - - -def url_parse(url): - url = parse_mongodb_url(url) - return url.username, url.password, url.hostname, url.port - - -def execute(cmd, args): - (username, password, hostname, port) = url_parse(args.url) - cmd.extend(['--host', '%s' % hostname, '--port', '%s' % port]) - db = args.db - if db is not None: - cmd.extend(['--db', '%s' % db]) - if username is not None: - cmd.extend(['-u', '%s' % username, '-p', '%s' % password]) - print('execute: %s' % cmd) - execute_output = subprocess.check_output(cmd) - print(execute_output) - - -def main(method, parser): - args = parser.parse_args() - try: - method(args) - except AssertionError, msg: - print(msg) -- cgit 1.2.3-korg