deb-heat/heat/common/grouputils.py
huangtianhua b101190f32 Don't raise exception when get nested stack
1. Stack.load() won't return None, instead will raise
notFound exception if we can't get the stack from db.
So we should catch the notFound exception in
StackResource.nested() when loading.
2. Return None if we catch the notFound when get the
nested, due there are many places where we call the
nested(), and raise the notFound exception makes no sense.

Closes-Bug: #1479579
Change-Id: I2540ca13572dfe628e6fc596815bee427b41290f
2015-08-07 14:26:07 +08:00

100 lines
3.1 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.
import six
from heat.common import exception
def get_size(group, include_failed=False):
"""Get number of member resources managed by the specified group.
The size exclude failed members default, set include_failed=True
to get total size.
"""
if group.nested():
resources = [r for r in six.itervalues(group.nested())
if include_failed or r.status != r.FAILED]
return len(resources)
else:
return 0
def get_members(group):
"""Get a list of member resources managed by the specified group.
Sort the list of instances first by created_time then by name.
"""
resources = []
if group.nested():
resources = [r for r in six.itervalues(group.nested())
if r.status != r.FAILED]
return sorted(resources, key=lambda r: (r.created_time, r.name))
def get_member_refids(group, exclude=None):
"""Get a list of member resources managed by the specified group.
The list of resources is sorted first by created_time then by name.
"""
members = get_members(group)
if len(members) == 0:
return []
if exclude is None:
exclude = []
return [r.FnGetRefId() for r in members
if r.FnGetRefId() not in exclude]
def get_member_names(group):
"""Get a list of resource names of the resources in the specified group.
Failed resources will be ignored.
"""
return [r.name for r in get_members(group)]
def get_resource(stack, resource_name, use_indices, key):
nested_stack = stack.nested()
if not nested_stack:
return None
try:
if use_indices:
return get_members(stack)[int(resource_name)]
else:
return nested_stack[resource_name]
except (IndexError, KeyError):
raise exception.InvalidTemplateAttribute(resource=stack.name,
key=key)
def get_rsrc_attr(stack, key, use_indices, resource_name, *attr_path):
resource = get_resource(stack, resource_name, use_indices, key)
if resource:
return resource.FnGetAtt(*attr_path)
def get_rsrc_id(stack, key, use_indices, resource_name):
resource = get_resource(stack, resource_name, use_indices, key)
if resource:
return resource.FnGetRefId()
def get_nested_attrs(stack, key, use_indices, *path):
path = key.split(".", 2)[1:] + list(path)
if len(path) > 1:
return get_rsrc_attr(stack, key, use_indices, *path)
else:
return get_rsrc_id(stack, key, use_indices, *path)