def __init__(self, host): self._factory = GerritEventFactory() self._events = Queue() self._stream = None self._ssh_client = GerritSSHClient(host)
class GerritClient(object): """ Gerrit client interface. """ def __init__(self, host): self._factory = GerritEventFactory() self._events = Queue() self._stream = None self._ssh_client = GerritSSHClient(host) def gerrit_version(self): """ Get the version of Gerrit that is connected to. """ return self._ssh_client.get_remote_version() def query(self, term): """ Run `gerrit query` with the given term. Return a list of results as `Change` objects. """ results = [] command = ["query", "--current-patch-set", "--all-approvals", "--format JSON", "--commit-message"] if isinstance(term, list): command += [escape_string(" ".join(term))] else: command += [escape_string(term)] result = self._ssh_client.run_gerrit_command(command) decoder = JSONDecoder() for line in result.stdout.read().splitlines(): # Gerrit's response to the query command contains one or more # lines of JSON-encoded strings. The last one is a status # dictionary containing the key "type" whose value indicates # whether or not the operation was successful. # According to http://goo.gl/h13HD it should be safe to use the # presence of the "type" key to determine whether the dictionary # represents a change or if it's the query status indicator. try: data = decoder.decode(line) except ValueError as err: raise GerritError("Query returned invalid data: %s", err) if "type" in data and data["type"] == "error": raise GerritError("Query error: %s" % data["message"]) elif "project" in data: results.append(Change(data)) return results def start_event_stream(self): """ Start streaming events from `gerrit stream-events`. """ if not self._stream: self._stream = GerritStream(self, ssh_client=self._ssh_client) self._stream.start() def stop_event_stream(self): """ Stop streaming events from `gerrit stream-events`.""" if self._stream: self._stream.stop() self._stream.join() self._stream = None with self._events.mutex: self._events.queue.clear() def get_event(self, block=True, timeout=None): """ Get the next event from the queue. Return a `GerritEvent` instance, or None if: - `block` is False and there is no event available in the queue, or - `block` is True and no event is available within the time specified by `timeout`. """ try: return self._events.get(block, timeout) except Empty: return None def put_event(self, json_data): """ Create event from `json_data` and add it to the queue. Raise GerritError if the queue is full, or the factory could not create the event. """ try: event = self._factory.create(json_data) self._events.put(event) except Full: raise GerritError("Unable to add event: queue is full")
help='Show day with maximum number of patch sets overall projects') parser.add_argument('--per-project', action="store_true", dest='per_project', default=False, help='Show statistics per each project') args = parser.parse_args() start = [int(i) for i in args.start.split('-')] end = [int(i) for i in args.end.split('-')] d_start = date(start[0], start[1], start[2]) d_end = date(end[0], end[1], end[2]) client = GerritSSHClient("review") openstack_projects = [ 'nova', 'cinder', 'glance', 'keystone', 'horizon', 'neutron', 'designate', 'heat', 'ironic', 'barbican', 'aodh', 'ceilometer', 'gnocchi', 'panko', 'manila', 'salt', 'linux', 'reclass', 'galera', 'memcached', 'rabbitmq', 'bind', 'apache', 'runtest', 'oslo-templates', 'auditd', 'octavia', 'openscap' ] openstack_salt_formulas = [ 'salt-formulas/{}'.format(i) for i in openstack_projects ] pkg_projects = ['^packaging/specs/.*'] aio_model = ['salt-models/mcp-virtual-aio'] model_projects = ['mk/cookiecutter-templates', 'salt-models/reclass-system'] projects = openstack_salt_formulas + pkg_projects + model_projects + aio_model
def applyProp(d, query, prop, arg, sep): p = safeGet(arg, d) if p is not None: tmp = sep.join(p) query += " {}:{} ".format(prop, tmp) return query def applyOrProp(d, query, prop, arg): return applyProp(d, query, prop, arg, " OR ") client = GerritSSHClient("gerrit.ovirt.org") def run_gerrit_command(command): try: return client.run_gerrit_command(command) except Exception as e: print 'Error when running gerrit command:', e def get_topic_changes(d): query = "query --format=JSON status:open --current-patch-set" query = applyOrProp(d, query, "owner", "owners") query = applyOrProp(d, query, "topic", "topics") query = applyOrProp(d, query, "project", "projects") log.info("Running query %s", query)
return d[key] return None def applyProp(d, query, prop, arg, sep): p = safeGet(arg, d) if p is not None: tmp = sep.join(p) query+=" {}:{} ".format(prop, tmp) return query def applyOrProp(d, query, prop, arg): return applyProp(d, query, prop, arg, " OR ") client = GerritSSHClient("gerrit.ovirt.org") def run_gerrit_command(command): try: return client.run_gerrit_command(command) except Exception as e: print 'Error when running gerrit command:', e def get_topic_changes(d): query = "query --format=JSON status:open --current-patch-set" query = applyOrProp(d, query, "owner", "owners") query = applyOrProp(d, query, "topic", "topics") query = applyOrProp(d, query, "project", "projects") log.info("Running query %s", query) query_result = run_gerrit_command(query) result = query_result.stdout.readlines()