Merge "Only delete 'owned' packages for --exists-action update"

This commit is contained in:
Jenkins 2015-04-29 21:05:11 +00:00 committed by Gerrit Code Review
commit 6ec80dfdeb
2 changed files with 154 additions and 3 deletions

View File

@ -27,6 +27,7 @@ import requests_mock
import six import six
from testtools import matchers from testtools import matchers
from muranoclient.common import exceptions as common_exceptions
from muranoclient.common import utils from muranoclient.common import utils
from muranoclient.openstack.common.apiclient import exceptions from muranoclient.openstack.common.apiclient import exceptions
import muranoclient.shell import muranoclient.shell
@ -335,6 +336,136 @@ class ShellPackagesOperations(ShellTest):
'is_public': True 'is_public': True
}, {RESULT_PACKAGE: mock.ANY},) }, {RESULT_PACKAGE: mock.ANY},)
def _test_conflict(self,
packages, from_file, raw_input_mock,
input_action, exists_action=''):
packages.create = mock.MagicMock(
side_effect=[common_exceptions.HTTPConflict("Conflict"), None])
packages.filter.return_value = [mock.Mock(id='test_id')]
raw_input_mock.return_value = input_action
args = TestArgs()
args.exists_action = exists_action
with tempfile.NamedTemporaryFile() as f:
args.filename = f.name
pkg = make_pkg({'FullName': f.name})
from_file.return_value = utils.Package(utils.File(pkg))
v1_shell.do_package_import(self.client, args)
return f.name
@mock.patch('__builtin__.raw_input')
@mock.patch('muranoclient.common.utils.Package.from_file')
def test_package_import_conflict_skip(self, from_file, raw_input_mock):
name = self._test_conflict(
self.client.packages,
from_file,
raw_input_mock,
's',
)
self.client.packages.create.assert_called_once_with({
'is_public': False,
}, {name: mock.ANY},)
@mock.patch('__builtin__.raw_input')
@mock.patch('muranoclient.common.utils.Package.from_file')
def test_package_import_conflict_skip_ea(self, from_file, raw_input_mock):
name = self._test_conflict(
self.client.packages,
from_file,
raw_input_mock,
'',
exists_action='s',
)
self.client.packages.create.assert_called_once_with({
'is_public': False,
}, {name: mock.ANY},)
self.assertFalse(raw_input_mock.called)
@mock.patch('__builtin__.raw_input')
@mock.patch('muranoclient.common.utils.Package.from_file')
def test_package_import_conflict_abort(self, from_file, raw_input_mock):
self.assertRaises(SystemExit, self._test_conflict,
self.client.packages,
from_file,
raw_input_mock,
'a',
)
self.client.packages.create.assert_called_once_with({
'is_public': False,
}, mock.ANY,)
@mock.patch('__builtin__.raw_input')
@mock.patch('muranoclient.common.utils.Package.from_file')
def test_package_import_conflict_abort_ea(self,
from_file, raw_input_mock):
self.assertRaises(SystemExit, self._test_conflict,
self.client.packages,
from_file,
raw_input_mock,
'',
exists_action='a',
)
self.client.packages.create.assert_called_once_with({
'is_public': False,
}, mock.ANY,)
self.assertFalse(raw_input_mock.called)
@mock.patch('__builtin__.raw_input')
@mock.patch('muranoclient.common.utils.Package.from_file')
def test_package_import_conflict_update(self, from_file, raw_input_mock):
name = self._test_conflict(
self.client.packages,
from_file,
raw_input_mock,
'u',
)
self.client.packages.delete.assert_called_once_with('test_id')
self.client.packages.create.assert_has_calls(
[
mock.call({'is_public': False}, {name: mock.ANY},),
mock.call({'is_public': False}, {name: mock.ANY},)
], any_order=True,
)
self.assertEqual(self.client.packages.create.call_count, 2)
@mock.patch('__builtin__.raw_input')
@mock.patch('muranoclient.common.utils.Package.from_file')
def test_package_import_conflict_update_ea(self,
from_file, raw_input_mock):
name = self._test_conflict(
self.client.packages,
from_file,
raw_input_mock,
'',
exists_action='u',
)
self.client.packages.delete.assert_called_once_with('test_id')
self.client.packages.create.assert_has_calls(
[
mock.call({'is_public': False}, {name: mock.ANY},),
mock.call({'is_public': False}, {name: mock.ANY},)
], any_order=True,
)
self.assertEqual(self.client.packages.create.call_count, 2)
self.assertFalse(raw_input_mock.called)
@mock.patch('muranoclient.common.utils.Package.from_file') @mock.patch('muranoclient.common.utils.Package.from_file')
def test_package_import_no_categories(self, from_file): def test_package_import_no_categories(self, from_file):
args = TestArgs() args = TestArgs()

View File

@ -280,7 +280,8 @@ def _handle_package_exists(mc, data, package, exists_action):
try: try:
return mc.packages.create(data, {name: package.file()}) return mc.packages.create(data, {name: package.file()})
except common_exceptions.HTTPConflict: except common_exceptions.HTTPConflict:
print("Package with name {0} is already registered.".format(name)) print("Importing package {0} failed. Package with the same"
" name/classes is already registered.".format(name))
allowed_results = ['s', 'u', 'a'] allowed_results = ['s', 'u', 'a']
res = exists_action res = exists_action
if not res: if not res:
@ -296,8 +297,23 @@ def _handle_package_exists(mc, data, package, exists_action):
print("Exiting.") print("Exiting.")
sys.exit() sys.exit()
elif res == 'u': elif res == 'u':
print("Deleting package {0}".format(name)) pkgs = list(mc.packages.filter(fqn=name, owned=True))
mc.packages.delete(name) if not pkgs:
msg = (
"Got Conflict response, but couldn't find package "
"'{0}' in the current tenant.\nThis probably means "
"conflicting package is in another tenant.\n"
"Please delete it manually."
).format(name)
raise exceptions.CommandError(msg)
elif len(pkgs) > 1:
msg = (
"Got {0} packages with name '{1}'.\nI'm not trusting "
"myself, please delete the package manually"
).format(len(pkgs), name)
raise exceptions.CommandError(msg)
print("Deleting package {0}({1})".format(name, pkgs[0].id))
mc.packages.delete(pkgs[0].id)
continue continue
@ -358,6 +374,8 @@ def do_package_import(mc, args):
"images for {1}".format(e, name)) "images for {1}".format(e, name))
try: try:
_handle_package_exists(mc, data, package, args.exists_action) _handle_package_exists(mc, data, package, args.exists_action)
except exceptions.CommandError:
raise
except Exception as e: except Exception as e:
print("Error {0} occurred while installing package {1}".format( print("Error {0} occurred while installing package {1}".format(
e, name)) e, name))
@ -426,6 +444,8 @@ def do_bundle_import(mc, args):
try: try:
_handle_package_exists( _handle_package_exists(
mc, data, dep_package, args.exists_action) mc, data, dep_package, args.exists_action)
except exceptions.CommandError:
raise
except Exception as e: except Exception as e:
print("Error {0} occurred while " print("Error {0} occurred while "
"installing package {1}".format(e, name)) "installing package {1}".format(e, name))