Skip to content

Commit

Permalink
Add 'clone' action to release client command.
Browse files Browse the repository at this point in the history
JIRA: PDC-1149
  • Loading branch information
xychu committed Nov 12, 2015
1 parent ba6fa9c commit 0ca2307
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 0 deletions.
42 changes: 42 additions & 0 deletions pdc_client/plugins/release.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,14 @@ def register(self):
self.add_release_arguments(create_parser, required=True)
create_parser.set_defaults(func=self.release_create)

clone_parser = self.add_action('clone', help='clone new release from an existed one',
description=('NOTE: At least one of `short`, `version`, '
'`base_product` or `release_type` '
'is required.'))
clone_parser.add_argument('old_release_id', metavar='OLD_RELEASE_ID')
self.add_clone_arguments(clone_parser, required=False)
clone_parser.set_defaults(func=self.release_clone)

def add_release_arguments(self, parser, required=False):
group = parser.add_mutually_exclusive_group()
group.add_argument('--activate', action='store_const', const=True, dest='active')
Expand All @@ -55,6 +63,29 @@ def add_release_arguments(self, parser, required=False):

self.run_hook('release_parser_setup', parser)

def add_clone_arguments(self, parser, required=False):
active_group = parser.add_mutually_exclusive_group()
active_group.add_argument('--activate', action='store_const', const=True, dest='active')
active_group.add_argument('--deactivate', action='store_const', const=False, dest='active')

optional_args = {
'short': {},
'version': {},
'release_type': {},
'base_product': {},
'name': {},
'product_version': {},
'bugzilla__product': {'arg': 'bugzilla-product'},
'dist_git__branch': {'arg': 'dist-git-branch'},
'component_dist_git_branch': {},
'include_inactive': {},
'include_trees': {},
'integrated_with': {}
}
add_create_update_args(parser, {}, optional_args, required)

self.run_hook('release_parser_setup', parser)

def list_releases(self, args):
filters = {}
if args.inactive:
Expand Down Expand Up @@ -129,6 +160,17 @@ def release_create(self, args):
response = self.client.releases._(data)
self.release_info(args, response['release_id'])

def release_clone(self, args):
data = self.get_release_data(args)
if not any(key in data for key in ['short', 'version', 'base_product', 'release_type']):
self.subparsers.choices.get('clone').error(
('At least one of `short`, `version`, `base_product` '
'or `release_type` is required.'))
data['old_release_id'] = args.old_release_id
self.logger.debug('Clone release with data {}'.format(data))
response = self.client.rpc.release.clone._(data)
self.release_info(args, response['release_id'])

def get_release_data(self, args):
data = extract_arguments(args)
if args.active is not None:
Expand Down
12 changes: 12 additions & 0 deletions pdc_client/tests/release/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,18 @@ def test_create(self, api):
'releases/release-1.0': [('GET', {})],
'release-variants': [('GET', {'page': 1, 'release': 'release-1.0'})]})

def test_clone(self, api):
api.add_endpoint('rpc/release/clone', 'POST', self.release_detail)
self._setup_release_detail(api)
with self.expect_output('detail.txt'):
self.runner.run(['release', 'clone', 'old_release_id', '--version', '1.0'])
self.assertDictEqual(api.calls,
{'rpc/release/clone': [('POST',
{'old_release_id': 'old_release_id',
'version': '1.0'})],
'releases/release-1.0': [('GET', {})],
'release-variants': [('GET', {'page': 1, 'release': 'release-1.0'})]})

def test_info_json(self, api):
self._setup_release_detail(api)
with self.expect_output('detail.json', parse_json=True):
Expand Down

0 comments on commit 0ca2307

Please sign in to comment.