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:
parent
e536c65b3e
commit
a6ea6bb4bf
@ -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)
|
||||
|
@ -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.
|
||||
)
|
||||
|
||||
|
@ -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'),
|
||||
|
@ -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),
|
||||
|
@ -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,
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -36,9 +36,9 @@
|
||||
</dd>
|
||||
<dt>{% trans "Registered HW" %}</dt>
|
||||
<dd>
|
||||
{{ node.properties.cpu|default:"—" }} {% trans "CPU" %}<br />
|
||||
{{ node.properties.ram|filesizeformat|default:"—" }} {% trans "RAM" %}<br />
|
||||
{{ node.properties.local_disk|filesizeformat|default:"—" }} {% trans "HDD" %}
|
||||
{{ node.cpus|default:"—" }} {% trans "CPU" %}<br />
|
||||
{{ node.memory_mb|default:"—" }} {% trans "RAM (MB)" %}<br />
|
||||
{{ node.local_gb|default:"—" }} {% trans "HDD (GB)" %}
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user