99 lines
3.7 KiB
Python
99 lines
3.7 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 oslo_log import log as logging
|
|
|
|
from tacker.common import log
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
class HOTUpdater(object):
|
|
"""Update HOT template."""
|
|
|
|
def __init__(self, heatclient):
|
|
self.heatclient = heatclient
|
|
self.template = {}
|
|
self.nested_templates = dict()
|
|
|
|
@log.log
|
|
def get_templates_from_stack(self, stack_id):
|
|
"""Get template information from the stack.
|
|
|
|
Get the template from stack specified by stack_id,
|
|
if stack has scalable resource, get the its child
|
|
template.
|
|
"""
|
|
|
|
def _get_resource(name, resources):
|
|
for resource in resources:
|
|
if resource.resource_name == name:
|
|
return resource
|
|
|
|
self.template = self.heatclient.stacks.template(stack_id)
|
|
LOG.debug('got main template for stack({}). template={}'.format(
|
|
stack_id, self.template))
|
|
|
|
stack_resources = self.heatclient.resource_get_list(stack_id,
|
|
nested_depth=2)
|
|
for resource in stack_resources:
|
|
if resource.resource_type == 'OS::Heat::AutoScalingGroup':
|
|
intermediate_template = self.heatclient.stacks.template(
|
|
resource.physical_resource_id)
|
|
|
|
for resource_id in intermediate_template['resources'].keys():
|
|
corresponding_resource = _get_resource(resource_id,
|
|
stack_resources)
|
|
nested_template = self.heatclient.stacks.template(
|
|
corresponding_resource.physical_resource_id)
|
|
LOG.debug('got nested template for stack({}). template={}'
|
|
.format(corresponding_resource.physical_resource_id,
|
|
nested_template))
|
|
if nested_template:
|
|
self.nested_templates[
|
|
corresponding_resource.resource_type] = nested_template
|
|
|
|
@log.log
|
|
def update_resource_property(self,
|
|
resource_id,
|
|
resource_types=[],
|
|
**kwargs):
|
|
"""Update attributes of resource properties.
|
|
|
|
Get the resource information from template's resources section,
|
|
and update properties using kwargs information.
|
|
If resource type does not include in resource_types, nothing to do.
|
|
"""
|
|
|
|
def _update(template, resource_id, resource_types, kwargs):
|
|
resource = template.get('resources', {}).get(resource_id)
|
|
if not resource:
|
|
return
|
|
if resource.get('type', {}) not in resource_types:
|
|
return
|
|
|
|
resource_properties = resource.get('properties', {})
|
|
if not resource_properties:
|
|
return
|
|
|
|
for key, value in kwargs.items():
|
|
if value is not None:
|
|
resource_properties.update({key: value})
|
|
elif resource_properties.get(key):
|
|
del resource_properties[key]
|
|
|
|
_update(self.template, resource_id, resource_types, kwargs)
|
|
|
|
for value in self.nested_templates.values():
|
|
nested_template = value
|
|
_update(nested_template, resource_id, resource_types, kwargs)
|