heat/heat/engine/resources/openstack/magnum/bay.py

178 lines
6.3 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 heat.common import exception
from heat.common.i18n import _
from heat.engine import constraints
from heat.engine import properties
from heat.engine import resource
from heat.engine import support
class Bay(resource.Resource):
"""A resource that creates a Magnum Bay.
This resource has been deprecated in favor of OS::Magnum::Cluster.
"""
deprecation_msg = _('Please use OS::Magnum::Cluster instead.')
support_status = support.SupportStatus(
status=support.HIDDEN,
message=deprecation_msg,
version='11.0.0',
previous_status=support.SupportStatus(
status=support.DEPRECATED,
message=deprecation_msg,
version='9.0.0',
previous_status=support.SupportStatus(
status=support.SUPPORTED,
version='6.0.0')
)
)
PROPERTIES = (
NAME, BAYMODEL, NODE_COUNT, MASTER_COUNT, DISCOVERY_URL,
BAY_CREATE_TIMEOUT
) = (
'name', 'baymodel', 'node_count', 'master_count',
'discovery_url', 'bay_create_timeout'
)
properties_schema = {
NAME: properties.Schema(
properties.Schema.STRING,
_('The bay name.')
),
BAYMODEL: properties.Schema(
properties.Schema.STRING,
_('The name or ID of the bay model.'),
constraints=[
constraints.CustomConstraint('magnum.baymodel')
],
required=True
),
NODE_COUNT: properties.Schema(
properties.Schema.INTEGER,
_('The node count for this bay.'),
constraints=[constraints.Range(min=1)],
update_allowed=True,
default=1
),
MASTER_COUNT: properties.Schema(
properties.Schema.INTEGER,
_('The number of master nodes for this bay.'),
constraints=[constraints.Range(min=1)],
update_allowed=True,
default=1
),
DISCOVERY_URL: properties.Schema(
properties.Schema.STRING,
_('Specifies a custom discovery url for node discovery.')
),
BAY_CREATE_TIMEOUT: properties.Schema(
properties.Schema.INTEGER,
_('Timeout for creating the bay in minutes. '
'Set to 0 for no timeout.'),
constraints=[constraints.Range(min=0)],
default=0
)
}
default_client_name = 'magnum'
entity = 'bays'
def handle_create(self):
args = {
'name': self.properties[self.NAME],
'baymodel_id': self.properties[self.BAYMODEL],
'node_count': self.properties[self.NODE_COUNT],
'master_count': self.properties[self.NODE_COUNT],
'discovery_url': self.properties[self.DISCOVERY_URL],
'bay_create_timeout': self.properties[self.BAY_CREATE_TIMEOUT]
}
bay = self.client().bays.create(**args)
self.resource_id_set(bay.uuid)
return bay.uuid
def check_create_complete(self, id):
bay = self.client().bays.get(id)
if bay.status == 'CREATE_IN_PROGRESS':
return False
elif bay.status is None:
return False
elif bay.status == 'CREATE_COMPLETE':
return True
elif bay.status == 'CREATE_FAILED':
msg = (_("Failed to create Bay '%(name)s' - %(reason)s")
% {'name': self.name, 'reason': bay.status_reason})
raise exception.ResourceInError(status_reason=msg,
resource_status=bay.status)
else:
msg = (_("Unknown status creating Bay '%(name)s' - %(reason)s")
% {'name': self.name, 'reason': bay.status_reason})
raise exception.ResourceUnknownStatus(status_reason=msg,
resource_status=bay.status)
def handle_update(self, json_snippet, tmpl_diff, prop_diff):
if prop_diff:
patch = [{'op': 'replace', 'path': '/' + k, 'value': v}
for k, v in prop_diff.items()]
self.client().bays.update(self.resource_id, patch)
return self.resource_id
def parse_live_resource_data(self, resource_properties, resource_data):
record_reality = {}
for key in [self.NODE_COUNT, self.MASTER_COUNT]:
record_reality.update({key: resource_data.get(key)})
return record_reality
def check_update_complete(self, id):
bay = self.client().bays.get(id)
# Check update complete request might get status before the status
# got changed to update in progress, so we allow `CREATE_COMPLETE`
# for it.
if bay.status in ['UPDATE_IN_PROGRESS', 'CREATE_COMPLETE']:
return False
elif bay.status == 'UPDATE_COMPLETE':
return True
elif bay.status == 'UPDATE_FAILED':
msg = (_("Failed to update Bay '%(name)s' - %(reason)s")
% {'name': self.name, 'reason': bay.status_reason})
raise exception.ResourceInError(status_reason=msg,
resource_status=bay.status)
else:
msg = (_("Unknown status updating Bay '%(name)s' - %(reason)s")
% {'name': self.name, 'reason': bay.status_reason})
raise exception.ResourceUnknownStatus(status_reason=msg,
resource_status=bay.status)
def check_delete_complete(self, id):
if not id:
return True
try:
self.client().bays.get(id)
except Exception as exc:
self.client_plugin().ignore_not_found(exc)
return True
return False
def resource_mapping():
return {
'OS::Magnum::Bay': Bay
}