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
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
|