From d4e461ea1776bbf812e72444504c484bb07396c4 Mon Sep 17 00:00:00 2001
From: Nguyen Hung Phuong <phuongnh@vn.fujitsu.com>
Date: Tue, 16 Aug 2016 10:27:20 +0700
Subject: [PATCH] Clean imports in code

In some part in the code we import objects.
In the Openstack style guidelines they recommend to import only
modules.

http://docs.openstack.org/developer/hacking/#imports

Change-Id: Ib3ded82524071c97f4e0508af7933ead63cc2dc5
---
 ironic/api/app.py                               | 12 +++++++-----
 ironic/api/controllers/v1/utils.py              |  4 ++--
 ironic/drivers/modules/amt/common.py            |  4 ++--
 ironic/drivers/modules/msftocs/msftocsclient.py |  6 +++---
 ironic/tests/unit/api/v1/test_drivers.py        |  6 +++---
 ironic/tests/unit/api/v1/test_nodes.py          | 12 ++++++------
 ironic/tests/unit/api/v1/test_ports.py          |  6 +++---
 ironic/tests/unit/api/v1/test_utils.py          |  4 ++--
 ironic/tests/unit/drivers/modules/amt/utils.py  | 11 ++++++-----
 ironic/tests/unit/objects/test_chassis.py       |  4 ++--
 ironic/tests/unit/objects/test_node.py          |  4 ++--
 ironic/tests/unit/objects/test_port.py          |  4 ++--
 ironic/tests/unit/objects/test_portgroup.py     |  6 +++---
 13 files changed, 43 insertions(+), 40 deletions(-)

diff --git a/ironic/api/app.py b/ironic/api/app.py
index 7c2c401b7d..5af2187051 100644
--- a/ironic/api/app.py
+++ b/ironic/api/app.py
@@ -16,13 +16,12 @@
 #    under the License.
 
 import keystonemiddleware.audit as audit_middleware
-from keystonemiddleware.audit import PycadfAuditApiConfigError
 from oslo_config import cfg
 import oslo_middleware.cors as cors_middleware
 import pecan
 
 from ironic.api import config
-from ironic.api.controllers.base import Version
+from ironic.api.controllers import base
 from ironic.api import hooks
 from ironic.api import middleware
 from ironic.api.middleware import auth_token
@@ -67,7 +66,8 @@ def setup_app(pecan_config=None, extra_hooks=None):
                 audit_map_file=CONF.audit.audit_map_file,
                 ignore_req_list=CONF.audit.ignore_req_list
             )
