109 lines
4.2 KiB
Python
109 lines
4.2 KiB
Python
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||
|
# not use this file except in compliance with the License. You may obtain
|
||
|
# a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||
|
# License for the specific language governing permissions and limitations
|
||
|
# under the License.
|
||
|
|
||
|
from openstack.baremetal.v1 import _common
|
||
|
from openstack import exceptions
|
||
|
from openstack import resource
|
||
|
from openstack import utils
|
||
|
|
||
|
|
||
|
class Allocation(_common.ListMixin, resource.Resource):
|
||
|
resources_key = 'allocations'
|
||
|
base_path = '/allocations'
|
||
|
|
||
|
# capabilities
|
||
|
allow_create = True
|
||
|
allow_fetch = True
|
||
|
allow_commit = True
|
||
|
allow_delete = True
|
||
|
allow_list = True
|
||
|
allow_patch = True
|
||
|
commit_method = 'PATCH'
|
||
|
commit_jsonpatch = True
|
||
|
|
||
|
_query_mapping = resource.QueryParameters(
|
||
|
'node',
|
||
|
'resource_class',
|
||
|
'state',
|
||
|
fields={'type': _common.fields_type},
|
||
|
)
|
||
|
|
||
|
# Allocation update is available since 1.57
|
||
|
# Backfilling allocations is available since 1.58
|
||
|
_max_microversion = '1.58'
|
||
|
|
||
|
#: The candidate nodes for this allocation.
|
||
|
candidate_nodes = resource.Body('candidate_nodes', type=list)
|
||
|
#: Timestamp at which the allocation was created.
|
||
|
created_at = resource.Body('created_at')
|
||
|
#: A set of one or more arbitrary metadata key and value pairs.
|
||
|
extra = resource.Body('extra', type=dict)
|
||
|
#: The UUID for the allocation.
|
||
|
id = resource.Body('uuid', alternate_id=True)
|
||
|
#: The last error for the allocation.
|
||
|
last_error = resource.Body("last_error")
|
||
|
#: A list of relative links, including the self and bookmark links.
|
||
|
links = resource.Body('links', type=list)
|
||
|
#: The name of the allocation.
|
||
|
name = resource.Body('name')
|
||
|
#: The node UUID or name to create the allocation against,
|
||
|
#: bypassing the normal allocation process.
|
||
|
node = resource.Body('node')
|
||
|
#: UUID of the node this allocation belongs to.
|
||
|
node_id = resource.Body('node_uuid')
|
||
|
#: The requested resource class.
|
||
|
resource_class = resource.Body('resource_class')
|
||
|
#: The state of the allocation.
|
||
|
state = resource.Body('state')
|
||
|
#: The requested traits.
|
||
|
traits = resource.Body('traits', type=list)
|
||
|
#: Timestamp at which the allocation was last updated.
|
||
|
updated_at = resource.Body('updated_at')
|
||
|
|
||
|
def wait(self, session, timeout=None, ignore_error=False):
|
||
|
"""Wait for the allocation to become active.
|
||
|
|
||
|
:param session: The session to use for making this request.
|
||
|
:type session: :class:`~keystoneauth1.adapter.Adapter`
|
||
|
:param timeout: How much (in seconds) to wait for the allocation.
|
||
|
The value of ``None`` (the default) means no client-side timeout.
|
||
|
:param ignore_error: If ``True``, this call will raise an exception
|
||
|
if the allocation reaches the ``error`` state. Otherwise the error
|
||
|
state is considered successful and the call returns.
|
||
|
|
||
|
:return: This :class:`Allocation` instance.
|
||
|
:raises: :class:`~openstack.exceptions.ResourceFailure` if allocation
|
||
|
fails and ``ignore_error`` is ``False``.
|
||
|
:raises: :class:`~openstack.exceptions.ResourceTimeout` on timeout.
|
||
|
"""
|
||
|
if self.state == 'active':
|
||
|
return self
|
||
|
|
||
|
for count in utils.iterate_timeout(
|
||
|
timeout, "Timeout waiting for the allocation %s" % self.id
|
||
|
):
|
||
|
self.fetch(session)
|
||
|
|
||
|
if self.state == 'error' and not ignore_error:
|
||
|
raise exceptions.ResourceFailure(
|
||
|
"Allocation %(allocation)s failed: %(error)s"
|
||
|
% {'allocation': self.id, 'error': self.last_error}
|
||
|
)
|
||
|
elif self.state != 'allocating':
|
||
|
return self
|
||
|
|
||
|
session.log.debug(
|
||
|
'Still waiting for the allocation %(allocation)s '
|
||
|
'to become active, the current state is %(state)s',
|
||
|
{'allocation': self.id, 'state': self.state},
|
||
|
)
|