You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
3.0 KiB

# coding=utf-8
#
# Copyright © Splunk, Inc. All Rights Reserved.
from __future__ import absolute_import, division, print_function, unicode_literals
from builtins import object
from abc import abstractmethod, ABCMeta as AbstractMetaClass
from future.utils import with_metaclass
__all__ = ['PackagingRule', 'DefaultPackagingRule', 'InputsPackagingRule']
class PackagingRule(with_metaclass(AbstractMetaClass, object)):
"""
This is the extension point for future packaging rules
"""
@abstractmethod
def should_include_setting(self, stanza, setting, deployment_specification, app_manifest):
pass
@abstractmethod
def should_include_stanza(self, stanza, settings, deployment_specification, app_manifest):
pass
@classmethod
def instance(cls):
instance = cls.__dict__.get('_instance')
if instance is None:
instance = cls._instance = cls() # pylint: disable=abstract-class-instantiated
return instance
class DefaultPackagingRule(PackagingRule):
# noinspection PyMethodMayBeStatic
def should_include_setting(self, stanza, setting, deployment_specification, app_manifest):
return setting.placement.is_overlapping(deployment_specification.workload)
# noinspection PyMethodMayBeStatic
def should_include_stanza(self, stanza, settings, deployment_specification, app_manifest):
if len(settings) > 0:
return True
return stanza.placement.is_overlapping(deployment_specification.workload)
class InputsPackagingRule(DefaultPackagingRule):
def should_include_setting(self, stanza, setting, deployment_specification, app_manifest):
return self._should_include_stanza(stanza, deployment_specification, app_manifest)
def should_include_stanza(self, stanza, settings, deployment_specification, app_manifest):
if len(settings) > 0:
return True
if stanza.name == 'default':
return False
return self._should_include_stanza(stanza, deployment_specification, app_manifest)
@staticmethod
def _should_include_stanza(stanza, deployment_specification, app_manifest):
tasks = app_manifest.tasks
if tasks and 'searchHead' in deployment_specification.workload:
if stanza.name == 'default' or stanza.name in tasks:
return True
if 'forwarder' in deployment_specification.workload:
if stanza.name == 'default':
return True
if not (tasks and stanza.name in tasks):
names = deployment_specification.inputGroups
if deployment_specification.is_all_input_groups(names):
return True
input_groups = app_manifest.inputGroups
for name in names:
info = getattr(input_groups, name, None)
if info is None:
continue
if stanza.name in info.inputs:
return True
return False