-        except (EnvironmentError, OSError, PycadfAuditApiConfigError) as e:
+        except (EnvironmentError, OSError,
+                audit_middleware.PycadfAuditApiConfigError) as e:
             raise exception.InputFileError(
                 file_name=CONF.audit.audit_map_file,
                 reason=e
@@ -82,9 +82,11 @@ def setup_app(pecan_config=None, extra_hooks=None):
     # included in all CORS responses.
     app = cors_middleware.CORS(app, CONF)
     app.set_latent(
-        allow_headers=[Version.max_string, Version.min_string, Version.string],
+        allow_headers=[base.Version.max_string, base.Version.min_string,
+                       base.Version.string],
         allow_methods=['GET', 'PUT', 'POST', 'DELETE', 'PATCH'],
-        expose_headers=[Version.max_string, Version.min_string, Version.string]
+        expose_headers=[base.Version.max_string, base.Version.min_string,
+                        base.Version.string]
     )
 
     return app
diff --git a/ironic/api/controllers/v1/utils.py b/ironic/api/controllers/v1/utils.py
index 6c0cba7671..8a7d05dab2 100644
--- a/ironic/api/controllers/v1/utils.py
+++ b/ironic/api/controllers/v1/utils.py
@@ -22,7 +22,7 @@ import pecan
 from pecan import rest
 import six
 from six.moves import http_client
-from webob.static import FileIter
+from webob import static
 import wsme
 
 from ironic.api.controllers.v1 import versions
@@ -203,7 +203,7 @@ def vendor_passthru(ident, method, topic, data=None, driver_passthru=False):
             # If unicode, convert to bytes
             return_value = return_value.encode('utf-8')
         file_ = wsme.types.File(content=return_value)
-        pecan.response.app_iter = FileIter(file_.file)
+        pecan.response.app_iter = static.FileIter(file_.file)
         # Since we've attached the return value to the response
         # object the response body should now be empty.
         return_value = None
diff --git a/ironic/drivers/modules/amt/common.py b/ironic/drivers/modules/amt/common.py
index d950d8d8c9..831c1b0b3d 100644
--- a/ironic/drivers/modules/amt/common.py
+++ b/ironic/drivers/modules/amt/common.py
@@ -14,7 +14,7 @@
 Common functionalities for AMT Driver
 """
 import time
-from xml.etree import ElementTree
+from xml import etree
 
 from oslo_concurrency import processutils
 from oslo_config import cfg
@@ -216,7 +216,7 @@ def xml_find(doc, namespace, item):
     """
     if doc is None:
         raise exception.AMTConnectFailure()
-    tree = ElementTree.fromstring(doc.root().string())
+    tree = etree.ElementTree.fromstring(doc.root().string())
     query = ('.//{%(namespace)s}%(item)s' % {'namespace': namespace,
                                              'item': item})
     return tree.find(query)
diff --git a/ironic/drivers/modules/msftocs/msftocsclient.py b/ironic/drivers/modules/msftocs/msftocsclient.py
index 32a3192d2a..3c7d75829f 100644
--- a/ironic/drivers/modules/msftocs/msftocsclient.py
+++ b/ironic/drivers/modules/msftocs/msftocsclient.py
@@ -19,7 +19,7 @@ https://github.com/MSOpenTech/ChassisManager
 """
 
 import posixpath
-from xml.etree import ElementTree
+from xml import etree
 
 from oslo_log import log
 import requests
@@ -80,8 +80,8 @@ class MSFTOCSClientApi(object):
 
     def _check_completion_code(self, xml_response):
         try:
-            et = ElementTree.fromstring(xml_response)
-        except ElementTree.ParseError as ex:
+            et = etree.ElementTree.fromstring(xml_response)
+        except etree.ElementTree.ParseError as ex:
             LOG.exception(_LE("XML parsing failed: %s"), ex)
             raise exception.MSFTOCSClientApiException(
                 _("Invalid XML: %s") % xml_response)
diff --git a/ironic/tests/unit/api/v1/test_drivers.py b/ironic/tests/unit/api/v1/test_drivers.py
index 40850c9b97..cc519c5690 100644
--- a/ironic/tests/unit/api/v1/test_drivers.py
+++ b/ironic/tests/unit/api/v1/test_drivers.py
@@ -18,7 +18,7 @@ import json
 import mock
 from oslo_config import cfg
 from six.moves import http_client
-from testtools.matchers import HasLength
+from testtools import matchers
 
 from ironic.api.controllers import base as api_base
 from ironic.api.controllers.v1 import driver
@@ -50,7 +50,7 @@ class TestListDrivers(base.BaseApiTest):
             {'name': self.d2, 'hosts': [self.h1, self.h2]},
         ], key=lambda d: d['name'])
         data = self.get_json('/drivers')
-        self.assertThat(data['drivers'], HasLength(2))
+        self.assertThat(data['drivers'], matchers.HasLength(2))
         drivers = sorted(data['drivers'], key=lambda d: d['name'])
         for i in range(len(expected)):
             d = drivers[i]
@@ -61,7 +61,7 @@ class TestListDrivers(base.BaseApiTest):
 
     def test_drivers_no_active_conductor(self):
         data = self.get_json('/drivers')
-        self.assertThat(data['drivers'], HasLength(0))
+        self.assertThat(data['drivers'], matchers.HasLength(0))
         self.assertEqual([], data['drivers'])
 
     @mock.patch.object(rpcapi.ConductorAPI, 'get_driver_properties')
diff --git a/ironic/tests/unit/api/v1/test_nodes.py b/ironic/tests/unit/api/v1/test_nodes.py
index 476377d00b..5991e3a2da 100644
--- a/ironic/tests/unit/api/v1/test_nodes.py
+++ b/ironic/tests/unit/api/v1/test_nodes.py
@@ -25,7 +25,7 @@ from oslo_utils import uuidutils
 import six
 from six.moves import http_client
 from six.moves.urllib import parse as urlparse
-from testtools.matchers import HasLength
+from testtools import matchers
 from wsme import types as wtypes
 
 from ironic.api.controllers import base as api_base
@@ -560,7 +560,7 @@ class TestListNodes(test_api_base.BaseApiTest):
         data = self.get_json('/nodes?instance_uuid=%s' % instance_uuid,
                              headers={api_base.Version.string: "1.5"})
 
-        self.assertThat(data['nodes'], HasLength(1))
+        self.assertThat(data['nodes'], matchers.HasLength(1))
         self.assertEqual(node['instance_uuid'],
                          data['nodes'][0]["instance_uuid"])
 
@@ -572,7 +572,7 @@ class TestListNodes(test_api_base.BaseApiTest):
 
         data = self.get_json('/nodes?instance_uuid=%s' % wrong_uuid)
 
-        self.assertThat(data['nodes'], HasLength(0))
+        self.assertThat(data['nodes'], matchers.HasLength(0))
 
     def test_node_by_instance_uuid_invalid_uuid(self):
         response = self.get_json('/nodes?instance_uuid=fake',
@@ -618,13 +618,13 @@ class TestListNodes(test_api_base.BaseApiTest):
 
         data = self.get_json('/nodes?associated=False&limit=2')
 
-        self.assertThat(data['nodes'], HasLength(2))
+        self.assertThat(data['nodes'], matchers.HasLength(2))
         self.assertIn(data['nodes'][0]['uuid'], unassociated_nodes)
 
     def test_next_link_with_association(self):
         self._create_association_test_nodes()
         data = self.get_json('/nodes/?limit=3&associated=True')
-        self.assertThat(data['nodes'], HasLength(3))
+        self.assertThat(data['nodes'], matchers.HasLength(3))
         self.assertIn('associated=True', data['next'])
 
     def test_detail_with_association_filter(self):
@@ -637,7 +637,7 @@ class TestListNodes(test_api_base.BaseApiTest):
     def test_next_link_with_association_with_detail(self):
         self._create_association_test_nodes()
         data = self.get_json('/nodes/detail?limit=3&associated=true')
-        self.assertThat(data['nodes'], HasLength(3))
+        self.assertThat(data['nodes'], matchers.HasLength(3))
         self.assertIn('driver', data['nodes'][0])
         self.assertIn('associated=True', data['next'])
 
diff --git a/ironic/tests/unit/api/v1/test_ports.py b/ironic/tests/unit/api/v1/test_ports.py
index 59f6648aa0..ef6a0161a9 100644
--- a/ironic/tests/unit/api/v1/test_ports.py
+++ b/ironic/tests/unit/api/v1/test_ports.py
@@ -24,7 +24,7 @@ from oslo_utils import uuidutils
 import six
 from six.moves import http_client
 from six.moves.urllib import parse as urlparse
-from testtools.matchers import HasLength
+from testtools import matchers
 from wsme import types as wtypes
 
 from ironic.api.controllers import base as api_base
@@ -249,13 +249,13 @@ class TestListPorts(test_api_base.BaseApiTest):
 
         target_address = address_template % 1
         data = self.get_json('/ports?address=%s' % target_address)
-        self.assertThat(data['ports'], HasLength(1))
+        self.assertThat(data['ports'], matchers.HasLength(1))
         self.assertEqual(target_address, data['ports'][0]['address'])
 
     def test_port_by_address_non_existent_address(self):
         # non-existent address
         data = self.get_json('/ports?address=%s' % 'aa:bb:cc:dd:ee:ff')
-        self.assertThat(data['ports'], HasLength(0))
+        self.assertThat(data['ports'], matchers.HasLength(0))
 
     def test_port_by_address_invalid_address_format(self):
         obj_utils.create_test_port(self.context, node_id=self.node.id)
diff --git a/ironic/tests/unit/api/v1/test_utils.py b/ironic/tests/unit/api/v1/test_utils.py
index f540f5f1d7..7c9c8c0a08 100644
--- a/ironic/tests/unit/api/v1/test_utils.py
+++ b/ironic/tests/unit/api/v1/test_utils.py
@@ -19,7 +19,7 @@ from oslo_config import cfg
 from oslo_utils import uuidutils
 import pecan
 from six.moves import http_client
-from webob.static import FileIter
+from webob import static
 import wsme
 
 from ironic.api.controllers.v1 import node as api_node
@@ -443,7 +443,7 @@ class TestVendorPassthru(base.TestCase):
             'fake-data', 'fake-topic')
 
         # Assert file was attached to the response object
-        self.assertIsInstance(mock_response.app_iter, FileIter)
+        self.assertIsInstance(mock_response.app_iter, static.FileIter)
         self.assertEqual(expct_return_value,
                          mock_response.app_iter.file.read())
         # Assert response message is none
diff --git a/ironic/tests/unit/drivers/modules/amt/utils.py b/ironic/tests/unit/drivers/modules/amt/utils.py
index 6338f71689..552d3d37b3 100644
--- a/ironic/tests/unit/drivers/modules/amt/utils.py
+++ b/ironic/tests/unit/drivers/modules/amt/utils.py
@@ -15,7 +15,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-from xml.etree import ElementTree
+from xml import etree
 
 import mock
 
@@ -37,13 +37,14 @@ def build_soap_xml(items, namespace=None):
             xml_string = "{%(namespace)s}%(item)s" % {'namespace': namespace,
                                                       'item': xml_string}
 
-        element = ElementTree.Element(xml_string)
+        element = etree.ElementTree.Element(xml_string)
         element.text = value
         return element
 
     soap_namespace = "http://www.w3.org/2003/05/soap-envelope"
-    envelope_element = ElementTree.Element("{%s}Envelope" % soap_namespace)
-    body_element = ElementTree.Element("{%s}Body" % soap_namespace)
+    envelope_element = etree.ElementTree.Element(
+        "{%s}Envelope" % soap_namespace)
+    body_element = etree.ElementTree.Element("{%s}Body" % soap_namespace)
 
     for item in items:
         for i in item:
@@ -57,7 +58,7 @@ def build_soap_xml(items, namespace=None):
             body_element.append(insertion_point)
 
     envelope_element.append(body_element)
-    return ElementTree.tostring(envelope_element)
+    return etree.ElementTree.tostring(envelope_element)
 
 
 def mock_wsman_root(return_value):
diff --git a/ironic/tests/unit/objects/test_chassis.py b/ironic/tests/unit/objects/test_chassis.py
index d4859a5719..78045f40f3 100644
--- a/ironic/tests/unit/objects/test_chassis.py
+++ b/ironic/tests/unit/objects/test_chassis.py
@@ -16,7 +16,7 @@
 import datetime
 import mock
 from oslo_utils import uuidutils
-from testtools.matchers import HasLength
+from testtools import matchers
 
 from ironic.common import exception
 from ironic import objects
@@ -99,6 +99,6 @@ class TestChassisObject(base.DbTestCase):
                                autospec=True) as mock_get_list:
             mock_get_list.return_value = [self.fake_chassis]
             chassis = objects.Chassis.list(self.context)
-            self.assertThat(chassis, HasLength(1))
+            self.assertThat(chassis, matchers.HasLength(1))
             self.assertIsInstance(chassis[0], objects.Chassis)
             self.assertEqual(self.context, chassis[0]._context)
diff --git a/ironic/tests/unit/objects/test_node.py b/ironic/tests/unit/objects/test_node.py
index 74d95157ec..f439d88601 100644
--- a/ironic/tests/unit/objects/test_node.py
+++ b/ironic/tests/unit/objects/test_node.py
@@ -14,7 +14,7 @@
 #    under the License.
 
 import mock
-from testtools.matchers import HasLength
+from testtools import matchers
 
 from ironic.common import context
 from ironic.common import exception
@@ -113,7 +113,7 @@ class TestNodeObject(base.DbTestCase):
                                autospec=True) as mock_get_list:
             mock_get_list.return_value = [self.fake_node]
             nodes = objects.Node.list(self.context)
-            self.assertThat(nodes, HasLength(1))
+            self.assertThat(nodes, matchers.HasLength(1))
             self.assertIsInstance(nodes[0], objects.Node)
             self.assertEqual(self.context, nodes[0]._context)
 
diff --git a/ironic/tests/unit/objects/test_port.py b/ironic/tests/unit/objects/test_port.py
index 445ca84b7c..81b3a48e54 100644
--- a/ironic/tests/unit/objects/test_port.py
+++ b/ironic/tests/unit/objects/test_port.py
@@ -15,7 +15,7 @@
 
 import datetime
 import mock
-from testtools.matchers import HasLength
+from testtools import matchers
 
 from ironic.common import exception
 from ironic import objects
@@ -109,6 +109,6 @@ class TestPortObject(base.DbTestCase):
                                autospec=True) as mock_get_list:
             mock_get_list.return_value = [self.fake_port]
             ports = objects.Port.list(self.context)
-            self.assertThat(ports, HasLength(1))
+            self.assertThat(ports, matchers.HasLength(1))
             self.assertIsInstance(ports[0], objects.Port)
             self.assertEqual(self.context, ports[0]._context)
diff --git a/ironic/tests/unit/objects/test_portgroup.py b/ironic/tests/unit/objects/test_portgroup.py
index 4ced77a2f6..7337e539cf 100644
--- a/ironic/tests/unit/objects/test_portgroup.py
+++ b/ironic/tests/unit/objects/test_portgroup.py
@@ -12,7 +12,7 @@
 
 import datetime
 import mock
-from testtools.matchers import HasLength
+from testtools import matchers
 
 from ironic.common import exception
 from ironic import objects
@@ -119,7 +119,7 @@ class TestPortgroupObject(base.DbTestCase):
                                autospec=True) as mock_get_list:
             mock_get_list.return_value = [self.fake_portgroup]
             portgroups = objects.Portgroup.list(self.context)
-            self.assertThat(portgroups, HasLength(1))
+            self.assertThat(portgroups, matchers.HasLength(1))
             self.assertIsInstance(portgroups[0], objects.Portgroup)
             self.assertEqual(self.context, portgroups[0]._context)
 
@@ -130,6 +130,6 @@ class TestPortgroupObject(base.DbTestCase):
             node_id = self.fake_portgroup['node_id']
             portgroups = objects.Portgroup.list_by_node_id(self.context,
                                                            node_id)
-            self.assertThat(portgroups, HasLength(1))
+            self.assertThat(portgroups, matchers.HasLength(1))
             self.assertIsInstance(portgroups[0], objects.Portgroup)
             self.assertEqual(self.context, portgroups[0]._context)