GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

Issues (503)

tools/st2-inject-trigger-instances.py (1 issue)

1
#!/usr/bin/env python
2
# Licensed to the StackStorm, Inc ('StackStorm') under one or more
3
# contributor license agreements.  See the NOTICE file distributed with
4
# this work for additional information regarding copyright ownership.
5
# The ASF licenses this file to You under the Apache License, Version 2.0
6
# (the "License"); you may not use this file except in compliance with
7
# the License.  You may obtain a copy of the License at
8
#
9
#     http://www.apache.org/licenses/LICENSE-2.0
10
#
11
# Unless required by applicable law or agreed to in writing, software
12
# distributed under the License is distributed on an "AS IS" BASIS,
13
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
# See the License for the specific language governing permissions and
15
# limitations under the License.
16
17
"""
18
19
Tags: Load test, stress test.
20
21
A utility script that injects trigger instances into st2 system.
22
23
This tool is designed with stress/load testing in mind. Trigger
24
instances need appropriate rules to be setup so there is some
25
meaningful work.
26
27
"""
28
29
import os
30
import random
31
32
import eventlet
33
from oslo_config import cfg
34
import yaml
35
36
from st2common import config
37
from st2common.util.monkey_patch import monkey_patch
38
from st2common.util import date as date_utils
39
from st2common.transport.reactor import TriggerDispatcher
40
41
42
def do_register_cli_opts(opts, ignore_errors=False):
43
    for opt in opts:
44
        try:
45
            cfg.CONF.register_cli_opt(opt)
46
        except:
47
            if not ignore_errors:
48
                raise
49
50
51
def _inject_instances(trigger, rate_per_trigger, duration, payload={}):
0 ignored issues
show
Bug Best Practice introduced by
The default value {} might cause unintended side-effects.

Objects as default values are only created once in Python and not on each invocation of the function. If the default object is modified, this modification is carried over to the next invocation of the method.

# Bad:
# If array_param is modified inside the function, the next invocation will
# receive the modified object.
def some_function(array_param=[]):
    # ...

# Better: Create an array on each invocation
def some_function(array_param=None):
    array_param = array_param or []
    # ...
Loading history...
52
    start = date_utils.get_datetime_utc_now()
53
    elapsed = 0.0
54
    count = 0
55
56
    dispatcher = TriggerDispatcher()
57
    while elapsed < duration:
58
        # print('Dispatching trigger %s at time %s', trigger, date_utils.get_datetime_utc_now())
59
        dispatcher.dispatch(trigger, payload)
60
        delta = random.expovariate(rate_per_trigger)
61
        eventlet.sleep(delta)
62
        elapsed = (date_utils.get_datetime_utc_now() - start).seconds / 60.0
63
        count += 1
64
65
    print('%s: Emitted %d triggers in %d seconds' % (trigger, count, elapsed))
66
67
68
def main():
69
    monkey_patch()
70
71
    cli_opts = [
72
        cfg.IntOpt('rate', default=100,
73
                   help='Rate of trigger injection measured in instances in per sec.' +
74
                   ' Assumes a default exponential distribution in time so arrival is poisson.'),
75
        cfg.ListOpt('triggers', required=False,
76
                    help='List of triggers for which instances should be fired.' +
77
                    ' Uniform distribution will be followed if there is more than one' +
78
                    'trigger.'),
79
        cfg.StrOpt('schema_file', default=None,
80
                   help='Path to schema file defining trigger and payload.'),
81
        cfg.IntOpt('duration', default=1,
82
                   help='Duration of stress test in minutes.')
83
    ]
84
    do_register_cli_opts(cli_opts)
85
    config.parse_args()
86
87
    # Get config values
88
    triggers = cfg.CONF.triggers
89
    trigger_payload_schema = {}
90
91
    if not triggers:
92
        if (cfg.CONF.schema_file is None or cfg.CONF.schema_file == '' or
93
                not os.path.exists(cfg.CONF.schema_file)):
94
            print('Either "triggers" need to be provided or a schema file containing' +
95
                  ' triggers should be provided.')
96
            return
97
        with open(cfg.CONF.schema_file) as fd:
98
            trigger_payload_schema = yaml.safe_load(fd)
99
            triggers = trigger_payload_schema.keys()
100
            print('Triggers=%s' % triggers)
101
102
    rate = cfg.CONF.rate
103
    rate_per_trigger = int(rate / len(triggers))
104
    duration = cfg.CONF.duration
105
106
    dispatcher_pool = eventlet.GreenPool(len(triggers))
107
108
    for trigger in triggers:
109
        payload = trigger_payload_schema.get(trigger, {})
110
        dispatcher_pool.spawn(_inject_instances, trigger, rate_per_trigger, duration,
111
                              payload=payload)
112
        eventlet.sleep(random.uniform(0, 1))
113
    dispatcher_pool.waitall()
114
115
116
if __name__ == '__main__':
117
    main()
118