Commit Graph

67 Commits

Author SHA1 Message Date
mprahl
af9505b0e1 Rearrange the imports to meet the style guide
This also includes `from __future__ import absolute_import`
in every file so that the imports are consistent in Python 2 and 3.
The Python 2 tests fail without this.
2020-01-16 14:39:46 -05:00
mprahl
63baaf9213 Move models.py to common/models.py and views.py to web/views.py 2020-01-16 14:39:46 -05:00
mprahl
5f27e4359f Move errors.py to common/errors.py 2020-01-16 14:39:46 -05:00
mprahl
3091d6cfda Move monitor.py to common/monitor.py 2020-01-16 14:39:46 -05:00
mprahl
c2a3b059e9 Move messaging.py to common/messaging.py 2020-01-16 14:39:46 -05:00
mprahl
46dcb2c236 Move db_session.py to scheduler/db_session.py 2020-01-16 14:39:46 -05:00
Qixiang Wan
ba22e1f686 Ignore koji_build_change event without task_id 2020-01-16 14:39:45 -05:00
Qixiang Wan
0e0033fb02 Return immediately when message parser returns None 2020-01-16 14:39:45 -05:00
Qixiang Wan
d01f911bd1 Rename handler.repos.done argument name "repo_tag" to "tag_name"
This to make it same as the `tag_name` argument in
`handlers.tags.tagged`, so we can handle it easily while inspecting the
function signatures.
2020-01-16 14:39:45 -05:00
Chenxiong Qi
6154cf5eb7 Convert the Poller to be Celery periodic tasks
Poller methods within original class MBSProducer become module level
functions and are registered as Celery periodic tasks.

Code logging the size of fedmsg-hub queue are removed from log_summary.

process_open_component_builds is still kept there and not converted to a
periodic task.

There are some small refactor:

* do not format string in logging method call.
* reformat some lines of code doing SQLAlchemy database query to make
  them more readable.

Signed-off-by: Chenxiong Qi <cqi@redhat.com>
2020-01-16 14:39:45 -05:00
Qixiang Wan
e07b82e2f9 Register handlers as Celery tasks 2020-01-16 14:39:45 -05:00
Jan Kaluza
473f7e5e5b Replace further work by Scheduler class based on the "sched" module.
To support multiple backend, we need to get rid of `further_work` concept
which is used in multiple places in the MBS code. Before this commit, if
one handler wanted to execute another handler, it planned this work by
constructing fake message and returning it. MBSConsumer then planned
its execution by adding it into the event loop.

In this commit, the new `events.scheduler` instance of new Scheduler
class is used to acomplish this. If handler wants to execute another
handler, it simply schedules it using `events.scheduler.add` method.

In the end of each handler, the `events.scheduler.run` method is
executed which calls all the scheduled handlers.

The idea is that when Celery is enabled, we can change the
`Scheduler.run` method to execute the handlers using the Celery, while
during the local builds, we could execute them directly without Celery.

Use of Scheduler also fixes the issue with ordering of such calls. If
we would call the handlers directly, they could have been executed
in the middle of another handler leading to behavior incompatible
with the current `further_work` concept. Using the Scheduler, these
calls are executed always in the end of the handler no matter when
they have been scheduled.
2020-01-16 14:39:45 -05:00
Chenxiong Qi
5f4ef94103 Pass event info arguments to event handler directly
This patch drops message objects, defined by class BaseMessage and its
subclasses, and pass event info arguments to event handler directly.
Different event handler requires different arguments to handle a kind of
specific event. The event info is parsed from the raw message received
from message bus.

Signed-off-by: Chenxiong Qi <cqi@redhat.com>
2020-01-16 14:39:45 -05:00
Chenxiong Qi
e1581ac831 Remove config argument from event handlers
For the purpose of migrating to Celery to run event handler inside a
worker, Config object is not serializable. And from the usage of config
argument, every event handler can just access module_build_service.conf
directly. This removal would make the migration easier.

Signed-off-by: Chenxiong Qi <cqi@redhat.com>
2020-01-16 14:39:45 -05:00
Chenxiong Qi
9c76f27d78 Access configured messaging backend directly
The accessible configured messaging backend is sigleton. This patch make
it possible to access the configured backend and avoid accessing a
"private" variable from module messaging.

Signed-off-by: Chenxiong Qi <cqi@redhat.com>
2020-01-16 14:39:45 -05:00
Chenxiong Qi
807acc2fb6 Clear up module_build_service.messaging
Message classes and FedmsgMessageParser are moved into dedicated Python module
under scheduler/ directory.

FedmsgMessageParser is decoupled from messaging.py by initializing a parser
object with known fedmsg services. This decouple avoids cycle import between
parser.py and messaging.py.

