Baremetal/utils should not log certain exceptions

unlink_without_raise was logging exceptions when it failed to unlink a
file, which is confusing since it is often called on non-existing files.

create_link_without_raise was also logging exceptions when it failed
to create a symlink.

This patch corrects this behaviour; both functions now explicitly check
for the type of error they expect, and then suppress that. If another
type of OSError is encountered, a warning is logged. This patch also
adds unit tests for both functions.

fixes bug 1097931.

Change-Id: Ie36f59dce34a6c67765770c5f968c003003acc88
This commit is contained in:
Devananda van der Veen 2013-01-17 13:30:58 -08:00
parent 1c9111eaa2
commit fd6120c877
2 changed files with 48 additions and 5 deletions
nova
tests/baremetal
virt/baremetal

@ -20,6 +20,9 @@
import mox
import errno
import os
from nova import exception
from nova import test
from nova.virt.baremetal import utils
@ -32,3 +35,36 @@ class BareMetalUtilsTestCase(test.TestCase):
self.assertEqual(len(s), 10)
s = utils.random_alnum(100)
self.assertEqual(len(s), 100)
def test_unlink(self):
self.mox.StubOutWithMock(os, "unlink")
os.unlink("/fake/path")
self.mox.ReplayAll()
utils.unlink_without_raise("/fake/path")
self.mox.VerifyAll()
def test_unlink_ENOENT(self):
self.mox.StubOutWithMock(os, "unlink")
os.unlink("/fake/path").AndRaise(OSError(errno.ENOENT))
self.mox.ReplayAll()
utils.unlink_without_raise("/fake/path")
self.mox.VerifyAll()
def test_create_link(self):
self.mox.StubOutWithMock(os, "symlink")
os.symlink("/fake/source", "/fake/link")
self.mox.ReplayAll()
utils.create_link_without_raise("/fake/source", "/fake/link")
self.mox.VerifyAll()
def test_create_link_EEXIST(self):
self.mox.StubOutWithMock(os, "symlink")
os.symlink("/fake/source", "/fake/link").AndRaise(
OSError(errno.EEXIST))
self.mox.ReplayAll()
utils.create_link_without_raise("/fake/source", "/fake/link")
self.mox.VerifyAll()

@ -15,6 +15,7 @@
# License for the specific language governing permissions and limitations
# under the License.
import errno
import os
import shutil
@ -44,8 +45,11 @@ def inject_into_image(image, key, net, metadata, admin_password,
def unlink_without_raise(path):
try:
os.unlink(path)
except OSError:
LOG.exception(_("Failed to unlink %s") % path)
except OSError, e:
if e.errno == errno.ENOENT:
return
else:
LOG.warn(_("Failed to unlink %(path)s, error: %(e)s") % locals())
def rmtree_without_raise(path):
@ -64,9 +68,12 @@ def write_to_file(path, contents):
def create_link_without_raise(source, link):
try:
os.symlink(source, link)
except OSError:
LOG.exception(_("Failed to create symlink from %(source)s to %(link)s")
% locals())
except OSError, e:
if e.errno == errno.EEXIST:
return
else:
LOG.warn(_("Failed to create symlink from %(source)s to %(link)s"
", error: %(e)s") % locals())
def random_alnum(count):