blob: 5cadd65762a37c24ab987c7eda4a43cd82473e36 [file] [log] [blame]
# -*- coding: utf-8 -*-
'''
Managing entities in Gnocchi
===================================
'''
# Import python libs
import logging
# Import Gnocchi libs
def __virtual__():
return 'gnocchiv1' if 'gnocchiv1.archive_policy_list' in __salt__ else False
log = logging.getLogger(__name__)
def _gnocchiv1_call(fname, *args, **kwargs):
return __salt__['gnocchiv1.{}'.format(fname)](*args, **kwargs)
def archive_policy_present(name, cloud_name, definition, **kwargs):
"""
Creates an archive policy
This state checks if an archive policy is present and, if not, creates an
archive policy with specified name, definition, aggregation methods and
back_window.
:param name: name of the archive policy
:param cloud_name: name of the cloud in cloud.yaml
:param definition: List of dictionaries. Every dictionary may contain:
:param granularity: String indicating policy's granularity e.g. '0:00:01'
:param points: Integer indicating policy's points e.g. 10
:param: timespan parameters of archive policy. e.g. '0:00:10'
:param aggregation_methods: List of aggregation methods used in archive policy
:param back_window: Integer specifies the number of coarsest periods to keep
"""
try:
archive_policy = _gnocchiv1_call(
'archive_policy_read', name, cloud_name=cloud_name
)
except Exception as e:
if 'NotFound' in repr(e):
try:
resp = _gnocchiv1_call(
'archive_policy_create', name=name, cloud_name=cloud_name,
definition=definition, **kwargs
)
except Exception as e:
log.error('Gnocchi archive policy create failed with {}'.format(e))
return _create_failed(name, 'archive_policy')
return _created(name, 'archive_policy', resp)
else:
raise
if archive_policy:
# TODO: Implement and design archive policy update procedure
return _no_changes(name, 'archive_policy')
else:
return _find_failed(name, 'archive_policy')
def archive_policy_absent(name, cloud_name):
try:
archive_policy = _gnocchiv1_call(
'archive_policy_read', name, cloud_name=cloud_name
)
except Exception as e:
if 'NotFound' in repr(e):
return _absent(name, 'archive_policy')
if archive_policy:
try:
resp = _gnocchiv1_call(
'archive_policy_delete', name, cloud_name=cloud_name
)
except Exception as e:
log.error('Archive policy delete failed with {}'.format(e))
return _delete_failed(name, 'archive_policy')
return _deleted(name, 'archive_policy')
else:
return _find_failed(name, 'archive_policy')
def archive_policy_rule_present(name, cloud_name, archive_policy_name, metric_pattern):
"""
Creates an archive policy rule
This state checks if an archive policy rule is present and, if not, creates an
archive policy rule with specified name, archive policy name, and metric_pattern.
:param name: name of the archive policy rule
:param cloud_name: name of the cloud in cloud.yaml
:param archive_policy_name: name of archive policy for specified rule
:param metric_pattern: pattern for metrics classified by the rule
"""
try:
archive_policy_rule = _gnocchiv1_call(
'archive_policy_rule_read', name, cloud_name=cloud_name
)
except Exception as e:
if 'NotFound' in repr(e):
try:
resp = _gnocchiv1_call(
'archive_policy_rule_create', name=name, cloud_name=cloud_name,
archive_policy_name=archive_policy_name, metric_pattern=metric_pattern,
)
except Exception as e:
log.error('Gnocchi archive policy rule create failed with {}'.format(e))
return _create_failed(name, 'archive_policy_rule')
return _created(name, 'archive_policy_rule', resp)
else:
raise
if archive_policy_rule:
# Currently Gnocchi API doesn't allow to update properties in rules,
# but they can be recreated.
if ((archive_policy_rule['archive_policy_name'] != archive_policy_name) or
(archive_policy_rule['metric_pattern'] != metric_pattern)):
try:
resp = _gnocchiv1_call(
'archive_policy_rule_delete', name, cloud_name=cloud_name
)
resp = _gnocchiv1_call(
'archive_policy_rule_create', name=name, cloud_name=cloud_name,
archive_policy_name=archive_policy_name, metric_pattern=metric_pattern
)
except Exception as e:
log.error('Archive policy rule update failed with {}'.format(e))
return _update_failed(name, 'archive_policy_rule')
return _updated(name, 'archive_policy_rule', resp)
else:
return _no_changes(name, 'archive_policy_rule')
else:
return _find_failed(name, 'archive_policy_rule')
def archive_policy_rule_absent(name, cloud_name):
try:
archive_policy_rule = _gnocchiv1_call(
'archive_policy_rule_read', name, cloud_name=cloud_name
)
except Exception as e:
if 'NotFound' in repr(e):
return _absent(name, 'archive_policy_rule')
if archive_policy_rule:
try:
resp = _gnocchiv1_call(
'archive_policy_rule_delete', name, cloud_name=cloud_name
)
except Exception as e:
log.error('Archive policy rule delete failed with {}'.format(e))
return _delete_failed(name, 'archive_policy_rule')
return _deleted(name, 'archive_policy_rule')
else:
return _find_failed(name, 'archive_policy_rule')
def _created(name, resource, resource_definition):
changes_dict = {
'name': name,
'changes': resource_definition,
'result': True,
'comment': '{}{} created'.format(resource, name)
}
return changes_dict
def _updated(name, resource, resource_definition):
changes_dict = {
'name': name,
'changes': resource_definition,
'result': True,
'comment': '{}{} updated'.format(resource, name)
}
return changes_dict
def _no_changes(name, resource):
changes_dict = {
'name': name,
'changes': {},
'result': True,
'comment': '{}{} is in desired state'.format(resource, name)
}
return changes_dict
def _deleted(name, resource):
changes_dict = {
'name': name,
'changes': {},
'result': True,
'comment': '{}{} removed'.format(resource, name)
}
return changes_dict
def _absent(name, resource):
changes_dict = {'name': name,
'changes': {},
'comment': '{0} {1} not present'.format(resource, name),
'result': True}
return changes_dict
def _delete_failed(name, resource):
changes_dict = {'name': name,
'changes': {},
'comment': '{0} {1} failed to delete'.format(resource,
name),
'result': False}
return changes_dict
def _create_failed(name, resource):
changes_dict = {'name': name,
'changes': {},
'comment': '{0} {1} failed to create'.format(resource,
name),
'result': False}
return changes_dict
def _update_failed(name, resource):
changes_dict = {'name': name,
'changes': {},
'comment': '{0} {1} failed to update'.format(resource,
name),
'result': False}
return changes_dict
def _find_failed(name, resource):
changes_dict = {
'name': name,
'changes': {},
'comment': '{0} {1} found multiple {0}'.format(resource, name),
'result': False,
}
return changes_dict