def test_gate_name_match(self): names = [ 'testgate', 'TESTGATE', 'testGate', 'TestGate', ] failz = ['test gate', 'TEST GATE'] for name in names: self.assertIsNotNone(Gate.get_gate_by_name(name)) for name in failz: with self.assertRaises(Exception) as e: Gate.get_gate_by_name(name)
def describe_policy(): """ Return a dictionary/json description of the set of gates available and triggers. :param gate_filter: a list of gate names to filter by, if None, then all are returned :return: dict/json description of the gates and triggers """ try: doc = [] for name in Gate.registered_gate_names(): v = Gate.get_gate_by_name(name) g = GateSpec() g.name = name g.description = v.__description__ if v.__description__ else '' g.triggers = [] for t in v.__triggers__: tr = TriggerSpec() tr.name = t.__trigger_name__ tr.description = t.__description__ if t.__description__ else '' tr.parameters = [] params = t._parameters() if params: for param in params.values(): tps = TriggerParamSpec() tps.name = param.name tps.description = param.description tps.validator = param.validator.json() tps.required = param.required tr.parameters.append(tps) g.triggers.append(tr) doc.append(g.to_dict()) return doc, 200 except Exception as e: log.exception('Error describing gate system') abort(500, 'Internal error describing gate configuration')
def __init__(self, parent, policy_json=None): super(ExecutablePolicyRule, self).__init__(parent, policy_json) # Configure the trigger instance try: self.gate_cls = Gate.get_gate_by_name(self.gate_name) except KeyError: # Gate not found self.error_exc = GateNotFoundError(gate=self.gate_name, valid_gates=Gate.registered_gate_names(), rule_id=self.rule_id) self.configured_trigger = None raise self.error_exc try: selected_trigger_cls = self.gate_cls.get_trigger_named(self.trigger_name.lower()) except KeyError: self.error_exc = TriggerNotFoundError(valid_triggers=self.gate_cls.trigger_names(), trigger=self.trigger_name, gate=self.gate_name, rule_id=self.rule_id) self.configured_trigger = None raise self.error_exc try: try: self.configured_trigger = selected_trigger_cls(parent_gate_cls=self.gate_cls, rule_id=self.rule_id, **self.trigger_params) except (TriggerNotFoundError, InvalidParameterError, ParameterValueInvalidError) as e: # Error finding or initializing the trigger self.error_exc = e self.configured_trigger = None if hasattr(e, 'gate') and e.gate is None: e.gate = self.gate_name if hasattr(e, 'trigger') and e.trigger is None: e.trigger = self.trigger_name if hasattr(e, 'rule_id') and e.rule_id is None: e.rule_id = self.rule_id raise e except PolicyError: raise # To filter out already-handled errors except Exception as e: raise ValidationError.caused_by(e)
def describe_policy(): """ Return a dictionary/json description of the set of gates available and triggers. :param gate_filter: a list of gate names to filter by, if None, then all are returned :return: dict/json description of the gates and triggers """ try: doc = [] for name in Gate.registered_gate_names(): v = Gate.get_gate_by_name(name) g = GateSpec() g.name = name g.description = v.__description__ if v.__description__ else "" g.triggers = [] if hasattr(v, "__superceded_by__"): g.superceded_by = v.__superceded_by__ else: g.superceded_by = None if hasattr(v, "__lifecycle_state__"): g.state = v.__lifecycle_state__.name else: g.state = "active" for t in v.__triggers__: tr = TriggerSpec() tr.name = t.__trigger_name__ tr.description = t.__description__ if t.__description__ else "" tr.parameters = [] if hasattr(t, "__superceded_by__"): tr.superceded_by = t.__superceded_by__ else: tr.superceded_by = None if hasattr(t, "__lifecycle_state__"): tr.state = t.__lifecycle_state__.name else: tr.state = "active" params = t._parameters() if params: param_list = sorted(list(params.values()), key=lambda x: x.sort_order) for param in param_list: tps = TriggerParamSpec() tps.name = param.name tps.description = param.description tps.example = param.example tps.validator = param.validator.json() tps.required = param.required if hasattr(param, "__superceded_by__"): tps.superceded_by = param.__superceded_by__ else: tps.superceded_by = None if hasattr(param, "__lifecycle_state__"): tps.state = param.__lifecycle_state__.name else: tps.state = "active" tr.parameters.append(tps) g.triggers.append(tr) doc.append(g.to_json()) doc = sorted(doc, key=lambda x: x["state"]) return doc, 200 except Exception as e: log.exception("Error describing gate system") return make_response_error(e, in_httpcode=500), 500
def describe_policy(): """ Return a dictionary/json description of the set of gates available and triggers. :param gate_filter: a list of gate names to filter by, if None, then all are returned :return: dict/json description of the gates and triggers """ try: doc = [] for name in Gate.registered_gate_names(): v = Gate.get_gate_by_name(name) g = GateSpec() g.name = name g.description = v.__description__ if v.__description__ else '' g.triggers = [] if hasattr(v, '__superceded_by__'): g.superceded_by = v.__superceded_by__ else: g.superceded_by = None if hasattr(v, '__lifecycle_state__'): g.state = v.__lifecycle_state__.name else: g.state = 'active' for t in v.__triggers__: tr = TriggerSpec() tr.name = t.__trigger_name__ tr.description = t.__description__ if t.__description__ else '' tr.parameters = [] if hasattr(t, '__superceded_by__'): tr.superceded_by = t.__superceded_by__ else: tr.superceded_by = None if hasattr(t, '__lifecycle_state__'): tr.state = t.__lifecycle_state__.name else: tr.state = 'active' params = t._parameters() if params: param_list = sorted(list(params.values()), key=lambda x: x.sort_order) for param in param_list: tps = TriggerParamSpec() tps.name = param.name tps.description = param.description tps.example = param.example tps.validator = param.validator.json() tps.required = param.required if hasattr(param, '__superceded_by__'): tps.superceded_by = param.__superceded_by__ else: tps.superceded_by = None if hasattr(param, '__lifecycle_state__'): tps.state = param.__lifecycle_state__.name else: tps.state = 'active' tr.parameters.append(tps) g.triggers.append(tr) doc.append(g.to_dict()) doc = sorted(doc, key=lambda x: x['state']) return doc, 200 except Exception as e: log.exception('Error describing gate system') abort(500, 'Internal error describing gate configuration')
def __init__(self, policy_json=None): self.gate_name = policy_json.get('gate') self.trigger_name = policy_json.get('trigger') self.rule_id = policy_json.get('id') # Convert to lower-case for case-insensitive matches self.trigger_params = { p.get('name').lower(): p.get('value') for p in policy_json.get('params') } action = policy_json.get('action', '').lower() try: self.action = GateAction.__members__[action] except KeyError: raise InvalidGateAction(gate=self.gate_name, trigger=self.trigger_name, rule_id=self.rule_id, action=action, valid_actions=filter( lambda x: not x.startswith('_'), GateAction.__dict__.keys())) self.error_exc = None self.errors = [] # Configure the trigger instance try: self.gate_cls = Gate.get_gate_by_name(self.gate_name) except KeyError: # Gate not found self.error_exc = GateNotFoundError( gate=self.gate_name, valid_gates=Gate.registered_gate_names(), rule_id=self.rule_id) self.configured_trigger = None raise self.error_exc try: selected_trigger_cls = self.gate_cls.get_trigger_named( self.trigger_name.lower()) except KeyError: self.error_exc = TriggerNotFoundError( valid_triggers=self.gate_cls.trigger_names(), trigger=self.trigger_name, gate=self.gate_name, rule_id=self.rule_id) self.configured_trigger = None raise self.error_exc try: try: self.configured_trigger = selected_trigger_cls( parent_gate_cls=self.gate_cls, rule_id=self.rule_id, **self.trigger_params) except [ TriggerNotFoundError, InvalidParameterError, ParameterValueInvalidError ] as e: # Error finding or initializing the trigger log.exception('Policy rule execution exception: {}'.format(e)) self.error_exc = e self.configured_trigger = None if hasattr(e, 'gate') and e.gate is None: e.gate = self.gate_name if hasattr(e, 'trigger') and e.trigger is None: e.trigger = self.trigger_name if hasattr(e, 'rule_id') and e.rule_id is None: e.rule_id = self.rule_id raise e except PolicyError: raise # To filter out already-handled errors except Exception as e: raise ValidationError.caused_by(e)