Signed-off-by: Chenxiong Qi <cqi@redhat.com>
2020-01-16 14:39:45 -05:00
Chenxiong Qi
f24cd4222f Make db_session singleton
Please note that this patch does not change the use of database session
in MBS. So, in the frontend, the database session is still managed by
Flask-SQLAlchemy, that is the db.session. And the backend, running event
handlers, has its own database session created from SQLAclehmy session
API directly.

This patch aims to reduce the number of scoped_session created when call
original function make_db_session. For technical detailed information,
please refer to SQLAlchemy documentation Contextual/Thread-local
Sessions.

As a result, a global scoped_session is accessible from the
code running inside backend, both the event handlers and functions
called from handlers. The library code shared by frontend and backend,
like resolvers, has no change.

Similarly, db.session is only used to recreate database for every test.

Signed-off-by: Chenxiong Qi <cqi@redhat.com>
2019-11-07 11:06:40 +08:00
Chenxiong Qi
1c645f5a04 Fix log.exception
log.exception() without a message will fail and module build cannot move
to failed state.

Signed-off-by: Chenxiong Qi <cqi@redhat.com>
2019-11-01 21:33:08 +08:00
Chenxiong Qi
251239621d Refactor consume and process_message
A new method _map_message is added for converting a message object to
corresponding event handler and module build. This is used to shorten the
process_message method.

process_message is refactored so that:

* when handler is NO_OP, just return as earlier as possible because setting it
  make no sense to set MBSConsumer.current_module_build_id back and forth.
* Re-raise error thrown from handler execution so that the caller is able to
  get a chance to collect monitoring metric inside except clause handling
  Exception. Otherwise, no failed metric is collected. This is the major
  problem this patch is to fix.
* Ensure MBSConsumer.current_module_build_id is set back to None.

In consumer method, no traceback is logged inside except clause catching
Exception. process_method does that.

Signed-off-by: Chenxiong Qi <cqi@redhat.com>
2019-10-29 22:22:10 +08:00
Chenxiong Qi
3bdbdaee20 Remove unnecessary code from process_message
It is not necessary to initialize the build variable before following
if-elif-else branch.

After the if-elif-else branch, if no build is found, process_message
just returns immediately. So, no need to check if build is None during
handling error raised from handler call.

Signed-off-by: Chenxiong Qi <cqi@redhat.com>
2019-10-28 20:49:52 +08:00
mprahl
8c6cfb702d Use small license headers in the Python files
This also removes the outdated comments around authorship of each
file. If there is still interest in this information, one can just
look at the git history.
2019-10-03 08:47:24 -04:00
Chenxiong Qi
3878affa41 Separate use of database sessions
This patch separates the use of database session in different MBS components
and do not mix them together.

In general, MBS components could be separated as the REST API (implemented
based on Flask) and non-REST API including the backend build workflow
(implemented as a fedmsg consumer on top of fedmsg-hub and running
independently) and library shared by them. As a result, there are two kind of
database session used in MBS, one is created and managed by Flask-SQLAlchemy,
and another one is created from SQLAclhemy Session API directly. The goal of
this patch is to make ensure session object is used properly in the right
place.

All the changes follow these rules:

* REST API related code uses the session object db.session created and
  managed by Flask-SQLAlchemy.
* Non-REST API related code uses the session object created with SQLAlchemy
  Session API. Function make_db_session does that.
* Shared code does not created a new session object as much as possible.
  Instead, it accepts an argument db_session.

The first two rules are applicable to tests as well.

Major changes:

* Switch tests back to run with a file-based SQLite database.
* make_session is renamed to make_db_session and SQLAlchemy connection pool
  options are applied for PostgreSQL backend.
* Frontend Flask related code uses db.session
* Shared code by REST API and backend build workflow accepts SQLAlchemy session
  object as an argument. For example, resolver class is constructed with a
  database session, and some functions accepts an argument for database session.
* Build workflow related code use session object returned from make_db_session
  and ensure db.session is not used.
* Only tests for views use db.session, and other tests use db_session fixture
  to access database.
* All argument name session, that is for database access, are renamed to
  db_session.
* Functions model_tests_init_data, reuse_component_init_data and
  reuse_shared_userspace_init_data, which creates fixture data for
  tests, are converted into pytest fixtures from original function
  called inside setup_method or a test method. The reason of this
  conversion is to use fixture ``db_session`` rather than create a
  new one. That would also benefit the whole test suite to reduce the
  number of SQLAlchemy session objects.

