Update ironic properties to match REST API doc

The referenced doc is here:

http://docs.openstack.org/developer/ironic/webapi/v1.html

This fix should make it far more explicit what units are needed
for various node properties.  Note that Ironic and Nova BareMetal
now use the exact same property names.

Closes-bug: #1342156
Change-Id: I024c29d0ab648ed5db000ddb6d0ffaa24e8805b8
This commit is contained in:
Tzu-Mainn Chen 2014-07-18 04:45:17 +02:00
parent e536c65b3e
commit a6ea6bb4bf
10 changed files with 98 additions and 131 deletions

View File

@ -62,25 +62,10 @@ class IronicNode(base.APIResourceWrapper):
'properties', 'power_state', 'maintenance')
@classmethod
def create(cls, request, ipmi_address, architecture, cpu, ram, local_disk,
mac_addresses, ipmi_username=None, ipmi_password=None,
def create(cls, request, ipmi_address, architecture, cpus, memory_mb,
local_gb, mac_addresses, ipmi_username=None, ipmi_password=None,
driver=None):
"""Create a Node in Ironic
:param cpu: number of cores
:type cpu: int
:param ram: RAM in GB
:type ram: int
:param local_disk: local disk in TB
:type local_disk: int
:param mac_addresses: list of mac addresses
:type mac_addresses: list of str
:return: the created Node object
:rtype: tuskar_ui.api.node.IronicNode
"""
node = TEST_DATA.ironicclient_nodes.first()
return cls(node)
@ -190,31 +175,28 @@ class IronicNode(base.APIResourceWrapper):
ports = TEST_DATA.ironicclient_ports.list()
return [port.address for port in ports]
@cached_property
def cpus(self):
return self.properties['cpus']
@cached_property
def memory_mb(self):
return self.properties['memory_mb']
@cached_property
def local_gb(self):
return self.properties['local_gb']
class BareMetalNode(base.APIResourceWrapper):
_attrs = ('id', 'uuid', 'instance_uuid', 'memory_mb', 'cpus', 'local_gb',
'task_state', 'pm_user', 'pm_address', 'interfaces')
@classmethod
def create(cls, request, ipmi_address, architecture, cpu, ram, local_disk,
mac_addresses, ipmi_username=None, ipmi_password=None,
def create(cls, request, ipmi_address, architecture, cpus, memory_mb,
local_gb, mac_addresses, ipmi_username=None, ipmi_password=None,
driver=None):
"""Create a Nova BareMetalNode
:param cpu: number of cores
:type cpu: int
:param ram: RAM in GB
:type ram: int
:param local_disk: local disk in TB
:type local_disk: int
:param mac_addresses: list of mac addresses
:type mac_addresses: list of str
:return: the created BareMetalNode object
:rtype: tuskar_ui.api.node.BareMetalNode
"""
node = TEST_DATA.baremetalclient_nodes.first()
return cls(node)
@ -317,21 +299,6 @@ class BareMetalNode(base.APIResourceWrapper):
}
return task_state_dict.get(self.task_state, 'off')
@cached_property
def properties(self):
"""Return properties of this BareMetalNode
:return: return memory, cpus and local_disk properties
of this BareMetalNode, ram and local_disk properties
are in bytes
:rtype: dict of str
"""
return {
'ram': self.memory_mb * 1024.0 * 1024.0,
'cpu': self.cpus,
'local_disk': self.local_gb * 1024.0 * 1024.0 * 1024.0
}
@cached_property
def driver(self):
"""Return driver for this BareMetalNode
@ -386,7 +353,8 @@ class NodeClient(object):
class Node(base.APIResourceWrapper):
_attrs = ('id', 'uuid', 'instance_uuid', 'driver', 'driver_info',
'properties', 'power_state', 'addresses', 'maintenance')
'power_state', 'addresses', 'maintenance', 'cpus',
'memory_mb', 'local_gb')
def __init__(self, apiresource, request=None, **kwargs):
"""Initialize a Node
@ -409,11 +377,11 @@ class Node(base.APIResourceWrapper):
self._instance = kwargs['instance']
@classmethod
def create(cls, request, ipmi_address, architecture, cpu, ram, local_disk,
mac_addresses, ipmi_username=None, ipmi_password=None,
def create(cls, request, ipmi_address, architecture, cpus, memory_mb,
local_gb, mac_addresses, ipmi_username=None, ipmi_password=None,
driver=None):
return cls(NodeClient(request).node_class.create(
request, ipmi_address, architecture, cpu, ram, local_disk,
request, ipmi_address, architecture, cpus, memory_mb, local_gb,
mac_addresses, ipmi_username=ipmi_username,
ipmi_password=ipmi_password, driver=driver))
@ -448,7 +416,6 @@ class Node(base.APIResourceWrapper):
def list(cls, request, associated=None):
nodes = NodeClient(request).node_class.list(
request, associated=associated)
if associated is None or associated:
servers = TEST_DATA.novaclient_servers.list()
servers_dict = utils.list_to_dict(servers)

View File

@ -65,9 +65,9 @@ class FlavorSuggestion(object):
def from_node(cls, node):
return cls(
node_id=node.id,
vcpus=int(node.properties['cpu']),
ram_bytes=int(node.properties['ram']),
disk_bytes=int(node.properties['local_disk']),
vcpus=int(node.cpus),
ram_bytes=int(node.memory_mb * (1024 ** 2)),
disk_bytes=int(node.local_gb * (1024 ** 3)),
# TODO(rdopieralski) Add architecture when available.
)

View File

@ -97,7 +97,7 @@ class NodeForm(django.forms.Form):
widget=tuskar_ui.forms.NumberInput(
attrs={'class': 'input input-medium'}),
)
memory = django.forms.IntegerField(
memory_mb = django.forms.IntegerField(
label=_("Memory"),
required=True,
min_value=1,
@ -105,7 +105,7 @@ class NodeForm(django.forms.Form):
widget=tuskar_ui.forms.NumberInput(
attrs={'class': 'input input-medium'}),
)
local_disk = django.forms.IntegerField(
local_gb = django.forms.IntegerField(
label=_("Local Disk"),
required=True,
min_value=1,
@ -136,9 +136,9 @@ class BaseNodeFormset(django.forms.formsets.BaseFormSet):
# then we will need to use something else here?
ipmi_address=data['ipmi_address'],
architecture=data.get('architecture'),
cpu=data.get('cpus'),
ram=data.get('memory'),
local_disk=data.get('local_disk'),
cpus=data.get('cpus'),
memory_mb=data.get('memory_mb'),
local_gb=data.get('local_gb'),
mac_addresses=data['mac_addresses'].split(),
ipmi_username=data.get('ipmi_username'),
ipmi_password=data.get('ipmi_password'),

View File

@ -43,9 +43,9 @@ class NodeFilterAction(tables.FilterAction):
def comp(node):
return any(q in attr for attr in
(node.ip_address,
node.properties['cpu'],
node.properties['ram'],
node.properties['local_disk'],))
node.cpus,
node.memory_mb,
node.local_gb,))
return filter(comp, nodes)
@ -115,12 +115,12 @@ class IronicDiscoveredNodesTable(tables.DataTable):
node = tables.Column('uuid',
link="horizon:infrastructure:nodes:detail",
verbose_name=_("Node Name"))
cpu = tables.Column(lambda n: n.properties['cpu'],
verbose_name=_("CPU (cores)"))
ram = tables.Column(lambda n: n.properties['ram'],
verbose_name=_("Memory (MB)"))
local_disk = tables.Column(lambda n: n.properties['local_disk'],
verbose_name=_("Disk (GB)"))
cpus = tables.Column('cpus',
verbose_name=_("CPU (cores)"))
memory_mb = tables.Column('memory_mb',
verbose_name=_("Memory (MB)"))
local_gb = tables.Column('local_gb',
verbose_name=_("Disk (GB)"))
driver = tables.Column('driver',
verbose_name=_("Driver"))
nics = tables.Column(lambda n: len(n.addresses),

View File

@ -29,9 +29,9 @@ class OverviewTab(tabs.Tab):
def get_context_data(self, request):
nodes = api.node.Node.list(request)
cpus = sum(int(node.properties['cpu']) for node in nodes)
ram = sum(int(node.properties['ram']) for node in nodes)
local_disk = sum(int(node.properties['local_disk']) for node in nodes)
cpus = sum(int(node.cpus) for node in nodes)
memory_mb = sum(int(node.memory_mb) for node in nodes)
local_gb = sum(int(node.local_gb) for node in nodes)
deployed_nodes = api.node.Node.list(request, associated=True)
free_nodes = api.node.Node.list(request, associated=False)
deployed_nodes_error = api.node.filter_nodes(
@ -48,8 +48,8 @@ class OverviewTab(tabs.Tab):
return {
'cpus': cpus,
'ram_gb': ram / 1024.0 ** 3,
'local_disk_gb': local_disk / 1024.0 ** 3,
'memory_gb': memory_mb / 1024.0,
'local_gb': local_gb,
'total_nodes_healthy': total_nodes_healthy,
'total_nodes_up': total_nodes_up,
'total_nodes_error': total_nodes_error,

View File

@ -27,8 +27,8 @@
<div class="row-fluid" id="register-hardware-fields">
{% include 'infrastructure/nodes/_nodes_formset_field.html' with field=form.architecture required=True %}
{% include 'infrastructure/nodes/_nodes_formset_field.html' with field=form.cpus extra_text=_('units') required=True %}
{% include 'infrastructure/nodes/_nodes_formset_field.html' with field=form.memory extra_text=_('MB') required=True %}
{% include 'infrastructure/nodes/_nodes_formset_field.html' with field=form.local_disk extra_text=_('GB') required=True %}
{% include 'infrastructure/nodes/_nodes_formset_field.html' with field=form.memory_mb extra_text=_('MB') required=True %}
{% include 'infrastructure/nodes/_nodes_formset_field.html' with field=form.local_gb extra_text=_('GB') required=True %}
</div>
</fieldset></div>
</div>

View File

@ -12,10 +12,10 @@
<td>{{ cpus }} {% trans 'CPU cores' %}</td>
</tr>
<tr>
<td>{{ ram_gb }} {% trans 'GB of memory' %}</td>
<td>{{ memory_gb }} {% trans 'GB of memory' %}</td>
</tr>
<tr>
<td>{{ local_disk_gb }} {% trans 'GB of storage' %}</td>
<td>{{ local_gb }} {% trans 'GB of storage' %}</td>
</tr>
<tr>
<td>

View File

@ -36,9 +36,9 @@
</dd>
<dt>{% trans "Registered HW" %}</dt>
<dd>
{{ node.properties.cpu|default:"&mdash;" }} {% trans "CPU" %}<br />
{{ node.properties.ram|filesizeformat|default:"&mdash;" }} {% trans "RAM" %}<br />
{{ node.properties.local_disk|filesizeformat|default:"&mdash;" }} {% trans "HDD" %}
{{ node.cpus|default:"&mdash;" }} {% trans "CPU" %}<br />
{{ node.memory_mb|default:"&mdash;" }} {% trans "RAM (MB)" %}<br />
{{ node.local_gb|default:"&mdash;" }} {% trans "HDD (GB)" %}
</dd>
</dl>
</div>

View File

@ -59,7 +59,7 @@ class NodesTests(test.BaseAdminViewTests, helpers.APITestCase):
self.assertTemplateUsed(res, 'infrastructure/nodes/_overview.html')
def test_registered_nodes(self):
registered_nodes = [api.node.Node(node)
registered_nodes = [api.node.Node(api.node.IronicNode(node))
for node in self.ironicclient_nodes.list()]
roles = [api.tuskar.OvercloudRole(r)
for r in TEST_DATA.tuskarclient_roles.list()]
@ -125,16 +125,16 @@ class NodesTests(test.BaseAdminViewTests, helpers.APITestCase):
'register_nodes-0-mac_addresses': 'de:ad:be:ef:ca:fe',
'register_nodes-0-architecture': 'x86',
'register_nodes-0-cpus': '1',
'register_nodes-0-memory': '2',
'register_nodes-0-local_disk': '3',
'register_nodes-0-memory_mb': '2',
'register_nodes-0-local_gb': '3',
'register_nodes-1-driver': 'ipmi',
'register_nodes-1-ipmi_address': '127.0.0.2',
'register_nodes-1-mac_addresses': 'de:ad:be:ef:ca:ff',
'register_nodes-1-architecture': 'x86',
'register_nodes-1-cpus': '4',
'register_nodes-1-memory': '5',
'register_nodes-1-local_disk': '6',
'register_nodes-1-memory_mb': '5',
'register_nodes-1-local_gb': '6',
}
with patch('tuskar_ui.api.node.Node', **{
'spec_set': ['create'],
@ -148,9 +148,9 @@ class NodesTests(test.BaseAdminViewTests, helpers.APITestCase):
request,
ipmi_address=u'127.0.0.1',
architecture='x86',
cpu=1,
ram=2,
local_disk=3,
cpus=1,
memory_mb=2,
local_gb=3,
mac_addresses=['DE:AD:BE:EF:CA:FE'],
ipmi_username=u'username',
ipmi_password=u'password',
@ -160,9 +160,9 @@ class NodesTests(test.BaseAdminViewTests, helpers.APITestCase):
request,
ipmi_address=u'127.0.0.2',
architecture='x86',
cpu=4,
ram=5,
local_disk=6,
cpus=4,
memory_mb=5,
local_gb=6,
mac_addresses=['DE:AD:BE:EF:CA:FF'],
ipmi_username=None,
ipmi_password=None,
@ -183,16 +183,16 @@ class NodesTests(test.BaseAdminViewTests, helpers.APITestCase):
'register_nodes-0-mac_addresses': 'de:ad:be:ef:ca:fe',
'register_nodes-0-architecture': 'x86',
'register_nodes-0-cpus': '1',
'register_nodes-0-memory': '2',
'register_nodes-0-local_disk': '3',
'register_nodes-0-memory_mb': '2',
'register_nodes-0-local_gb': '3',
'register_nodes-1-driver': 'ipmi',
'register_nodes-1-ipmi_address': '127.0.0.2',
'register_nodes-1-mac_addresses': 'de:ad:be:ef:ca:ff',
'register_nodes-1-architecture': 'x86',
'register_nodes-1-cpus': '4',
'register_nodes-1-memory': '5',
'register_nodes-1-local_disk': '6',
'register_nodes-1-memory_mb': '5',
'register_nodes-1-local_gb': '6',
}
with patch('tuskar_ui.api.node.Node', **{
'spec_set': ['create'],
@ -206,9 +206,9 @@ class NodesTests(test.BaseAdminViewTests, helpers.APITestCase):
request,
ipmi_address=u'127.0.0.1',
architecture='x86',
cpu=1,
ram=2,
local_disk=3,
cpus=1,
memory_mb=2,
local_gb=3,
mac_addresses=['DE:AD:BE:EF:CA:FE'],
ipmi_username=u'username',
ipmi_password=u'password',
@ -218,9 +218,9 @@ class NodesTests(test.BaseAdminViewTests, helpers.APITestCase):
request,
ipmi_address=u'127.0.0.2',
architecture='x86',
cpu=4,
ram=5,
local_disk=6,
cpus=4,
memory_mb=5,
local_gb=6,
mac_addresses=['DE:AD:BE:EF:CA:FF'],
ipmi_username=None,
ipmi_password=None,

View File

@ -124,9 +124,9 @@ def data(TEST):
'ip_address': '1.2.2.2'
},
'properties': {
'cpu': '8',
'ram': '16',
'local_disk': '10',
'cpus': '8',
'memory_mb': '4096',
'local_gb': '10',
},
'power_state': 'on',
'maintenance': None,
@ -145,9 +145,9 @@ def data(TEST):
'ip_address': '1.2.2.3'
},
'properties': {
'cpu': '16',
'ram': '32',
'local_disk': '100',
'cpus': '16',
'memory_mb': '4096',
'local_gb': '100',
},
'power_state': 'on',
'maintenance': None,
@ -166,9 +166,9 @@ def data(TEST):
'ip_address': '1.2.2.4'
},
'properties': {
'cpu': '32',
'ram': '64',
'local_disk': '1',
'cpus': '32',
'memory_mb': '8192',
'local_gb': '1',
},
'power_state': 'rebooting',
'maintenance': None,
@ -187,9 +187,9 @@ def data(TEST):
'ip_address': '1.2.2.5'
},
'properties': {
'cpu': '8',
'ram': '16',
'local_disk': '10',
'cpus': '8',
'memory_mb': '4096',
'local_gb': '10',
},
'power_state': 'on',
'maintenance': None,
@ -208,9 +208,9 @@ def data(TEST):
'ip_address': '1.2.2.6'
},
'properties': {
'cpu': '8',
'ram': '16',
'local_disk': '10',
'cpus': '8',
'memory_mb': '4096',
'local_gb': '10',
},
'power_state': 'error',
'maintenance': None,
@ -229,9 +229,9 @@ def data(TEST):
'ip_address': '1.2.2.6'
},
'properties': {
'cpu': '8',
'ram': '16',
'local_disk': '10',
'cpus': '8',
'memory_mb': '4096',
'local_gb': '10',
},
'power_state': 'on',
'maintenance': None,
@ -250,9 +250,9 @@ def data(TEST):
'ip_address': '1.2.2.7'
},
'properties': {
'cpu': '8',
'ram': '16',
'local_disk': '10',
'cpus': '8',
'memory_mb': '4096',
'local_gb': '10',
},
'power_state': 'on',
'maintenance': True,
@ -271,9 +271,9 @@ def data(TEST):
'ip_address': '1.2.2.8'
},
'properties': {
'cpu': '8',
'ram': '16',
'local_disk': '10',
'cpus': '8',
'memory_mb': '4096',
'local_gb': '10',
},
'power_state': 'on',
'maintenance': True,
@ -292,9 +292,9 @@ def data(TEST):
'ip_address': '1.2.2.9'
},
'properties': {
'cpu': '16',
'ram': '32',
'local_disk': '1000',
'cpus': '16',
'memory_mb': '8192',
'local_gb': '1000',
},
'power_state': 'on',
'maintenance': True,