diff --git a/nailgun/nailgun/api/models/fields.py b/nailgun/nailgun/api/models/fields.py index 72405acf2f..0bc1f54a1a 100644 --- a/nailgun/nailgun/api/models/fields.py +++ b/nailgun/nailgun/api/models/fields.py @@ -32,3 +32,11 @@ class JSON(types.TypeDecorator): if value is not None: value = json.loads(value) return value + + +class LowercaseString(types.TypeDecorator): + + impl = types.String + + def process_bind_param(self, value, dialect): + return value.lower() diff --git a/nailgun/nailgun/api/models/node.py b/nailgun/nailgun/api/models/node.py index c288176f7d..19866c5e32 100644 --- a/nailgun/nailgun/api/models/node.py +++ b/nailgun/nailgun/api/models/node.py @@ -26,6 +26,7 @@ from sqlalchemy.orm import relationship, backref from nailgun.api.models.base import Base from nailgun.api.models.fields import JSON +from nailgun.api.models.fields import LowercaseString from nailgun.api.models.network import AllowedNetworks from nailgun.api.models.network import NetworkAssignment from nailgun.db import db @@ -78,7 +79,7 @@ class Node(Base): default='discover' ) meta = Column(JSON, default={}) - mac = Column(String(17), nullable=False, unique=True) + mac = Column(LowercaseString(17), nullable=False, unique=True) ip = Column(String(15)) fqdn = Column(String(255)) manufacturer = Column(Unicode(50)) @@ -244,7 +245,7 @@ class NodeNICInterface(Base): ForeignKey('nodes.id', ondelete="CASCADE"), nullable=False) name = Column(String(128), nullable=False) - mac = Column(String(32), nullable=False) + mac = Column(LowercaseString(17), nullable=False) max_speed = Column(Integer) current_speed = Column(Integer) allowed_networks = relationship( diff --git a/nailgun/nailgun/fixtures/sample_environment.json b/nailgun/nailgun/fixtures/sample_environment.json index 4b596eb5f6..1bc9fb1c65 100644 --- a/nailgun/nailgun/fixtures/sample_environment.json +++ b/nailgun/nailgun/fixtures/sample_environment.json @@ -9,7 +9,7 @@ "online": true, "pending_addition": false, "platform_name": "X9DRW", - "mac": "00:25:90:6A:B1:10", + "mac": "00:25:90:6a:b1:10", "meta": { "cpu": { "real": 2, @@ -115,13 +115,13 @@ }, "interfaces": [ { - "mac": "00:25:90:6A:B1:10", + "mac": "00:25:90:6a:b1:10", "max_speed": 1000, "name": "eth0", "current_speed": 1000 }, { - "mac": "00:25:90:6A:B1:11", + "mac": "00:25:90:6a:b1:11", "max_speed": 1000, "name": "eth1", "current_speed": null, @@ -283,7 +283,7 @@ "online": true, "pending_addition": false, "platform_name": "Inspiron N5110", - "mac": "58:91:CF:2A:C4:1B", + "mac": "58:91:cF:2a:c4:1b", "meta": { "memory": { "slots": 2, @@ -305,20 +305,20 @@ "interfaces": [ { "ip": "10.20.0.4", - "mac": "58:91:CF:2A:C4:1B", + "mac": "58:91:cF:2a:c4:1b", "netmask": "255.255.255.0", "current_speed": null, "name": "wlan0" }, { "ip": "192.168.70.234", - "mac": "24:B6:FD:53:63:00", + "mac": "24:b6:fd:53:63:00", "max_speed": 100, "name": "eth0", "current_speed": 10 }, { - "mac": "54:78:EA:05:17:BA", + "mac": "54:78:ea:05:17:ba", "max_speed": 100, "name": "eth1", "current_speed": 20 @@ -400,7 +400,7 @@ "online": true, "pending_addition": false, "platform_name": "X9SCD", - "mac": "00:25:90:67:9F:B7", + "mac": "00:25:90:67:9f:b7", "meta": { "memory": { "slots": 4, @@ -434,13 +434,13 @@ "name": "eth1", "ip": "172.18.67.167", "netmask": "255.255.255.240", - "mac": "00:25:90:67:9F:B7", + "mac": "00:25:90:67:9f:b7", "max_speed": 1000, "current_speed": 1000 }, { "ip": "10.20.0.5", - "mac": "00:25:90:67:9F:B6", + "mac": "00:25:90:67:9f:b6", "max_speed": 1000, "name": "eth0", "current_speed": null @@ -524,7 +524,7 @@ "online": false, "pending_addition": false, "platform_name": "X9SCD", - "mac": "00:25:90:67:9D:24", + "mac": "00:25:90:67:9d:24", "meta": { "memory": { "slots": 4, @@ -555,7 +555,7 @@ }, "interfaces": [ { - "mac": "00:25:90:67:9D:25", + "mac": "00:25:90:67:9d:25", "max_speed": 1000, "name": "eth1", "current_speed": null @@ -564,7 +564,7 @@ "name": "eth0", "ip": "10.20.0.6", "netmask": "255.255.255.240", - "mac": "00:25:90:67:9D:24", + "mac": "00:25:90:67:9d:24", "max_speed": 1000, "current_speed": 1000 } @@ -648,7 +648,7 @@ "online": true, "pending_addition": false, "platform_name": "X9SCD", - "mac": "00:25:90:67:9C:9C", + "mac": "00:25:90:67:9c:9c", "meta": { "memory": { "slots": 4, @@ -679,7 +679,7 @@ }, "interfaces": [ { - "mac": "00:25:90:67:9C:9D", + "mac": "00:25:90:67:9c:9d", "max_speed": 1000, "name": "eth1", "current_speed": null, @@ -688,7 +688,7 @@ { "name": "eth0", "netmask": "255.255.255.224", - "mac": "00:25:90:67:9C:9C", + "mac": "00:25:90:67:9c:9c", "max_speed": 1000, "current_speed": 1000 } @@ -770,7 +770,7 @@ "ip": "10.20.0.63", "online": true, "pending_addition": false, - "mac": "08:00:27:22:AB:AA", + "mac": "08:00:27:22:ab:aa", "meta": { "memory": { "total": 778887168 @@ -780,7 +780,7 @@ "name": "eth0", "ip": "10.20.0.63", "netmask": "255.255.255.0", - "mac": "08:00:27:22:AB:AA", + "mac": "08:00:27:22:ab:aa", "max_speed": 100, "current_speed": 100 } @@ -827,7 +827,7 @@ "ip": "10.20.0.226", "online": true, "pending_addition": false, - "mac": "52:54:00:0E:B8:F5", + "mac": "52:54:00:0e:b8:f5", "meta": { "memory": { "slots": 1, @@ -845,7 +845,7 @@ "name": "eth0", "ip": "10.20.0.226", "netmask": "255.255.255.0", - "mac": "52:54:00:0E:B8:F5", + "mac": "52:54:00:0e:b8:f5", "max_speed": 100, "current_speed": 100 } @@ -891,7 +891,7 @@ "pending_addition": false, "fqdn": "slave-15.domain.tld", "platform_name": "X9DRW", - "mac": "00:25:90:6A:B1:84", + "mac": "00:25:90:6a:b1:84", "meta": { "cpu": { "real": 2, @@ -1000,13 +1000,13 @@ "name": "p2p1", "ip": "172.18.67.170", "netmask": "255.255.255.240", - "mac": "00:25:90:6A:B1:84", + "mac": "00:25:90:6a:b1:84", "max_speed": 1000, "current_speed": 1000 }, { "ip": "10.20.0.7", - "mac": "00:25:90:6A:B1:85", + "mac": "00:25:90:6a:b1:b5", "max_speed": 1000, "name": "p2p2", "current_speed": null diff --git a/nailgun/nailgun/test/base.py b/nailgun/nailgun/test/base.py index 6f1836c476..cbd9268c17 100644 --- a/nailgun/nailgun/test/base.py +++ b/nailgun/nailgun/test/base.py @@ -303,7 +303,7 @@ class Environment(object): def _generate_random_mac(self): mac = [randint(0x00, 0x7f) for _ in xrange(6)] - return ':'.join(map(lambda x: "%02x" % x, mac)).upper() + return ':'.join(map(lambda x: "%02x" % x, mac)).lower() def generate_interfaces_in_meta(self, amount): nics = [] diff --git a/nailgun/nailgun/test/unit/test_node_nic_handler.py b/nailgun/nailgun/test/unit/test_node_nic_handler.py index f6b536c9b1..99cf93fa0c 100644 --- a/nailgun/nailgun/test/unit/test_node_nic_handler.py +++ b/nailgun/nailgun/test/unit/test_node_nic_handler.py @@ -246,3 +246,16 @@ class TestHandlers(BaseIntegrationTest): self.assertEquals(resp.status, 200) response = json.loads(resp.body) self.assertNotEquals(response[0]['id'], fake_id) + + def test_mac_address_should_be_in_lower_case(self): + meta = self.env.default_metadata() + new_mac = 'AA:BB:CC:DD:11:22' + self.env.set_interfaces_in_meta(meta, [ + {'name': 'eth0', 'mac': new_mac}]) + node = self.env.create_node(api=True, meta=meta) + resp = self.app.get( + reverse('NodeNICsHandler', kwargs={'node_id': node['id']}), + headers=self.default_headers) + self.assertEquals(resp.status, 200) + response = json.loads(resp.body) + self.assertNotEquals(response[0]['mac'], new_mac.lower())