Signed-off-by: Chenxiong Qi <cqi@redhat.com>
2019-07-18 21:26:50 +08:00
Jan Kaluza
222f0417cf Use single session object in greenwave handler and call commit() in the end. 2019-05-29 13:45:08 +02:00
mprahl
66c3f82160 Format the coding style across the codebase using "black" and manual tweaks
The main benefit of this commit is that the use of double quotes
is now consistent.
2019-04-26 00:32:13 -04:00
Valerij Maljulin
e564edc808 Build counters
Signed-off-by: Valerij Maljulin <vmaljuli@redhat.com>
2019-04-09 15:44:45 +02:00
Chenxiong Qi
0ee801877b Move module build to ready from done according to Greenwave
Signed-off-by: Chenxiong Qi <cqi@redhat.com>
2019-04-02 16:11:43 +08:00
Filip Valder
38c0ea6147 Basic monitoring w/-o MBS-specific metrics 2019-02-12 16:08:41 +00:00
mprahl
25cda8d2bd Shutdown fedmsg-hub when SQLAlchemy can no longer resolve DNS records 2019-01-24 10:48:28 -05:00
Chenxiong Qi
0c642a0944 Fix deprecation warnings from log.warn and inspect.getargspec
Signed-off-by: Chenxiong Qi <cqi@redhat.com>
2018-12-04 18:35:56 +08:00
mprahl
713172e1d5 Remove some other noisy debug logs 2018-08-14 11:22:04 -04:00
mprahl
79be63a7e7 Remove the debug log saying the MBS received a message to reduce noise 2018-08-14 10:03:53 -04:00
mprahl
ef5dc64f2b Transition stale failed builds to the "garbage" state and untag their components 2017-11-17 12:07:51 -05:00
Jan Kaluza
8fedf35b6c Log the original exception in consumer before trying to do anything else. Also commit the db.session before doing build.transition 2017-10-26 13:26:43 +02:00
Martin Curlej
60b3d97c97 flake8 cleanup
Signed-off-by: Martin Curlej <mcurlej@redhat.com>

removed some noqa tags
2017-10-25 12:13:59 +02:00
Jakub Kadlcik
e6a23cfd64 Record components through the backend after module submission 2017-10-16 14:45:04 -04:00
Ralph Bean
8e27fe16fe Raise a special exception for special messages.
Today, we ignore koji messages with a None `task_id` in two ways.  First
with a conditional, and then with a second check in the message
`__init__` method.  This is a belt-and-suspenders approach.

For other reasons in the UMB messaging plugin, we'd like to put this
check in just one place and use a special exception in the initializer
instead of in a conditional beforehand.
2017-09-29 13:07:06 -04:00
Ralph Bean
4d393b9e73 Handle python3 queue rename. 2017-09-19 13:21:29 -04:00
Ralph Bean
5e08d2ffe4 Introduce pluggable backends.
This allows an operator to write a custom messaging backend to handle
whatever transport and format.
2017-09-19 13:13:40 -04:00
Mike Bonnet
1f077a12ea pass the entire message to get_abstracted_msg()
Other messaging backends may use different formats, so pass the
entire message through and let get_abstracted_msg() handle it.
2017-09-19 13:12:45 -04:00
Filip Valder
7ef2975984 PEP8 fixes 2017-07-17 18:29:10 +02:00
Ralph Bean
a755104bd4 Fix the test suite.
We had some circular imports that caused the tests (and more?) to fail.

I ran into this when looking at the tests for #583 and #595.
2017-07-06 21:02:32 -04:00
Jan Kaluza
93092a43be Add per-module-build logging feature 2017-06-30 16:30:47 +02:00
Ralph Bean
c432187f92 Log message ids every time we try to handle them. 2017-04-07 08:28:28 -04:00
Jan Kaluza
8bbe2d359f Trigger newRepo by MBS instead of waiting on Kojira in case when we have sucessfully tagged all the components 2017-04-06 17:19:35 +02:00
Jan Kaluža
f7c8478d9c Merge #448 Copr builder improvements #2 2017-03-29 12:09:43 +00:00
Jan Kaluza
296d69b609 Handle all exceptions in the consumer handlers. 2017-03-23 14:59:38 +01:00
Ralph Bean
aabd28b148 Fix UnboundLocalError.
I have hotfixed this in production on mbs-backend01::

    Traceback (most recent call last):
      File "module_build_service/scheduler/consumer.py", line 134, in consume
        self.process_message(session, msg)
      File "module_build_service/scheduler/consumer.py", line 224, in process_message
        for event in further_work:
    UnboundLocalError: local variable 'further_work' referenced before assignment
2017-03-22 13:10:34 -04:00
Jakub Kadlčík
61b74293b1 Rather extend koji message so we can have additional arguments for copr 2017-03-21 07:47:25 +01:00
Ralph Bean
f12d6e0394 Don't validate internal messages.
These fail the validate check every time (because they're not real
messages; they're not signed).
2017-03-03 06:44:12 -05:00
Ralph Bean
c57d52ee56 Simplify this. 2017-03-02 14:30:05 -05:00