From b7f19335f6c6a710d1e8925f8a9675d9e7115741 Mon Sep 17 00:00:00 2001 From: Ilya Shakhat Date: Mon, 1 Jul 2013 19:46:44 +0400 Subject: [PATCH] Implementation of blueprint stackalytics-core * Data updater is implemented * Completed implementation of commit processor * Logging is added into commit processor and runtime storage * Commit processor is fixed * Domain-company map is inverted * Extracted get update count into separate function * Fixed regex that matches diff statistics (lines inserted, lines deleted and files changed) * Implemented caching of unknown users * Replaced dictionaries by sets for pids and branches * Vcs is responsible for module and branches fields of commit record * Added release tags support * Implemented statistics by company * Added config for releases * Implemented front-end for companies details * Implemented front-end for modules details * Fixed metric switch * Implemented timeline rendering * Release selector is fixed * Chdir is needed after cloning a new repo * Company details screen is implemented * Fixed invalid emails processing by Launchpad * Fixed parsing of 0 files changed case * Module details screen implemented * Commit message is cleared and links are inserted * Engineer details screen is implemented * Fixed mapping from company to email for subdomains of 3rd level * Fixed wrong user structure for users not found by LP * Also coverage for commit processor * Fixed company matching algorithm * The company was not matched when user email had more domains than company's one * Add option to enforce sync with default data * Default data is added. Old confs removed * Add *.local into gitignore Scripts cleanup Moved from pylibmc to python-memcached Library pylibmc depends on libmemcached and doesn't work on CentOS (version conflict bw lib requirement and memcached). Change-Id: I0cc61c6d344ba24442ec954635010b518c0efa95 --- .gitignore | 1 + bin/{stackalytics-dashboard => dashboard} | 2 +- bin/full-update | 31 - bin/grab-unmapped | 5 - bin/{stackalytics => processor} | 2 +- bin/update | 18 - dashboard/memory_storage.py | 100 + dashboard/{dashboard.py => old_dashboard.py} | 0 dashboard/static/css/style.css | 2 +- dashboard/templates/base.html | 36 +- dashboard/templates/company_details.html | 38 +- dashboard/templates/engineer_details.html | 61 +- dashboard/templates/layout.html | 291 +- dashboard/templates/module_details.html | 36 +- .../{companies.html => overview.html} | 19 +- dashboard/web.py | 452 + etc/default_data.json | 13549 ++++++++++++++++ etc/domain-company | 94 - etc/email-aliases | 257 - etc/email-company | 17 - etc/launchpad-company | 36 - etc/launchpad-ids | 1128 -- etc/openstack.conf | 27 - etc/stackalytics.conf | 24 + etc/test_default_data.json | 121 + requirements.txt | 17 +- stackalytics/__init__.py | 1 + stackalytics/openstack/__init__.py | 1 + stackalytics/openstack/common/__init__.py | 0 stackalytics/openstack/common/importutils.py | 68 + stackalytics/openstack/common/jsonutils.py | 169 + stackalytics/openstack/common/log.py | 559 + stackalytics/openstack/common/timeutils.py | 187 + stackalytics/processor/__init__.py | 1 + stackalytics/processor/commit_processor.py | 177 + stackalytics/processor/main.py | 164 + stackalytics/processor/persistent_storage.py | 150 + stackalytics/processor/runtime_storage.py | 196 + stackalytics/processor/user_utils.py | 58 + stackalytics/processor/vcs.py | 175 + test-requirements.txt | 2 +- tests/unit/test_commit_processor.py | 231 + tests/unit/test_dashboard.py | 22 - tests/unit/test_vcs.py | 110 + tox.ini | 5 +- 45 files changed, 16749 insertions(+), 1891 deletions(-) rename bin/{stackalytics-dashboard => dashboard} (78%) delete mode 100755 bin/full-update delete mode 100755 bin/grab-unmapped rename bin/{stackalytics => processor} (73%) delete mode 100755 bin/update create mode 100644 dashboard/memory_storage.py rename dashboard/{dashboard.py => old_dashboard.py} (100%) rename dashboard/templates/{companies.html => overview.html} (72%) create mode 100644 dashboard/web.py create mode 100644 etc/default_data.json delete mode 100644 etc/domain-company delete mode 100644 etc/email-aliases delete mode 100644 etc/email-company delete mode 100644 etc/launchpad-company delete mode 100644 etc/launchpad-ids delete mode 100644 etc/openstack.conf create mode 100644 etc/stackalytics.conf create mode 100644 etc/test_default_data.json create mode 100644 stackalytics/__init__.py create mode 100644 stackalytics/openstack/__init__.py create mode 100644 stackalytics/openstack/common/__init__.py create mode 100644 stackalytics/openstack/common/importutils.py create mode 100644 stackalytics/openstack/common/jsonutils.py create mode 100644 stackalytics/openstack/common/log.py create mode 100644 stackalytics/openstack/common/timeutils.py create mode 100644 stackalytics/processor/__init__.py create mode 100644 stackalytics/processor/commit_processor.py create mode 100644 stackalytics/processor/main.py create mode 100644 stackalytics/processor/persistent_storage.py create mode 100644 stackalytics/processor/runtime_storage.py create mode 100644 stackalytics/processor/user_utils.py create mode 100644 stackalytics/processor/vcs.py create mode 100644 tests/unit/test_commit_processor.py delete mode 100644 tests/unit/test_dashboard.py create mode 100644 tests/unit/test_vcs.py diff --git a/.gitignore b/.gitignore index 469e17fbe..eb65f0d6b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ *~ *.pyc +*.local AUTHORS ChangeLog MANIFEST diff --git a/bin/stackalytics-dashboard b/bin/dashboard similarity index 78% rename from bin/stackalytics-dashboard rename to bin/dashboard index 63f184008..d7862984c 100755 --- a/bin/stackalytics-dashboard +++ b/bin/dashboard @@ -5,7 +5,7 @@ import os import sys sys.path.insert(0, os.getcwd()) -from dashboard.dashboard import app +from dashboard.web import app app.run() diff --git a/bin/full-update b/bin/full-update deleted file mode 100755 index c6d290cb7..000000000 --- a/bin/full-update +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -if [[ -z $STACKALYTICS_HOME ]]; then -echo "Variable STACKALYTICS_HOME must be specified" -exit -fi - -echo "Analytics home is $STACKALYTICS_HOME" - -DASHBOARD_CONF='$STACKALYTICS_HOME/conf/dashboard.conf' - -TOP_DIR=$(cd $(dirname "$0") && pwd) - -DB_FILE=`mktemp -u --tmpdir=$STACKALYTICS_HOME/data stackalytics-XXXXXXXXXXXX.sqlite` -TEMP_CONF=`mktemp -u` - -cd $TOP_DIR/../scripts/ -./pull-repos.sh - -cd $TOP_DIR/../ -./bin/stackalytics --config-file $STACKALYTICS_HOME/conf/analytics.conf --db-database $DB_FILE --verbose - -DATE=`date -u +'%d-%b-%y %H:%M %Z'` - -echo DATABASE = \'$DB_FILE\' >> $TEMP_CONF -echo LAST_UPDATE = \'$DATE\' >> $TEMP_CONF - -#rm $DASHBOARD_CONF -#mv $TEMP_CONF $DASHBOARD_CONF - -echo "Data is refreshed, please restart service" diff --git a/bin/grab-unmapped b/bin/grab-unmapped deleted file mode 100755 index ea1f54071..000000000 --- a/bin/grab-unmapped +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -TOP_DIR=$(cd $(dirname "$0") && pwd) - -./tools/with_venv.sh python scripts/launchpad/grab-unmapped-launchpad-ids.py \ No newline at end of file diff --git a/bin/stackalytics b/bin/processor similarity index 73% rename from bin/stackalytics rename to bin/processor index 253fd9334..415b67946 100755 --- a/bin/stackalytics +++ b/bin/processor @@ -5,7 +5,7 @@ import os import sys sys.path.insert(0, os.getcwd()) -from pycvsanaly2.main import main +from stackalytics.processor.main import main main() diff --git a/bin/update b/bin/update deleted file mode 100755 index d6f1ae358..000000000 --- a/bin/update +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -if [[ -z $STACKALYTICS_HOME ]]; then - echo "Variable STACKALYTICS_HOME must be specified" - exit -fi - -echo "Analytics home is $STACKALYTICS_HOME" - -CONF="$STACKALYTICS_HOME/conf/analytics.conf" - -TOP_DIR=$(cd $(dirname "$0") && pwd) -cd $TOP_DIR/../scripts/ -./pull-repos.sh - -echo "Updating data" -cd $TOP_DIR/../ -./bin/stackalytics --config-file $CONF --db-database $STACKALYTICS_HOME/data/stackalyticss.sqlite --verbose diff --git a/dashboard/memory_storage.py b/dashboard/memory_storage.py new file mode 100644 index 000000000..769e54818 --- /dev/null +++ b/dashboard/memory_storage.py @@ -0,0 +1,100 @@ +from stackalytics.processor import user_utils + +MEMORY_STORAGE_CACHED = 0 + + +class MemoryStorage(object): + def __init__(self, records): + pass + + +class CachedMemoryStorage(MemoryStorage): + def __init__(self, records): + super(CachedMemoryStorage, self).__init__(records) + + self.records = {} + self.company_index = {} + self.date_index = {} + self.module_index = {} + self.launchpad_id_index = {} + self.release_index = {} + self.dates = [] + for record in records: + self.records[record['record_id']] = record + self.index(record) + self.dates = sorted(self.date_index) + self.company_name_mapping = dict((c.lower(), c) + for c in self.company_index.keys()) + + def index(self, record): + + self._add_to_index(self.company_index, record, 'company_name') + self._add_to_index(self.module_index, record, 'module') + self._add_to_index(self.launchpad_id_index, record, 'launchpad_id') + self._add_to_index(self.release_index, record, 'release') + self._add_to_index(self.date_index, record, 'date') + + record['week'] = user_utils.timestamp_to_week(record['date']) + record['loc'] = record['lines_added'] + record['lines_deleted'] + + def _add_to_index(self, record_index, record, key): + record_key = record[key] + if record_key in record_index: + record_index[record_key].add(record['record_id']) + else: + record_index[record_key] = set([record['record_id']]) + + def _get_record_ids_from_index(self, items, index): + record_ids = set() + for item in items: + if item not in index: + raise Exception('Parameter %s not valid' % item) + record_ids |= index[item] + return record_ids + + def get_record_ids_by_modules(self, modules): + return self._get_record_ids_from_index(modules, self.module_index) + + def get_record_ids_by_companies(self, companies): + return self._get_record_ids_from_index( + map(self._get_company_name, companies), + self.company_index) + + def get_record_ids_by_launchpad_ids(self, launchpad_ids): + return self._get_record_ids_from_index(launchpad_ids, + self.launchpad_id_index) + + def get_record_ids_by_releases(self, releases): + return self._get_record_ids_from_index(releases, self.release_index) + + def get_record_ids(self): + return set(self.records.keys()) + + def get_records(self, record_ids): + for i in record_ids: + yield self.records[i] + + def _get_company_name(self, company_name): + normalized = company_name.lower() + if normalized not in self.company_name_mapping: + raise Exception('Unknown company name %s' % company_name) + return self.company_name_mapping[normalized] + + def get_companies(self): + return self.company_index.keys() + + def get_modules(self): + return self.module_index.keys() + + def get_launchpad_ids(self): + return self.launchpad_id_index.keys() + + +class MemoryStorageFactory(object): + + @staticmethod + def get_storage(memory_storage_type, records): + if memory_storage_type == MEMORY_STORAGE_CACHED: + return CachedMemoryStorage(records) + else: + raise Exception('Unknown memory storage type') diff --git a/dashboard/dashboard.py b/dashboard/old_dashboard.py similarity index 100% rename from dashboard/dashboard.py rename to dashboard/old_dashboard.py diff --git a/dashboard/static/css/style.css b/dashboard/static/css/style.css index bf93fe8f1..345ca542e 100644 --- a/dashboard/static/css/style.css +++ b/dashboard/static/css/style.css @@ -94,7 +94,7 @@ div.drops label { color: #909cb5; } -span.drop_period { +span.drop_release { margin-top: 6px; display: block; height: 30px; diff --git a/dashboard/templates/base.html b/dashboard/templates/base.html index 2b01e6cad..6d8d55b4e 100644 --- a/dashboard/templates/base.html +++ b/dashboard/templates/base.html @@ -34,9 +34,9 @@ - - - + + + {# #} @@ -49,21 +49,21 @@ {% block head %}{% endblock %} - +{# #} diff --git a/dashboard/templates/company_details.html b/dashboard/templates/company_details.html index 2889e32cc..2257f67e5 100644 --- a/dashboard/templates/company_details.html +++ b/dashboard/templates/company_details.html @@ -4,16 +4,19 @@ {{ company }} {% endblock %} +{% block scripts %} + +{% endblock %} + + {% block left_frame %}

Contribution by engineers

- -
@@ -35,11 +38,6 @@

Contribution by modules

- -
@@ -59,10 +57,10 @@ {% if blueprints %}
Blueprints:
    - {% for one in blueprints %} + {% for rec in blueprints %}
  1. - {{ one[0] }} - {{ one[1] }} + {{ rec['id'] }} + {{ rec['module'] }}
  2. {% endfor %}
@@ -70,12 +68,18 @@ {% endif %} {% if bugs %} -
Bug fixes: {{ bugs|length }} +
Bugs: +
    + {% for rec in bugs %} +
  1. + {{ rec['id'] }} +
  2. + {% endfor %} +
{% endif %} -
Total commits: {{ commits|length }}, among them {{ code_commits }} commits in code, - among them {{ test_only_commits }} test only commits
+
Total commits: {{ commits|length }}
Total LOC: {{ loc }}
{% endblock %} diff --git a/dashboard/templates/engineer_details.html b/dashboard/templates/engineer_details.html index 8b7c8fad3..811047abc 100644 --- a/dashboard/templates/engineer_details.html +++ b/dashboard/templates/engineer_details.html @@ -1,25 +1,26 @@ {% extends "layout.html" %} {% block title %} - {{ details.name }} + {{ user.user_name }} +{% endblock %} + +{% block scripts %} + {% endblock %} {% block left_frame %} - - -
- +
-

{{ details.name }}

- {% if details.company %} -
Company: {{ link('/companies/' + details.company, details.company) }}
+

{{ user.user_name }}

+ {% if user.companies %} +
Company: {{ user.companies[-1].company_name|link('/companies/' + user.companies[-1].company_name)|safe }}
{% endif %} -
Launchpad: {{ details.launchpad_id }}
-{#
Email: {{ details.email }}
#} +
Launchpad: {{ launchpad_id }}

Commits history

@@ -28,15 +29,13 @@
There are no commits for selected period or project type.
{% endif %} - {% for message in commits %} + {% for rec in commits %}
-

{{ message.date|datetimeformat }} to {{ message.module }} - {% if message.is_code %} code {% endif %} - {% if message.is_test %} test {% endif %} +

{{ rec.date|datetimeformat }} to {{ rec.module }}

-
{{ message.message|safe }}
-
+ {{ message.added_loc }} - - {{ message.removed_loc }}
+
{{ rec|commit_message|safe }}
+
+ {{ rec.lines_added }} + - {{ rec.lines_deleted }}
{% endfor %} @@ -47,11 +46,6 @@ {% if commits %}

Contribution by modules

- -
@@ -71,10 +65,10 @@ {% if blueprints %}
Blueprints:
    - {% for one in blueprints %} + {% for rec in blueprints %}
  1. - {{ one[0] }} - {{ one[1] }} + {{ rec['id'] }} + {{ rec['module'] }}
  2. {% endfor %}
@@ -82,23 +76,18 @@ {% endif %} {% if bugs %} -
Bug fixes: +
Bugs:
    - {% for one in bugs %} + {% for rec in bugs %}
  1. - {{ one[0] }} - - {% if one[1] %} C {% endif %} - {% if one[2] %} T {% endif %} - + {{ rec['id'] }}
  2. {% endfor %}
{% endif %} -
Total commits: {{ commits|length }}, among them {{ code_commits }} commits in code, - among them {{ test_only_commits }} test only commits
+
Total commits: {{ commits|length }}
Total LOC: {{ loc }}
{% endif %} diff --git a/dashboard/templates/layout.html b/dashboard/templates/layout.html index c88f948cc..314976293 100644 --- a/dashboard/templates/layout.html +++ b/dashboard/templates/layout.html @@ -18,159 +18,173 @@ +{% block scripts %}{% endblock %} + {% endblock %} {% block body %} @@ -244,10 +260,9 @@ - - - @@ -278,7 +293,3 @@
{% endblock %} - -{% macro link(base, title) -%} - {{ title }} -{%- endmacro %} diff --git a/dashboard/templates/module_details.html b/dashboard/templates/module_details.html index 9dea8edf6..271820eb7 100644 --- a/dashboard/templates/module_details.html +++ b/dashboard/templates/module_details.html @@ -4,16 +4,17 @@ {{ module }} {% endblock %} +{% block scripts %} + +{% endblock %} + {% block left_frame %}

Contribution by companies

- -
@@ -38,30 +39,25 @@ {% for rec in commits %}
- +
- {{ link('/engineers/' + rec.launchpad_id, rec.name) }} -{# {{ rec.name }}#} + {% if rec.launchpad_id %} + {{ rec.author|link('/engineers/' + rec.launchpad_id)|safe }} + {% else %} + {{ rec.author }} + {% endif %} {% if rec.company %} ( - {{ link('/companies/' + rec.company, rec.company) }} -{# {{ rec.company }}#} + {{ rec.company|link('/companies/' + rec.company)|safe }} ) {% endif %} {{ rec.date|datetimeformat }}
- {% if rec.ref %} -
{{ rec.ref|safe }}
- {% endif %} -
{{ rec.text }}
- {% if rec.change_id %} -
Change-Id: {{ rec.change_id }} -
- {% endif %} +
{{ rec.subject }}
+
{{ rec|commit_message|safe }}
{% endfor %} diff --git a/dashboard/templates/companies.html b/dashboard/templates/overview.html similarity index 72% rename from dashboard/templates/companies.html rename to dashboard/templates/overview.html index 5a640e4a4..ddb67d346 100644 --- a/dashboard/templates/companies.html +++ b/dashboard/templates/overview.html @@ -4,16 +4,18 @@ Overview {% endblock %} +{% block scripts %} + +{% endblock %} + {% block left_frame %}

Contribution by companies

- -
@@ -35,11 +37,6 @@

Contribution by modules

- -
diff --git a/dashboard/web.py b/dashboard/web.py new file mode 100644 index 000000000..79ca50946 --- /dev/null +++ b/dashboard/web.py @@ -0,0 +1,452 @@ +import cgi +import datetime +import functools +import json +import os +import re +import urllib + +import flask +from flask.ext import gravatar as gravatar_ext +import time + +from dashboard import memory_storage +from stackalytics.processor.persistent_storage import PersistentStorageFactory +from stackalytics.processor.runtime_storage import RuntimeStorageFactory +from stackalytics.processor import user_utils + +DEBUG = True +RUNTIME_STORAGE_URI = 'memcached://127.0.0.1:11211' +PERSISTENT_STORAGE_URI = 'mongodb://localhost' + +# create our little application :) +app = flask.Flask(__name__) +app.config.from_object(__name__) +app.config.from_envvar('DASHBOARD_CONF', silent=True) + + +def get_vault(): + vault = getattr(app, 'stackalytics_vault', None) + if not vault: + vault = {} + vault['runtime_storage'] = RuntimeStorageFactory.get_storage( + RUNTIME_STORAGE_URI) + vault['persistent_storage'] = PersistentStorageFactory.get_storage( + PERSISTENT_STORAGE_URI) + vault['memory_storage'] = ( + memory_storage.MemoryStorageFactory.get_storage( + memory_storage.MEMORY_STORAGE_CACHED, + vault['runtime_storage'].get_update(os.getpid()))) + + releases = vault['persistent_storage'].get_releases() + vault['releases'] = dict((r['release_name'].lower(), r) + for r in releases) + app.stackalytics_vault = vault + return vault + + +def get_memory_storage(): + return get_vault()['memory_storage'] + + +def record_filter(parameter_getter=lambda x: flask.request.args.get(x)): + def decorator(f): + @functools.wraps(f) + def decorated_function(*args, **kwargs): + + vault = get_vault() + memory_storage = vault['memory_storage'] + record_ids = memory_storage.get_record_ids() + + param = parameter_getter('modules') + if param: + record_ids &= memory_storage.get_record_ids_by_modules( + param.split(',')) + + if 'launchpad_id' in kwargs: + param = kwargs['launchpad_id'] + else: + param = (parameter_getter('launchpad_id') or + parameter_getter('launchpad_ids')) + if param: + record_ids &= memory_storage.get_record_ids_by_launchpad_ids( + param.split(',')) + + if 'company' in kwargs: + param = kwargs['company'] + else: + param = (parameter_getter('company') or + parameter_getter('companies')) + if param: + record_ids &= memory_storage.get_record_ids_by_companies( + param.split(',')) + + param = parameter_getter('release') or parameter_getter('releases') + if param: + if param != 'all': + record_ids &= memory_storage.get_record_ids_by_releases( + c.lower() for c in param.split(',')) + + kwargs['records'] = memory_storage.get_records(record_ids) + return f(*args, **kwargs) + + return decorated_function + + return decorator + + +def aggregate_filter(): + def decorator(f): + @functools.wraps(f) + def decorated_function(*args, **kwargs): + + metric_filter = lambda r: r['loc'] + metric_param = flask.request.args.get('metric') + if metric_param: + metric = metric_param.lower() + if metric == 'commits': + metric_filter = lambda r: 1 + elif metric != 'loc': + raise Exception('Invalid metric %s' % metric) + + kwargs['metric_filter'] = metric_filter + return f(*args, **kwargs) + + return decorated_function + + return decorator + + +def exception_handler(): + def decorator(f): + @functools.wraps(f) + def decorated_function(*args, **kwargs): + try: + return f(*args, **kwargs) + except Exception as e: + print e + flask.abort(404) + + return decorated_function + + return decorator + + +DEFAULT_METRIC = 'loc' +DEFAULT_RELEASE = 'havana' +DEFAULT_PROJECT_TYPE = 'incubation' + +INDEPENDENT = '*independent' + +METRIC_LABELS = { + 'loc': 'Lines of code', + 'commits': 'Commits', +} + +PROJECT_TYPES = { + 'core': ['core'], + 'incubation': ['core', 'incubation'], + 'all': ['core', 'incubation', 'dev'], +} + +ISSUE_TYPES = ['bug', 'blueprint'] + +DEFAULT_RECORDS_LIMIT = 10 + + +def templated(template=None): + def decorator(f): + @functools.wraps(f) + def decorated_function(*args, **kwargs): + + vault = get_vault() + template_name = template + if template_name is None: + template_name = (flask.request.endpoint.replace('.', '/') + + '.html') + ctx = f(*args, **kwargs) + if ctx is None: + ctx = {} + + # put parameters into template + metric = flask.request.args.get('metric') + if metric not in METRIC_LABELS: + metric = None + ctx['metric'] = metric or DEFAULT_METRIC + ctx['metric_label'] = METRIC_LABELS[ctx['metric']] + + release = flask.request.args.get('release') + releases = vault['releases'] + if release: + release = release.lower() + if release not in releases: + release = None + else: + release = releases[release]['release_name'] + ctx['release'] = (release or DEFAULT_RELEASE).lower() + + return flask.render_template(template_name, **ctx) + + return decorated_function + + return decorator + + +@app.route('/') +@templated() +def overview(): + pass + + +def contribution_details(records, limit=DEFAULT_RECORDS_LIMIT): + blueprints_map = {} + bugs_map = {} + commits = [] + loc = 0 + + for record in records: + loc += record['loc'] + commits.append(record) + blueprint = record['blueprint_id'] + if blueprint: + if blueprint in blueprints_map: + blueprints_map[blueprint].append(record) + else: + blueprints_map[blueprint] = [record] + + bug = record['bug_id'] + if bug: + if bug in bugs_map: + bugs_map[bug].append(record) + else: + bugs_map[bug] = [record] + + blueprints = sorted([{'id': key, + 'module': value[0]['module'], + 'records': value} + for key, value in blueprints_map.iteritems()], + key=lambda x: x['id']) + bugs = sorted([{'id': key, 'records': value} + for key, value in bugs_map.iteritems()], + key=lambda x: x['id']) + commits.sort(key=lambda x: x['date'], reverse=True) + + result = { + 'blueprints': blueprints, + 'bugs': bugs, + 'commits': commits[0:limit], + 'loc': loc, + } + return result + + +@app.route('/companies/') +@exception_handler() +@templated() +@record_filter() +def company_details(company, records): + details = contribution_details(records) + details['company'] = company + return details + + +@app.route('/modules/') +@exception_handler() +@templated() +@record_filter() +def module_details(module, records): + details = contribution_details(records) + details['module'] = module + return details + + +@app.route('/engineers/') +@exception_handler() +@templated() +@record_filter() +def engineer_details(launchpad_id, records): + persistent_storage = get_vault()['persistent_storage'] + user = list(persistent_storage.get_users(launchpad_id=launchpad_id))[0] + + details = contribution_details(records) + details['launchpad_id'] = launchpad_id + details['user'] = user + return details + + +@app.errorhandler(404) +def page_not_found(e): + return flask.render_template('404.html'), 404 + + +def _get_aggregated_stats(records, metric_filter, keys, param_id, + param_title=None): + param_title = param_title or param_id + result = dict((c, 0) for c in keys) + titles = {} + for record in records: + result[record[param_id]] += metric_filter(record) + titles[record[param_id]] = record[param_title] + + response = [{'id': r, 'metric': result[r], 'name': titles[r]} + for r in result if result[r]] + response.sort(key=lambda x: x['metric'], reverse=True) + return response + + +@app.route('/data/companies') +@exception_handler() +@record_filter() +@aggregate_filter() +def get_companies(records, metric_filter): + response = _get_aggregated_stats(records, metric_filter, + get_memory_storage().get_companies(), + 'company_name') + return json.dumps(response) + + +@app.route('/data/modules') +@exception_handler() +@record_filter() +@aggregate_filter() +def get_modules(records, metric_filter): + response = _get_aggregated_stats(records, metric_filter, + get_memory_storage().get_modules(), + 'module') + return json.dumps(response) + + +@app.route('/data/engineers') +@exception_handler() +@record_filter() +@aggregate_filter() +def get_engineers(records, metric_filter): + response = _get_aggregated_stats(records, metric_filter, + get_memory_storage().get_launchpad_ids(), + 'launchpad_id', 'author') + return json.dumps(response) + + +@app.route('/data/timeline') +@exception_handler() +@record_filter(parameter_getter=lambda x: flask.request.args.get(x) + if (x != "release") and (x != "releases") else None) +def timeline(records): + + # find start and end dates + release_name = flask.request.args.get('release') + + if not release_name: + release_name = DEFAULT_RELEASE + else: + release_name = release_name.lower() + + releases = get_vault()['releases'] + if release_name not in releases: + flask.abort(404) + release = releases[release_name] + + start_date = release_start_date = user_utils.timestamp_to_week( + user_utils.date_to_timestamp(release['start_date'])) + end_date = release_end_date = user_utils.timestamp_to_week( + user_utils.date_to_timestamp(release['end_date'])) + now = user_utils.timestamp_to_week(int(time.time())) + + # expand start-end to year if needed + if release_end_date - release_start_date < 52: + expansion = (52 - (release_end_date - release_start_date)) // 2 + if release_end_date + expansion < now: + end_date += expansion + else: + end_date = now + start_date = end_date - 52 + + # empty stats for all weeks in range + weeks = range(start_date, end_date) + week_stat_loc = dict((c, 0) for c in weeks) + week_stat_commits = dict((c, 0) for c in weeks) + + # fill stats with the data + for record in records: + week = record['week'] + if week in weeks: + week_stat_loc[week] += record['loc'] + week_stat_commits[week] += 1 + + # form arrays in format acceptable to timeline plugin + array_loc = [] + array_commits = [] + array_commits_hl = [] + + for week in weeks: + week_str = user_utils.week_to_date(week) + array_loc.append([week_str, week_stat_loc[week]]) + if release_start_date <= week <= release_end_date: + array_commits_hl.append([week_str, week_stat_commits[week]]) + array_commits.append([week_str, week_stat_commits[week]]) + + return json.dumps([array_commits, array_commits_hl, array_loc]) + + +# Jinja Filters + +@app.template_filter('datetimeformat') +def format_datetime(timestamp): + return datetime.datetime.utcfromtimestamp( + timestamp).strftime('%d %b %Y @ %H:%M') + + +@app.template_filter('launchpadmodule') +def format_launchpad_module_link(module): + return '%s' % (module, module) + + +@app.template_filter('encode') +def safe_encode(s): + return urllib.quote_plus(s) + + +@app.template_filter('link') +def make_link(title, uri=None): + return '%(title)s' % {'uri': uri, 'title': title} + + +def clear_text(s): + return cgi.escape(re.sub(r'\n{2,}', '\n', s, flags=re.MULTILINE)) + + +def link_blueprint(s, module): + return re.sub(r'(blueprint\s+)([\w-]+)', + r'\1\2', + s, flags=re.IGNORECASE) + + +def link_bug(s): + return re.sub(r'(bug\s+)#?([\d]{5,7})', + r'\1\2', + s, flags=re.IGNORECASE) + + +def link_change_id(s): + return re.sub(r'\s+(I[0-9a-f]{40})', + r' \1', + s) + + +@app.template_filter('commit_message') +def make_commit_message(record): + + return link_change_id(link_bug(link_blueprint(clear_text( + record['message']), record['module']))) + + +gravatar = gravatar_ext.Gravatar(app, + size=100, + rating='g', + default='wavatar', + force_default=False, + force_lower=False) + +if __name__ == '__main__': + app.run('0.0.0.0') diff --git a/etc/default_data.json b/etc/default_data.json new file mode 100644 index 000000000..41061f73f --- /dev/null +++ b/etc/default_data.json @@ -0,0 +1,13549 @@ +{ + "meta": { + "last_update": "09-Jul-2013" + }, + + "users": [ + { + "launchpad_id": "akamyshnikova", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Ann Kamyshnikova", + "emails": [ + "akamyshnikova@mirantis.com" + ] + }, + { + "launchpad_id": "berrange", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Daniel Berrange", + "emails": [ + "berrange@redhat.com" + ] + }, + { + "launchpad_id": "hzwangpan", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "wangpan", + "emails": [ + "hzwangpan@corp.netease.com" + ] + }, + { + "launchpad_id": "fabien-boucher", + "companies": [ + { + "company_name": "eNovance", + "end_date": null + } + ], + "user_name": "Fabien Boucher", + "emails": [ + "fabien.boucher@enovance.com" + ] + }, + { + "launchpad_id": "treinish", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Matthew Treinish", + "emails": [ + "treinish@linux.vnet.ibm.com" + ] + }, + { + "launchpad_id": "neoshades", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Andy Hill", + "emails": [ + "hillad@gmail.com" + ] + }, + { + "launchpad_id": "lianhao-lu", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "Lianhao Lu", + "emails": [ + "lianhao.lu@intel.com" + ] + }, + { + "launchpad_id": "lcui", + "companies": [ + { + "company_name": "VMware", + "end_date": null + } + ], + "user_name": "Leon", + "emails": [ + "lcui@vmware.com" + ] + }, + { + "launchpad_id": "litong01", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Tong Li", + "emails": [ + "litong01@us.ibm.com" + ] + }, + { + "launchpad_id": "kvdveer", + "companies": [ + { + "company_name": "CloudVPS", + "end_date": null + } + ], + "user_name": "Koert van der Veer", + "emails": [ + "koert@cloudvps.com" + ] + }, + { + "launchpad_id": "iosctr", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Brian D. Burns", + "emails": [ + "iosctr@gmail.com" + ] + }, + { + "launchpad_id": "hvolkmer", + "companies": [ + { + "company_name": "Cloudbau", + "end_date": null + } + ], + "user_name": "Hendrik Volkmer", + "emails": [ + "h.volkmer@cloudbau.de" + ] + }, + { + "launchpad_id": "zulcss", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Chuck Short", + "emails": [ + "chuck.short@canonical.com", + "zulcss@ubuntu.com" + ] + }, + { + "launchpad_id": "pauldbourke", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Paul Bourke", + "emails": [ + "paul-david.bourke@hp.com" + ] + }, + { + "launchpad_id": "hodong-hwang", + "companies": [ + { + "company_name": "KT Corporation", + "end_date": null + } + ], + "user_name": "Hodong Hwang", + "emails": [ + "hodong.hwang@kt.com" + ] + }, + { + "launchpad_id": "bao-mingyan", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Mingyan Bao", + "emails": [ + "bao.mingyan@hp.com" + ] + }, + { + "launchpad_id": "michaeltchapman", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Michael Chapman", + "emails": [ + "michchap@cisco.com" + ] + }, + { + "launchpad_id": "carlos-marin-d", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Carlos Marin", + "emails": [ + "carlos.marin@rackspace.com" + ] + }, + { + "launchpad_id": "renier-h", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Renier Morales", + "emails": [ + "renierm@us.ibm.com" + ] + }, + { + "launchpad_id": "cgoncalves", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Carlos Gon\u00e7alves", + "emails": [ + "cgoncalves@av.it.pt" + ] + }, + { + "launchpad_id": "truijllo", + "companies": [ + { + "company_name": "CRS4", + "end_date": null + } + ], + "user_name": "truijllo", + "emails": [ + "truijllo@crs4.it" + ] + }, + { + "launchpad_id": "aglenyoung", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Andrew Glen-Young", + "emails": [ + "andrew.glen-young@canonical.com" + ] + }, + { + "launchpad_id": "fifieldt", + "companies": [ + { + "company_name": "University of Melbourne", + "end_date": null + } + ], + "user_name": "Tom Fifield", + "emails": [ + "fifieldt@unimelb.edu.au", + "tom@openstack.org" + ] + }, + { + "launchpad_id": "daeskp", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Dae S. Kim", + "emails": [ + "dae@velatum.com" + ] + }, + { + "launchpad_id": "jbresnah", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "John Bresnahan", + "emails": [ + "jbresnah@redhat.com" + ] + }, + { + "launchpad_id": "prykhodchenko", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Roman Prykhodchenko", + "emails": [ + "rprikhodchenko@mirantis.com", + "me@romcheg.me" + ] + }, + { + "launchpad_id": "stephen-mulcahy", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "stephen mulcahy", + "emails": [ + "stephen.mulcahy@hp.com" + ] + }, + { + "launchpad_id": "jrd-q", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "John Dunning", + "emails": [ + "jrd@jrd.org" + ] + }, + { + "launchpad_id": "kgriffs", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Kurt Griffiths", + "emails": [ + "kurt.griffiths@rackspace.com" + ] + }, + { + "launchpad_id": "changbl", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Changbin Liu", + "emails": [ + "changbin.liu@gmail.com" + ] + }, + { + "launchpad_id": "yunshen", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Yun Shen", + "emails": [ + "yun.shen@hp.com" + ] + }, + { + "launchpad_id": "n0ano-ddd", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "Donald Dugger", + "emails": [ + "donald.d.dugger@intel.com" + ] + }, + { + "launchpad_id": "nachiappan-veerappan-nachiappan", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Nachiappan", + "emails": [ + "nachiappan.veerappan-nachiappan@hp.com" + ] + }, + { + "launchpad_id": "zyluo", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "Zhongyue Luo", + "emails": [ + "lzyeval@gmail.com", + "zhongyue.nah@intel.com" + ] + }, + { + "launchpad_id": "mikeyp-3", + "companies": [ + { + "company_name": "La Honda Research", + "end_date": null + } + ], + "user_name": "Mike Pittaro", + "emails": [ + "mikeyp@LaHondaResearch.org", + "mikeyp@lahondaresearch.org" + ] + }, + { + "launchpad_id": "zedshaw", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Zed A. Shaw", + "emails": [ + "zedshaw@zedshaw.com" + ] + }, + { + "launchpad_id": "enikanorov", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Eugene Nikanorov", + "emails": [ + "enikanorov@mirantis.com" + ] + }, + { + "launchpad_id": "mriedem", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Matt Riedemann", + "emails": [ + "mriedem@us.ibm.com" + ] + }, + { + "launchpad_id": "flaviamissi", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "flaviamissi", + "emails": [ + "flaviamissi@gmail.com" + ] + }, + { + "launchpad_id": "david-martin", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "David Martin", + "emails": [ + "dmartls1@gmail.com" + ] + }, + { + "launchpad_id": "rwsu", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Richard Su", + "emails": [ + "rwsu@redhat.com" + ] + }, + { + "launchpad_id": "chendi-xue", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "XueChendi", + "emails": [ + "chendi.xue@intel.com" + ] + }, + { + "launchpad_id": "mandarvaze", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Mandar Vaze", + "emails": [ + "mandar.vaze@vertex.co.in" + ] + }, + { + "launchpad_id": "motonobu", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Motonobu Ichimura", + "emails": [ + "motonobu@gmail.com" + ] + }, + { + "launchpad_id": "novel", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Roman Bogorodskiy", + "emails": [ + "bogorodskiy@gmail.com", + "rbogorodskiy@mirantis.com" + ] + }, + { + "launchpad_id": "vsergeyev", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Victor Sergeyev", + "emails": [ + "vsergeyev@mirantis.com" + ] + }, + { + "launchpad_id": "constantine-q", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Constantine Peresypkin", + "emails": [ + "constantine@litestack.com" + ] + }, + { + "launchpad_id": "yanglyy", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "YangLei", + "emails": [ + "yanglyy@cn.ibm.com" + ] + }, + { + "launchpad_id": "ziad-sawalha", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Ziad Sawalha", + "emails": [ + "ziad.sawalha@rackspace.com", + "github@highbridgellc.com", + "gihub@highbridgellc.com" + ] + }, + { + "launchpad_id": "vishvananda", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "Vish Ishaya", + "emails": [ + "vishvananda@yahoo.com", + "root@ubuntu", + "vishvananda@gmail.com", + "root@mirror.nasanebula.net" + ] + }, + { + "launchpad_id": "tsedovic", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Tomas Sedovic", + "emails": [ + "tomas@sedovic.cz" + ] + }, + { + "launchpad_id": "eafonichev", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Evgeniy Afonichev", + "emails": [ + "eafonichev@mirantis.com", + "evgeniy@afonichev.com" + ] + }, + { + "launchpad_id": "joshua-mckenty", + "companies": [ + { + "company_name": "Piston Cloud", + "end_date": null + } + ], + "user_name": "Joshua McKenty", + "emails": [ + "jmckenty@yyj-dhcp171.corp.flock.com", + "joshua@pistoncloud.com", + "joshua.mckenty@nasa.gov", + "jmckenty@joshua-mckentys-macbook-pro.local", + "jmckenty@gmail.com" + ] + }, + { + "launchpad_id": "scott-dangelo", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Scott DAngelo", + "emails": [ + "scott.dangelo@hp.com" + ] + }, + { + "launchpad_id": "reynolds.chin", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Reynolds Chin", + "emails": [ + "benzwt@gmail.com" + ] + }, + { + "launchpad_id": "xyj-asmy", + "companies": [ + { + "company_name": "UnitedStack", + "end_date": null + } + ], + "user_name": "Yejia Xu", + "emails": [ + "yejia@unitedstack.com", + "xyj.asmy@gmail.com" + ] + }, + { + "launchpad_id": "scollins", + "companies": [ + { + "company_name": "Comcast", + "end_date": null + } + ], + "user_name": "Sean M. Collins", + "emails": [ + "sean@coreitpro.com" + ] + }, + { + "launchpad_id": "darragh-oreilly", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Darragh O'Reilly", + "emails": [ + "dara2002-openstack@yahoo.com" + ] + }, + { + "launchpad_id": "hyphon-zh", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Hyphon Zhang", + "emails": [ + "ghj114@gmail.com" + ] + }, + { + "launchpad_id": "usrleon", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Lvov Maxim", + "emails": [ + "usrleon@gmail.com", + "mlvov@mirantis.com" + ] + }, + { + "launchpad_id": "kaiwei-fan", + "companies": [ + { + "company_name": "VMware", + "end_date": null + } + ], + "user_name": "Kaiwei Fan", + "emails": [ + "fank@vmware.com" + ] + }, + { + "launchpad_id": "lklrmn", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Leah Klearman", + "emails": [ + "lklrmn@gmail.com" + ] + }, + { + "launchpad_id": "starmer", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Robert Starmer", + "emails": [ + "starmer@cisco.com" + ] + }, + { + "launchpad_id": "racb", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Robie Basak", + "emails": [ + "robie.basak@canonical.com" + ] + }, + { + "launchpad_id": "thomas-spatzier", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Thomas Spatzier", + "emails": [ + "thomas.spatzier@de.ibm.com" + ] + }, + { + "launchpad_id": "henry-nash", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Henry Nash", + "emails": [ + "henryn@linux.vnet.ibm.com" + ] + }, + { + "launchpad_id": "kelsey-tripp", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "Kelsey Tripp", + "emails": [ + "kelsey.tripp@nebula.com" + ] + }, + { + "launchpad_id": "erikzaadi", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Erik Zaadi", + "emails": [ + "erikz@il.ibm.com" + ] + }, + { + "launchpad_id": "swann-w", + "companies": [ + { + "company_name": "Bull", + "end_date": null + } + ], + "user_name": "Swann Croiset", + "emails": [ + "swann.croiset@bull.net", + "swann@oopss.org" + ] + }, + { + "launchpad_id": "eday", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Eric Day", + "emails": [ + "eday@oddments.org" + ] + }, + { + "launchpad_id": "rcurran", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Rich Curran", + "emails": [ + "rcurran@cisco.com" + ] + }, + { + "launchpad_id": "tpatil", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Tushar Patil", + "emails": [ + "tpatil@vertex.co.in", + "tushar.vitthal.patil@gmail.com" + ] + }, + { + "launchpad_id": "a-koppad", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Annapoornima Koppad", + "emails": [ + "a.koppad@gmail.com" + ] + }, + { + "launchpad_id": "john-brzozowski", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "John Jason Brzozowski", + "emails": [ + "jjmb@jjmb.com" + ] + }, + { + "launchpad_id": "zhiteng-huang", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "Huang Zhiteng", + "emails": [ + "zhiteng.huang@intel.com" + ] + }, + { + "launchpad_id": "aloga", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Alvaro Lopez", + "emails": [ + "Lopez", + "aloga@ifca.unican.es" + ] + }, + { + "launchpad_id": "kanaderohan", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Rohan", + "emails": [ + "rohan.kanade@nttdata.com" + ] + }, + { + "launchpad_id": "sylvain-afchain", + "companies": [ + { + "company_name": "eNovance", + "end_date": null + } + ], + "user_name": "Sylvain Afchain", + "emails": [ + "sylvain.afchain@enovance.com" + ] + }, + { + "launchpad_id": "njohnston", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Neil Johnston", + "emails": [ + "onewheeldrive.net@gmail.com" + ] + }, + { + "launchpad_id": "terriyu", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Terri Yu", + "emails": [ + "teryu@alum.mit.edu" + ] + }, + { + "launchpad_id": "pksunkara", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Pavan Kumar Sunkara", + "emails": [ + "pavan.sss1991@gmail.com" + ] + }, + { + "launchpad_id": "johannes.erdfelt", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Johannes Erdfelt", + "emails": [ + "johannes@erdfelt.com", + "johannes.erdfelt@rackspace.com", + "johannes@compute3.221.st" + ] + }, + { + "launchpad_id": "jerome-gallard", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "J\u00e9r\u00f4me Gallard", + "emails": [ + "jerome.david.gallard@gmail.com" + ] + }, + { + "launchpad_id": "gtt116", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "TianTian Gao", + "emails": [ + "gtt116@gmail.com", + "gtt116@126.com" + ] + }, + { + "launchpad_id": "shrinand", + "companies": [ + { + "company_name": "Maginatics", + "end_date": null + } + ], + "user_name": "Shri Javadekar", + "emails": [ + "shrinand@maginatics.com" + ] + }, + { + "launchpad_id": "asomya", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Arvind Somya", + "emails": [ + "asomya@cisco.com", + "Somya" + ] + }, + { + "launchpad_id": "chungg", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "gordon chung", + "emails": [ + "chungg@ca.ibm.com" + ] + }, + { + "launchpad_id": "rjuvvadi", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Ramana Juvvadi", + "emails": [ + "rjuvvadi@hcl.com", + "rrjuvvadi@gmail.com", + "ramana@venus.lekha.org" + ] + }, + { + "launchpad_id": "anotherjesse", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "Jesse Andrews", + "emails": [ + "jesse@gigantor.local", + "jesse@aire.local", + "jesse@ubuntu", + "jesse@dancelamb", + "anotherjesse@gmail.com" + ] + }, + { + "launchpad_id": "luis-fernandez-alvarez", + "companies": [ + { + "company_name": "CERN", + "end_date": null + } + ], + "user_name": "Luis Fernandez", + "emails": [ + "luis.fernandez.alvarez@cern.ch" + ] + }, + { + "launchpad_id": "sgordon", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Stephen Gordon", + "emails": [ + "sgordon@redhat.com" + ] + }, + { + "launchpad_id": "jbryce", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jonathan Bryce", + "emails": [ + "jbryce@jbryce.com" + ] + }, + { + "launchpad_id": "alexhandle", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Alex Handle", + "emails": [ + "ah@mynet.at" + ] + }, + { + "launchpad_id": "alatynskaya", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Anastasia Latynskaya", + "emails": [ + "alatynskaya@mirantis.com" + ] + }, + { + "launchpad_id": "rtb", + "companies": [ + { + "company_name": "CERN", + "end_date": null + } + ], + "user_name": "Rainer Toebbicke", + "emails": [ + "rainer.toebbicke@cern.ch" + ] + }, + { + "launchpad_id": "mattt416", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Matt Thompson", + "emails": [ + "mattt@defunct.ca" + ] + }, + { + "launchpad_id": "juergh", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Juerg Haefliger", + "emails": [ + "juerg.haefliger@hp.com" + ] + }, + { + "launchpad_id": "rcc", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Ricardo Carrillo Cruz", + "emails": [ + "emaildericky@gmail.com" + ] + }, + { + "launchpad_id": "ilyaalekseyev", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Ilya Alekseyev", + "emails": [ + "ialekseev@griddynamics.com", + "ilya@oscloud.ru", + "ilyaalekseyev@acm.org" + ] + }, + { + "launchpad_id": "sgran", + "companies": [ + { + "company_name": "The Guardian", + "end_date": null + } + ], + "user_name": "Stephen Gran", + "emails": [ + "stephen.gran@guardian.co.uk" + ] + }, + { + "launchpad_id": "joe-topjian-v", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Joe T", + "emails": [ + "joe@topjian.net" + ] + }, + { + "launchpad_id": "zzs", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Jason Zhang", + "emails": [ + "zhesen@nttmcl.com" + ] + }, + { + "launchpad_id": "yuxcer", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Yuxingchao", + "emails": [ + "yuxcer@126.com", + "yuxcer@gmail.com" + ] + }, + { + "launchpad_id": "wanglong", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "drabbit", + "emails": [ + "wl3617@qq.com" + ] + }, + { + "launchpad_id": "nick-craig-wood", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Nick Craig-Wood", + "emails": [ + "nick@craig-wood.com" + ] + }, + { + "launchpad_id": "mattstep", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Matt Stephenson", + "emails": [ + "mattstep@mattstep.net" + ] + }, + { + "launchpad_id": "eap-x", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Eric Pendergrass", + "emails": [ + "eap@hp.com" + ] + }, + { + "launchpad_id": "k.c.wang", + "companies": [ + { + "company_name": "Big Switch Networks", + "end_date": null + } + ], + "user_name": "KC Wang", + "emails": [ + "kc.wang@bigswitch.com" + ] + }, + { + "launchpad_id": "justin-fathomdb", + "companies": [ + { + "company_name": "FathomDB", + "end_date": null + } + ], + "user_name": "justinsb", + "emails": [ + "justinsb@justinsb-desktop", + "justin@fathomdb.com", + "SB", + "superstack@superstack.org" + ] + }, + { + "launchpad_id": "vash-vasiliyshlykov", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Vasiliy Shlykov", + "emails": [ + "vash@vasiliyshlykov.org" + ] + }, + { + "launchpad_id": "nicolas.simonds", + "companies": [ + { + "company_name": "Metacloud", + "end_date": null + } + ], + "user_name": "Nicolas Simonds", + "emails": [ + "nic@metacloud.com" + ] + }, + { + "launchpad_id": "xiaoxi-chen", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "xiaoxi_chen", + "emails": [ + "xiaoxi.chen@intel.com" + ] + }, + { + "launchpad_id": "wenjianhn", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Jian Wen", + "emails": [ + "jian.wen@canonical.com", + "wenjianhn@gmail.com", + "jian.wen@ubuntu.com" + ] + }, + { + "launchpad_id": "mate-lakat", + "companies": [ + { + "company_name": "Citrix", + "end_date": null + } + ], + "user_name": "Mate Lakat", + "emails": [ + "mate.lakat@citrix.com" + ] + }, + { + "launchpad_id": "chiradeep", + "companies": [ + { + "company_name": "Citrix Systems", + "end_date": null + } + ], + "user_name": "Chiradeep Vittal", + "emails": [ + "chiradeep@chiradeep-lt2", + "chiradeep@cloud.com" + ] + }, + { + "launchpad_id": "dheidler", + "companies": [ + { + "company_name": "SUSE", + "end_date": null + } + ], + "user_name": "Dominik Heidler", + "emails": [ + "dheidler@suse.de" + ] + }, + { + "launchpad_id": "ekirpichov", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Eugene Kirpichov", + "emails": [ + "ekirpichov@gmail.com" + ] + }, + { + "launchpad_id": "alaski", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Andrew Laski", + "emails": [ + "andrew.laski@rackspace.com" + ] + }, + { + "launchpad_id": "jens-christian-fischer", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jens-Christian Fischer", + "emails": [ + "jens-christian.fischer@switch.ch" + ] + }, + { + "launchpad_id": "entropyworks", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Yazz Atlas", + "emails": [ + "yazz.atlas@hp.com" + ] + }, + { + "launchpad_id": "ewindisch", + "companies": [ + { + "company_name": "Cloudscaling", + "end_date": null + } + ], + "user_name": "Eric Windisch", + "emails": [ + "eric@cloudscaling.com" + ] + }, + { + "launchpad_id": "david-wilde-rackspace", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Dave Wilde", + "emails": [ + "david.wilde@rackspace.com" + ] + }, + { + "launchpad_id": "lauria", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Giampaolo Lauria", + "emails": [ + "lauria@us.ibm.com" + ] + }, + { + "launchpad_id": "bob-melander", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Bob Melander", + "emails": [ + "bob.melander@gmail.com" + ] + }, + { + "launchpad_id": "paul-mcmillan", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "Paul McMillan", + "emails": [ + "paul.mcmillan@nebula.com" + ] + }, + { + "launchpad_id": "vkhomenko", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Vasyl Khomenko", + "emails": [ + "vasiliyk@yahoo-inc.com" + ] + }, + { + "launchpad_id": "matt-nycresistor", + "companies": [ + { + "company_name": "Cloudscaling", + "end_date": null + } + ], + "user_name": "Matt Joyce", + "emails": [ + "matt.joyce@cloudscaling.com" + ] + }, + { + "launchpad_id": "ykaneko0929", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Yoshihiro Kaneko", + "emails": [ + "ykaneko0929@gmail.com" + ] + }, + { + "launchpad_id": "vvechkanov", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Vladimir Vechkanov", + "emails": [ + "vvechkanov@mirantis.com" + ] + }, + { + "launchpad_id": "berendt", + "companies": [ + { + "company_name": "B1 Systems", + "end_date": null + } + ], + "user_name": "Christian Berendt", + "emails": [ + "berendt@b1-systems.de" + ] + }, + { + "launchpad_id": "rajarammallya", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Rajaram Mallya", + "emails": [ + "rajarammallya@gmail.com" + ] + }, + { + "launchpad_id": "thingee", + "companies": [ + { + "company_name": "DreamHost", + "end_date": null + } + ], + "user_name": "Mike Perez", + "emails": [ + "thingee@gmail.com", + "mike.perez@dreamhost.com" + ] + }, + { + "launchpad_id": "markgius", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Mark Gius", + "emails": [ + "launchpad@markgius.com" + ] + }, + { + "launchpad_id": "dricco", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Cian O'Driscoll", + "emails": [ + "cian@hp.com" + ] + }, + { + "launchpad_id": "venkateshsampath", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Venkatesh Sampath", + "emails": [ + "venkatesh.sampath@outlook.com" + ] + }, + { + "launchpad_id": "john-postlethwait", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "John Postlethwait", + "emails": [ + "john.postlethwait@nebula.com" + ] + }, + { + "launchpad_id": "weiyuanke123", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "weiyuanke", + "emails": [ + "weiyuanke123@gmail.com" + ] + }, + { + "launchpad_id": "leseb", + "companies": [ + { + "company_name": "eNovance", + "end_date": null + } + ], + "user_name": "Sebastien Han", + "emails": [ + "sebastien.han@enovance.com" + ] + }, + { + "launchpad_id": "jajohnson", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jason Johnson", + "emails": [ + "jajohnson@softlayer.com" + ] + }, + { + "launchpad_id": "ladquin", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Laura Alves", + "emails": [ + "laura.adq@gmail.com" + ] + }, + { + "launchpad_id": "chris-ricker", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Chris Ricker", + "emails": [ + "chris.ricker@gmail.com" + ] + }, + { + "launchpad_id": "tim-miller-0", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Tim Miller", + "emails": [ + "tim.miller.0@gmail.com" + ] + }, + { + "launchpad_id": "gpernot", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Guillaume Pernot", + "emails": [ + "gpernot@praksys.org" + ] + }, + { + "launchpad_id": "sirisha-devineni", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Sirisha Devineni", + "emails": [ + "sirisha_devineni@persistent.co.in" + ] + }, + { + "launchpad_id": "nobodycam", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Chris Krelle", + "emails": [ + "nobodycam@gmail.com" + ] + }, + { + "launchpad_id": "cbjchen", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Liang Chen", + "emails": [ + "cbjchen@cn.ibm.com" + ] + }, + { + "launchpad_id": "russell", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Russell Cloran", + "emails": [ + "russell@nimbula.com" + ] + }, + { + "launchpad_id": "slukjanov", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Sergey Lukjanov", + "emails": [ + "me@frostman.ru", + "slukjanov@mirantis.com" + ] + }, + { + "launchpad_id": "tr3buchet", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Trey Morris", + "emails": [ + "trey.morris@rackspace.com", + "treyemorris@gmail.com" + ] + }, + { + "launchpad_id": "jiyou09", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "You Ji", + "emails": [ + "jiyou09@gmail.com" + ] + }, + { + "launchpad_id": "lapgoon", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "LiangAiping", + "emails": [ + "lapgoon@gmail.com" + ] + }, + { + "launchpad_id": "ajames", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Andrew James", + "emails": [ + "andrew.james@hp.com" + ] + }, + { + "launchpad_id": "james-meredith", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "James Meredith", + "emails": [ + "james.meredith@rackspace.com" + ] + }, + { + "launchpad_id": "lmatter", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Larry Matter", + "emails": [ + "lmatter@coraid.com" + ] + }, + { + "launchpad_id": "bfschott", + "companies": [ + { + "company_name": "Information Sciences Institute", + "end_date": null + } + ], + "user_name": "Brian Schott", + "emails": [ + "bschott@isi.edu", + "bfschott@gmail.com" + ] + }, + { + "launchpad_id": "gblomqui", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Greg Blomquist", + "emails": [ + "gblomqui@redhat.com" + ] + }, + { + "launchpad_id": "rushiagr", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Rushi Agrawal", + "emails": [ + "rushi.agr@gmail.com" + ] + }, + { + "launchpad_id": "derekh", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Derek Higgins", + "emails": [ + "higginsd@gmail.com", + "derekh@redhat.com" + ] + }, + { + "launchpad_id": "iberezovskiy", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Ivan Berezovskiy", + "emails": [ + "iberezovskiy@mirantis.com" + ] + }, + { + "launchpad_id": "rellerreller", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Nathan Reller", + "emails": [ + "nathan.reller@jhuapl.edu" + ] + }, + { + "launchpad_id": "bmcconne", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Brad McConnell", + "emails": [ + "McConnell", + "bmcconne@rackspace.com" + ] + }, + { + "launchpad_id": "bilalakhtar", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Bilal Akhtar", + "emails": [ + "bilalakhtar@ubuntu.com" + ] + }, + { + "launchpad_id": "tamura-yoshiaki", + "companies": [ + { + "company_name": "Midokura", + "end_date": null + } + ], + "user_name": "Yoshiaki Tamura", + "emails": [ + "yoshi@midokura.jp" + ] + }, + { + "launchpad_id": "ishii-hisaharu", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Hisaharu Ishii", + "emails": [ + "ishii@nttmcl.com", + "ishii.hisaharu@lab.ntt.co.jp" + ] + }, + { + "launchpad_id": "john-lenihan", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "John Lenihan", + "emails": [ + "john.lenihan@hp.com" + ] + }, + { + "launchpad_id": "jk0", + "companies": [ + { + "company_name": "Piston Cloud", + "end_date": null + } + ], + "user_name": "Josh Kearney", + "emails": [ + "jkearney@nova.(none)", + "josh.kearney@pistoncloud.com", + "josh@jk0.org", + "josh.kearney@rackspace.com" + ] + }, + { + "launchpad_id": "jasonstraw", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Jason Straw", + "emails": [ + "jason.straw@rackspace.com" + ] + }, + { + "launchpad_id": "retr0h", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "John Dewey", + "emails": [ + "john@dewey.ws" + ] + }, + { + "launchpad_id": "liyingjun", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Liyingjun", + "emails": [ + "liyingjun1988@gmail.com" + ] + }, + { + "launchpad_id": "izbyshev", + "companies": [ + { + "company_name": "ISP RAS", + "end_date": null + } + ], + "user_name": "Alexey Izbyshev", + "emails": [ + "izbyshev@ispras.ru" + ] + }, + { + "launchpad_id": "christophe.sauthier", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Christophe Sauthier", + "emails": [ + "christophe@sauthier.com", + "christophe.sauthier@objectif-libre.com" + ] + }, + { + "launchpad_id": "lars-gellrich", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Lars Gellrich", + "emails": [ + "lars.gellrich@hp.com" + ] + }, + { + "launchpad_id": "darrellb", + "companies": [ + { + "company_name": "SwiftStack", + "end_date": null + } + ], + "user_name": "Darrell Bishop", + "emails": [ + "darrell@swiftstack.com" + ] + }, + { + "launchpad_id": "kiran-kumar-vaddi", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Kiran Kumar Vaddi", + "emails": [ + "kiran-kumar.vaddi@hp.com" + ] + }, + { + "launchpad_id": "mkkang", + "companies": [ + { + "company_name": "Information Sciences Institute", + "end_date": null + } + ], + "user_name": "Mikyung Kang", + "emails": [ + "mkkang@isi.edu" + ] + }, + { + "launchpad_id": "prem-karat", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Prem Karat", + "emails": [ + "prem.karat@linux.vnet.ibm.com" + ] + }, + { + "launchpad_id": "francine-ransy", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Francine Ransy", + "emails": [ + "francine.ransy@gmail.com" + ] + }, + { + "launchpad_id": "jhenner", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Jaroslav Henner", + "emails": [ + "jhenner@redhat.com" + ] + }, + { + "launchpad_id": "nerminamiller", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Nermina Miller", + "emails": [ + "nerminamiller@gmail.com" + ] + }, + { + "launchpad_id": "epavlova", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Katrin Pavlova", + "emails": [ + "epavlova@mirantis.com" + ] + }, + { + "launchpad_id": "yportnova", + "companies": [ + { + "company_name": "Yahoo!", + "end_date": null + } + ], + "user_name": "Yuliya Portnova", + "emails": [ + "yportnova@griddynamics.com", + "yportnov@yahoo-inc.com" + ] + }, + { + "launchpad_id": "han-sebastien", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "S\u00e9bastien Han", + "emails": [ + "han.sebastien@gmail.com" + ] + }, + { + "launchpad_id": "arata776", + "companies": [ + { + "company_name": "Virtualtech", + "end_date": null + } + ], + "user_name": "Arata Notsu", + "emails": [ + "notsu@virtualtech.jp" + ] + }, + { + "launchpad_id": "gundlach", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Michael Gundlach", + "emails": [ + "michael.gundlach@rackspace.com" + ] + }, + { + "launchpad_id": "rloo", + "companies": [ + { + "company_name": "Yahoo!", + "end_date": null + } + ], + "user_name": "Ruby Loo", + "emails": [ + "rloo@yahoo-inc.com" + ] + }, + { + "launchpad_id": "cp16net", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "cp16net", + "emails": [ + "cp16net@gmail.com" + ] + }, + { + "launchpad_id": "ning", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "ning_zhang", + "emails": [ + "ning@zmanda.com" + ] + }, + { + "launchpad_id": "mdragon", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Monsyne Dragon", + "emails": [ + "mdragon@rackspace.com" + ] + }, + { + "launchpad_id": "rohitagarwalla", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Rohit Agarwalla", + "emails": [ + "rohitgarwalla@gmail.com", + "rohitagarwalla@gmail.com", + "roagarwa@cisco.com" + ] + }, + { + "launchpad_id": "ebballon", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Natale Vinto", + "emails": [ + "ebballon@gmail.com" + ] + }, + { + "launchpad_id": "russell-sim", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Russell Sim", + "emails": [ + "russell.sim@gmail.com" + ] + }, + { + "launchpad_id": "naehring", + "companies": [ + { + "company_name": "B1 Systems", + "end_date": null + } + ], + "user_name": "Andre Naehring", + "emails": [ + "naehring@b1-systems.de" + ] + }, + { + "launchpad_id": "bswartz", + "companies": [ + { + "company_name": "NetApp", + "end_date": null + } + ], + "user_name": "Ben Swartzlander", + "emails": [ + "bswartz@netapp.com" + ] + }, + { + "launchpad_id": "rpodolyaka", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Roman Podolyaka", + "emails": [ + "rpodolyaka@mirantis.com" + ] + }, + { + "launchpad_id": "liquid-x", + "companies": [ + { + "company_name": "KT Corporation", + "end_date": null + } + ], + "user_name": "Eohyung Lee", + "emails": [ + "liquid@kt.com" + ] + }, + { + "launchpad_id": "jkleinpeter", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Josh Kleinpeter", + "emails": [ + "josh@kleinpeter.org" + ] + }, + { + "launchpad_id": "kaushikc", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Kaushik Chandrashekar", + "emails": [ + "kaushik.chand@gmail.com", + "kaushik.chandrashekar@rackspace.com" + ] + }, + { + "launchpad_id": "stanislaw-pitucha", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Stanislaw Pitucha", + "emails": [ + "stanislaw.pitucha@hp.com" + ] + }, + { + "launchpad_id": "lrqrun", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "lrqrun", + "emails": [ + "lrqrun@gmail.com" + ] + }, + { + "launchpad_id": "krt", + "companies": [ + { + "company_name": "Yahoo!", + "end_date": null + } + ], + "user_name": "Ken Thomas", + "emails": [ + "krt@yahoo-inc.com" + ] + }, + { + "launchpad_id": "spn", + "companies": [ + { + "company_name": "Dell", + "end_date": null + } + ], + "user_name": "Surya Prabhakar", + "emails": [ + "surya_prabhakar@dell.com" + ] + }, + { + "launchpad_id": "bknowles", + "companies": [ + { + "company_name": "MomentumSI", + "end_date": null + } + ], + "user_name": "Brad Knowles", + "emails": [ + "bknowles@momentumsi.com" + ] + }, + { + "launchpad_id": "pmezard", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Patrick Mezard", + "emails": [ + "patrick@mezard.eu" + ] + }, + { + "launchpad_id": "yolanda.robla", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Yolanda Robla", + "emails": [ + "yolanda.robla@canonical.com" + ] + }, + { + "launchpad_id": "andrew-mccrae", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Andy McCrae", + "emails": [ + "andy.mccrae@gmail.com", + "andy.mccrae@googlemail.com" + ] + }, + { + "launchpad_id": "victor-lowther", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Victor Lowther", + "emails": [ + "victor.lowther@gmail.com" + ] + }, + { + "launchpad_id": "lemonlatte", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jim Yeh", + "emails": [ + "lemonlatte@gmail.com" + ] + }, + { + "launchpad_id": "ncode", + "companies": [ + { + "company_name": "Locaweb", + "end_date": null + } + ], + "user_name": "Juliano Martinez", + "emails": [ + "juliano.martinez@locaweb.com.br" + ] + }, + { + "launchpad_id": "lmorchard", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Les Orchard", + "emails": [ + "me@lmorchard.com" + ] + }, + { + "launchpad_id": "salvatore-orlando", + "companies": [ + { + "company_name": "Nicira", + "end_date": null + } + ], + "user_name": "Salvatore Orlando", + "emails": [ + "salv.orlando@gmail.com", + "sorlando@nicira.com", + "salvatore.orlando@eu.citrix.com" + ] + }, + { + "launchpad_id": "cfb-n", + "companies": [ + { + "company_name": "Metacloud", + "end_date": null + } + ], + "user_name": "Chet Burgess", + "emails": [ + "cfb@metacloud.com" + ] + }, + { + "launchpad_id": "jpichon", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Julie Pichon", + "emails": [ + "julie.pichon@gmail.com", + "jpichon@redhat.com" + ] + }, + { + "launchpad_id": "jcannava", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Jason Cannavale", + "emails": [ + "jason@cannavale.com", + "jason.cannavale@rackspace.com" + ] + }, + { + "launchpad_id": "jamielennox", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Jamie Lennox", + "emails": [ + "jlennox@redhat.com" + ] + }, + { + "launchpad_id": "vickymsee", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Victoria Mart\u00ednez de la Cruz", + "emails": [ + "vickymsee@gmail.com" + ] + }, + { + "launchpad_id": "ewanmellor", + "companies": [ + { + "company_name": "Citrix", + "end_date": null + } + ], + "user_name": "Ewan Mellor", + "emails": [ + "emellor@silver", + "ewan.mellor@citrix.com" + ] + }, + { + "launchpad_id": "ed-leafe", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Ed Leafe", + "emails": [ + "ed@leafe.com" + ] + }, + { + "launchpad_id": "thomas-goirand", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Thomas Goirand", + "emails": [ + "thomas@goirand.fr" + ] + }, + { + "launchpad_id": "sarob", + "companies": [ + { + "company_name": "Yahoo!", + "end_date": null + } + ], + "user_name": "Sean Roberts", + "emails": [ + "seanrob@yahoo-inc.com" + ] + }, + { + "launchpad_id": "iryoung", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Iryoung Jeong", + "emails": [ + "iryoung@gmail.com" + ] + }, + { + "launchpad_id": "mat-o", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Mat Grove", + "emails": [ + "mat@grove.me.uk" + ] + }, + { + "launchpad_id": "andy-southgate", + "companies": [ + { + "company_name": "Citrix", + "end_date": null + } + ], + "user_name": "Andy Southgate", + "emails": [ + "andy.southgate@citrix.com" + ] + }, + { + "launchpad_id": "kravchenko-pavel", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Kravchenko Pavel", + "emails": [ + "kpavel@il.ibm.com" + ] + }, + { + "launchpad_id": "abhiabhi-sr", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Abhinav Srivastava", + "emails": [ + "abhiabhi.sr@gmail.com" + ] + }, + { + "launchpad_id": "briancline", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Brian Cline", + "emails": [ + "bcline@softlayer.com" + ] + }, + { + "launchpad_id": "xiaoquqi", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Ray", + "emails": [ + "xiaoquqi@gmail.com" + ] + }, + { + "launchpad_id": "justin-hopper", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Justin Hopper", + "emails": [ + "justin.hopper@hp.com" + ] + }, + { + "launchpad_id": "kylin7-sg", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Kylin CG", + "emails": [ + "kylin7.sg@gmail.com" + ] + }, + { + "launchpad_id": "amotoki", + "companies": [ + { + "company_name": "NEC", + "end_date": null + } + ], + "user_name": "Akihiro Motoki", + "emails": [ + "motoki@da.jp.nec.com" + ] + }, + { + "launchpad_id": "ityaptin", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Ilya Tyaptin", + "emails": [ + "ityaptin@mirantis.com" + ] + }, + { + "launchpad_id": "chris-allnutt", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Chris Allnutt", + "emails": [ + "chris.allnutt@rackspace.com" + ] + }, + { + "launchpad_id": "nanjj", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "JunJie Nan", + "emails": [ + "nanjj@cn.ibm.com" + ] + }, + { + "launchpad_id": "jianingy", + "companies": [ + { + "company_name": "UnitedStack", + "end_date": null + } + ], + "user_name": "Jianing Yang", + "emails": [ + "jianingy@unitedstack.com" + ] + }, + { + "launchpad_id": "antonym", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Antony Messerli", + "emails": [ + "root@debian.ohthree.com", + "ant@openstack.org", + "amesserl@rackspace.com" + ] + }, + { + "launchpad_id": "leblancd", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Dane LeBlanc", + "emails": [ + "leblancd@cisco.com" + ] + }, + { + "launchpad_id": "david-hill", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "David Hill", + "emails": [ + "david.hill@ubisoft.com" + ] + }, + { + "launchpad_id": "phongdly", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Phong Doan Ly", + "emails": [ + "phongdly@us.ibm.com" + ] + }, + { + "launchpad_id": "yzveryanskyy", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Yuriy Zveryanskyy", + "emails": [ + "yzveryanskyy@mirantis.com" + ] + }, + { + "launchpad_id": "fungi", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jeremy Stanley", + "emails": [ + "fungi@yuggoth.org" + ] + }, + { + "launchpad_id": "ayasakov", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Artem Yasakov", + "emails": [ + "ayasakov@mirantis.com" + ] + }, + { + "launchpad_id": "dolph", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Dolph Mathews", + "emails": [ + "dolph.mathews@gmail.com", + "dolph.mathews@rackspace.com" + ] + }, + { + "launchpad_id": "phil-hopkins-a", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Phil Hopkins", + "emails": [ + "phil.hopkins@rackspace.com" + ] + }, + { + "launchpad_id": "pierre-freund", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Pierre Freund", + "emails": [ + "pierre.freund@gmail.com" + ] + }, + { + "launchpad_id": "belliott", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Brian Elliott", + "emails": [ + "brian.elliott@rackspace.com", + "bdelliott@gmail.com" + ] + }, + { + "launchpad_id": "chen-li", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "li,chen", + "emails": [ + "chen.li@intel.com" + ] + }, + { + "launchpad_id": "vivekys", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "vivek.ys", + "emails": [ + "YS", + "vivek.ys@gmail.com" + ] + }, + { + "launchpad_id": "jtomasek", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Jiri Tomasek", + "emails": [ + "jtomasek@redhat.com" + ] + }, + { + "launchpad_id": "bill-rich", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Bill Rich", + "emails": [ + "bill.rich@gmail.com" + ] + }, + { + "launchpad_id": "daisy-ycguo", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Ying Chun Guo", + "emails": [ + "daisy.ycguo@gmail.com", + "guoyingc@cn.ibm.com" + ] + }, + { + "launchpad_id": "ttx", + "companies": [ + { + "company_name": "OpenStack Foundation", + "end_date": null + } + ], + "user_name": "Thierry Carrez", + "emails": [ + "thierry@openstack.org" + ] + }, + { + "launchpad_id": "oldsharp", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Ray Chen", + "emails": [ + "oldsharp@163.com" + ] + }, + { + "launchpad_id": "dshrews", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "David Shrewsbury", + "emails": [ + "shrewsbury.dave@gmail.com" + ] + }, + { + "launchpad_id": "andrew-tranquada", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Andrew Tranquada", + "emails": [ + "andrew.tranquada@rackspace.com" + ] + }, + { + "launchpad_id": "habukao", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Osamu Habuka", + "emails": [ + "xiu.yushen@gmail.com" + ] + }, + { + "launchpad_id": "woprandi", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "William Oprandi", + "emails": [ + "william.oprandi@gmail.com" + ] + }, + { + "launchpad_id": "cleverdevil", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jonathan LaCour", + "emails": [ + "jonathan@cleverdevil.org" + ] + }, + { + "launchpad_id": "lorinh", + "companies": [ + { + "company_name": "Nimbis Services", + "end_date": null + } + ], + "user_name": "Lorin Hochstein", + "emails": [ + "lorin@isi.edu", + "lorin@nimbisservices.com" + ] + }, + { + "launchpad_id": "redbo", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Mike Barton", + "emails": [ + "michael.barton@rackspace.com", + "mike@weirdlooking.com", + "mike-launchpad@weirdlooking.com" + ] + }, + { + "launchpad_id": "luiz-ozaki", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Luiz Ozaki", + "emails": [ + "luiz.ozaki@gmail.com" + ] + }, + { + "launchpad_id": "pandemicsyn", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Florian Hines", + "emails": [ + "syn@ronin.io", + "florian.hines@gmail.com" + ] + }, + { + "launchpad_id": "mgagne", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Mathieu Gagn\u00e9", + "emails": [ + "mgagne@iweb.com" + ] + }, + { + "launchpad_id": "greg-ball", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Greg Ball", + "emails": [ + "greg.ball@rackspace.com" + ] + }, + { + "launchpad_id": "jeff-d-halter", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jeff Halter", + "emails": [ + "jeff.d.halter@gmail.com" + ] + }, + { + "launchpad_id": "psiwczak", + "companies": [ + { + "company_name": "Internap", + "end_date": null + } + ], + "user_name": "Piotr Siwczak", + "emails": [ + "psiwczak@internap.com", + "psiwczak@mirantis.com" + ] + }, + { + "launchpad_id": "mvidner", + "companies": [ + { + "company_name": "SUSE", + "end_date": null + } + ], + "user_name": "Martin Vidner", + "emails": [ + "mvidner@suse.cz" + ] + }, + { + "launchpad_id": "rohitkarajgi", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Rohit Karajgi", + "emails": [ + "rohit.karajgi@nttdata.com" + ] + }, + { + "launchpad_id": "dweimer", + "companies": [ + { + "company_name": "San Diego Supercomputer Center", + "end_date": null + } + ], + "user_name": "Doug Weimer", + "emails": [ + "dweimer@gmail.com", + "dougw@sdsc.edu" + ] + }, + { + "launchpad_id": "sdague", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Sean Dague", + "emails": [ + "sean@dague.net", + "sdague@linux.vnet.ibm.com" + ] + }, + { + "launchpad_id": "niuwl586-v", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Tony NIU", + "emails": [ + "niuwl586@gmail.com" + ] + }, + { + "launchpad_id": "guang-yee", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Guang Yee", + "emails": [ + "guang.yee@hp.com" + ] + }, + { + "launchpad_id": "amalabasha", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Amala Basha", + "emails": [ + "princessbasha@gmail.com" + ] + }, + { + "launchpad_id": "serge-maskalik", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Serge Maskalik", + "emails": [ + "serge_maskalik@yahoo.com" + ] + }, + { + "launchpad_id": "kanzhe-jiang", + "companies": [ + { + "company_name": "Big Switch Networks", + "end_date": null + } + ], + "user_name": "Kanzhe Jiang", + "emails": [ + "kanzhe.jiang@bigswitch.com", + "kanzhe@gmail.com" + ] + }, + { + "launchpad_id": "senhuang", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Senhua Huang", + "emails": [ + "senhuang@cisco.com" + ] + }, + { + "launchpad_id": "rkhardalian", + "companies": [ + { + "company_name": "Metacloud", + "end_date": null + } + ], + "user_name": "Rafi Khardalian", + "emails": [ + "rafi@metacloud.com" + ] + }, + { + "launchpad_id": "zhigang", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Zhigang Wang", + "emails": [ + "w1z2g3@gmail.com" + ] + }, + { + "launchpad_id": "hzguanqiang", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "QiangGuan", + "emails": [ + "hzguanqiang@corp.netease.com" + ] + }, + { + "launchpad_id": "leamhall", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Leam", + "emails": [ + "leam.hall@mailtrust.com" + ] + }, + { + "launchpad_id": "markmc", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Mark McLoughlin", + "emails": [ + "markmc@redhat.com" + ] + }, + { + "launchpad_id": "dims-v", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Davanum Srinivas", + "emails": [ + "dims@linux.vnet.ibm.com", + "davanum@gmail.com" + ] + }, + { + "launchpad_id": "long-wang", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "wanglong", + "emails": [ + "long.wang@bj.cs2c.com.cn" + ] + }, + { + "launchpad_id": "chnm-kulkarni", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Chinmay Kulkarni", + "emails": [ + "chnm.kulkarni@gmail.com" + ] + }, + { + "launchpad_id": "afazekas", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Attila Fazekas", + "emails": [ + "afazekas@redhat.com" + ] + }, + { + "launchpad_id": "jvarlamova", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Julia Varlamova", + "emails": [ + "jvarlamova@mirantis.com" + ] + }, + { + "launchpad_id": "jennchen", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Jennifer Chen", + "emails": [ + "jennchen@cisco.com" + ] + }, + { + "launchpad_id": "alex-meade", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Alex Meade", + "emails": [ + "alex.meade@rackspace.com", + "hatboy112@yahoo.com" + ] + }, + { + "launchpad_id": "ken-pepple", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Ken Pepple", + "emails": [ + "ken.pepple@cloudtp.com", + "ken@pepple.info", + "ken.pepple@rabbityard.com", + "ken.pepple@gmail.com" + ] + }, + { + "launchpad_id": "mkerrin", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Michael Kerrin", + "emails": [ + "michael.kerrin@hp.com" + ] + }, + { + "launchpad_id": "reldan", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Eldar Nugaev", + "emails": [ + "eldr@ya.ru", + "enugaev@griddynamics.com", + "reldan@oscloud.ru" + ] + }, + { + "launchpad_id": "guochbo", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Chang Bo Guo", + "emails": [ + "guochbo@cn.ibm.com" + ] + }, + { + "launchpad_id": "ylobankov", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Yaroslav Lobankov", + "emails": [ + "ylobankov@mirantis.com" + ] + }, + { + "launchpad_id": "yunmao", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Yun Mao", + "emails": [ + "yunmao@gmail.com" + ] + }, + { + "launchpad_id": "yusuke", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "MURAOKA Yusuke", + "emails": [ + "yusuke@nttmcl.com" + ] + }, + { + "launchpad_id": "aarti-kriplani", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Aarti Kriplani", + "emails": [ + "aarti.kriplani@rackspace.com" + ] + }, + { + "launchpad_id": "zaneb", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Zane Bitter", + "emails": [ + "zbitter@redhat.com" + ] + }, + { + "launchpad_id": "pamor", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Patrick Amor", + "emails": [ + "pamor@cisco.com" + ] + }, + { + "launchpad_id": "dzhou121", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Dongdong Zhou", + "emails": [ + "dzhou121@gmail.com" + ] + }, + { + "launchpad_id": "teselkin-d", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Dmitry Teselkin", + "emails": [ + "dteselkin@mirantis.com" + ] + }, + { + "launchpad_id": "yuzawataka", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Yuzawa Takahiko", + "emails": [ + "yuzawataka@intellilink.co.jp" + ] + }, + { + "launchpad_id": "david-thingbag", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "David Cramer", + "emails": [ + "david.cramer@rackspace.com" + ] + }, + { + "launchpad_id": "bartos", + "companies": [ + { + "company_name": "Piston Cloud", + "end_date": null + } + ], + "user_name": "Nick Bartos", + "emails": [ + "nick@pistoncloud.com" + ] + }, + { + "launchpad_id": "imelnikov", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Ivan Melnikov", + "emails": [ + "imelnikov@griddynamics.com" + ] + }, + { + "launchpad_id": "r-thorsten", + "companies": [ + { + "company_name": "Atomia", + "end_date": null + } + ], + "user_name": "Thorsten Tarrach", + "emails": [ + "thorsten@atomia.com" + ] + }, + { + "launchpad_id": "alex-gaynor", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Alex Gaynor", + "emails": [ + "alex.gaynor@gmail.com" + ] + }, + { + "launchpad_id": "jason-koelker", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Jason K\u00f6lker", + "emails": [ + "jason@koelker.net", + "jkoelker@rackspace.com", + "K\u00f6lker" + ] + }, + { + "launchpad_id": "akscram", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Ilya Kharin", + "emails": [ + "ikharin@mirantis.com", + "akscram@gmail.com" + ] + }, + { + "launchpad_id": "zhoudongshu", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "zhoudonshu", + "emails": [ + "zhoudshu@gmail.com" + ] + }, + { + "launchpad_id": "guanxiaohua2k6", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Xiaohua Guan", + "emails": [ + "guanxiaohua2k6@gmail.com" + ] + }, + { + "launchpad_id": "ctennis", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Caleb Tennis", + "emails": [ + "caleb.tennis@gmail.com" + ] + }, + { + "launchpad_id": "mcgrue", + "companies": [ + { + "company_name": "Piston Cloud", + "end_date": null + } + ], + "user_name": "Ben McGraw", + "emails": [ + "ben@pistoncloud.com" + ] + }, + { + "launchpad_id": "endre-karlson", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Endre Karlson", + "emails": [ + "endre.karlson@gmail.com" + ] + }, + { + "launchpad_id": "motokentsai", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "MotoKen", + "emails": [ + "motokentsai@gmail.com" + ] + }, + { + "launchpad_id": "rkukura", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Robert Kukura", + "emails": [ + "rkukura@redhat.com" + ] + }, + { + "launchpad_id": "dekehn", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "dkehn", + "emails": [ + "dekehn@gmail.com" + ] + }, + { + "launchpad_id": "sreshetniak", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Sergey Reshetnyak", + "emails": [ + "sreshetniak@mirantis.com" + ] + }, + { + "launchpad_id": "christoph-gysin", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Christoph Gysin", + "emails": [ + "christoph.gysin@gmail.com" + ] + }, + { + "launchpad_id": "nprivalova", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Nadya Privalova", + "emails": [ + "nprivalova@mirantis.com" + ] + }, + { + "launchpad_id": "mihgen", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Mike Scherbakov", + "emails": [ + "mihgen@gmail.com" + ] + }, + { + "launchpad_id": "joelbm24", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "joelbm24", + "emails": [ + "Moore", + "joelbm24@gmail.com" + ] + }, + { + "launchpad_id": "ppouliot", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Peter Pouliot", + "emails": [ + "peter@pouliot.net" + ] + }, + { + "launchpad_id": "viraj-hardikar-n", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Viraj Hardikar", + "emails": [ + "viraj.hardikar@hp.com" + ] + }, + { + "launchpad_id": "reese-sm", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Stephanie Reese", + "emails": [ + "reese.sm@gmail.com" + ] + }, + { + "launchpad_id": "sylvain-bauza", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Sylvain Bauza", + "emails": [ + "sbauza@free.fr" + ] + }, + { + "launchpad_id": "blak111", + "companies": [ + { + "company_name": "Big Switch Networks", + "end_date": null + } + ], + "user_name": "Kevin Benton", + "emails": [ + "kevin.benton@bigswitch.com" + ] + }, + { + "launchpad_id": "tom-hancock", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Tom Hancock", + "emails": [ + "tom.hancock@hp.com" + ] + }, + { + "launchpad_id": "hiroaki-kawai", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Hiroaki Kawai", + "emails": [ + "hiroaki.kawai@gmail.com" + ] + }, + { + "launchpad_id": "dbelova", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Dina Belova", + "emails": [ + "dbelova@mirantis.com" + ] + }, + { + "launchpad_id": "jean-marc-saffroy", + "companies": [ + { + "company_name": "Scality", + "end_date": null + } + ], + "user_name": "Jean-Marc Saffroy", + "emails": [ + "jean.marc.saffroy@scality.com" + ] + }, + { + "launchpad_id": "tatyana-leontovich", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + }, + { + "company_name": "Mirantis", + "end_date": "2013-Jun-10" + } + ], + "user_name": "Tatyana Leontovich", + "emails": [ + "tleontov@yahoo-inc.com" + ] + }, + { + "launchpad_id": "dragosm", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Dragos Manolescu", + "emails": [ + "dragosm@hp.com" + ] + }, + { + "launchpad_id": "hisaki", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "Hisaki Ohara", + "emails": [ + "hisaki.ohara@intel.com" + ] + }, + { + "launchpad_id": "sdeaton2", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Steven Deaton", + "emails": [ + "sdeaton2@gmail.com" + ] + }, + { + "launchpad_id": "darren-birkett", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Darren Birkett", + "emails": [ + "darren.birkett@gmail.com" + ] + }, + { + "launchpad_id": "yuan-zhou", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "Zhou Yuan", + "emails": [ + "yuan.zhou@intel.com" + ] + }, + { + "launchpad_id": "harlowja", + "companies": [ + { + "company_name": "Yahoo!", + "end_date": null + } + ], + "user_name": "Joshua Harlow", + "emails": [ + "harlowja@gmail.com", + "harlowja@yahoo-inc.com" + ] + }, + { + "launchpad_id": "esker", + "companies": [ + { + "company_name": "NetApp", + "end_date": null + } + ], + "user_name": "Robert Esker", + "emails": [ + "esker@netapp.com" + ] + }, + { + "launchpad_id": "scott-devoid", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Scott Devoid", + "emails": [ + "devoid@anl.gov" + ] + }, + { + "launchpad_id": "colin-nicholson", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Colin Nicholson", + "emails": [ + "colin.nicholson@iomart.com" + ] + }, + { + "launchpad_id": "jan-provaznik", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Jan Provaznik", + "emails": [ + "jprovazn@redhat.com" + ] + }, + { + "launchpad_id": "nickshobe", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Nicholas Shobe", + "emails": [ + "nickshobe@gmail.com" + ] + }, + { + "launchpad_id": "sean-mccully", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Sean McCully", + "emails": [ + "sean.mccully@rackspace.com" + ] + }, + { + "launchpad_id": "iccha-sethi", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Iccha Sethi", + "emails": [ + "iccha.sethi@rackspace.com" + ] + }, + { + "launchpad_id": "joe-arnold", + "companies": [ + { + "company_name": "SwiftStack", + "end_date": null + } + ], + "user_name": "Joe Arnold", + "emails": [ + "joe@swiftstack.com", + "joe@cloudscaling.com" + ] + }, + { + "launchpad_id": "morita-kazutaka", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Kazutaka Morita", + "emails": [ + "morita.kazutaka@gmail.com" + ] + }, + { + "launchpad_id": "maheshp", + "companies": [ + { + "company_name": "ThoughtWorks", + "end_date": null + } + ], + "user_name": "Mahesh Panchaksharaiah", + "emails": [ + "maheshp@thoughtworks.com" + ] + }, + { + "launchpad_id": "shh", + "companies": [ + { + "company_name": "Brocade", + "end_date": null + } + ], + "user_name": "Shiv Haris", + "emails": [ + "sharis@brocade.com" + ] + }, + { + "launchpad_id": "danwent", + "companies": [ + { + "company_name": "Nicira", + "end_date": null + } + ], + "user_name": "dan wendlandt", + "emails": [ + "danwent@dan-xs3-cs", + "danwent@gmail.com", + "dan@nicira.com" + ] + }, + { + "launchpad_id": "xychu2008", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Ethan Chu", + "emails": [ + "xychu2008@gmail.com", + "xchu@redhat.com" + ] + }, + { + "launchpad_id": "bradjones", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Bradley Jones", + "emails": [ + "jones.bradley@me.com" + ] + }, + { + "launchpad_id": "vaddi-kiran", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "sasikiran", + "emails": [ + "vaddi_kiran@persistent.co.in" + ] + }, + { + "launchpad_id": "akuznetsov", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Alexander Kuznetsov", + "emails": [ + "akuznetsov@mirantis.com" + ] + }, + { + "launchpad_id": "stuart-mclaren", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Stuart McLaren", + "emails": [ + "stuart.mclaren@hp.com" + ] + }, + { + "launchpad_id": "andrea-rosa-m", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Andrea Rosa", + "emails": [ + "andrea.rosa@hp.com" + ] + }, + { + "launchpad_id": "john-m-kennedy", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "John Kennedy", + "emails": [ + "john.m.kennedy@intel.com" + ] + }, + { + "launchpad_id": "jakez", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jake Zukowski", + "emails": [ + "jake@ponyloaf.com" + ] + }, + { + "launchpad_id": "jaypipes", + "companies": [ + { + "company_name": "AT&T", + "end_date": null + } + ], + "user_name": "Jay Pipes", + "emails": [ + "jpipes@serialcoder", + "jpipes@uberbox.gateway.2wire.net", + "jaypipes@gmail.com" + ] + }, + { + "launchpad_id": "eyuzlikeev", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Eduard Yuzlikeev", + "emails": [ + "eyuzlikeev@mirantis.com" + ] + }, + { + "launchpad_id": "dripton", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "David Ripton", + "emails": [ + "dripton@redhat.com" + ] + }, + { + "launchpad_id": "morellon", + "companies": [ + { + "company_name": "Locaweb", + "end_date": null + } + ], + "user_name": "Thiago Morello", + "emails": [ + "thiago.morello@locaweb.com.br" + ] + }, + { + "launchpad_id": "a-gordeev", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Alexander Gordeev", + "emails": [ + "agordeev@mirantis.com" + ] + }, + { + "launchpad_id": "yacine-b", + "companies": [ + { + "company_name": "Alyseo", + "end_date": null + } + ], + "user_name": "Yacine Kheddache", + "emails": [ + "yacine@alyseo.com" + ] + }, + { + "launchpad_id": "zhhuabj", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Hua Zhang", + "emails": [ + "zhhuabj@cn.ibm.com" + ] + }, + { + "launchpad_id": "y-yamagata", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "You Yamagata", + "emails": [ + "bi.yamagata@gmail.com" + ] + }, + { + "launchpad_id": "egallen", + "companies": [ + { + "company_name": "AT&T", + "end_date": null + } + ], + "user_name": "Erwan Gallen", + "emails": [ + "erwan.gallen@cloudwatt.com", + "dev@zinux.com" + ] + }, + { + "launchpad_id": "malini-k-bhandaru", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "Malini Bhandaru", + "emails": [ + "malini.k.bhandaru@intel.com" + ] + }, + { + "launchpad_id": "hanlind", + "companies": [ + { + "company_name": "Kungliga Tekniska h\u00f6gskolan", + "end_date": null + } + ], + "user_name": "Hans Lindgren", + "emails": [ + "hanlind@kth.se" + ] + }, + { + "launchpad_id": "rconradharris", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Rick Harris", + "emails": [ + "rick.harris@rackspace.com", + "rick@quasar.racklabs.com", + "rconradharris@gmail.com" + ] + }, + { + "launchpad_id": "kurt-f-martin", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Kurt Martin", + "emails": [ + "kurt.f.martin@hp.com" + ] + }, + { + "launchpad_id": "cyeoh-0", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Christopher Yeoh", + "emails": [ + "cyeoh@au1.ibm.com" + ] + }, + { + "launchpad_id": "vodmat-news", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Mattieu Puel", + "emails": [ + "vodmat.news@gmail.com" + ] + }, + { + "launchpad_id": "houshengbo", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Vincent Hou", + "emails": [ + "sbhou@cn.ibm.com" + ] + }, + { + "launchpad_id": "jogo", + "companies": [ + { + "company_name": "Cloudscaling", + "end_date": null + } + ], + "user_name": "Joe Gordon", + "emails": [ + "joe.gordon0@gmail.com", + "jogo@cloudscaling.com" + ] + }, + { + "launchpad_id": "iida-koji", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Koji Iida", + "emails": [ + "iida.koji@lab.ntt.co.jp" + ] + }, + { + "launchpad_id": "opencompute", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Sean Chen", + "emails": [ + "xuchenx@gmail.com" + ] + }, + { + "launchpad_id": "matthias-sigxcpu", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Matthias Schmitz", + "emails": [ + "matthias@sigxcpu.org" + ] + }, + { + "launchpad_id": "tmazur", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Tatiana Mazur", + "emails": [ + "tmazur@mirantis.com" + ] + }, + { + "launchpad_id": "snaiksat", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Sumit Naiksatam", + "emails": [ + "sumitnaiksatam@gmail.com", + "snaiksat@cisco.com" + ] + }, + { + "launchpad_id": "avinash-prasad", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Avinash Prasad", + "emails": [ + "avinash.prasad@nttdata.com" + ] + }, + { + "launchpad_id": "termie", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "termie", + "emails": [ + "Smith", + "termie@preciousroy.local", + "github@anarkystic.com", + "code@term.ie" + ] + }, + { + "launchpad_id": "laurence-miao", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Laurence Miao", + "emails": [ + "laurence.miao@gmail.com" + ] + }, + { + "launchpad_id": "sklimoff", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Stan Klimoff", + "emails": [ + "sklimoff@griddynamics.com" + ] + }, + { + "launchpad_id": "emilienm", + "companies": [ + { + "company_name": "eNovance", + "end_date": null + } + ], + "user_name": "Emilien Macchi", + "emails": [ + "emilien.macchi@stackops.com", + "emilien.macchi@enovance.com", + "emilien@enovance.com" + ] + }, + { + "launchpad_id": "jbrendel", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Juergen Brendel", + "emails": [ + "jbrendel@cisco.com" + ] + }, + { + "launchpad_id": "saschpe", + "companies": [ + { + "company_name": "SUSE", + "end_date": null + } + ], + "user_name": "Sascha Peilicke", + "emails": [ + "saschpe@suse.de", + "saschpe@gmx.de" + ] + }, + { + "launchpad_id": "jking-6", + "companies": [ + { + "company_name": "Internap", + "end_date": null + } + ], + "user_name": "James King", + "emails": [ + "jking@internap.com" + ] + }, + { + "launchpad_id": "dmitry-x", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Dmitry Spikhalskiy", + "emails": [ + "dmitry@spikhalskiy.com" + ] + }, + { + "launchpad_id": "mana-62-1-11", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Mana Kaneko", + "emails": [ + "mana.62.1.11@gmail.com" + ] + }, + { + "launchpad_id": "diego-parrilla-santamaria", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Diego Parrilla", + "emails": [ + "diego.parrilla@stackops.com" + ] + }, + { + "launchpad_id": "mail-zhang-yee", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Yee", + "emails": [ + "mail.zhang.yee@gmail.com" + ] + }, + { + "launchpad_id": "nkonovalov", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Nikita Konovalov", + "emails": [ + "nkonovalov@mirantis.com" + ] + }, + { + "launchpad_id": "burt-t", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Burt Holzman", + "emails": [ + "burt@fnal.gov" + ] + }, + { + "launchpad_id": "asalkeld", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Angus Salkeld", + "emails": [ + "angus@salkeld.id.au", + "asalkeld@redhat.com" + ] + }, + { + "launchpad_id": "wbatterson", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Walter Batterson", + "emails": [ + "wbatterson@brinkster.com" + ] + }, + { + "launchpad_id": "nati-ueno-s", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Nachi Ueno", + "emails": [ + "nova@u4", + "openstack@lab.ntt.co.jp", + "nati.ueno@gmail.com", + "Ueno", + "ueno.nachi@lab.ntt.co.jp" + ] + }, + { + "launchpad_id": "clint-fewbar", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Clint Byrum", + "emails": [ + "clint@fewbar.com", + "clint.byrum@hp.com", + "clint@ubuntu.com" + ] + }, + { + "launchpad_id": "devananda", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Devananda van der Veen", + "emails": [ + "devananda.vdv@gmail.com" + ] + }, + { + "launchpad_id": "arathi-darshanam", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Arathi", + "emails": [ + "arathi_darshanam@persistent.co.in" + ] + }, + { + "launchpad_id": "k3vinmcdonald", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Kevin McDonald", + "emails": [ + "k3vinmcdonald@gmail.com" + ] + }, + { + "launchpad_id": "ericpeterson-l", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Eric Peterson", + "emails": [ + "ericpeterson@hp.com" + ] + }, + { + "launchpad_id": "kashivreddy", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Kashi Reddy", + "emails": [ + "kashi.reddy@rackspace.com" + ] + }, + { + "launchpad_id": "soren", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Soren Hansen", + "emails": [ + "soren.hansen@rackspace.com", + "soren@openstack.org", + "sorenhansen@rackspace.com", + "soren@linux2go.dk", + "sorhanse@cisco.com" + ] + }, + { + "launchpad_id": "wayne-walls", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Wayne A. Walls", + "emails": [ + "wayne.walls@rackspace.com" + ] + }, + { + "launchpad_id": "jola-mirecka", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Jola Mirecka", + "emails": [ + "jola.mirecka@hp.com" + ] + }, + { + "launchpad_id": "sergey.vilgelm", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Sergey Vilgelm", + "emails": [ + "sergey.vilgelm@gmail.com", + "svilgelm@mirantis.com" + ] + }, + { + "launchpad_id": "shiju-p", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Shiju", + "emails": [ + "shiju.p@gmail.com" + ] + }, + { + "launchpad_id": "ethuleau", + "companies": [ + { + "company_name": "AT&T", + "end_date": null + } + ], + "user_name": "\u00c9douard Thuleau", + "emails": [ + "edouard.thuleau@orange.com", + "thuleau@gmail.com", + "edouard.thuleau@cloudwatt.com", + "edouard1.thuleau@orange.com" + ] + }, + { + "launchpad_id": "zhangchao010", + "companies": [ + { + "company_name": "Huawei", + "end_date": null + } + ], + "user_name": "zhangchao", + "emails": [ + "zhangchao010@huawei.com" + ] + }, + { + "launchpad_id": "mouad-benchchaoui", + "companies": [ + { + "company_name": "Cloudbau", + "end_date": null + } + ], + "user_name": "Mouad Benchchaoui", + "emails": [ + "m.benchchaoui@cloudbau.de" + ] + }, + { + "launchpad_id": "sateesh-chodapuneedi", + "companies": [ + { + "company_name": "Citrix", + "end_date": null + } + ], + "user_name": "Sateesh", + "emails": [ + "sateesh.chodapuneedi@citrix.com" + ] + }, + { + "launchpad_id": "lyda.google", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Kevin Lyda", + "emails": [ + "kevin@ie.suberic.net" + ] + }, + { + "launchpad_id": "ijw-ubuntu", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Ian Wells", + "emails": [ + "iawells@cisco.com" + ] + }, + { + "launchpad_id": "guohliu", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "GuoHui LIu", + "emails": [ + "guohliu@cn.ibm.com" + ] + }, + { + "launchpad_id": "cweidenkeller", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Conrad Weidenkeller", + "emails": [ + "conrad.weidenkeller@rackspace.com" + ] + }, + { + "launchpad_id": "rackerhacker", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Major Hayden", + "emails": [ + "major.hayden@rackspace.com", + "major@mhtx.net" + ] + }, + { + "launchpad_id": "kyle-r", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Kai Zhang", + "emails": [ + "kyle@zelin.io" + ] + }, + { + "launchpad_id": "malini-kamalambal", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Malini Kamalambal", + "emails": [ + "malini.kamalambal@rackspace.com" + ] + }, + { + "launchpad_id": "tres", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Tres Henry", + "emails": [ + "tres@treshenry.net" + ] + }, + { + "launchpad_id": "kjharke", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "K Jonathan Harker", + "emails": [ + "k.jonathan.harker@hp.com" + ] + }, + { + "launchpad_id": "stephen-ma", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Stephen Ma", + "emails": [ + "stephen.ma@hp.com" + ] + }, + { + "launchpad_id": "ryan-petrello", + "companies": [ + { + "company_name": "DreamHost", + "end_date": null + } + ], + "user_name": "Ryan Petrello", + "emails": [ + "ryan.petrello@dreamhost.com" + ] + }, + { + "launchpad_id": "selvait90", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Selvakumar Arumugam", + "emails": [ + "selvait90@gmail.com" + ] + }, + { + "launchpad_id": "kshileev", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Kirill Shileev", + "emails": [ + "kshileev@griddynamics.com", + "kshileev@gmail.com" + ] + }, + { + "launchpad_id": "noguchimn", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Muneyuki Noguchi", + "emails": [ + "noguchimn@nttdata.co.jp" + ] + }, + { + "launchpad_id": "joe-hakim-rahme", + "companies": [ + { + "company_name": "eNovance", + "end_date": null + } + ], + "user_name": "Joe Hakim Rahme", + "emails": [ + "joe.hakim.rahme@enovance.com" + ] + }, + { + "launchpad_id": "yuyuehill", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "hill", + "emails": [ + "yuyuehill@gmail.com" + ] + }, + { + "launchpad_id": "tim-simpson", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Tim Simpson", + "emails": [ + "tim.simpson@rackspace.com", + "tim.simpson4@gmail.com" + ] + }, + { + "launchpad_id": "diopter", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Evan Callicoat", + "emails": [ + "diopter@gmail.com" + ] + }, + { + "launchpad_id": "a-gorodnev", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Alexander Gorodnev", + "emails": [ + "a.gorodnev@gmail.com", + "agorodnev@mirantis.com" + ] + }, + { + "launchpad_id": "haneef", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Haneef Ali", + "emails": [ + "haneef.ali@hp.com" + ] + }, + { + "launchpad_id": "simon-pasquier", + "companies": [ + { + "company_name": "Bull", + "end_date": null + } + ], + "user_name": "Simon Pasquier", + "emails": [ + "simon.pasquier@bull.net", + "pasquier.simon@gmail.com" + ] + }, + { + "launchpad_id": "danms", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Dan Smith", + "emails": [ + "danms@us.ibm.com" + ] + }, + { + "launchpad_id": "msinhore", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "msinhore", + "emails": [ + "msinhore@gmail.com" + ] + }, + { + "launchpad_id": "john-eo", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "John Eo", + "emails": [ + "joon.eo@gmail.com", + "john.eo@gmail.com", + "john.eo@rackspace.com" + ] + }, + { + "launchpad_id": "jsuh", + "companies": [ + { + "company_name": "Information Sciences Institute", + "end_date": null + } + ], + "user_name": "Jinwoo 'Joseph' Suh", + "emails": [ + "jsuh@bespin", + "jsuh@isi.edu" + ] + }, + { + "launchpad_id": "andreserl", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Andres Rodriguez", + "emails": [ + "andres.rodriguez@canonical.com" + ] + }, + { + "launchpad_id": "laksharm", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Lakshmi Sharma", + "emails": [ + "laksharm@cisco.com" + ] + }, + { + "launchpad_id": "gessau", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Henry Gessau", + "emails": [ + "gessau@cisco.com" + ] + }, + { + "launchpad_id": "mordred", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Monty Taylor", + "emails": [ + "mordred@inaugust.com", + "mordred@hudson" + ] + }, + { + "launchpad_id": "krtaylor", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Kurt Taylor", + "emails": [ + "krtaylor@us.ibm.com" + ] + }, + { + "launchpad_id": "crobinso", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Cole Robinson", + "emails": [ + "crobinso@redhat.com" + ] + }, + { + "launchpad_id": "itoumsn", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Masanori Itoh", + "emails": [ + "itoumsn@nttdata.co.jp", + "itoumsn@shayol" + ] + }, + { + "launchpad_id": "victor-r-howard", + "companies": [ + { + "company_name": "Comcast", + "end_date": null + } + ], + "user_name": "Victor Howard", + "emails": [ + "victor.r.howard@gmail.com" + ] + }, + { + "launchpad_id": "brimstone-q", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Matt Robinson", + "emails": [ + "brimstone@the.narro.ws" + ] + }, + { + "launchpad_id": "avishay-il", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Avishay Traeger", + "emails": [ + "avishay@il.ibm.com" + ] + }, + { + "launchpad_id": "p-draigbrady", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "P\u00e1draig Brady", + "emails": [ + "p@draigbrady.com", + "pbrady@redhat.com" + ] + }, + { + "launchpad_id": "dazworrall", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Darren Worrall", + "emails": [ + "daz@dwuk.net", + "darren@iweb.co.uk" + ] + }, + { + "launchpad_id": "adriansmith", + "companies": [ + { + "company_name": "Dell", + "end_date": null + } + ], + "user_name": "Adrian Smith", + "emails": [ + "adrian@17od.com", + "adrian_f_smith@dell.com" + ] + }, + { + "launchpad_id": "pmsangal", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Puneet Sangal", + "emails": [ + "puneet@inmovi.net" + ] + }, + { + "launchpad_id": "starodubcevna", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Nikolay Starodubtsev", + "emails": [ + "nstarodubtsev@mirantis.com", + "starodubcevna@gmail.com" + ] + }, + { + "launchpad_id": "pengyuwei", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Peng YuWei", + "emails": [ + "pengyuwei@gmail.com" + ] + }, + { + "launchpad_id": "ldbragst", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Lance Bragstad", + "emails": [ + "ldbragst@us.ibm.com" + ] + }, + { + "launchpad_id": "leo-toyoda", + "companies": [ + { + "company_name": "NEC", + "end_date": null + } + ], + "user_name": "Leo Toyoda", + "emails": [ + "toyoda-reo@cnt.mxw.nes.nec.co.jp" + ] + }, + { + "launchpad_id": "mnaser", + "companies": [ + { + "company_name": "VexxHost", + "end_date": null + } + ], + "user_name": "Mohammed Naser", + "emails": [ + "mnaser@vexxhost.com" + ] + }, + { + "launchpad_id": "mjfork", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Michael Fork", + "emails": [ + "mjfork@us.ibm.com" + ] + }, + { + "launchpad_id": "d1b", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Dmitriy Budnik", + "emails": [ + "dmitriy.budnik@gmail.com" + ] + }, + { + "launchpad_id": "bhuvan", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Bhuvaneswaran A", + "emails": [ + "bhuvan@apache.org" + ] + }, + { + "launchpad_id": "liemmn", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Liem Nguyen", + "emails": [ + "liem.m.nguyen@hp.com", + "liem_m_nguyen@hp.com", + "liem.m.nguyen@gmail.com" + ] + }, + { + "launchpad_id": "matt-sherborne", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Matthew Sherborne", + "emails": [ + "msherborne@gmail.com" + ] + }, + { + "launchpad_id": "cody-somerville", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Cody A.W. Somerville", + "emails": [ + "cody.somerville@hp.com" + ] + }, + { + "launchpad_id": "cperz", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "HeinMueck", + "emails": [ + "cperz@gmx.net" + ] + }, + { + "launchpad_id": "kspear", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Kieran Spear", + "emails": [ + "kispear@gmail.com" + ] + }, + { + "launchpad_id": "dce3062", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Syed Armani", + "emails": [ + "dce3062@gmail.com" + ] + }, + { + "launchpad_id": "sshturm", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Shturm Svetlana", + "emails": [ + "sshturm@mirantis.com" + ] + }, + { + "launchpad_id": "alexpilotti", + "companies": [ + { + "company_name": "Cloudbase Solutions", + "end_date": null + } + ], + "user_name": "Alessandro Pilotti", + "emails": [ + "ap@pilotti.it" + ] + }, + { + "launchpad_id": "jose-castro-leon", + "companies": [ + { + "company_name": "CERN", + "end_date": null + } + ], + "user_name": "Jose Castro Leon", + "emails": [ + "jose.castro.leon@cern.ch" + ] + }, + { + "launchpad_id": "deevi-rani", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "D LALITHA RANI", + "emails": [ + "deevi_rani@persistent.co.in" + ] + }, + { + "launchpad_id": "everett-toews", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Everett Toews", + "emails": [ + "everett.toews@gmail.com", + "everett.toews@rackspace.com" + ] + }, + { + "launchpad_id": "cschwede", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Christian Schwede", + "emails": [ + "info@cschwede.de" + ] + }, + { + "launchpad_id": "sthaha", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Sunil Thaha", + "emails": [ + "sthaha@redhat.com" + ] + }, + { + "launchpad_id": "mrunge", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Matthias Runge", + "emails": [ + "mrunge@redhat.com" + ] + }, + { + "launchpad_id": "novas0x2a", + "companies": [ + { + "company_name": "Piston Cloud", + "end_date": null + } + ], + "user_name": "Mike Lundy", + "emails": [ + "mike@fluffypenguin.org", + "mike@pistoncloud.com" + ] + }, + { + "launchpad_id": "john-griffith", + "companies": [ + { + "company_name": "SolidFire", + "end_date": null + } + ], + "user_name": "John Griffith", + "emails": [ + "john.griffith@solidfire.com", + "john.griffith8@gmail.com" + ] + }, + { + "launchpad_id": "andycjw", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Andy Chong", + "emails": [ + "andycjw@gmail.com" + ] + }, + { + "launchpad_id": "gerardo8a", + "companies": [ + { + "company_name": "Yahoo!", + "end_date": null + } + ], + "user_name": "Gerardo Porras", + "emails": [ + "gporras@yahoo-inc.com" + ] + }, + { + "launchpad_id": "ronenkat", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "RonenKat", + "emails": [ + "ronenkat@il.ibm.com" + ] + }, + { + "launchpad_id": "donal-lafferty", + "companies": [ + { + "company_name": "Citrix", + "end_date": null + } + ], + "user_name": "Donal Lafferty", + "emails": [ + "donal.lafferty@citrix.com" + ] + }, + { + "launchpad_id": "ivoks", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Ante Karamati\u0107", + "emails": [ + "ivoks@ubuntu.com", + "ante.karamatic@canonical.com" + ] + }, + { + "launchpad_id": "yhasan", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Yousuf Hasan", + "emails": [ + "yhasan@cisco.com" + ] + }, + { + "launchpad_id": "dkang", + "companies": [ + { + "company_name": "Information Sciences Institute", + "end_date": null + } + ], + "user_name": "David Kang", + "emails": [ + "dkang@isi.edu" + ] + }, + { + "launchpad_id": "rafadurancastaneda", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Rafael Dur\u00e1n Casta\u00f1eda", + "emails": [ + "rafadurancastaneda@gmail.com" + ] + }, + { + "launchpad_id": "breu", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Joseph W. Breu", + "emails": [ + "breu@breu.org" + ] + }, + { + "launchpad_id": "hovyakov", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Dmitry Khovyakov", + "emails": [ + "hovyakov@gmail.com", + "hovyakov@griddynamics.com", + "dkhovyakov@griddynamics.com" + ] + }, + { + "launchpad_id": "gholt", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "gholt", + "emails": [ + "z-launchpad@brim.net", + "gholt@rackspace.com" + ] + }, + { + "launchpad_id": "xinxin-shu", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "shu, xinxin", + "emails": [ + "xinxin.shu@intel.com" + ] + }, + { + "launchpad_id": "mgius7096", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Mark Gius", + "emails": [ + "mgius7096@gmail.com" + ] + }, + { + "launchpad_id": "radix", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Christopher Armstrong", + "emails": [ + "chris.armstrong@rackspace.com" + ] + }, + { + "launchpad_id": "xqueralt", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Xavier Queralt", + "emails": [ + "xqueralt@redhat.com" + ] + }, + { + "launchpad_id": "shakhat", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Ilya Shakhat", + "emails": [ + "ishakhat@mirantis.com" + ] + }, + { + "launchpad_id": "janisg", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Janis Gengeris", + "emails": [ + "janis.gengeris@gmail.com" + ] + }, + { + "launchpad_id": "markwash", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Mark Washenberger", + "emails": [ + "mark.washenberger@rackspace.com", + "mark.washenberger@markwash.net" + ] + }, + { + "launchpad_id": "nakamura-h", + "companies": [ + { + "company_name": "NEC", + "end_date": null + } + ], + "user_name": "Hidekazu Nakamura", + "emails": [ + "nakamura-h@mxd.nes.nec.co.jp" + ] + }, + { + "launchpad_id": "m-koderer", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Marc Koderer", + "emails": [ + "m.koderer@telekom.de" + ] + }, + { + "launchpad_id": "therve", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Thomas Herve", + "emails": [ + "therve@gmail.com" + ] + }, + { + "launchpad_id": "rsokolkov", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Roman Sokolkov", + "emails": [ + "rsokolkov@mirantis.com" + ] + }, + { + "launchpad_id": "jokcylou", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "loutc", + "emails": [ + "jokcylou@gmail.com" + ] + }, + { + "launchpad_id": "the-william-kelly", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "William Kelly", + "emails": [ + "the.william.kelly@gmail.com" + ] + }, + { + "launchpad_id": "512-francois-o63", + "companies": [ + { + "company_name": "Alyseo", + "end_date": null + } + ], + "user_name": "Francois Billard", + "emails": [ + "francois@alyseo.com" + ] + }, + { + "launchpad_id": "freedomhui", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Hui Cheng", + "emails": [ + "freedomhui@gmail.com" + ] + }, + { + "launchpad_id": "c-kassen", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Christoph Kassen", + "emails": [ + "c.kassen@telekom.de" + ] + }, + { + "launchpad_id": "igawa", + "companies": [ + { + "company_name": "NEC", + "end_date": null + } + ], + "user_name": "Masayuki Igawa", + "emails": [ + "igawa@mxs.nes.nec.co.jp" + ] + }, + { + "launchpad_id": "jian-zhang", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "Jian Zhang", + "emails": [ + "jian.zhang@intel.com" + ] + }, + { + "launchpad_id": "brian-haley", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Brian Haley", + "emails": [ + "brian.haley@hp.com" + ] + }, + { + "launchpad_id": "shweta-ap05", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Shweta P", + "emails": [ + "shpadubi@cisco.com", + "shweta.ap05@gmail.com" + ] + }, + { + "launchpad_id": "genggjh", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "David Geng", + "emails": [ + "gengjh@cn.ibm.com" + ] + }, + { + "launchpad_id": "sogabe", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Takashi Sogabe", + "emails": [ + "sogabe@iij.ad.jp" + ] + }, + { + "launchpad_id": "meizu647", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "dk647", + "emails": [ + "meizu647@gmail.com" + ] + }, + { + "launchpad_id": "gregory-althaus", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Greg Althaus", + "emails": [ + "galthaus@austin.rr.com" + ] + }, + { + "launchpad_id": "steven-berler", + "companies": [ + { + "company_name": "DreamHost", + "end_date": null + } + ], + "user_name": "Steven Berler", + "emails": [ + "steven.berler@dreamhost.com" + ] + }, + { + "launchpad_id": "yuyangbj", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Yang Yu", + "emails": [ + "yuyangbj@cn.ibm.com" + ] + }, + { + "launchpad_id": "ram-nalluri", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "rampradeep", + "emails": [ + "ram_nalluri@persistent.co.in" + ] + }, + { + "launchpad_id": "mdrnstm", + "companies": [ + { + "company_name": "Metacloud", + "end_date": null + } + ], + "user_name": "Morgan Fainberg", + "emails": [ + "m@metacloud.com" + ] + }, + { + "launchpad_id": "yosshy", + "companies": [ + { + "company_name": "NEC", + "end_date": null + } + ], + "user_name": "Akira Yoshiyama", + "emails": [ + "a-yoshiyama@bu.jp.nec.com", + "akirayoshiyama@gmail.com" + ] + }, + { + "launchpad_id": "andrew-plunk", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Andrew Plunk", + "emails": [ + "andrew.plunk@rackspace.com" + ] + }, + { + "launchpad_id": "cerberus", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Matt Dietz", + "emails": [ + "matt.dietz@rackspace.com", + "matthew.dietz@gmail.com", + "Dietz", + "matthewdietz@Matthew-Dietzs-MacBook-Pro.local", + "mdietz@openstack" + ] + }, + { + "launchpad_id": "blamar", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Brian Lamar", + "emails": [ + "brian.lamar@rackspace.com" + ] + }, + { + "launchpad_id": "jan-grant", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Jan Grant", + "emails": [ + "jan.grant@hp.com" + ] + }, + { + "launchpad_id": "andrea-frittoli", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Andrea Frittoli", + "emails": [ + "andrea.frittoli@hp.com" + ] + }, + { + "launchpad_id": "jesse-pretorius", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jesse Pretorius", + "emails": [ + "jesse.pretorius@gmail.com" + ] + }, + { + "launchpad_id": "psedlak", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Pavel Sedl\u00e1k", + "emails": [ + "psedlak@redhat.com" + ] + }, + { + "launchpad_id": "sirish-bitra-gmail", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "sirish chandra bitra", + "emails": [ + "root@bsirish.(none)", + "sirish.bitra@gmail.com" + ] + }, + { + "launchpad_id": "nealph", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Phil Neal", + "emails": [ + "phil.neal@hp.com" + ] + }, + { + "launchpad_id": "fujita-tomonori-lab", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Tomo", + "emails": [ + "fujita.tomonori@lab.ntt.co.jp" + ] + }, + { + "launchpad_id": "pekowski", + "companies": [ + { + "company_name": "Dell", + "end_date": null + } + ], + "user_name": "Raymond Pekowski", + "emails": [ + "raymond_pekowski@dell.com", + "pekowski@gmail.com" + ] + }, + { + "launchpad_id": "bruno-semperlotti", + "companies": [ + { + "company_name": "Dassault Syst\u00e8mes", + "end_date": null + } + ], + "user_name": "Bruno Semperlotti", + "emails": [ + "bruno.semperlotti@gmail.com" + ] + }, + { + "launchpad_id": "rcritten", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Rob Crittenden", + "emails": [ + "rcritten@redhat.com" + ] + }, + { + "launchpad_id": "r-mibu", + "companies": [ + { + "company_name": "NEC", + "end_date": null + } + ], + "user_name": "Ryota Mibu", + "emails": [ + "r-mibu@cq.jp.nec.com" + ] + }, + { + "launchpad_id": "dscannell", + "companies": [ + { + "company_name": "Gridcentric", + "end_date": null + } + ], + "user_name": "David Scannell", + "emails": [ + "dscannell@gridcentric.com" + ] + }, + { + "launchpad_id": "randall-burt", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Randall Burt", + "emails": [ + "randall.burt@rackspace.com" + ] + }, + { + "launchpad_id": "deepak.garg", + "companies": [ + { + "company_name": "Citrix", + "end_date": null + } + ], + "user_name": "Deepak Garg", + "emails": [ + "deepak.garg@citrix.com", + "deepakgarg.iitg@gmail.com" + ] + }, + { + "launchpad_id": "soulascedric", + "companies": [ + { + "company_name": "AT&T", + "end_date": null + } + ], + "user_name": "C\u00e9dric Soulas", + "emails": [ + "soulascedric@gmail.com", + "cedric.soulas@cloudwatt.com" + ] + }, + { + "launchpad_id": "beagles", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Brent Eagles", + "emails": [ + "beagles@redhat.com" + ] + }, + { + "launchpad_id": "mathieu-rohon", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "mathieu rohon", + "emails": [ + "mathieu.rohon@gmail.com" + ] + }, + { + "launchpad_id": "otherwiseguy", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Terry Wilson", + "emails": [ + "twilson@redhat.com" + ] + }, + { + "launchpad_id": "siyingchun", + "companies": [ + { + "company_name": "SINA", + "end_date": null + } + ], + "user_name": "Yingchun Si", + "emails": [ + "siyingchun@sina.com" + ] + }, + { + "launchpad_id": "aditirav", + "companies": [ + { + "company_name": "ThoughtWorks", + "end_date": null + } + ], + "user_name": "Aditi Raveesh", + "emails": [ + "aditirav@thoughtworks.com" + ] + }, + { + "launchpad_id": "lucasagomes", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Lucas Alvares Gomes", + "emails": [ + "lucasagomes@gmail.com" + ] + }, + { + "launchpad_id": "ema", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Emanuele Rocca", + "emails": [ + "ema@linux.it" + ] + }, + { + "launchpad_id": "xbsd-nikolay", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Nikolay Sobolevsky", + "emails": [ + "nsobolevsky@mirantis.com" + ] + }, + { + "launchpad_id": "oubiwann", + "companies": [ + { + "company_name": "DreamHost", + "end_date": null + } + ], + "user_name": "Duncan McGreggor", + "emails": [ + "duncan@dreamhost.com" + ] + }, + { + "launchpad_id": "dendrobates", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Rick Clark", + "emails": [ + "rick@openstack.org", + "rclark@chat-blanc" + ] + }, + { + "launchpad_id": "ivan-zhu", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Ivan-Zhu", + "emails": [ + "bozhu@linux.vnet.ibm.com" + ] + }, + { + "launchpad_id": "eglynn", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Eoghan Glynn", + "emails": [ + "eglynn@redhat.com" + ] + }, + { + "launchpad_id": "ke-wu", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "Ke Wu", + "emails": [ + "ke.wu@nebula.com", + "ke.wu@ibeca.me" + ] + }, + { + "launchpad_id": "fghaas", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Florian Haas", + "emails": [ + "florian@hastexo.com" + ] + }, + { + "launchpad_id": "lakhindr", + "companies": [ + { + "company_name": "Hitachi", + "end_date": null + } + ], + "user_name": "Lakhinder Walia", + "emails": [ + "lakhindr@hotmail.com", + "lakhinder.walia@hds.com" + ] + }, + { + "launchpad_id": "mikalstill", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Michael Still", + "emails": [ + "michael.still@canonical.com", + "mikal@stillhq.com" + ] + }, + { + "launchpad_id": "kevin-carter", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Kevin Carter", + "emails": [ + "kevin.carter@rackspace.com" + ] + }, + { + "launchpad_id": "rhafer", + "companies": [ + { + "company_name": "SUSE", + "end_date": null + } + ], + "user_name": "Ralf Haferkamp", + "emails": [ + "rhafer@suse.de" + ] + }, + { + "launchpad_id": "rainya-mosher-m", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Rainya Mosher", + "emails": [ + "rainya.mosher@rackspace.com" + ] + }, + { + "launchpad_id": "ubuntubmw", + "companies": [ + { + "company_name": "SUSE", + "end_date": null + } + ], + "user_name": "Bernhard M. Wiedemann", + "emails": [ + "bwiedemann@suse.de" + ] + }, + { + "launchpad_id": "jiataotj", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "David Jia", + "emails": [ + "jiataotj@cn.ibm.com" + ] + }, + { + "launchpad_id": "lsmola", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Ladislav Smola", + "emails": [ + "lsmola@redhat.com" + ] + }, + { + "launchpad_id": "baoli", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Baodong (Robert) Li", + "emails": [ + "baoli@cisco.com" + ] + }, + { + "launchpad_id": "stef-ummon", + "companies": [ + { + "company_name": "Internap", + "end_date": null + } + ], + "user_name": "stelford", + "emails": [ + "stelford@internap.com" + ] + }, + { + "launchpad_id": "smelikyan", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Serg Melikyan", + "emails": [ + "smelikyan@mirantis.com", + "serg.melikyan@gmail.com" + ] + }, + { + "launchpad_id": "maurosr", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Mauro Sergio Martins Rodrigues", + "emails": [ + "maurosr@linux.vnet.ibm.com" + ] + }, + { + "launchpad_id": "jsavak", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Joe Savak", + "emails": [ + "joe.savak@rackspace.com", + "jsavak@gmail.com" + ] + }, + { + "launchpad_id": "sandy-walsh", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Sandy Walsh", + "emails": [ + "sandy.walsh@rackspace.com" + ] + }, + { + "launchpad_id": "james-morgan", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "James Morgan", + "emails": [ + "james.morgan@rackspace.com" + ] + }, + { + "launchpad_id": "5-suzuki", + "companies": [ + { + "company_name": "Midokura", + "end_date": null + } + ], + "user_name": "Takaaki Suzuki", + "emails": [ + "suzuki@midokura.com" + ] + }, + { + "launchpad_id": "0x44", + "companies": [ + { + "company_name": "Piston Cloud", + "end_date": null + } + ], + "user_name": "Christopher MacGown", + "emails": [ + "ignoti+github@gmail.com", + "chris@pistoncloud.com", + "chris@slicehost.com" + ] + }, + { + "launchpad_id": "matt-wagner", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Matt Wagner", + "emails": [ + "matt.wagner@redhat.com" + ] + }, + { + "launchpad_id": "anastasia-karpinska", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Anastasia Karpinska", + "emails": [ + "akarpinska@griddynamics.com" + ] + }, + { + "launchpad_id": "torandu", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Sean Gallagher", + "emails": [ + "sean@torandu.com" + ] + }, + { + "launchpad_id": "tagami-keisuke", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Keisuke Tagami", + "emails": [ + "tagami.keisuke@lab.ntt.co.jp" + ] + }, + { + "launchpad_id": "david-besen", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "David Besen", + "emails": [ + "david.besen@hp.com" + ] + }, + { + "launchpad_id": "pvo", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Paul Voccio", + "emails": [ + "paul@openstack.org", + "paul@substation9.com", + "pvoccio@castor.local", + "paul.voccio@rackspace.com" + ] + }, + { + "launchpad_id": "toabctl", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Thomas Bechtold", + "emails": [ + "thomasbechtold@jpberlin.de" + ] + }, + { + "launchpad_id": "yamamoto", + "companies": [ + { + "company_name": "VA Linux", + "end_date": null + } + ], + "user_name": "Yamamoto Takashi", + "emails": [ + "yamamoto@valinux.co.jp" + ] + }, + { + "launchpad_id": "emagana", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Edgar Magana", + "emails": [ + "emagana@gmail.com", + "eperdomo@dhcp-171-71-119-164.cisco.com", + "eperdomo@cisco.com" + ] + }, + { + "launchpad_id": "mdegerne", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Mandell", + "emails": [ + "mdegerne@gmail.com" + ] + }, + { + "launchpad_id": "aaron-lee", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Aaron Lee", + "emails": [ + "wwkeyboard@gmail.com", + "aaron.lee@rackspace.com" + ] + }, + { + "launchpad_id": "john-davidge", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "John Davidge", + "emails": [ + "jodavidg@cisco.com" + ] + }, + { + "launchpad_id": "yorik-sar", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Yuriy Taraday", + "emails": [ + "yorik@ytaraday", + "yorik.sar@gmail.com" + ] + }, + { + "launchpad_id": "corystone", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Cory Stone", + "emails": [ + "corystone@gmail.com" + ] + }, + { + "launchpad_id": "chris-fattarsi", + "companies": [ + { + "company_name": "Piston Cloud", + "end_date": null + } + ], + "user_name": "Chris Fattarsi", + "emails": [ + "chris.fattarsi@pistoncloud.com" + ] + }, + { + "launchpad_id": "amir-sadoughi", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Amir Sadoughi", + "emails": [ + "amir.sadoughi@gmail.com" + ] + }, + { + "launchpad_id": "abrindeyev", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Andrey Brindeyev", + "emails": [ + "abrindeyev@griddynamics.com" + ] + }, + { + "launchpad_id": "sammiestoel", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Sam Stoelinga", + "emails": [ + "sammiestoel@gmail.com" + ] + }, + { + "launchpad_id": "dougdoan", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Doug", + "emails": [ + "dougdoan@gmail.com" + ] + }, + { + "launchpad_id": "debo", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Debo~ Dutta", + "emails": [ + "dedutta@cisco.com", + "ddutta@gmail.com" + ] + }, + { + "launchpad_id": "david-wittman", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "David Wittman", + "emails": [ + "david.wittman@rackspace.com" + ] + }, + { + "launchpad_id": "sagar-r-nikam", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Sagar Nikam", + "emails": [ + "sagar.r.nikam@gmail.com" + ] + }, + { + "launchpad_id": "endeepak", + "companies": [ + { + "company_name": "ThoughtWorks", + "end_date": null + } + ], + "user_name": "Deepak N", + "emails": [ + "deepak.n@thoughtworks.com" + ] + }, + { + "launchpad_id": "gabriel-hurley", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "Gabriel Hurley", + "emails": [ + "gabriel@strikeawe.com" + ] + }, + { + "launchpad_id": "heckj", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "Joseph Heck", + "emails": [ + "heckj@mac.com" + ] + }, + { + "launchpad_id": "mszilagyi", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Michael Szilagyi", + "emails": [ + "mszilagyi@gmail.com" + ] + }, + { + "launchpad_id": "justin-hammond", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Justin Hammond", + "emails": [ + "justin.hammond@rackspace.com" + ] + }, + { + "launchpad_id": "forrest-r", + "companies": [ + { + "company_name": "AT&T", + "end_date": null + } + ], + "user_name": "Andrew Forrest", + "emails": [ + "forrest@research.att.com" + ] + }, + { + "launchpad_id": "xu-haiwei", + "companies": [ + { + "company_name": "NEC", + "end_date": null + } + ], + "user_name": "Haiwei Xu", + "emails": [ + "xu-haiwei@mxw.nes.nec.co.jp" + ] + }, + { + "launchpad_id": "kwadronaut", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Kwadronaut", + "emails": [ + "kwadronaut@autistici.org" + ] + }, + { + "launchpad_id": "jaegerandi", + "companies": [ + { + "company_name": "SUSE", + "end_date": null + } + ], + "user_name": "Andreas Jaeger", + "emails": [ + "aj@suse.de" + ] + }, + { + "launchpad_id": "vladimir.p", + "companies": [ + { + "company_name": "Zadara Storage", + "end_date": null + } + ], + "user_name": "Vladimir Popovski", + "emails": [ + "vladimir@zadarastorage.com" + ] + }, + { + "launchpad_id": "mhu-s", + "companies": [ + { + "company_name": "eNovance", + "end_date": null + } + ], + "user_name": "Matthieu Huin", + "emails": [ + "mhu@enovance.com" + ] + }, + { + "launchpad_id": "hubcap", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Michael Basnight", + "emails": [ + "mbasnigh@rackspace.com", + "mbasnight@gmail.com" + ] + }, + { + "launchpad_id": "kiall", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Kiall Mac Innes", + "emails": [ + "kiall@managedit.ie", + "kiall@hp.com" + ] + }, + { + "launchpad_id": "markmcclain", + "companies": [ + { + "company_name": "DreamHost", + "end_date": null + } + ], + "user_name": "Mark McClain", + "emails": [ + "mark.mcclain@dreamhost.com" + ] + }, + { + "launchpad_id": "notmyname", + "companies": [ + { + "company_name": "SwiftStack", + "end_date": null + } + ], + "user_name": "John Dickinson", + "emails": [ + "john.dickinson@rackspace.com", + "me@not.mn" + ] + }, + { + "launchpad_id": "santhoshkumar", + "companies": [ + { + "company_name": "ThoughtWorks", + "end_date": null + } + ], + "user_name": "Santhosh Kumar Muniraj", + "emails": [ + "santhom@thoughtworks.com", + "santhosh.m@thoughtworks.com" + ] + }, + { + "launchpad_id": "johndescs", + "companies": [ + { + "company_name": "IGBMC", + "end_date": null + } + ], + "user_name": "Jonathan Michalon", + "emails": [ + "michalon@igbmc.fr" + ] + }, + { + "launchpad_id": "satish-0", + "companies": [ + { + "company_name": "Arista Networks", + "end_date": null + } + ], + "user_name": "Satish Mohan", + "emails": [ + "satish@aristanetworks.com" + ] + }, + { + "launchpad_id": "emmasteimann", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Emma Grace Steimann", + "emails": [ + "emmasteimann@gmail.com" + ] + }, + { + "launchpad_id": "armando-migliaccio", + "companies": [ + { + "company_name": "Nicira", + "end_date": null + } + ], + "user_name": "armando-migliaccio", + "emails": [ + "amigliaccio@nicira.com", + "Armando.Migliaccio@eu.citrix.com", + "amigliaccio@internap.com", + "armamig@gmail.com", + "armando.migliaccio@citrix.com", + "armando.migliaccio@eu.citrix.com" + ] + }, + { + "launchpad_id": "nijaba", + "companies": [ + { + "company_name": "Canonical", + "end_date": "2013-Jan-01" + }, + { + "company_name": "eNovance", + "end_date": null + } + ], + "user_name": "Nicolas Barcet", + "emails": [ + "nicolas@barcet.com", + "nick@enovance.com", + "nijaba@ubuntu.com", + "nick.barcet@canonical.com" + ] + }, + { + "launchpad_id": "yufang521247", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Yufang Zhang", + "emails": [ + "yufang521247@gmail.com" + ] + }, + { + "launchpad_id": "vito-ordaz", + "companies": [ + { + "company_name": "Nexenta", + "end_date": null + } + ], + "user_name": "Victor Rodionov", + "emails": [ + "vito.ordaz@gmail.com", + "victor.rodionov@nexenta.com" + ] + }, + { + "launchpad_id": "pednape", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Pedro Navarro Perez", + "emails": [ + "pednape@gmail.com" + ] + }, + { + "launchpad_id": "ymzk37", + "companies": [ + { + "company_name": "NEC", + "end_date": null + } + ], + "user_name": "Mitsuhiko Yamazaki", + "emails": [ + "yamazaki-mitsuhiko@cnt.mxc.nes.nec.co.jp" + ] + }, + { + "launchpad_id": "btopol", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Brad Topol", + "emails": [ + "btopol@us.ibm.com" + ] + }, + { + "launchpad_id": "tpot", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Tim Potter", + "emails": [ + "tpot@hp.com" + ] + }, + { + "launchpad_id": "dbailey-k", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Darragh Bailey", + "emails": [ + "dbailey@hp.com" + ] + }, + { + "launchpad_id": "fujioka-yuuichi-d", + "companies": [ + { + "company_name": "NEC", + "end_date": null + } + ], + "user_name": "fujioka yuuichi", + "emails": [ + "fujioka-yuuichi@zx.mxh.nes.nec.co.jp" + ] + }, + { + "launchpad_id": "winson-c-chan", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "Winson Chan", + "emails": [ + "winson.c.chan@intel.com" + ] + }, + { + "launchpad_id": "franciscosouza", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Francisco Souza", + "emails": [ + "f@souza.cc" + ] + }, + { + "launchpad_id": "azilli", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Marharyta Kislinska", + "emails": [ + "mkislins@yahoo-inc.com", + "mkislinska@griddynamics.com" + ] + }, + { + "launchpad_id": "jproulx", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jonathan Proulx", + "emails": [ + "jon@csail.mit.edu", + "jon@jonproulx.com" + ] + }, + { + "launchpad_id": "zealot0630", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Zang MingJie", + "emails": [ + "zealot0630@gmail.com" + ] + }, + { + "launchpad_id": "locke105", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Mathew Odden", + "emails": [ + "mrodden@us.ibm.com" + ] + }, + { + "launchpad_id": "sthakkar", + "companies": [ + { + "company_name": "VMware", + "end_date": null + } + ], + "user_name": "Sachin Thakkar", + "emails": [ + "sthakkar@vmware.com" + ] + }, + { + "launchpad_id": "steve-stevebaker", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Steve Baker", + "emails": [ + "sbaker@redhat.com", + "steve@stevebaker.org" + ] + }, + { + "launchpad_id": "littleidea", + "companies": [ + { + "company_name": "Cloudscaling", + "end_date": null + } + ], + "user_name": "Andrew Clay Shafer", + "emails": [ + "andrew@cloudscaling.com", + "acs@parvuscaptus.com" + ] + }, + { + "launchpad_id": "yamahata", + "companies": [ + { + "company_name": "VA Linux", + "end_date": null + } + ], + "user_name": "Isaku Yamahata", + "emails": [ + "yamahata@valinux.co.jp" + ] + }, + { + "launchpad_id": "klmitch", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Kevin L. Mitchell", + "emails": [ + "kevin.mitchell@rackspace.com" + ] + }, + { + "launchpad_id": "sheeprine", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "St\u00e9phane Albert", + "emails": [ + "sheeprine@nullplace.com" + ] + }, + { + "launchpad_id": "akuno", + "companies": [ + { + "company_name": "eNovance", + "end_date": null + } + ], + "user_name": "Anita Kuno", + "emails": [ + "akuno@lavabit.com", + "anita.kuno@enovance.com" + ] + }, + { + "launchpad_id": "rizumu", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Thomas Schreiber", + "emails": [ + "tom@rizu.mu" + ] + }, + { + "launchpad_id": "tsuyuzaki-kota", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Kota Tsuyuzaki", + "emails": [ + "tsuyuzaki.kota@lab.ntt.co.jp" + ] + }, + { + "launchpad_id": "arosen", + "companies": [ + { + "company_name": "Nicira", + "end_date": null + } + ], + "user_name": "Aaron Rosen", + "emails": [ + "arosen@nicira.com" + ] + }, + { + "launchpad_id": "greglange", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Greg Lange", + "emails": [ + "greglange+launchpad@gmail.com", + "greglange@gmail.com", + "glange@rackspace.com" + ] + }, + { + "launchpad_id": "johngarbutt", + "companies": [ + { + "company_name": "Citrix", + "end_date": "2013-Feb-01" + }, + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "John Garbutt", + "emails": [ + "john@johngarbutt.com", + "john.garbutt@rackspace.com", + "john.garbutt@citrix.com" + ] + }, + { + "launchpad_id": "simplylizz", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Anton V. Yanchenko", + "emails": [ + "simplylizz@gmail.com" + ] + }, + { + "launchpad_id": "john-herndon", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "John Herndon", + "emails": [ + "john.herndon@hp.com" + ] + }, + { + "launchpad_id": "edward-hope-morley", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Edward Hope-Morley", + "emails": [ + "edward.hope-morley@canonical.com", + "opentastic@gmail.com" + ] + }, + { + "launchpad_id": "salgado", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Guilherme Salgado", + "emails": [ + "gsalgado@gmail.com" + ] + }, + { + "launchpad_id": "yosef-4", + "companies": [ + { + "company_name": "Cloudscaling", + "end_date": null + } + ], + "user_name": "Yosef Berman", + "emails": [ + "yosef@cloudscaling.com" + ] + }, + { + "launchpad_id": "xchenum", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Simon", + "emails": [ + "xchenum@gmail.com" + ] + }, + { + "launchpad_id": "rvaknin", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Rami Vaknin", + "emails": [ + "rvaknin@redhat.com" + ] + }, + { + "launchpad_id": "toan-nguyen", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Toan Nguyen", + "emails": [ + "toan.nguyen@rackspace.com" + ] + }, + { + "launchpad_id": "vrovachev", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Vadim Rovachev", + "emails": [ + "vrovachev@mirantis.com" + ] + }, + { + "launchpad_id": "moreira-belmiro-email-lists", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Belmiro Moreira", + "emails": [ + "moreira.belmiro.email.lists@gmail.com" + ] + }, + { + "launchpad_id": "johannes", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Johannes Erdfelt", + "emails": [ + "johannes@squeeze.(none)" + ] + }, + { + "launchpad_id": "maru", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Maru Newby", + "emails": [ + "marun@redhat.com", + "mnewby@internap.com" + ] + }, + { + "launchpad_id": "awoods-0", + "companies": [ + { + "company_name": "Internap", + "end_date": null + } + ], + "user_name": "Anthony Woods", + "emails": [ + "awoods@internap.com" + ] + }, + { + "launchpad_id": "btorch", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Marcelo Martins", + "emails": [ + "btorch@gmail.com", + "marcelo.martins@rackspace.com" + ] + }, + { + "launchpad_id": "e0ne", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Ivan Kolodyazhny", + "emails": [ + "e0ne@e0ne.info", + "ikolodyazhny@mirantis.com" + ] + }, + { + "launchpad_id": "zrzhit", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Rongze Zhu", + "emails": [ + "zrzhit@gmail.com" + ] + }, + { + "launchpad_id": "stevemar", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Steve Martinelli", + "emails": [ + "stevemar@ca.ibm.com" + ] + }, + { + "launchpad_id": "aignatov", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Alexander Ignatov", + "emails": [ + "aignatov@mirantis.com" + ] + }, + { + "launchpad_id": "bkjones", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "jonesy", + "emails": [ + "bkjones@gmail.com" + ] + }, + { + "launchpad_id": "derek-chiang", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "Derek Chiang", + "emails": [ + "derek.chiang@nebula.com" + ] + }, + { + "launchpad_id": "306455645-b", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "ShichaoXu", + "emails": [ + "gudujianjsk@gmail.com" + ] + }, + { + "launchpad_id": "pcm", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Paul Michali", + "emails": [ + "pcm@cisco.com" + ] + }, + { + "launchpad_id": "jenny-shieh", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Jenny Shieh", + "emails": [ + "jenny.shieh@hp.com" + ] + }, + { + "launchpad_id": "linuxjedi", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Andrew Hutchings", + "emails": [ + "andrew@linuxjedi.co.uk" + ] + }, + { + "launchpad_id": "nidonato", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Nicholas Donato", + "emails": [ + "nidonato@cisco.com" + ] + }, + { + "launchpad_id": "maksimov", + "companies": [ + { + "company_name": "Dell", + "end_date": null + } + ], + "user_name": "Stas Maksimov", + "emails": [ + "stanislav_m@dell.com" + ] + }, + { + "launchpad_id": "ejkern", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Ed Kern", + "emails": [ + "ejkern@mac.com" + ] + }, + { + "launchpad_id": "vinkeshb", + "companies": [ + { + "company_name": "ThoughtWorks", + "end_date": null + } + ], + "user_name": "Vinkesh Banka", + "emails": [ + "vinkeshb@thoughtworks.com" + ] + }, + { + "launchpad_id": "unicell", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "unicell", + "emails": [ + "unicell@gmail.com" + ] + }, + { + "launchpad_id": "flaper87", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Flavio Percoco Premoli", + "emails": [ + "fpercoco@redhat.com", + "flaper87@gmail.com" + ] + }, + { + "launchpad_id": "bdpayne", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Bryan D. Payne", + "emails": [ + "bdpayne@acm.org" + ] + }, + { + "launchpad_id": "adri2000", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Adrien Cunin", + "emails": [ + "acunin@linagora.com" + ] + }, + { + "launchpad_id": "irsxyp", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "irsxyp", + "emails": [ + "irsxyp@gmail.com" + ] + }, + { + "launchpad_id": "mandoonandy", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Andy McCallum", + "emails": [ + "andy@aptira.com" + ] + }, + { + "launchpad_id": "jdillaman", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Jason Dillaman", + "emails": [ + "dillaman@redhat.com" + ] + }, + { + "launchpad_id": "john-dunning", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "John Dunning", + "emails": [ + "jrd@redhat.com" + ] + }, + { + "launchpad_id": "dlapsley", + "companies": [ + { + "company_name": "Nicira", + "end_date": null + } + ], + "user_name": "David Lapsley", + "emails": [ + "dlapsley@nicira.com" + ] + }, + { + "launchpad_id": "razique", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Razique Mahroua", + "emails": [ + "razique.mahroua@gmail.com" + ] + }, + { + "launchpad_id": "ron-pedde", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Ron Pedde", + "emails": [ + "ron@pedde.com" + ] + }, + { + "launchpad_id": "vijaya-erukala", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Vijaya Erukala", + "emails": [ + "vijaya_erukala@persistent.co.in" + ] + }, + { + "launchpad_id": "wenhao-x", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Wenhao Xu", + "emails": [ + "xuwenhao2008@gmail.com" + ] + }, + { + "launchpad_id": "rnirmal", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Nirmal Ranganathan", + "emails": [ + "nirmal.ranganathan@rackspace.com", + "nirmal.ranganathan@rackspace.coom", + "rnirmal@gmail.com" + ] + }, + { + "launchpad_id": "david-hadas", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "David Hadas", + "emails": [ + "davidh@il.ibm.com", + "david.hadas@gmail.com" + ] + }, + { + "launchpad_id": "jpeeler-z", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Jeff Peeler", + "emails": [ + "jpeeler@redhat.com" + ] + }, + { + "launchpad_id": "andrewsmedina", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Andrews Medina", + "emails": [ + "andrewsmedina@gmail.com" + ] + }, + { + "launchpad_id": "jonathan-abdiel", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jonathan Gonzalez V.", + "emails": [ + "jonathan.abdiel@gmail.com" + ] + }, + { + "launchpad_id": "sadasu", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Sandhya Dasu", + "emails": [ + "sadasu@cisco.com" + ] + }, + { + "launchpad_id": "haomai", + "companies": [ + { + "company_name": "UnitedStack", + "end_date": null + } + ], + "user_name": "Haomai Wang", + "emails": [ + "haomai@unitedstack.com" + ] + }, + { + "launchpad_id": "carlos-garza", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Carlos Garza", + "emails": [ + "carlos.garza@rackspace.com" + ] + }, + { + "launchpad_id": "aovchinnikov", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Alexey Ovchinnikov", + "emails": [ + "aovchinnikov@mirantis.com" + ] + }, + { + "launchpad_id": "khussein", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Khaled Hussein", + "emails": [ + "khaled.hussein@rackspace.com", + "khaled.hussein@gmail.com" + ] + }, + { + "launchpad_id": "flepied", + "companies": [ + { + "company_name": "eNovance", + "end_date": null + } + ], + "user_name": "Frederic Lepied", + "emails": [ + "frederic.lepied@enovance.com" + ] + }, + { + "launchpad_id": "jimmy-sigint", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jimmy Bergman", + "emails": [ + "jimmy@sigint.se" + ] + }, + { + "launchpad_id": "gpocentek", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Gauvain Pocentek", + "emails": [ + "gauvain@pocentek.net", + "gauvain.pocentek@objectif-libre.com" + ] + }, + { + "launchpad_id": "pkilambi", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Pradeep Kilambi", + "emails": [ + "pkilambi@cisco.com", + "praddevel@gmail.com" + ] + }, + { + "launchpad_id": "jemartin", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "JC Martin", + "emails": [ + "jcmartin@ebaysf.com" + ] + }, + { + "launchpad_id": "ryu-midokura", + "companies": [ + { + "company_name": "Midokura", + "end_date": null + } + ], + "user_name": "Ryu Ishimoto", + "emails": [ + "ryu@midokura.jp", + "ryu@midokura.com" + ] + }, + { + "launchpad_id": "jiangwt100", + "companies": [ + { + "company_name": "UnitedStack", + "end_date": null + } + ], + "user_name": "Jim Jiang", + "emails": [ + "wentian@unitedstack.com", + "jiangwt100@gmail.com" + ] + }, + { + "launchpad_id": "donagh-mccabe", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Donagh McCabe", + "emails": [ + "donagh.mccabe@hp.com" + ] + }, + { + "launchpad_id": "anniec", + "companies": [ + { + "company_name": "Yahoo!", + "end_date": null + } + ], + "user_name": "Annie Cheng", + "emails": [ + "anniec@yahoo-inc.com" + ] + }, + { + "launchpad_id": "tzn", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Tomasz 'Zen' Napierala", + "emails": [ + "tomasz@napierala.org" + ] + }, + { + "launchpad_id": "jolyon", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jolyon Brown", + "emails": [ + "git@limilo.com" + ] + }, + { + "launchpad_id": "sdake", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Steven Dake", + "emails": [ + "sdake@redhat.com" + ] + }, + { + "launchpad_id": "broskos", + "companies": [ + { + "company_name": "Internap", + "end_date": null + } + ], + "user_name": "Brent Roskos", + "emails": [ + "broskos@internap.com" + ] + }, + { + "launchpad_id": "devdeep-singh", + "companies": [ + { + "company_name": "Citrix", + "end_date": null + } + ], + "user_name": "Devdeep Singh", + "emails": [ + "devdeep.singh@citrix.com" + ] + }, + { + "launchpad_id": "jasondunsmore", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Jason Dunsmore", + "emails": [ + "jasondunsmore@gmail.com" + ] + }, + { + "launchpad_id": "chmouel", + "companies": [ + { + "company_name": "eNovance", + "end_date": null + } + ], + "user_name": "Chmouel Boudjnah", + "emails": [ + "chmouel@chmouel.com", + "launchpad@chmouel.com", + "chmouel.boudjnah@rackspace.co.uk", + "chmouel@openstack.org", + "chmouel@enovance.com" + ] + }, + { + "launchpad_id": "therese-mchale", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Therese McHale", + "emails": [ + "therese.mchale@hp.com" + ] + }, + { + "launchpad_id": "fujioka-yuuichi", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "fujioka yuuichi", + "emails": [ + "fujioka.yuuichi@gmail.com" + ] + }, + { + "launchpad_id": "jruzicka", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Jakub Ruzicka", + "emails": [ + "jruzicka@redhat.com" + ] + }, + { + "launchpad_id": "hudayou", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Hengqing Hu", + "emails": [ + "hudayou@hotmail.com" + ] + }, + { + "launchpad_id": "alekibango", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "David Pravec", + "emails": [ + "david.pravec@danix.org" + ] + }, + { + "launchpad_id": "madhav-puri", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Madhav Puri", + "emails": [ + "madhav.puri@gmail.com" + ] + }, + { + "launchpad_id": "niu-zglinux", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Zhenguo Niu (\u725b\u632f\u56fd)", + "emails": [ + "niu.zglinux@gmail.com" + ] + }, + { + "launchpad_id": "kbringard", + "companies": [ + { + "company_name": "AT&T", + "end_date": null + } + ], + "user_name": "Kevin Bringard", + "emails": [ + "kbringard@attinteractive.com", + "kbringard@att.com" + ] + }, + { + "launchpad_id": "andrew-melton", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Andrew Melton", + "emails": [ + "andrew.melton@rackspace.com" + ] + }, + { + "launchpad_id": "ayoung", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Adam Young", + "emails": [ + "ayoung@redhat.com" + ] + }, + { + "launchpad_id": "9-sa", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Stephane ANGOT", + "emails": [ + "sa@hydre.org" + ] + }, + { + "launchpad_id": "flwang", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Fei Long Wang", + "emails": [ + "flwang@cn.ibm.com" + ] + }, + { + "launchpad_id": "mark-seger", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Mark Seger", + "emails": [ + "mark.seger@hp.com" + ] + }, + { + "launchpad_id": "gongysh", + "companies": [ + { + "company_name": "IBM", + "end_date": "2013-Jun-15" + }, + { + "company_name": "UnitedStack", + "end_date": null + } + ], + "user_name": "Yong Sheng Gong", + "emails": [ + "gongysh@unitedstack.com", + "gongysh@cn.ibm.com", + "gongysh@linux.vnet.ibm.com" + ] + }, + { + "launchpad_id": "lin-hua-cheng", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Lin Hua Cheng", + "emails": [ + "lin-hua.cheng@hp.com" + ] + }, + { + "launchpad_id": "bartosz-gorski", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Bartosz G\u00f3rski", + "emails": [ + "bartosz.gorski@nttmcl.com", + "bartosz.gorski@ntti3.com" + ] + }, + { + "launchpad_id": "ttrifonov", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Tihomir Trifonov", + "emails": [ + "t.trifonov@gmail.com" + ] + }, + { + "launchpad_id": "mukul18", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Mukul Patel", + "emails": [ + "mukul18@gmail.com" + ] + }, + { + "launchpad_id": "wu-wenxiang", + "companies": [ + { + "company_name": "99cloud", + "end_date": null + } + ], + "user_name": "Wu Wenxiang", + "emails": [ + "wu.wenxiang@99cloud.net" + ] + }, + { + "launchpad_id": "jjmartinez", + "companies": [ + { + "company_name": "Memset", + "end_date": null + } + ], + "user_name": "Juan J. Mart\u00ednez", + "emails": [ + "juan@memset.com" + ] + }, + { + "launchpad_id": "matthew-macdonald-wallace", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Matthew Macdonald-Wallace", + "emails": [ + "matthew.macdonald-wallace@hp.com" + ] + }, + { + "launchpad_id": "thedodd", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Anthony Dodd", + "emails": [ + "adodd@vbridges.com" + ] + }, + { + "launchpad_id": "jdsn", + "companies": [ + { + "company_name": "SUSE", + "end_date": null + } + ], + "user_name": "J. Daniel Schmidt", + "emails": [ + "jdsn@suse.de" + ] + }, + { + "launchpad_id": "alexyang", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Alex Yang", + "emails": [ + "alex890714@gmail.com" + ] + }, + { + "launchpad_id": "ed-bak2", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Ed Bak", + "emails": [ + "ed.bak2@hp.com" + ] + }, + { + "launchpad_id": "talkain", + "companies": [ + { + "company_name": "Ravello Systems", + "end_date": null + } + ], + "user_name": "Tal Kain", + "emails": [ + "tal.kain@ravellosystems.com" + ] + }, + { + "launchpad_id": "jean-baptiste-ransy", + "companies": [ + { + "company_name": "Alyseo", + "end_date": null + } + ], + "user_name": "Jean-Baptiste Ransy", + "emails": [ + "jean-baptiste.ransy@alyseo.com" + ] + }, + { + "launchpad_id": "brian-lamar", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Brian Lamar", + "emails": [ + "brian.lamar@gmail.com" + ] + }, + { + "launchpad_id": "rlane", + "companies": [ + { + "company_name": "Wikimedia Foundation", + "end_date": null + } + ], + "user_name": "Ryan Lane", + "emails": [ + "laner@controller", + "rlane@wikimedia.org" + ] + }, + { + "launchpad_id": "rpothier", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Robert Pothier", + "emails": [ + "rpothier@cisco.com" + ] + }, + { + "launchpad_id": "jay-lau-513", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Jay Lau", + "emails": [ + "jay.lau.513@gmail.com", + "liugya@cn.ibm.com" + ] + }, + { + "launchpad_id": "francois-charlier", + "companies": [ + { + "company_name": "eNovance", + "end_date": null + } + ], + "user_name": "Fran\u00e7ois Charlier", + "emails": [ + "francois.charlier@enovance.com" + ] + }, + { + "launchpad_id": "fmanco", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Filipe Manco", + "emails": [ + "filipe.manco@gmail.com" + ] + }, + { + "launchpad_id": "woodspa", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Patrick Woods", + "emails": [ + "woodspa@us.ibm.com" + ] + }, + { + "launchpad_id": "mr-rods", + "companies": [ + { + "company_name": "DreamHost", + "end_date": null + } + ], + "user_name": "Rosario Di Somma", + "emails": [ + "rosario.disomma@dreamhost.com" + ] + }, + { + "launchpad_id": "melwitt", + "companies": [ + { + "company_name": "Yahoo!", + "end_date": null + } + ], + "user_name": "Melanie Witt", + "emails": [ + "melwitt@yahoo-inc.com" + ] + }, + { + "launchpad_id": "ppyy", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Peng Yong", + "emails": [ + "ppyy@pubyun.com" + ] + }, + { + "launchpad_id": "frossigneux", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Fran\u00e7ois Rossigneux", + "emails": [ + "francois.rossigneux@inria.fr" + ] + }, + { + "launchpad_id": "gfidente", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Giulio Fidente", + "emails": [ + "gfidente@redhat.com" + ] + }, + { + "launchpad_id": "enakai", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Etsuji Nakai", + "emails": [ + "enakai@redhat.com" + ] + }, + { + "launchpad_id": "cthier", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Chuck Thier", + "emails": [ + "cthier@gmail.com" + ] + }, + { + "launchpad_id": "jmatt", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "J. Matt Peterson", + "emails": [ + "jmatt@jmatt.org" + ] + }, + { + "launchpad_id": "singn", + "companies": [ + { + "company_name": "NetApp", + "end_date": null + } + ], + "user_name": "Navneet", + "emails": [ + "singn@netapp.com" + ] + }, + { + "launchpad_id": "parthipan", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Loganathan Parthipan", + "emails": [ + "parthipan@hp.com" + ] + }, + { + "launchpad_id": "pjz", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Paul Jimenez", + "emails": [ + "pj@place.org" + ] + }, + { + "launchpad_id": "bryan-davidson", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Bryan Davidson", + "emails": [ + "bryan.davidson@rackspace.com" + ] + }, + { + "launchpad_id": "alexei-kornienko", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Alexei Kornienko", + "emails": [ + "alexei.kornienko@gmail.com", + "akornienko@mirantis.com" + ] + }, + { + "launchpad_id": "westmaas", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Gabe Westmaas", + "emails": [ + "gabe.westmaas@rackspace.com" + ] + }, + { + "launchpad_id": "glikson", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Alex Glikson", + "emails": [ + "glikson@il.ibm.com" + ] + }, + { + "launchpad_id": "liam-kelleher", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Liam Kelleher", + "emails": [ + "liam.kelleher@hp.com" + ] + }, + { + "launchpad_id": "yazirian", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Dan Dillinger", + "emails": [ + "dan.dillinger@sonian.net" + ] + }, + { + "launchpad_id": "xuhanp", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Xuhan Peng", + "emails": [ + "xuhanp@cn.ibm.com" + ] + }, + { + "launchpad_id": "bob-ball", + "companies": [ + { + "company_name": "Citrix", + "end_date": null + } + ], + "user_name": "Bob Ball", + "emails": [ + "bob.ball@citrix.com" + ] + }, + { + "launchpad_id": "james-page", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "James Page", + "emails": [ + "james.page@ubuntu.com" + ] + }, + { + "launchpad_id": "jafletch", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Jack Peter Fletcher", + "emails": [ + "jafletch@cisco.com" + ] + }, + { + "launchpad_id": "redheadflyundershadow", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Lei Zhang", + "emails": [ + "sneezezhang@cienet.com.cn" + ] + }, + { + "launchpad_id": "mapleoin", + "companies": [ + { + "company_name": "SUSE", + "end_date": null + } + ], + "user_name": "Ionu\u021b Ar\u021b\u0103ri\u0219i", + "emails": [ + "iartarisi@suse.cz" + ] + }, + { + "launchpad_id": "dhersam", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Dan Hersam", + "emails": [ + "dan.hersam@hp.com" + ] + }, + { + "launchpad_id": "troy-toman", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Troy Toman", + "emails": [ + "ttcl@mac.com", + "troy.toman@rackspace.com" + ] + }, + { + "launchpad_id": "hazmat", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Kapil Thangavelu", + "emails": [ + "kapil.foss@gmail.com" + ] + }, + { + "launchpad_id": "b-maguire", + "companies": [ + { + "company_name": "Dell", + "end_date": null + } + ], + "user_name": "Brendan Maguire", + "emails": [ + "b_maguire@dell.com" + ] + }, + { + "launchpad_id": "nickchase", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Nicholas Chase", + "emails": [ + "nchase@mirantis.com" + ] + }, + { + "launchpad_id": "gmb", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Graham Binns", + "emails": [ + "graham.binns@gmail.com", + "graham@grahambinns.com", + "graham.binns@canonical.com", + "graham@canonical.com", + "gmb@canonical.com", + "gmb@grahambinns.com" + ] + }, + { + "launchpad_id": "jonesld", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Daniel Jones", + "emails": [ + "jonesld@us.ibm.com" + ] + }, + { + "launchpad_id": "apevec", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Alan Pevec", + "emails": [ + "apevec@redhat.com" + ] + }, + { + "launchpad_id": "ahmad-hassan-q", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Ahmad Hassan", + "emails": [ + "ahmad.hassan@hp.com" + ] + }, + { + "launchpad_id": "jcherkas", + "companies": [ + { + "company_name": "Nicira", + "end_date": null + } + ], + "user_name": "Jacob Cherkas", + "emails": [ + "jcherkas@nicira.com" + ] + }, + { + "launchpad_id": "ripal-nathuji", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Ripal Nathuji", + "emails": [ + "ripal.nathuji@calxeda.com" + ] + }, + { + "launchpad_id": "divakar-padiyar-nandavar", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Divakar Padiyar Nandavar", + "emails": [ + "divakar.padiyar-nandavar@hp.com" + ] + }, + { + "launchpad_id": "asbjorn-sannes", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Asbj\u00f8rn Sannes", + "emails": [ + "asbjorn.sannes@interhost.no" + ] + }, + { + "launchpad_id": "epatro", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Eduardo Patrocinio", + "emails": [ + "epatro@gmail.com" + ] + }, + { + "launchpad_id": "jcallicoat", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Jordan Callicoat", + "emails": [ + "jordan.callicoat@rackspace.com" + ] + }, + { + "launchpad_id": "pps-pranav", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Pranav Salunke", + "emails": [ + "pps.pranav@gmail.com" + ] + }, + { + "launchpad_id": "throughnothing", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "William Wolf", + "emails": [ + "will.wolf@rackspace.com", + "throughnothing@gmail.com" + ] + }, + { + "launchpad_id": "thrawn01", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Derrick Wippler", + "emails": [ + "thrawn01@gmail.com" + ] + }, + { + "launchpad_id": "lzy-dev", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Zhi Yan Liu", + "emails": [ + "lzy.dev@gmail.com", + "zhiyanl@cn.ibm.com" + ] + }, + { + "launchpad_id": "annegentle", + "companies": [ + { + "company_name": "Rackspace", + "end_date": "2013-Apr-01" + }, + { + "company_name": "OpenStack Foundation", + "end_date": null + } + ], + "user_name": "Anne Gentle", + "emails": [ + "anne@openstack.org", + "anne.gentle@rackspace.com" + ] + }, + { + "launchpad_id": "anton0", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Anton Frolov", + "emails": [ + "anfrolov@mirantis.com" + ] + }, + { + "launchpad_id": "wugc", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Guang Chun Wu", + "emails": [ + "wugc@cn.ibm.com" + ] + }, + { + "launchpad_id": "diane-fleming", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Diane Fleming", + "emails": [ + "diane.fleming@rackspace.com" + ] + }, + { + "launchpad_id": "dtroyer", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "Dean Troyer", + "emails": [ + "dt-github@xr7.org", + "dtroyer@gmail.com" + ] + }, + { + "launchpad_id": "imsplitbit", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Daniel Salinas", + "emails": [ + "imsplitbit@gmail.com", + "dsalinas@rackspace.com" + ] + }, + { + "launchpad_id": "sorrison", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Sam Morrison", + "emails": [ + "sorrison@gmail.com" + ] + }, + { + "launchpad_id": "geekinutah", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Michael H Wilson", + "emails": [ + "geekinutah@gmail.com" + ] + }, + { + "launchpad_id": "vijendar-komalla", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Vijendar Komalla", + "emails": [ + "vijendar.komalla@rackspace.com" + ] + }, + { + "launchpad_id": "davewalker", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Dave Walker", + "emails": [ + "Dave.Walker@canonical.com", + "DaveWalker@ubuntu.com", + "davewalker@ubuntu.com", + "dave.walker@canonical.com", + "Dave.Walker@Canonical.com" + ] + }, + { + "launchpad_id": "satya-patibandla", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Satyanarayana Patibandla", + "emails": [ + "satya.patibandla@tcs.com" + ] + }, + { + "launchpad_id": "simo-x", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Simo Sorce", + "emails": [ + "simo@redhat.com" + ] + }, + { + "launchpad_id": "jsbryant", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Jay S. Bryant", + "emails": [ + "jsbryant@us.ibm.com" + ] + }, + { + "launchpad_id": "jordan-pittier", + "companies": [ + { + "company_name": "AT&T", + "end_date": null + } + ], + "user_name": "Jordan Pittier", + "emails": [ + "jordan.pittier-ext@cloudwatt.com", + "jordan.pittier@gmail.com" + ] + }, + { + "launchpad_id": "unmesh-gurjar", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Unmesh Gurjar", + "emails": [ + "unmesh.gurjar@vertex.co.in", + "unmesh.gurjar@nttdata.com" + ] + }, + { + "launchpad_id": "dmitrymex", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Dmitry Mescheryakov", + "emails": [ + "dmescheryakov@mirantis.com" + ] + }, + { + "launchpad_id": "yuanotes", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Brooklyn", + "emails": [ + "brooklyn.chen@canonical.com" + ] + }, + { + "launchpad_id": "cboylan", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Clark Boylan", + "emails": [ + "clark.boylan@gmail.com" + ] + }, + { + "launchpad_id": "dmllr", + "companies": [ + { + "company_name": "SUSE", + "end_date": null + } + ], + "user_name": "Dirk Mueller", + "emails": [ + "dirk@dmllr.de" + ] + }, + { + "launchpad_id": "karin-levenstein", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Karin Levenstein", + "emails": [ + "karin.levenstein@rackspace.com" + ] + }, + { + "launchpad_id": "peter-a-portante", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Peter Portante", + "emails": [ + "peter.portante@redhat.com" + ] + }, + { + "launchpad_id": "nicholaskuechler", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Nicholas Kuechler", + "emails": [ + "nkuechler@gmail.com" + ] + }, + { + "launchpad_id": "david-goetz", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "David Goetz", + "emails": [ + "david.goetz@rackspace.com", + "dpgoetz@gmail.com", + "david.goetz@gmail.com" + ] + }, + { + "launchpad_id": "freyes", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Felipe Reyes", + "emails": [ + "freyes@tty.cl" + ] + }, + { + "launchpad_id": "timjr", + "companies": [ + { + "company_name": "Yahoo!", + "end_date": null + } + ], + "user_name": "Tim Daly Jr.", + "emails": [ + "timjr@yahoo-inc.com" + ] + }, + { + "launchpad_id": "yogesh-srikrishnan", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Yogeshwar Srikrishnan", + "emails": [ + "yogesh.srikrishnan@rackspace.com", + "yoga80@yahoo.com" + ] + }, + { + "launchpad_id": "jordanrinke", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jordan Rinke", + "emails": [ + "jordan@openstack.org" + ] + }, + { + "launchpad_id": "hzzhoushaoyu", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Zhou ShaoYu", + "emails": [ + "hzzhoushaoyu@corp.netease.com" + ] + }, + { + "launchpad_id": "walter-boring", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Walt Boring", + "emails": [ + "walter.boring@hp.com" + ] + }, + { + "launchpad_id": "eamonn-otoole", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Eamonn O'Toole", + "emails": [ + "eamonn.otoole@hp.com" + ] + }, + { + "launchpad_id": "pshkitin", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Pavel Shkitin", + "emails": [ + "pshkitin@griddynamics.com" + ] + }, + { + "launchpad_id": "cthiel-suse", + "companies": [ + { + "company_name": "DE Telekom", + "end_date": null + } + ], + "user_name": "Christoph Thiel", + "emails": [ + "c.thiel@telekom.de", + "cthiel@suse.com" + ] + }, + { + "launchpad_id": "adam.spiers", + "companies": [ + { + "company_name": "SUSE", + "end_date": null + } + ], + "user_name": "Adam Spiers", + "emails": [ + "aspiers@suse.com" + ] + }, + { + "launchpad_id": "mathrock", + "companies": [ + { + "company_name": "National Security Agency", + "end_date": null + } + ], + "user_name": "Nathanael Burton", + "emails": [ + "nathanael.i.burton@gmail.com", + "nathanael.i.burton.work@gmail.com" + ] + }, + { + "launchpad_id": "lichray", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Zhihao Yuan", + "emails": [ + "lichray@gmail.com" + ] + }, + { + "launchpad_id": "justin-lund", + "companies": [ + { + "company_name": "DreamHost", + "end_date": null + } + ], + "user_name": "Justin Lund", + "emails": [ + "justin.lund@dreamhost.com" + ] + }, + { + "launchpad_id": "fengqian-gao", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "Fengqian.Gao", + "emails": [ + "fengqian.gao@intel.com" + ] + }, + { + "launchpad_id": "dukov", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Dmitry Ukov", + "emails": [ + "dukov@mirantis.com" + ] + }, + { + "launchpad_id": "academicgareth", + "companies": [ + { + "company_name": "UnitedStack", + "end_date": null + } + ], + "user_name": "Kun Huang", + "emails": [ + "gareth@unitedstack.com", + "academicgareth@gmail.com" + ] + }, + { + "launchpad_id": "devcamcar", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Devin Carlen", + "emails": [ + "devcamcar@illian.local", + "devin.carlen@gmail.com" + ] + }, + { + "launchpad_id": "sileht", + "companies": [ + { + "company_name": "eNovance", + "end_date": null + } + ], + "user_name": "Mehdi Abaakouk", + "emails": [ + "mehdi.abaakouk@enovance.com" + ] + }, + { + "launchpad_id": "blk-u", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Brant Knudson", + "emails": [ + "bknudson@us.ibm.com" + ] + }, + { + "launchpad_id": "nicholas-mistry", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Nicholas Mistry", + "emails": [ + "nmistry@gmail.com" + ] + }, + { + "launchpad_id": "sandy-sandywalsh", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Sandy Walsh", + "emails": [ + "sandy@darksecretsoftware.com", + "sandy@sandywalsh.com" + ] + }, + { + "launchpad_id": "adjohn", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Adam Johnson", + "emails": [ + "adjohn@gmail.com" + ] + }, + { + "launchpad_id": "nikhil-komawar", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "nikhil komawar", + "emails": [ + "nikhil.komawar@rackspace.com" + ] + }, + { + "launchpad_id": "andrewsben", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "andrewsben", + "emails": [ + "andrewsben@gmail.com" + ] + }, + { + "launchpad_id": "xing-yang", + "companies": [ + { + "company_name": "EMC", + "end_date": null + } + ], + "user_name": "Xing Yang", + "emails": [ + "xing.yang@emc.com" + ] + }, + { + "launchpad_id": "fzylogic", + "companies": [ + { + "company_name": "DreamHost", + "end_date": null + } + ], + "user_name": "Jeremy Hanmer", + "emails": [ + "jeremy@dreamhost.com" + ] + }, + { + "launchpad_id": "calfonso", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Chris Alfonso", + "emails": [ + "calfonso@redhat.com" + ] + }, + { + "launchpad_id": "tpaszkowski", + "companies": [ + { + "company_name": "SUSE", + "end_date": null + } + ], + "user_name": "Tomasz Paszkowski", + "emails": [ + "tpaszkowski@suse.com" + ] + }, + { + "launchpad_id": "cbehrens", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Chris Behrens", + "emails": [ + "chris.behrens@rackspace.com", + "cbehrens@codestud.com", + "cbehrens+github@codestud.com" + ] + }, + { + "launchpad_id": "sulochan-acharya", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Sulochan Acharya", + "emails": [ + "sulochan@gmail.com", + "sulochan.acharya@rackspace.co.uk" + ] + }, + { + "launchpad_id": "mestery", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Kyle Mestery", + "emails": [ + "kmestery@cisco.com" + ] + }, + { + "launchpad_id": "jshepher", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Justin Shepherd", + "emails": [ + "galstrom21@gmail.com", + "jshepher@rackspace.com" + ] + }, + { + "launchpad_id": "tfukushima", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Taku Fukushima", + "emails": [ + "tfukushima@dcl.info.waseda.ac.jp" + ] + }, + { + "launchpad_id": "krum-spencer", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Spencer Krum", + "emails": [ + "nibz@cat.pdx.edu" + ] + }, + { + "launchpad_id": "boris-42", + "companies": [ + { + "company_name": "*independent", + "end_date": "2013-Apr-10" + }, + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Boris Pavlovic", + "emails": [ + "boris@pavlovic.me" + ] + }, + { + "launchpad_id": "renukaapte", + "companies": [ + { + "company_name": "Citrix", + "end_date": null + } + ], + "user_name": "Renuka Apte", + "emails": [ + "renuka.apte@citrix.com" + ] + }, + { + "launchpad_id": "xuhj", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Alex Xu", + "emails": [ + "xuhj@linux.vnet.ibm.com" + ] + }, + { + "launchpad_id": "michael-ogorman", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Michael O'Gorman", + "emails": [ + "michael.ogorman@gmail.com" + ] + }, + { + "launchpad_id": "philip-day", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Phil Day", + "emails": [ + "philip.day@hp.com" + ] + }, + { + "launchpad_id": "brian-rosmaita", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Brian Rosmaita", + "emails": [ + "brian.rosmaita@rackspace.com" + ] + }, + { + "launchpad_id": "pete5", + "companies": [ + { + "company_name": "Gridcentric", + "end_date": null + } + ], + "user_name": "Peter Feiner", + "emails": [ + "peter@gridcentric.ca" + ] + }, + { + "launchpad_id": "yinliu2", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Ying Liu", + "emails": [ + "yinliu2@cisco.com" + ] + }, + { + "launchpad_id": "david-perez5", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "David Subiros Perez", + "emails": [ + "david.perez5@hp.com" + ] + }, + { + "launchpad_id": "sross-7", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Solly Ross", + "emails": [ + "sross@redhat.com" + ] + }, + { + "launchpad_id": "dave-mcnally", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "David McNally", + "emails": [ + "dave.mcnally@hp.com" + ] + }, + { + "launchpad_id": "ruhe", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Ruslan Kamaldinov", + "emails": [ + "rkamaldinov@mirantis.com" + ] + }, + { + "launchpad_id": "dvaleriani", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Daniele Valeriani", + "emails": [ + "daniele@dvaleriani.net" + ] + }, + { + "launchpad_id": "ifarkas", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Imre Farkas", + "emails": [ + "ifarkas@redhat.com" + ] + }, + { + "launchpad_id": "doug-hellmann", + "companies": [ + { + "company_name": "DreamHost", + "end_date": null + } + ], + "user_name": "Doug Hellmann", + "emails": [ + "doug.hellmann@gmail.com", + "doug.hellmann@dreamhost.com" + ] + }, + { + "launchpad_id": "shardy", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Steven Hardy", + "emails": [ + "shardy@redhat.com" + ] + }, + { + "launchpad_id": "bgh", + "companies": [ + { + "company_name": "Nicira", + "end_date": null + } + ], + "user_name": "Brad Hall", + "emails": [ + "brad@nicira.com", + "bhall@nicira.com" + ] + }, + { + "launchpad_id": "hughsaunders", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Hugh Saunders", + "emails": [ + "hugh@wherenow.org" + ] + }, + { + "launchpad_id": "dtynan", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Dermot Tynan", + "emails": [ + "tynan@hp.com" + ] + }, + { + "launchpad_id": "dflorea", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Dan Florea", + "emails": [ + "dflorea@cisco.com" + ] + }, + { + "launchpad_id": "prasad-tanay", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Harsh Prasad", + "emails": [ + "prasad.tanay@gmail.com" + ] + }, + { + "launchpad_id": "carl-baldwin", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Carl Baldwin", + "emails": [ + "carl.baldwin@hp.com" + ] + }, + { + "launchpad_id": "lifeless", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Robert Collins", + "emails": [ + "robertc@robertcollins.net", + "rbtcollins@hp.com" + ] + }, + { + "launchpad_id": "shrutiranade38", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Shruti Ranade", + "emails": [ + "shrutiranade38@gmail.com" + ] + }, + { + "launchpad_id": "spzala", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Sahdev Zala", + "emails": [ + "spzala@us.ibm.com" + ] + }, + { + "launchpad_id": "sathish-nagappan", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "Sathish Nagappan", + "emails": [ + "sathish.nagappan@nebula.com" + ] + }, + { + "launchpad_id": "james-slagle", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "James Slagle", + "emails": [ + "james.slagle@gmail.com" + ] + }, + { + "launchpad_id": "jfehlig", + "companies": [ + { + "company_name": "SUSE", + "end_date": null + } + ], + "user_name": "Jim Fehlig", + "emails": [ + "jfehlig@suse.com" + ] + }, + { + "launchpad_id": "skraynev", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Sergey Kraynev", + "emails": [ + "skraynev@mirantis.com" + ] + }, + { + "launchpad_id": "slagun", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Stan Lagun", + "emails": [ + "slagun@mirantis.com" + ] + }, + { + "launchpad_id": "corywright", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Cory Wright", + "emails": [ + "corywright@gmail.com", + "cory.wright@rackspace.com" + ] + }, + { + "launchpad_id": "jdanjou", + "companies": [ + { + "company_name": "eNovance", + "end_date": null + } + ], + "user_name": "Julien Danjou", + "emails": [ + "julien@danjou.info", + "julien.danjou@enovance.com" + ] + }, + { + "launchpad_id": "yugsuo", + "companies": [ + { + "company_name": "UnitedStack", + "end_date": null + } + ], + "user_name": "Guangyu Suo", + "emails": [ + "yugsuo@gmail.com", + "guangyu@unitedstack.com" + ] + }, + { + "launchpad_id": "iwienand", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Ian Wienand", + "emails": [ + "iwienand@redhat.com" + ] + }, + { + "launchpad_id": "jtran", + "companies": [ + { + "company_name": "AT&T", + "end_date": null + } + ], + "user_name": "John Tran", + "emails": [ + "Tran", + "jtran@attinteractive.com", + "jhtran@att.com" + ] + }, + { + "launchpad_id": "hartsock", + "companies": [ + { + "company_name": "VMware", + "end_date": null + } + ], + "user_name": "Shawn Hartsock", + "emails": [ + "hartsocks@vmware.com" + ] + }, + { + "launchpad_id": "masumotok", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Kei Masumoto", + "emails": [ + "masumotok@nttdata.co.jp", + "root@openstack2-api", + "masumoto" + ] + }, + { + "launchpad_id": "jeffmilstea", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jeff Milstead", + "emails": [ + "jeffmilstea@gmail.com" + ] + }, + { + "launchpad_id": "shane-wang", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "Shane Wang", + "emails": [ + "shane.wang@intel.com" + ] + }, + { + "launchpad_id": "dan-prince", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Dan Prince", + "emails": [ + "dprince@redhat.com", + "dan.prince@rackspace.com" + ] + }, + { + "launchpad_id": "dperaza", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "David Peraza", + "emails": [ + "dperaza@linux.vnet.ibm.com" + ] + }, + { + "launchpad_id": "robin-norwood", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Robin Norwood", + "emails": [ + "robin.norwood@gmail.com" + ] + }, + { + "launchpad_id": "jay-clark", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jay Clark", + "emails": [ + "jay.clark@gmail.com" + ] + }, + { + "launchpad_id": "farrellee", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Matthew Farrellee", + "emails": [ + "matt@redhat.com" + ] + }, + { + "launchpad_id": "jiajun-xu", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "jiajun xu", + "emails": [ + "jiajun.xu@intel.com" + ] + }, + { + "launchpad_id": "y-derek", + "companies": [ + { + "company_name": "University of Maryland", + "end_date": null + } + ], + "user_name": "Derek Yarnell", + "emails": [ + "derek@umiacs.umd.edu" + ] + }, + { + "launchpad_id": "letterj", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jay Payne", + "emails": [ + "letterj@racklabs.com", + "letterj@gmail.com" + ] + }, + { + "launchpad_id": "ironcamel", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Naveed Massjouni", + "emails": [ + "naveedm9@gmail.com", + "naveed.massjouni@rackspace.com" + ] + }, + { + "launchpad_id": "slicknik", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Nikhil Manchanda", + "emails": [ + "slicknik@gmail.com" + ] + }, + { + "launchpad_id": "somikbehera", + "companies": [ + { + "company_name": "Nicira", + "end_date": null + } + ], + "user_name": "Somik Behera", + "emails": [ + "somikbehera@gmail.com", + "somik@nicira.com" + ] + }, + { + "launchpad_id": "krishna1256", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Sai Krishna Sripada", + "emails": [ + "krishna1256@gmail.com" + ] + }, + { + "launchpad_id": "colinmcnamara", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Colin McNamara", + "emails": [ + "colin@2cups.com" + ] + }, + { + "launchpad_id": "rmoore08", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Ryan Moore", + "emails": [ + "rmoore08@gmail.com", + "ryan.moore@hp.com" + ] + }, + { + "launchpad_id": "nati-ueno", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Nachi Ueno", + "emails": [ + "nachi@nttmcl.com", + "nachi@ntti3.com" + ] + }, + { + "launchpad_id": "alyseo", + "companies": [ + { + "company_name": "Alyseo", + "end_date": null + } + ], + "user_name": "Alyseo", + "emails": [ + "openstack@alyseo.com" + ] + }, + { + "launchpad_id": "ahaldin", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Anton Haldin", + "emails": [ + "ahaldin@griddynamics.com" + ] + }, + { + "launchpad_id": "corcornelisse", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Cor Cornelisse", + "emails": [ + "cor@hyves.nl" + ] + }, + { + "launchpad_id": "milner", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Mike Milner", + "emails": [ + "mike.milner@canonical.com" + ] + }, + { + "launchpad_id": "eyerediskin", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Sergey Skripnick", + "emails": [ + "sskripnick@mirantis.com" + ] + }, + { + "launchpad_id": "zyuan", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Zhihao Yuan", + "emails": [ + "zhihao.yuan@rackspace.com" + ] + }, + { + "launchpad_id": "obondarev", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Oleg Bondarev", + "emails": [ + "obondarev@mirantis.com" + ] + }, + { + "launchpad_id": "bnemec", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Ben Nemec", + "emails": [ + "bnemec@us.ibm.com" + ] + }, + { + "launchpad_id": "ashwini-shukla", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Ashwini Shukla", + "emails": [ + "ashwini.shukla@rackspace.com" + ] + }, + { + "launchpad_id": "0xffea", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "David H\u00f6ppner", + "emails": [ + "0xffea@gmail.com" + ] + }, + { + "launchpad_id": "derek-morton", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Derek Morton", + "emails": [ + "derek.morton25@gmail.com", + "derek@networkwhisperer.com" + ] + }, + { + "launchpad_id": "jdurgin", + "companies": [ + { + "company_name": "Inktank", + "end_date": null + } + ], + "user_name": "Josh Durgin", + "emails": [ + "joshd@hq.newdream.net", + "josh.durgin@dreamhost.com", + "josh.durgin@inktank.com" + ] + }, + { + "launchpad_id": "aababilov", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Alessio Ababilov", + "emails": [ + "aababilo@yahoo-inc.com", + "ilovegnulinux@gmail.com", + "aababilov@griddynamics.com" + ] + }, + { + "launchpad_id": "ghe.rivero", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Ghe Rivero", + "emails": [ + "ghe.rivero@hp.com", + "ghe@debian.org", + "ghe.rivero@gmail.com", + "ghe.rivero@stackops.com" + ] + }, + { + "launchpad_id": "frodenas", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Ferran Rodenas", + "emails": [ + "frodenas@gmail.com" + ] + }, + { + "launchpad_id": "ljjjustin", + "companies": [ + { + "company_name": "UnitedStack", + "end_date": null + } + ], + "user_name": "Jiajun Liu", + "emails": [ + "iamljj@gmail.com", + "jiajun@unitedstack.com" + ] + }, + { + "launchpad_id": "gz", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Martin Packman", + "emails": [ + "martin.packman@canonical.com" + ] + }, + { + "launchpad_id": "torgomatic", + "companies": [ + { + "company_name": "SwiftStack", + "end_date": null + } + ], + "user_name": "Samuel Merritt", + "emails": [ + "spam@andcheese.org", + "sam@swiftstack.com" + ] + }, + { + "launchpad_id": "corvus", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "James E. Blair", + "emails": [ + "corvus@gnu.org", + "corvus@inaugust.com", + "jeblair@hp.com", + "james.blair@rackspace.com" + ] + }, + { + "launchpad_id": "learnerever", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "TengLi", + "emails": [ + "learnerever@gmail.com" + ] + }, + { + "launchpad_id": "cmsj", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Chris Jones", + "emails": [ + "cmsj@tenshu.net" + ] + }, + { + "launchpad_id": "rlucio", + "companies": [ + { + "company_name": "Internap", + "end_date": null + } + ], + "user_name": "Ryan Lucio", + "emails": [ + "rlucio@internap.com" + ] + }, + { + "launchpad_id": "robert-myers", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Robert Myers", + "emails": [ + "robert_myers@earthlink.net", + "robert.myers@rackspace.com" + ] + }, + { + "launchpad_id": "zhang-hare", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Edward", + "emails": [ + "zhuadl@cn.ibm.com" + ] + }, + { + "launchpad_id": "dmodium", + "companies": [ + { + "company_name": "Information Sciences Institute", + "end_date": null + } + ], + "user_name": "Devendra", + "emails": [ + "dmodium@isi.edu" + ] + }, + { + "launchpad_id": "leekelby", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "leekelby", + "emails": [ + "leekelby@gmail.com" + ] + }, + { + "launchpad_id": "bcwaldon", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "Brian Waldon", + "emails": [ + "brian.waldon@rackspace.com", + "bcwaldon@gmail.com" + ] + }, + { + "launchpad_id": "smoser", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Scott Moser", + "emails": [ + "smoser@brickies.net", + "smoser@canonical.com", + "scott.moser@canonical.com", + "ssmoser2@gmail.com", + "smoser@ubuntu.com" + ] + }, + { + "launchpad_id": "robert-van-leeuwen", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Robert van Leeuwen", + "emails": [ + "robert.vanleeuwen@spilgames.com" + ] + }, + { + "launchpad_id": "duncan-thomas", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Duncan Thomas", + "emails": [ + "duncan.thomas@hp.com", + "duncan.thomas@gmail.com" + ] + }, + { + "launchpad_id": "sasimpson", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Scott Simpson", + "emails": [ + "sasimpson@gmail.com" + ] + }, + { + "launchpad_id": "xingzhou", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "xingzhou", + "emails": [ + "xingzhou@cn.ibm.com" + ] + }, + { + "launchpad_id": "roland-hochmuth-s", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Roland Hochmuth", + "emails": [ + "roland.hochmuth@hp.com" + ] + }, + { + "launchpad_id": "xtoddx", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "Todd Willey", + "emails": [ + "todd@lapex", + "todd@ansolabs.com", + "todd@rubidine.com", + "xtoddx@gmail.com" + ] + }, + { + "launchpad_id": "mvoelker", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Mark T. Voelker", + "emails": [ + "mvoelker@cisco.com" + ] + }, + { + "launchpad_id": "dradez", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Dan Radez", + "emails": [ + "dradez@redhat.com" + ] + }, + { + "launchpad_id": "andrewbogott", + "companies": [ + { + "company_name": "Wikimedia Foundation", + "end_date": null + } + ], + "user_name": "Andrew Bogott", + "emails": [ + "abogott@wikimedia.org", + "Bogott" + ] + }, + { + "launchpad_id": "seif", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Seif Lotfy", + "emails": [ + "s.lotfy@telekom.de" + ] + }, + { + "launchpad_id": "oliver-leahy-l", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Ollie Leahy", + "emails": [ + "oliver.leahy@hp.com" + ] + }, + { + "launchpad_id": "rohara", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Ryan O'Hara", + "emails": [ + "rohara@redhat.com" + ] + }, + { + "launchpad_id": "tmello", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Tiago Rodrigues de Mello", + "emails": [ + "tmello@linux.vnet.ibm.com" + ] + }, + { + "launchpad_id": "james-branen", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Jim Branen", + "emails": [ + "james.branen@hp.com" + ] + }, + { + "launchpad_id": "bfilippov", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Boris Filippov", + "emails": [ + "bfilippov@griddynamics.com" + ] + }, + { + "launchpad_id": "david-lyle", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "David Lyle", + "emails": [ + "david.lyle@hp.com" + ] + }, + { + "launchpad_id": "gagupta", + "companies": [ + { + "company_name": "Denali Systems", + "end_date": null + } + ], + "user_name": "Gaurav Gupta", + "emails": [ + "gaurav@denali-systems.com" + ] + }, + { + "launchpad_id": "eddie-sheffield", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Eddie Sheffield", + "emails": [ + "eddie.sheffield@rackspace.com" + ] + }, + { + "launchpad_id": "sleepsonthefloor", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "Anthony Young", + "emails": [ + "sleepsonthefloor@gmail.com", + "root@tonbuntu" + ] + }, + { + "launchpad_id": "kannan", + "companies": [ + { + "company_name": "Rightscale", + "end_date": null + } + ], + "user_name": "Kannan Manickam", + "emails": [ + "arangamani.kannan@gmail.com" + ] + }, + { + "launchpad_id": "russellb", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Russell Bryant", + "emails": [ + "russell@russellbryant.net", + "rbryant@redhat.com" + ] + }, + { + "launchpad_id": "jake-hyperboledesign", + "companies": [ + { + "company_name": "Nebula", + "end_date": null + } + ], + "user_name": "jakedahn", + "emails": [ + "admin@jakedahn.com", + "jake@ansolabs.com" + ] + }, + { + "launchpad_id": "v-joseph", + "companies": [ + { + "company_name": "Cloudscaling", + "end_date": null + } + ], + "user_name": "Joseph Glanville", + "emails": [ + "joseph@cloudscaling.com" + ] + }, + { + "launchpad_id": "tagliapietra.alessandro", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Alessandro Tagliapietra", + "emails": [ + "tagliapietra.alessandro@gmail.com" + ] + }, + { + "launchpad_id": "eharney", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Eric Harney", + "emails": [ + "eharney@redhat.com", + "eharney@gmail.com" + ] + }, + { + "launchpad_id": "garyk", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Gary Kotton", + "emails": [ + "gkotton@redhat.com" + ] + }, + { + "launchpad_id": "shengjie-min", + "companies": [ + { + "company_name": "Dell", + "end_date": null + } + ], + "user_name": "Shengjie Min", + "emails": [ + "shengjie_min@dell.com" + ] + }, + { + "launchpad_id": "u-matt-h", + "companies": [ + { + "company_name": "Cloudscaling", + "end_date": null + } + ], + "user_name": "Matthew Hooker", + "emails": [ + "matt@cloudscaling.com" + ] + }, + { + "launchpad_id": "jiangy", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jiang Yong", + "emails": [ + "jiangyong.hn@gmail.com" + ] + }, + { + "launchpad_id": "bkerensa", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Benjamin Kerensa", + "emails": [ + "bkerensa@ubuntu.com" + ] + }, + { + "launchpad_id": "pschaef", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Patrick Schaefer", + "emails": [ + "pschaef@de.ibm.com" + ] + }, + { + "launchpad_id": "avishayb", + "companies": [ + { + "company_name": "Radware", + "end_date": null + } + ], + "user_name": "Avishay Balderman", + "emails": [ + "avishayb@radware.com" + ] + }, + { + "launchpad_id": "chemikadze", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Nikolay Sokolov", + "emails": [ + "Sokolov", + "nsokolov@griddynamics.com", + "nsokolov@griddynamics.net", + "chemikadze@gmail.com" + ] + }, + { + "launchpad_id": "imain", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Ian Main", + "emails": [ + "imain@redhat.com" + ] + }, + { + "launchpad_id": "likitha-shetty", + "companies": [ + { + "company_name": "Citrix", + "end_date": null + } + ], + "user_name": "Likitha Shetty", + "emails": [ + "likitha.shetty@citrix.com" + ] + }, + { + "launchpad_id": "wdec-ietf", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Wojciech Dec", + "emails": [ + "wdec.ietf@gmail.com" + ] + }, + { + "launchpad_id": "asakhnov", + "companies": [ + { + "company_name": "Mirantis", + "end_date": null + } + ], + "user_name": "Alexander Sakhnov", + "emails": [ + "asakhnov@mirantis.com" + ] + }, + { + "launchpad_id": "clay-gerrard", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "clayg", + "emails": [ + "clay.gerrard@rackspace.com", + "clayg@clayg-desktop", + "clay.gerrard@gmail.com" + ] + }, + { + "launchpad_id": "soheil-h-y", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Soheil Hassas Yeganeh", + "emails": [ + "soheil@cs.toronto.edu" + ] + }, + { + "launchpad_id": "ywang19", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "yaguang wang", + "emails": [ + "yaguang.wang@intel.com" + ] + }, + { + "launchpad_id": "danehans", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Daneyon Hansen", + "emails": [ + "danehans@cisco.com" + ] + }, + { + "launchpad_id": "heut2008", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Yaguang Tang", + "emails": [ + "yaguang.tang@canonical.com", + "heut2008@gmail.com" + ] + }, + { + "launchpad_id": "crayz", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Allan Feid", + "emails": [ + "allanfeid@gmail.com" + ] + }, + { + "launchpad_id": "yunhong-jiang", + "companies": [ + { + "company_name": "Intel", + "end_date": null + } + ], + "user_name": "jiang, yunhong", + "emails": [ + "yunhong.jiang@intel.com" + ] + }, + { + "launchpad_id": "david-kranz", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "David Kranz", + "emails": [ + "david.kranz@qrclab.com" + ] + }, + { + "launchpad_id": "tzumainn", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Tzu-Mainn Chen", + "emails": [ + "tzumainn@redhat.com" + ] + }, + { + "launchpad_id": "adalbas", + "companies": [ + { + "company_name": "IBM", + "end_date": null + } + ], + "user_name": "Adalberto Medeiros", + "emails": [ + "adalbas@linux.vnet.ibm.com" + ] + }, + { + "launchpad_id": "skuicloud", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Kui Shi", + "emails": [ + "skuicloud@gmail.com" + ] + }, + { + "launchpad_id": "philip-knouff", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Philip Knouff", + "emails": [ + "philip.knouff@mailtrust.com", + "Knouff" + ] + }, + { + "launchpad_id": "jamesli-olsf", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "James Li", + "emails": [ + "yueli.m@gmail.com" + ] + }, + { + "launchpad_id": "mshuler", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Michael Shuler", + "emails": [ + "mshuler@rackspace.com" + ] + }, + { + "launchpad_id": "tomoe", + "companies": [ + { + "company_name": "Midokura", + "end_date": null + } + ], + "user_name": "Tomoe Sugihara", + "emails": [ + "tomoe@midokura.com" + ] + }, + { + "launchpad_id": "nsavin", + "companies": [ + { + "company_name": "Grid Dynamics", + "end_date": null + } + ], + "user_name": "Nikita Savin", + "emails": [ + "nsavin@griddynamics.com" + ] + }, + { + "launchpad_id": "jakedahn", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jake Dahn", + "emails": [ + "jake@markupisart.com" + ] + }, + { + "launchpad_id": "jdenisco", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "John DeNisco", + "emails": [ + "jdenisco@cisco.com" + ] + }, + { + "launchpad_id": "hayashi", + "companies": [ + { + "company_name": "NTT", + "end_date": null + } + ], + "user_name": "Toshiyuki Hayashi", + "emails": [ + "hayashi@nttmcl.com" + ] + }, + { + "launchpad_id": "ndipanov", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Nikola \u0110ipanov", + "emails": [ + "ndipanov@redhat.com" + ] + }, + { + "launchpad_id": "oomichi", + "companies": [ + { + "company_name": "NEC", + "end_date": null + } + ], + "user_name": "Ken'ichi Ohmichi", + "emails": [ + "oomichi@mxs.nes.nec.co.jp" + ] + }, + { + "launchpad_id": "tylern-u", + "companies": [ + { + "company_name": "Piston Cloud", + "end_date": null + } + ], + "user_name": "Tyler North", + "emails": [ + "tylern@pistoncloud.com" + ] + }, + { + "launchpad_id": "hyerle", + "companies": [ + { + "company_name": "HP", + "end_date": null + } + ], + "user_name": "Robert Hyerle", + "emails": [ + "hyerle@hp.com" + ] + }, + { + "launchpad_id": "leanderbb", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Leander Beernaert", + "emails": [ + "leanderbb@gmail.com" + ] + }, + { + "launchpad_id": "kost-isi", + "companies": [ + { + "company_name": "Information Sciences Institute", + "end_date": null + } + ], + "user_name": "Kost", + "emails": [ + "kost@isi.edu" + ] + }, + { + "launchpad_id": "jorgew", + "companies": [ + { + "company_name": "Rackspace", + "end_date": null + } + ], + "user_name": "Jorge L. Williams", + "emails": [ + "jorge.williams@rackspace.com" + ] + }, + { + "launchpad_id": "jeffjapan", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Jeffrey Wilcox", + "emails": [ + "jeffjapan@gmail.com" + ] + }, + { + "launchpad_id": "gandelman-a", + "companies": [ + { + "company_name": "Canonical", + "end_date": null + } + ], + "user_name": "Adam Gandelman", + "emails": [ + "adam.gandelman@canonical.com", + "adamg@canonical.com" + ] + }, + { + "launchpad_id": "tylesmit", + "companies": [ + { + "company_name": "Cisco Systems", + "end_date": null + } + ], + "user_name": "Tyler Smith", + "emails": [ + "tylesmit@cisco.com" + ] + }, + { + "launchpad_id": "vuntz", + "companies": [ + { + "company_name": "SUSE", + "end_date": null + } + ], + "user_name": "Vincent Untz", + "emails": [ + "vuntz@suse.com" + ] + }, + { + "launchpad_id": "irenab", + "companies": [ + { + "company_name": "Mellanox", + "end_date": null + } + ], + "user_name": "Irena Berezovsky", + "emails": [ + "irenab@mellanox.com" + ] + }, + { + "launchpad_id": "vipuls", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Vipul Sabhaya", + "emails": [ + "vipuls@gmail.com" + ] + }, + { + "launchpad_id": "mtaylor-s", + "companies": [ + { + "company_name": "Red Hat", + "end_date": null + } + ], + "user_name": "Martyn Taylor", + "emails": [ + "mtaylor@redhat.com" + ] + }, + { + "launchpad_id": "nelson-crynwr", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Russ Nelson", + "emails": [ + "nelson@nelson-laptop", + "nelson@crynwr.com", + "russ@crynwr.com" + ] + }, + { + "launchpad_id": "zaitcev", + "companies": [ + { + "company_name": "*independent", + "end_date": null + } + ], + "user_name": "Pete Zaitcev", + "emails": [ + "zaitcev@kotori.zaitcev.us" + ] + } + ], + + "companies": [ + { + "company_name": "*independent", + "domains": [""] + }, + { + "domains": ["99cloud.net"], + "company_name": "99cloud" + }, + { + "domains": ["attinteractive.com", "att.com"], + "company_name": "AT&T" + }, + { + "domains": ["alyseo.com"], + "company_name": "Alyseo" + }, + { + "domains": ["aristanetworks.com"], + "company_name": "Arista Networks" + }, + { + "domains": ["atomia.com"], + "company_name": "Atomia" + }, + { + "domains": ["b1-systems.de"], + "company_name": "B1 Systems" + }, + { + "domains": ["bigswitch.com"], + "company_name": "Big Switch Networks" + }, + { + "domains": ["brocade.com"], + "company_name": "Brocade" + }, + { + "domains": ["bull.net"], + "company_name": "Bull" + }, + { + "domains": ["cern.ch"], + "company_name": "CERN" + }, + { + "domains": ["crs4.it"], + "company_name": "CRS4" + }, + { + "domains": ["canonical.com"], + "company_name": "Canonical" + }, + { + "domains": ["cisco.com"], + "company_name": "Cisco Systems" + }, + { + "domains": ["citrix.com"], + "company_name": "Citrix" + }, + { + "domains": ["cloud.com"], + "company_name": "Citrix Systems" + }, + { + "domains": ["cloudvps.com"], + "company_name": "CloudVPS" + }, + { + "domains": ["cloudbau.de"], + "company_name": "Cloudbau" + }, + { + "domains": ["cloudscaling.com"], + "company_name": "Cloudscaling" + }, + { + "domains": ["3ds.com"], + "company_name": "Dassault Syst\u00e8mes" + }, + { + "domains": ["Dell.com", "software.dell.com", "dell.com"], + "company_name": "Dell" + }, + { + "domains": ["denali-systems.com"], + "company_name": "Denali Systems" + }, + { + "domains": ["dreamhost.com"], + "company_name": "DreamHost" + }, + { + "domains": ["emc.com"], + "company_name": "EMC" + }, + { + "domains": ["fathomdb.com"], + "company_name": "FathomDB" + }, + { + "domains": ["griddynamics.com"], + "company_name": "Grid Dynamics" + }, + { + "domains": ["gridcentric.ca", "gridcentric.com"], + "company_name": "Gridcentric" + }, + { + "domains": ["hp.com"], + "company_name": "HP" + }, + { + "domains": ["hds.com"], + "company_name": "Hitachi" + }, + { + "domains": ["huawei.com"], + "company_name": "Huawei" + }, + { + "domains": ["linux.vnet.ibm.com", "ibm.com"], + "company_name": "IBM" + }, + { + "domains": ["igbmc.fr"], + "company_name": "IGBMC" + }, + { + "domains": ["ispras.ru"], + "company_name": "ISP RAS" + }, + { + "domains": ["isi.edu"], + "company_name": "Information Sciences Institute" + }, + { + "domains": ["inktank.com"], + "company_name": "Inktank" + }, + { + "domains": ["intel.com"], + "company_name": "Intel" + }, + { + "domains": ["internap.com"], + "company_name": "Internap" + }, + { + "domains": ["kt.com"], + "company_name": "KT Corporation" + }, + { + "domains": ["kth.se"], + "company_name": "Kungliga Tekniska h\u00f6gskolan" + }, + { + "domains": ["lahondaresearch.org"], + "company_name": "La Honda Research" + }, + { + "domains": ["locaweb.com.br"], + "company_name": "Locaweb" + }, + { + "domains": ["maginatics.com"], + "company_name": "Maginatics" + }, + { + "domains": ["managedit.ie"], + "company_name": "Managed IT" + }, + { + "domains": ["mellanox.com"], + "company_name": "Mellanox" + }, + { + "domains": ["memset.com"], + "company_name": "Memset" + }, + { + "domains": ["metacloud.com"], + "company_name": "Metacloud" + }, + { + "domains": ["midokura.com", "midokura.jp"], + "company_name": "Midokura" + }, + { + "domains": ["mirantis.com", "mirantis.ru"], + "company_name": "Mirantis" + }, + { + "domains": ["momentumsi.com"], + "company_name": "MomentumSI" + }, + { + "domains": ["nasa.gov"], + "company_name": "NASA" + }, + { + "domains": ["cq.jp.nec.com", "da.jp.nec.com", "mxw.nes.nec.co.jp", "nec.co.jp", "mxd.nes.nec.co.jp"], + "company_name": "NEC" + }, + { + "domains": ["nttmcl.com", "nttdata.co.jp", "ntt.com", "ntt.co.jp", "nttdata.com", "vertex.co.in"], + "company_name": "NTT" + }, + { + "domains": ["nebula.com", "ansolabs.com"], + "company_name": "Nebula" + }, + { + "domains": ["netapp.com"], + "company_name": "NetApp" + }, + { + "domains": ["nexenta.com"], + "company_name": "Nexenta" + }, + { + "domains": ["nicira.com"], + "company_name": "Nicira" + }, + { + "domains": ["nimbisservices.com"], + "company_name": "Nimbis Services" + }, + { + "domains": ["pistoncloud.com"], + "company_name": "Piston Cloud" + }, + { + "domains": ["rackspace.co.uk", "rackspace.com"], + "company_name": "Rackspace" + }, + { + "domains": ["radware.com"], + "company_name": "Radware" + }, + { + "domains": ["ravellosystems.com"], + "company_name": "Ravello Systems" + }, + { + "domains": ["gluster.com", "redhat.com"], + "company_name": "Red Hat" + }, + { + "domains": ["sina.com"], + "company_name": "SINA" + }, + { + "domains": ["suse.cz", "suse.de", "suse.com"], + "company_name": "SUSE" + }, + { + "domains": ["sdsc.edu"], + "company_name": "San Diego Supercomputer Center" + }, + { + "domains": ["scality.com"], + "company_name": "Scality" + }, + { + "domains": ["solidfire.com"], + "company_name": "SolidFire" + }, + { + "domains": ["pednape"], + "company_name": "StackOps" + }, + { + "domains": ["swiftstack.com"], + "company_name": "SwiftStack" + }, + { + "domains": ["guardian.co.uk"], + "company_name": "The Guardian" + }, + { + "domains": ["thoughtworks.com"], + "company_name": "ThoughtWorks" + }, + { + "domains": ["ustack.com", "unitedstack.com"], + "company_name": "UnitedStack" + }, + { + "domains": ["umd.edu"], + "company_name": "University of Maryland" + }, + { + "domains": ["unimelb.edu.au"], + "company_name": "University of Melbourne" + }, + { + "domains": ["valinux.co.jp"], + "company_name": "VA Linux" + }, + { + "domains": ["vmware.com"], + "company_name": "VMware" + }, + { + "domains": ["vexxhost.com"], + "company_name": "VexxHost" + }, + { + "domains": ["virtualtech.jp"], + "company_name": "Virtualtech" + }, + { + "domains": ["wikimedia.org"], + "company_name": "Wikimedia Foundation" + }, + { + "domains": ["yahoo-inc.com"], + "company_name": "Yahoo!" + }, + { + "domains": ["zadarastorage.com"], + "company_name": "Zadara Storage" + }, + { + "domains": ["enovance.com"], + "company_name": "eNovance" + } + ], + + "repos": [ + { + "branches": ["master"], + "name": "Neutron Client", + "type": "core", + "uri": "git://github.com/openstack/python-neutronclient.git", + "releases": [ + { + "release_name": "Folsom", + "tag_from": "folsom-1", + "tag_to": "2.1" + }, + { + "release_name": "Grizzly", + "tag_from": "2.1", + "tag_to": "2.2.1" + }, + { + "release_name": "Havana", + "tag_from": "2.2.1", + "tag_to": "HEAD" + } + ] + }, + { + "branches": ["master"], + "name": "Keystone", + "type": "core", + "uri": "git://github.com/openstack/keystone.git", + "releases": [ + { + "release_name": "Essex", + "tag_from": "2011.3", + "tag_to": "2012.1" + }, + { + "release_name": "Folsom", + "tag_from": "2012.1", + "tag_to": "2012.2" + }, + { + "release_name": "Grizzly", + "tag_from": "2012.2", + "tag_to": "2013.1" + }, + { + "release_name": "Havana", + "tag_from": "2013.1", + "tag_to": "HEAD" + } + ] + }, + { + "branches": ["master"], + "name": "Murano API", + "type": "stackforge", + "uri": "git://github.com/stackforge/murano-api.git", + "releases": [ + { + "release_name": "Havana", + "tag_from": "0.1", + "tag_to": "HEAD" + } + ] + } + ], + + "releases": [ + { + "release_name": "ALL", + "start_date": "2010-May-01", + "end_date": "now" + }, + { + "release_name": "Essex", + "start_date": "2011-Oct-01", + "end_date": "2012-Apr-01" + }, + { + "release_name": "Folsom", + "start_date": "2012-Apr-01", + "end_date": "2012-Oct-01" + }, + { + "release_name": "Grizzly", + "start_date": "2012-Oct-01", + "end_date": "2013-Apr-01" + }, + { + "release_name": "Havana", + "start_date": "2013-Apr-01", + "end_date": "now" + } + ] + +} \ No newline at end of file diff --git a/etc/domain-company b/etc/domain-company deleted file mode 100644 index 5b428140a..000000000 --- a/etc/domain-company +++ /dev/null @@ -1,94 +0,0 @@ -# domain employer [< yyyy-mm-dd] -3ds.com Dassault Systèmes -99cloud.net 99cloud -alyseo.com Alyseo -ansolabs.com Rackspace < 2012-07-20 -ansolabs.com Nebula -atomia.com Atomia -att.com AT&T -attinteractive.com AT&T -bigswitch.com Big Switch Networks -b1-systems.de BL Systems -brocade.com Brocade -bull.net Bull -canonical.com Canonical -cern.ch CERN -cisco.com Cisco Systems -citrix.com Citrix -cloud.com Citrix Systems -cloudbau.de Cloudbau -cloudscaling.com Cloudscaling -dell.com Dell -Dell.com Dell -denali-systems.com Denali Systems -dreamhost.com DreamHost -emc.com EMC -enovance.com eNovance -fathomdb.com FathomDB -gluster.com Red Hat -griddynamics.com Grid Dynamics -guardian.co.uk The Guardian -hds.com Hitachi -hp.com HP -huawei.com Huawei -ibm.com IBM -inktank.com Inktank -intel.com Intel -internap.com Internap -isi.edu University of Southern Carolina -ispras.ru ISP RAS -kt.com KT Corporation -kth.se Kungliga Tekniska högskolan -linux.vnet.ibm.com IBM -locaweb.com.br Locaweb -lahondaresearch.org La Honda Research -managedit.ie Managed IT -mellanox.com Mellanox -memset.com Memset -metacloud.com Metacloud -midokura.com Midokura -midokura.jp Midokura -mirantis.com Mirantis -mirantis.ru Mirantis -nasa.gov NASA -nebula.com Nebula -nexenta.com Nexenta -nec.co.jp NEC -cq.jp.nec.com NEC -da.jp.nec.com NEC -mxw.nes.nec.co.jp NEC -mxd.nes.nec.co.jp NEC -netapp.com NetApp -nicira.com Nicira -nimbisservices.com Nimbis Services -ntt.co.jp NTT -ntt.com NTT -nttdata.com NTT -nttdata.co.jp NTT -nttmcl.com NTT -vertex.co.in NTT -pednape StackOps -pistoncloud.com Piston Cloud -rackspace.co.uk Rackspace -rackspace.com Rackspace -radware.com Radware -redhat.com Red Hat -scality.com Scality -sdsc.edu San Diego Supercomputer Center -sina.com SINA -software.dell.com Dell -solidfire.com SolidFire -suse.de SUSE -suse.com SUSE -suse.cz SUSE -swiftstack.com SwiftStack -thoughtworks.com ThoughtWorks -umd.edu University of Maryland -unimelb.edu.au University of Melbourne -valinux.co.jp VA Linux -vexxhost.com VexxHost -virtualtech.jp Virtualtech -vmware.com VMware -wikimedia.org Wikimedia Foundation -yahoo-inc.com Yahoo! -zadarastorage.com Zadara Storage diff --git a/etc/email-aliases b/etc/email-aliases deleted file mode 100644 index 94e2a0090..000000000 --- a/etc/email-aliases +++ /dev/null @@ -1,257 +0,0 @@ -armamig@gmail.com Armando.Migliaccio@eu.citrix.com -yogesh.srikrishnan@rackspace.com yogesh.srikrishnan@rackspace.com -emagana@gmail.com eperdomo@cisco.com eperdomo@dhcp-171-71-119-164.cisco.com -jeblair@hp.com jeblair@openstack.org -rohitgarwalla@gmail.com roagarwa@cisco.com -shweta.ap05@gmail.com shpadubi@cisco.com -e0ne@e0ne.info ikolodyazhny@mirantis.com -santhosh.m@thoughtworks.com santhom@thoughtworks.com -john.garbutt@citrix.com john.garbutt@rackspace.com -thingee@gmail.com mike.perez@dreamhost.com -duncan.thomas@gmail.com duncan.thomas@hp.com -adamg@canonical.com adam.gandelman@canonical.com -admin@jakedahn.com jake@ansolabs.com -amesserl@rackspace.com ant@openstack.org -amigliaccio@internap.com Armando.Migliaccio@eu.citrix.com -andrew@cloudscaling.com acs@parvuscaptus.com -anne.gentle@rackspace.com anne@openstack.org -anne@openstack.org anne@openstack.org -armando.migliaccio@citrix.com Armando.Migliaccio@eu.citrix.com -asomya@cisco.com asomya@cisco.com -bcwaldon@gmail.com brian.waldon@rackspace.com -bfschott@gmail.com bschott@isi.edu -Bogott abogott@wikimedia.org -brian.lamar@gmail.com brian.lamar@rackspace.com -brian.lamar@rackspace.com brian.lamar@rackspace.com -cbehrens@codestud.com cbehrens+github@codestud.com -cbehrens+github@codestud.com cbehrens+github@codestud.com -chiradeep@chiradeep-lt2 chiradeep@cloud.com -chmouel@chmouel.com chmouel.boudjnah@rackspace.co.uk -chmouel@enovance.com chmouel@chmouel.com -chris.behrens@rackspace.com cbehrens@codestud.com -chris@slicehost.com chris@pistoncloud.com -chuck.short@canonical.com zulcss@ubuntu.com -clayg@clayg-desktop clay.gerrard@gmail.com -clay.gerrard@gmail.com clay.gerrard@gmail.com -clay.gerrard@rackspace.com clay.gerrard@gmail.com -code@term.ie code@term.ie -corvus@gnu.org jeblair@hp.com -corvus@inaugust.com jeblair@hp.com -corywright@gmail.com cory.wright@rackspace.com -cory.wright@rackspace.com corywright@gmail.com -dan@nicira.com dan@nicira.com -dan.prince@rackspace.com dprince@redhat.com -danwent@dan-xs3-cs dan@nicira.com -danwent@gmail.com dan@nicira.com -Dave.Walker@Canonical.com dave.walker@canonical.com -DaveWalker@ubuntu.com dave.walker@canonical.com -DaveWalker@ubuntu.com Dave.Walker@canonical.com -david.goetz@gmail.com david.goetz@rackspace.com -david.hadas@gmail.com davidh@il.ibm.com -devcamcar@illian.local devin.carlen@gmail.com -devnull@brim.net gholt@rackspace.com -Dietz matt.dietz@rackspace.com -dolph.mathews@gmail.com dolph.mathews@rackspace.com -doug.hellmann@gmail.com doug.hellmann@dreamhost.com -dougw@sdsc.edu dweimer@gmail.com -dpgoetz@gmail.com david.goetz@rackspace.com -dt-github@xr7.org dtroyer@gmail.com -Édouard edouard.thuleau@orange.com -emellor@silver ewan.mellor@citrix.com -enugaev@griddynamics.com reldan@oscloud.ru -florian.hines@gmail.com syn@ronin.io -gaurav@gluster.com gaurav@gluster.com -ghe.rivero@gmail.com ghe@debian.org -ghe.rivero@stackops.com ghe@debian.org -gholt@brim.net gholt@rackspace.com -gihub@highbridgellc.com github@highbridgellc.com -github@anarkystic.com code@term.ie -github@anarkystic.com github@anarkystic.com -glange@rackspace.com greglange@gmail.com -greglange+launchpad@gmail.com greglange@gmail.com -heut2008@gmail.com yaguang.tang@canonical.com -higginsd@gmail.com derekh@redhat.com -ialekseev@griddynamics.com ilyaalekseyev@acm.org -ilya@oscloud.ru ilyaalekseyev@acm.org -itoumsn@shayol itoumsn@nttdata.co.jp -jake@ansolabs.com jake@ansolabs.com -jake@markupisart.com jake@ansolabs.com -james.blair@rackspace.com jeblair@hp.com -jaypipes@gmail.com jaypipes@gmail.com -jesse@aire.local anotherjesse@gmail.com -jesse@dancelamb anotherjesse@gmail.com -jesse@gigantor.local anotherjesse@gmail.com -jesse@ubuntu anotherjesse@gmail.com -jian.wen@ubuntu.com jian.wen@canonical.com -jkearney@nova.(none) josh@jk0.org -jkearney@nova.(none) josh.kearney@pistoncloud.com -jmckenty@joshua-mckentys-macbook-pro.local jmckenty@gmail.com -jmckenty@yyj-dhcp171.corp.flock.com jmckenty@gmail.com -joe@cloudscaling.com joe@swiftstack.com -johannes@compute3.221.st johannes.erdfelt@rackspace.com -johannes@erdfelt.com johannes.erdfelt@rackspace.com -john.dickinson@rackspace.com me@not.mn -john.eo@gmail.com john.eo@rackspace.com -john.griffith8@gmail.com john.griffith@solidfire.com -john.griffith@solidfire.com john.griffith@solidfire.com -josh@jk0.org josh.kearney@pistoncloud.com -josh.kearney@rackspace.com josh@jk0.org -josh.kearney@rackspace.com josh.kearney@pistoncloud.com -joshua.mckenty@nasa.gov jmckenty@gmail.com -jpipes@serialcoder jaypipes@gmail.com -jpipes@uberbox.gateway.2wire.net jaypipes@gmail.com -jsuh@bespin jsuh@isi.edu -jtran@attinteractive.com jhtran@att.com -julien.danjou@enovance.com julien@danjou.info -justin@fathomdb.com justin@fathomdb.com -justinsb@justinsb-desktop justin@fathomdb.com -kapil.foss@gmail.com kapil.foss@gmail.com -ken.pepple@rabbityard.com ken.pepple@gmail.com -ke.wu@nebula.com ke.wu@ibeca.me -khaled.hussein@gmail.com khaled.hussein@rackspace.com -Knouff philip.knouff@mailtrust.com -Kölker jason@koelker.net -kshileev@griddynamics.com kshileev@gmail.com -laner@controller rlane@wikimedia.org -letterj@racklabs.com letterj@gmail.com -liem.m.nguyen@gmail.com liem_m_nguyen@hp.com -liem.m.nguyen@hp.com liem_m_nguyen@hp.com -Lopez aloga@ifca.unican.es -lorin@isi.edu lorin@nimbisservices.com -lrqrun@gmail.com lrqrun@gmail.com -lzyeval@gmail.com zhongyue.nah@intel.com -marcelo.martins@rackspace.com btorch@gmail.com -masumotok@nttdata.co.jp masumotok@nttdata.co.jp -masumoto masumotok@nttdata.co.jp -matt.dietz@rackspace.com matt.dietz@rackspace.com -matthew.dietz@gmail.com matt.dietz@rackspace.com -matthewdietz@Matthew-Dietzs-MacBook-Pro.local matt.dietz@rackspace.com -McConnell bmcconne@rackspace.com -mdietz@openstack matt.dietz@rackspace.com -mgius7096@gmail.com launchpad@markgius.com -michael.barton@rackspace.com mike@weirdlooking.com -michael.still@canonical.com mikal@stillhq.com -mike-launchpad@weirdlooking.com mike@weirdlooking.com -Moore joelbm24@gmail.com -mordred@hudson mordred@inaugust.com -nati.ueno@gmail.com ueno.nachi@lab.ntt.co.jp -naveed.massjouni@rackspace.com naveedm9@gmail.com -nelson@nelson-laptop russ@crynwr.com -nirmal.ranganathan@rackspace.com rnirmal@gmail.com -nirmal.ranganathan@rackspace.coom rnirmal@gmail.com -nova@u4 ueno.nachi@lab.ntt.co.jp -nsokolov@griddynamics.net nsokolov@griddynamics.com -openstack@lab.ntt.co.jp ueno.nachi@lab.ntt.co.jp -paul@openstack.org paul@openstack.org -paul@substation9.com paul@openstack.org -paul.voccio@rackspace.com paul@openstack.org -pvoccio@castor.local paul@openstack.org -ramana@venus.lekha.org rjuvvadi@hcl.com -rclark@chat-blanc rick@openstack.org -renuka.apte@citrix.com renuka.apte@citrix.com -rick.harris@rackspace.com rconradharris@gmail.com -rick@quasar.racklabs.com rconradharris@gmail.com -root@bsirish.(none) sirish.bitra@gmail.com -root@debian.ohthree.com amesserl@rackspace.com -root@mirror.nasanebula.net vishvananda@gmail.com -root@openstack2-api masumotok@nttdata.co.jp -root@tonbuntu sleepsonthefloor@gmail.com -root@ubuntu vishvananda@gmail.com -rrjuvvadi@gmail.com rjuvvadi@hcl.com -salv.orlando@gmail.com salvatore.orlando@eu.citrix.com -sandy@sandywalsh.com sandy@darksecretsoftware.com -sandy@sandywalsh.com sandy.walsh@rackspace.com -sandy.walsh@rackspace.com sandy@darksecretsoftware.com -sandy.walsh@rackspace.com sandy.walsh@rackspace.com -sateesh.chodapuneedi@citrix.com sateesh.chodapuneedi@citrix.com -SB justin@fathomdb.com -sirish.bitra@gmail.com sirish.bitra@gmail.com -sleepsonthefloor@gmail.com sleepsonthefloor@gmail.com -Smith code@term.ie -Sokolov nsokolov@griddynamics.com -Somya asomya@cisco.com -soren.hansen@rackspace.com soren@linux2go.dk -soren@linux2go.dk soren.hansen@rackspace.com -soren@openstack.org soren.hansen@rackspace.com -sorhanse@cisco.com sorenhansen@rackspace.com -sorlando@nicira.com salvatore.orlando@eu.citrix.com -spam@andcheese.org sam@swiftstack.com -superstack@superstack.org justin@fathomdb.com -termie@preciousroy.local code@term.ie -thuleau@gmail.com edouard1.thuleau@orange.com -thuleau@gmail.com edouard.thuleau@orange.com -tim.simpson4@gmail.com tim.simpson@rackspace.com -todd@lapex todd@ansolabs.com -todd@rubidine.com todd@ansolabs.com -todd@rubidine.com xtoddx@gmail.com -tpatil@vertex.co.in tushar.vitthal.patil@gmail.com -Tran jtran@attinteractive.com -treyemorris@gmail.com trey.morris@rackspace.com -ttcl@mac.com troy.toman@rackspace.com -Ueno ueno.nachi@lab.ntt.co.jp -vishvananda@yahoo.com vishvananda@gmail.com -vito.ordaz@gmail.com victor.rodionov@nexenta.com -wenjianhn@gmail.com jian.wen@canonical.com -will.wolf@rackspace.com throughnothing@gmail.com -wwkeyboard@gmail.com aaron.lee@rackspace.com -xchu@redhat.com xychu2008@gmail.com -xtoddx@gmail.com todd@ansolabs.com -xyj.asmy@gmail.com xyj.asmy@gmail.com -yorik@ytaraday yorik.sar@gmail.com -YS vivek.ys@gmail.com -z-github@brim.net gholt@rackspace.com -ziad.sawalha@rackspace.com github@highbridgellc.com -z-launchpad@brim.net gholt@rackspace.com -derek.morton25@gmail.com derek@networkwhisperer.com -bartosz.gorski@ntti3.com bartosz.gorski@nttmcl.com -launchpad@chmouel.com chmouel@chmouel.com -launchpad@chmouel.com chmouel@enovance.com -launchpad@chmouel.com chmouel@openstack.org -imsplitbit@gmail.com dsalinas@rackspace.com -clint@fewbar.com clint.byrum@hp.com -clint@fewbar.com clint@ubuntu.com -sbaker@redhat.com steve@stevebaker.org -asalkeld@redhat.com angus@salkeld.id.au -evgeniy@afonichev.com eafonichev@mirantis.com -smoser@ubuntu.com scott.moser@canonical.com -smoser@ubuntu.com smoser@brickies.net -smoser@ubuntu.com smoser@canonical.com -smoser@ubuntu.com ssmoser2@gmail.com -jason@koelker.net jkoelker@rackspace.com -john.garbutt@rackspace.com john@johngarbutt.com -zhongyue.nah@intel.com lzyeval@gmail.com -jiajun@unitedstack.com iamljj@gmail.com -christophe.sauthier@ubuntu.com christophe.sauthier@gmail.com -christophe.sauthier@ubuntu.com christophe@sauthier.com -christophe.sauthier@objectif-libre.com christophe@sauthier.com -aababilov@griddynamics.com ilovegnulinux@gmail.com -yportnova@griddynamics.com yportnov@yahoo-inc.com -mkislins@yahoo-inc.com mkislinska@griddynamics.com -ryan.moore@hp.com rmoore08@gmail.com -starodubcevna@gmail.com nstarodubtsev@mirantis.com -lakhinder.walia@hds.com lakhindr@hotmail.com -kanzhe@gmail.com kanzhe.jiang@bigswitch.com -anita.kuno@enovance.com akuno@lavabit.com -me@frostman.ru slukjanov@mirantis.com -alexei.kornienko@gmail.com akornienko@mirantis.com -nicolas@barcet.com nick.barcet@canonical.com -nicolas@barcet.com nick@enovance.com -nicolas@barcet.com nijaba@ubuntu.com -graham.binns@canonical.com gmb@canonical.com -graham.binns@canonical.com gmb@grahambinns.com -graham.binns@canonical.com graham.binns@gmail.com -graham.binns@canonical.com graham@canonical.com -graham.binns@canonical.com graham@grahambinns.com -emilien.macchi@stackops.com emilien.macchi@enovance.com -emilien.macchi@stackops.com emilien@enovance.com -swann.croiset@bull.net swann@oopss.org -soulascedric@gmail.com cedric.soulas@cloudwatt.com -simon.pasquier@bull.net pasquier.simon+launchpad@gmail.com -simon.pasquier@bull.net pasquier.simon@gmail.com -bogorodskiy@gmail.com novel@FreeBSD.org -bogorodskiy@gmail.com rbogorodskiy@mirantis.com -svilgelm@mirantis.com sergey.vilgelm@gmail.com -robert.myers@rackspace.com robert_myers@earthlink.net -raymond_pekowski@dell.com pekowski@gmail.com -agorodnev@mirantis.com a.gorodnev@gmail.com -rprikhodchenko@mirantis.com me@romcheg.me diff --git a/etc/email-company b/etc/email-company deleted file mode 100644 index aa512d59e..000000000 --- a/etc/email-company +++ /dev/null @@ -1,17 +0,0 @@ -# user@domain employer -anotherjesse@gmail.com Nebula -bcwaldon@gmail.com Nebula -code@term.ie Nebula -dprince@redhat.com Red Hat -github@anarkystic.com Nebula -jake@ansolabs.com Nebula -jaypipes@gmail.com AT&T -jeblair@hp.com HP -lzyeval@gmail.com Intel -me@not.mn SwiftStack -mordred@inaugust.com HP -sleepsonthefloor@gmail.com Nebula -soren@linux2go.dk Cisco -vishvananda@gmail.com Nebula -dtroyer@gmail.com Nebula - diff --git a/etc/launchpad-company b/etc/launchpad-company deleted file mode 100644 index 809cd396d..000000000 --- a/etc/launchpad-company +++ /dev/null @@ -1,36 +0,0 @@ -tatyana-leontovich Grid Dynamics -vkhomenko Grid Dynamics -cthiel-suse DE Telekom -yorik-sar Mirantis -gelbuhos Mirantis -aababilov Grid Dynamics -alexpilotti Cloudbase Solutions -devananda HP -heckj Nebula -matt-sherborne Rackspace -michael-ogorman Cisco Systems -boris-42 Mirantis -boris-42 *independent < 2013-04-10 -victor-r-howard Comcast -amitry Comcast -scollins Comcast -w-emailme Comcast -jasondunsmore Rackspace -kannan Rightscale -bob-melander Cisco Systems -gabriel-hurley Nebula -mathrock National Security Agency -yosshy NEC -johngarbutt Rackspace -johngarbutt Citrix < 2013-02-01 -jean-baptiste-ransy Alyseo -darren-birkett Rackspace -lucasagomes Red Hat -nobodycam HP -cboylan HP -dmllr SUSE -therve HP -hughsaunders Rackspace -bruno-semperlotti Dassault Systèmes -james-slagle Red Hat -openstack *robots \ No newline at end of file diff --git a/etc/launchpad-ids b/etc/launchpad-ids deleted file mode 100644 index f1a782102..000000000 --- a/etc/launchpad-ids +++ /dev/null @@ -1,1128 +0,0 @@ -aababilov aababilov@griddynamics.com Alessio Ababilov -aaron-lee aaron.lee@rackspace.com Aaron Lee -andrewbogott abogott@wikimedia.org Andrew Bogott -abrindeyev abrindeyev@griddynamics.com Andrey Brindeyev -academicgareth academicgareth@gmail.com Kun Huang -littleidea acs@parvuscaptus.com Andrew Clay Shafer -adri2000 acunin@linagora.com Adrien Cunin -adalbas adalbas@linux.vnet.ibm.com Adalberto Medeiros -gandelman-a adam.gandelman@canonical.com Adam Gandelman -gandelman-a adamg@canonical.com Adam Gandelman -adjohn adjohn@gmail.com Adam Johnson -jake-hyperboledesign admin@jakedahn.com jakedahn -adriansmith adrian_f_smith@dell.com Adrian Smith -afazekas afazekas@redhat.com Attila Fazekas -ahmad-hassan-q ahmad.hassan@hp.com Ahmad Hassan -alexhandle ah@mynet.at Alex Handle -yosshy akirayoshiyama@gmail.com Akira Yoshiyama -akuno akuno@lavabit.com Anita Kuno -alatynskaya alatynskaya@mirantis.com Anastasia Latynskaya -alexyang alex890714@gmail.com Alex Yang -alex-meade alex.meade@rackspace.com Alex Meade -aloga aloga@ifca.unican.es Alvaro Lopez -antonym amesserl@rackspace.com Antony Messerli -armando-migliaccio amigliaccio@internap.com Armando Migliaccio -andrea-rosa-m andrea.rosa@hp.com Andrea Rosa -aglenyoung andrew.glen-young@canonical.com Andrew Glen-Young -ajames andrew.james@hp.com Andrew James -alaski andrew.laski@rackspace.com Andrew Laski -linuxjedi andrew@linuxjedi.co.uk Andrew Hutchings -andrew-melton andrew.melton@rackspace.com Andrew Melton -andrewsben andrewsben@gmail.com andrewsben -andrewsmedina andrewsmedina@gmail.com Andrews Medina -andrew-tranquada andrew.tranquada@rackspace.com Andrew Tranquada -andycjw andycjw@gmail.com Andy Chong -andrew-mccrae andy.mccrae@gmail.com Andy McCrae -andy-southgate andy.southgate@citrix.com Andy Southgate -annegentle anne.gentle@rackspace.com Anne Gentle -annegentle anne@openstack.org Anne Gentle -anotherjesse anotherjesse@gmail.com Jesse Andrews -ivoks ante.karamatic@canonical.com Ante Karamatić -apevec apevec@redhat.com Alan Pevec -alexpilotti ap@pilotti.it Alessandro Pilotti -arathi-darshanam arathi_darshanam@persistent.co.in Arathi -armando-migliaccio armamig@gmail.com Armando Migliaccio -arosen arosen@nicira.com Aaron Rosen -asakhnov asakhnov@mirantis.com Alexander Sakhnov -asbjorn-sannes asbjorn.sannes@interhost.no Asbjørn Sannes -asomya asomya@cisco.com Arvind Somya -adam.spiers aspiers@suse.com Adam Spiers -avinash-prasad avinash.prasad@nttdata.com Avinash Prasad -avishayb avishayb@radware.com Avishay Balderman -avishay-il avishay@il.ibm.com Avishay Traeger -ayoung ayoung@redhat.com Adam Young -baoli baoli@cisco.com Baodong (Robert) Li -bao-mingyan bao.mingyan@hp.com Mingyan Bao -briancline bcline@softlayer.com Brian Cline -bcwaldon bcwaldon@gmail.com Brian Waldon -belliott bdelliott@gmail.com Brian Elliott -beagles beagles@redhat.com Brent Eagles -mcgrue ben@pistoncloud.com Ben McGraw -reynolds.chin benzwt@gmail.com Reynolds Chin -berendt berendt@b1-systems.de Christian Berendt -berrange berrange@redhat.com Daniel Berrange -bfilippov bfilippov@griddynamics.com Boris Filippov -bfschott bfschott@gmail.com Brian Schott -bhuvan bhuvan@apache.org Bhuvaneswaran A -bilalakhtar bilalakhtar@ubuntu.com Bilal Akhtar -y-yamagata bi.yamagata@gmail.com You Yamagata -bkjones bkjones@gmail.com jonesy -blk-u bknudson@us.ibm.com Brant Knudson -b-maguire b_maguire@dell.com Brendan Maguire -bmcconne bmcconne@rackspace.com Brad McConnell -bnemec bnemec@us.ibm.com Ben Nemec -boris-42 boris@pavlovic.me Boris Pavlovic -ivan-zhu bozhu@linux.vnet.ibm.com Ivan-Zhu -belliott brian.elliott@rackspace.com Brian Elliott -brian-haley brian.haley@hp.com Brian Haley -brian-lamar brian.lamar@gmail.com Brian Lamar -blamar brian.lamar@rackspace.com Brian Lamar -brian-rosmaita brian.rosmaita@rackspace.com Brian Rosmaita -yuanotes brooklyn.chen@canonical.com Brooklyn -bswartz bswartz@netapp.com Ben Swartzlander -btopol btopol@us.ibm.com Brad Topol -burt-t burt@fnal.gov Burt Holzman -ubuntubmw bwiedemann@suse.de Bernhard M. Wiedemann -ctennis caleb.tennis@gmail.com Caleb Tennis -carlos-marin-d carlos.marin@rackspace.com Carlos Marin -cbehrens cbehrens@codestud.com Chris Behrens -cfb-n cfb@metacloud.com Chet Burgess -cgoncalves cgoncalves@av.it.pt Carlos Gonçalves -changbl changbin.liu@gmail.com Changbin Liu -chemikadze chemikadze@gmail.com Nikolay Sokolov -chen-li chen.li@intel.com li,chen -chiradeep chiradeep@cloud.com Chiradeep Vittal -chmouel chmouel@chmouel.com Chmouel Boudjnah -chmouel chmouel@enovance.com Chmouel Boudjnah -chnm-kulkarni chnm.kulkarni@gmail.com Chinmay Kulkarni -chris-allnutt chris.allnutt@rackspace.com Chris Allnutt -cbehrens chris.behrens@rackspace.com Chris Behrens -chris-fattarsi chris.fattarsi@pistoncloud.com Chris Fattarsi -zulcss chuck.short@canonical.com Chuck Short -chungg chungg@ca.ibm.com gordon chung -dricco cian@hp.com Cian O'Driscoll -c-kassen c.kassen@telekom.de Christoph Kassen -cboylan clark.boylan@gmail.com Clark Boylan -clay-gerrard clay.gerrard@gmail.com clayg -clay-gerrard clay.gerrard@rackspace.com clayg -cmsj cmsj@tenshu.net Chris Jones -termie code@term.ie termie -cody-somerville cody.somerville@hp.com Cody A.W. Somerville -colin-nicholson colin.nicholson@iomart.com Colin Nicholson -cweidenkeller conrad.weidenkeller@rackspace.com Conrad Weidenkeller -constantine-q constantine@litestack.com Constantine Peresypkin -corcornelisse cor@hyves.nl Cor Cornelisse -corvus corvus@gnu.org James E. Blair -corvus corvus@inaugust.com James E. Blair -corystone corystone@gmail.com Cory Stone -corywright corywright@gmail.com Cory Wright -corywright cory.wright@rackspace.com Cory Wright -cp16net cp16net@gmail.com cp16net -cperz cperz@gmx.net HeinMueck -crobinso crobinso@redhat.com Cole Robinson -cthiel-suse c.thiel@telekom.de Christoph Thiel -cthier cthier@gmail.com Chuck Thier -cyeoh-0 cyeoh@au1.ibm.com Christopher Yeoh -daeskp dae@velatum.com Dae S. Kim -daisy-ycguo daisy.ycguo@gmail.com Ying Chun Guo -dhersam dan.hersam@hp.com Dan Hersam -dvaleriani daniele@dvaleriani.net Daniele Valeriani -danms danms@us.ibm.com Dan Smith -danwent dan@nicira.com dan wendlandt -danwent danwent@gmail.com dan wendlandt -darrellb darrell@swiftstack.com Darrell Bishop -dims-v davanum@gmail.com Davanum Srinivas (DIMS) -dave-mcnally dave.mcnally@hp.com David McNally -davewalker dave.walker@canonical.com Dave Walker -davewalker davewalker@ubuntu.com Dave Walker -david-besen david.besen@hp.com David Besen -david-thingbag david.cramer@rackspace.com David Cramer -david-goetz david.goetz@rackspace.com David Goetz -david-hadas david.hadas@gmail.com David Hadas -david-hadas davidh@il.ibm.com David Hadas -david-kranz david.kranz@qrclab.com David Kranz -david-lyle david.lyle@hp.com David Lyle -david-perez5 david.perez5@hp.com David Subiros Perez -alekibango david.pravec@danix.org David Pravec -david-wittman david.wittman@rackspace.com David Wittman -dazworrall daz@dwuk.net Darren Worrall -dbelova dbelova@mirantis.com Dina Belova -dce3062 dce3062@gmail.com Syed Armani -debo dedutta@cisco.com Debo~ Dutta -deepak.garg deepak.garg@citrix.com Deepak Garg -deepak.garg deepakgarg.iitg@gmail.com Deepak Garg -endeepak deepak.n@thoughtworks.com Deepak N -deevi-rani deevi_rani@persistent.co.in D LALITHA RANI -dekehn dekehn@gmail.com dkehn -derekh derekh@redhat.com Derek Higgins -y-derek derek@umiacs.umd.edu Derek Yarnell -devananda devananda.vdv@gmail.com Devananda van der Veen -devdeep-singh devdeep.singh@citrix.com Devdeep Singh -devcamcar devin.carlen@gmail.com Devin Carlen -scott-devoid devoid@anl.gov Scott Devoid -egallen dev@zinux.com Erwan Gallen -dheidler dheidler@suse.de Dominik Heidler -dims-v dims@linux.vnet.ibm.com Davanum Srinivas -diopter diopter@gmail.com Evan Callicoat -dmllr dirk@dmllr.de Dirk Mueller -divakar-padiyar-nandavar divakar.padiyar-nandavar@hp.com Divakar Padiyar Nandavar -dkang dkang@isi.edu David Kang -dlapsley dlapsley@nicira.com David Lapsley -dmodium dmodium@isi.edu Devendra -dolph dolph.mathews@gmail.com Dolph Mathews -dolph dolph.mathews@rackspace.com Dolph Mathews -donagh-mccabe donagh.mccabe@hp.com Donagh McCabe -n0ano-ddd donald.d.dugger@intel.com Donald Dugger -donal-lafferty donal.lafferty@citrix.com Donal Lafferty -dougdoan dougdoan@gmail.com Doug -doug-hellmann doug.hellmann@dreamhost.com Doug Hellmann -doug-hellmann doug.hellmann@gmail.com Doug Hellmann -dweimer dougw@sdsc.edu Doug Weimer -dperaza dperaza@linux.vnet.ibm.com David Peraza -dan-prince dprince@redhat.com Dan Prince -dradez dradez@redhat.com Dan Radez -dragosm dragosm@hp.com Dragos Manolescu -dripton dripton@redhat.com David Ripton -dscannell dscannell@gridcentric.com David Scannell -dtroyer dtroyer@gmail.com Dean Troyer -oubiwann duncan@dreamhost.com Duncan McGreggor -duncan-thomas duncan.thomas@gmail.com Duncan Thomas -dweimer dweimer@gmail.com Doug Weimer -dzhou121 dzhou121@gmail.com Dongdong Zhou -e0ne e0ne@e0ne.info Ivan Kolodyazhny -eamonn-otoole eamonn.otoole@hp.com Eamonn O'Toole -ed-bak2 ed.bak2@hp.com Ed Bak -eddie-sheffield eddie.sheffield@rackspace.com Eddie Sheffield -ed-leafe ed@leafe.com Ed Leafe -ethuleau edouard.thuleau@cloudwatt.com Édouard Thuleau -eglynn eglynn@redhat.com Eoghan Glynn -eharney eharney@gmail.com Eric Harney -eharney eharney@redhat.com Eric Harney -ekirpichov ekirpichov@gmail.com Eugene Kirpichov -reldan eldr@ya.ru Eldar Nugaev -emagana emagana@gmail.com Edgar Magana -rcc emaildericky@gmail.com Ricardo Carrillo Cruz -emmasteimann emmasteimann@gmail.com Emma Grace Steimann -enikanorov enikanorov@mirantis.com Eugene Nikanorov -epatro epatro@gmail.com Eduardo Patrocinio -ewindisch eric@cloudscaling.com Eric Windisch -ericpeterson-l ericpeterson@hp.com Eric Peterson -erikzaadi erikz@il.ibm.com Erik Zaadi -esker esker@netapp.com Robert Esker -everett-toews everett.toews@gmail.com Everett Toews -ewanmellor ewan.mellor@citrix.com Ewan Mellor -kaiwei-fan fank@vmware.com Kaiwei Fan -fifieldt fifieldt@unimelb.edu.au Tom Fifield -flaper87 flaper87@gmail.com Flavio Percoco Premoli -flaviamissi flaviamissi@gmail.com flaviamissi -fghaas florian@hastexo.com Florian Haas -pandemicsyn florian.hines@gmail.com Florian Hines -flwang flwang@cn.ibm.com Fei Long Wang -flaper87 fpercoco@redhat.com Flavio Percoco Premoli -francois-charlier francois.charlier@enovance.com François Charlier -flepied frederic.lepied@enovance.com Frederic Lepied -freedomhui freedomhui@gmail.com Hui Cheng -freyes freyes@tty.cl Felipe Reyes -franciscosouza f@souza.cc Francisco Souza -fujita-tomonori-lab fujita.tomonori@lab.ntt.co.jp Tomo -fungi fungi@yuggoth.org Jeremy Stanley -westmaas gabe.westmaas@rackspace.com Gabe Westmaas -gabriel-hurley gabriel@strikeawe.com Gabriel Hurley -geekinutah geekinutah@gmail.com Michael H Wilson -gessau gessau@cisco.com Henry Gessau -ghe.rivero ghe@debian.org Ghe Rivero -ghe.rivero ghe.rivero@gmail.com Ghe Rivero -termie github@anarkystic.com termie -garyk gkotton@redhat.com Gary Kotton -glikson glikson@il.ibm.com Alex Glikson -gongysh gongysh@cn.ibm.com yong sheng gong -gongysh gongysh@linux.vnet.ibm.com yong sheng gong -gerardo8a gporras@yahoo-inc.com Gerardo Porras -greglange greglange+launchpad@gmail.com Greg Lange -salgado gsalgado@gmail.com Guilherme Salgado -gtt116 gtt116@126.com TianTian Gao -guang-yee guang.yee@hp.com Guang Yee -306455645-b gudujianjsk@gmail.com ShichaoXu -daisy-ycguo guoyingc@cn.ibm.com Ying Chun Guo -hanlind hanlind@kth.se Hans Lindgren -harlowja harlowja@yahoo-inc.com Joshua Harlow -hayashi hayashi@nttmcl.com Toshiyuki Hayashi -heckj heckj@mac.com Joseph Heck -henry-nash henryn@linux.vnet.ibm.com Henry Nash -heut2008 heut2008@gmail.com Yaguang Tang -derekh higginsd@gmail.com Derek Higgins -hillad hillad@gmail.com Andy Hill -hiroaki-kawai hiroaki.kawai@gmail.com Hiroaki Kawai -hisaki hisaki.ohara@intel.com Hisaki Ohara -hodong-hwang hodong.hwang@kt.com Hodong Hwang -hovyakov hovyakov@gmail.com Dmitry -hudayou hudayou@hotmail.com Hengqing Hu -hvolkmer h.volkmer@cloudbau.de Hendrik Volkmer -hzguanqiang hzguanqiang@corp.netease.com QiangGuan -hzwangpan hzwangpan@corp.netease.com wangpan -hzzhoushaoyu hzzhoushaoyu@corp.netease.com Zhou ShaoYu -ljjjustin iamljj@gmail.com Jiajun Liu -mapleoin iartarisi@suse.cz Ionuț Arțăriși -ijw-ubuntu iawells@cisco.com Ian Wells -iccha-sethi iccha.sethi@rackspace.com Iccha Sethi -igawa igawa@mxs.nes.nec.co.jp Masayuki Igawa -iida-koji iida.koji@lab.ntt.co.jp Koji Iida -e0ne ikolodyazhny@mirantis.com Ivan Kolodyazhny -ilyaalekseyev ilyaalekseyev@acm.org Ilya Alekseyev -cschwede info@cschwede.de Christian Schwede -irsxyp irsxyp@gmail.com irsxyp -iryoung iryoung@gmail.com Iryoung Jeong -shakhat ishakhat@mirantis.com Ilya Shakhat -ishii-hisaharu ishii@nttmcl.com Hisaharu Ishii -itoumsn itoumsn@nttdata.co.jp Masanori Itoh -ivoks ivoks@ubuntu.com Ante Karamatić -izbyshev izbyshev@ispras.ru Alexey Izbyshev -jajohnson jajohnson@softlayer.com Jason Johnson -jakedahn jake@markupisart.com Jake Dahn -jakez jake@ponyloaf.com Jake Zukowski -james-meredith james.meredith@rackspace.com James Meredith -james-morgan james.morgan@rackspace.com James Morgan -james-page james.page@ubuntu.com James Page -janisg janis.gengeris@gmail.com Janis Gengeris -jcannava jason@cannavale.com Jason Cannavale -jcannava jason.cannavale@rackspace.com Jason Cannavale -jason-koelker jason@koelker.net Jason Kölker -jaypipes jaypipes@gmail.com Jay Pipes -jbrendel jbrendel@cisco.com Juergen Brendel -jbresnah jbresnah@redhat.com John Bresnahan -jbryce jbryce@jbryce.com Jonathan Bryce -jemartin jcmartin@ebaysf.com JC Martin -jdsn jdsn@suse.de J. Daniel Schmidt -jean-baptiste-ransy jean-baptiste.ransy@alyseo.com Jean-Baptiste Ransy -jean-marc-saffroy jean.marc.saffroy@scality.com Jean-Marc Saffroy -jeffjapan jeffjapan@gmail.com Jeffrey Wilcox -fzylogic jeremy@dreamhost.com Jeremy Hanmer -jesse-pretorius jesse.pretorius@gmail.com Jesse Pretorius -jfehlig jfehlig@suse.com Jim Fehlig -jhenner jhenner@redhat.com Jaroslav Henner -jtran jhtran@att.com John Tran -jiangwt100 jiangwt100@gmail.com Jim Jiang -jiangy jiangyong.hn@gmail.com Jiang Yong -wenjianhn jian.wen@canonical.com Jian Wen -jian-zhang jian.zhang@intel.com Jian Zhang -jimmy-sigint jimmy@sigint.se Jimmy Bergman -jking-6 jking@internap.com James King -joshua-mckenty jmckenty@gmail.com Joshua McKenty -joelbm24 joelbm24@gmail.com joelbm24 -jsavak joe.savak@rackspace.com Joe Savak -joe-arnold joe@swiftstack.com Joe Arnold -joe-topjian-v joe@topjian.net Joe T -jogo jogo@cloudscaling.com Joe Gordon -johannes.erdfelt johannes@erdfelt.com Johannes Erdfelt -johannes.erdfelt johannes.erdfelt@rackspace.com Johannes Erdfelt -retr0h john@dewey.ws John Dewey -john-eo john.eo@rackspace.com John Eo -johngarbutt john.garbutt@rackspace.com John Garbutt -john-griffith john.griffith8@gmail.com John Griffith -john-griffith john.griffith@solidfire.com John Griffith -john-herndon john.herndon@hp.com John Herndon -john-m-kennedy john.m.kennedy@intel.com John Kennedy -john-postlethwait john.postlethwait@nebula.com John Postlethwait -jokcylou jokcylou@gmail.com loutc -jola-mirecka jola.mirecka@hp.com Jola Mirecka -jonathan-abdiel jonathan.abdiel@gmail.com Jonathan Gonzalez V. -cleverdevil jonathan@cleverdevil.org Jonathan LaCour -jordanrinke jordan@openstack.org Jordan Rinke -jorgew jorge.williams@rackspace.com Jorge L. Williams -jose-castro-leon jose.castro.leon@cern.ch Jose Castro Leon -jdurgin joshd@hq.newdream.net Josh Durgin -jdurgin josh.durgin@dreamhost.com Josh Durgin -jdurgin josh.durgin@inktank.com Josh Durgin -jk0 josh@jk0.org Josh Kearney -jkleinpeter josh@kleinpeter.org Josh Kleinpeter -joshua-mckenty joshua.mckenty@nasa.gov Joshua McKenty -joshua-mckenty joshua@pistoncloud.com Joshua McKenty -jpichon jpichon@redhat.com Julie Pichon -jshepher jshepher@rackspace.com Justin Shepherd -jjmartinez juan@memset.com Juan J. Martínez -juergh juerg.haefliger@hp.com Juerg Haefliger -ncode juliano.martinez@locaweb.com.br Juliano Martinez -jdanjou julien.danjou@enovance.com Julien Danjou -jdanjou julien@danjou.info Julien Danjou -jpichon julie.pichon@gmail.com Julie Pichon -justin-fathomdb justin@fathomdb.com justinsb -justin-hammond justin.hammond@rackspace.com Justin Hammond -justin-lund justin.lund@dreamhost.com Justin Lund -hazmat kapil.foss@gmail.com Kapil Thangavelu -kashivreddy kashi.reddy@rackspace.com Kashi Reddy -kaushikc kaushik.chand@gmail.com Kaushik Chandrashekar -kc-wang kc.wang@bigswitch.com Kuang-Ching Wang -kelsey-tripp kelsey.tripp@nebula.com Kelsey Tripp -ken-pepple ken.pepple@gmail.com Ken Pepple -ken-pepple ken@pepple.info Ken Pepple -ken-pepple ken.pepple@rabbityard.com Ken Pepple -klmitch kevin.mitchell@rackspace.com Kevin L. Mitchell -ke-wu ke.wu@ibeca.me Ke Wu -khussein khaled.hussein@gmail.com Khaled Hussein -khussein khaled.hussein@rackspace.com Khaled Hussein -kiall kiall@managedit.ie Kiall Mac Innes -kspear kispear@gmail.com Kieran Spear -mestery kmestery@cisco.com Kyle Mestery -kost-isi kost@isi.edu Kost -kravchenko-pavel kpavel@il.ibm.com Kravchenko Pavel -krtaylor krtaylor@us.ibm.com Kurt Taylor -krt krt@yahoo-inc.com Ken Thomas -kshileev kshileev@gmail.com Kirill Shileev -kurt-f-martin kurt.f.martin@hp.com Kurt Martin -kylin7-sg kylin7.sg@gmail.com Kylin CG -lapgoon lapgoon@gmail.com LiangAiping -lars-gellrich lars.gellrich@hp.com Lars Gellrich -markgius launchpad@markgius.com Mark Gius -ladquin laura.adq@gmail.com Laura Alves -laurence-miao laurence.miao@gmail.com Laurence Miao -lauria lauria@us.ibm.com Giampaolo Lauria -lcui lcui@vmware.com Leon -ldbragst ldbragst@us.ibm.com Lance Bragstad -leanderbb leanderbb@gmail.com Leander Beernaert -learnerever learnerever@gmail.com TengLi -leekelby leekelby@gmail.com leekelby -lemonlatte lemonlatte@gmail.com Jim Yeh -letterj letterj@gmail.com Jay Payne -letterj letterj@racklabs.com Jay Payne -liam-kelleher liam.kelleher@hp.com Liam Kelleher -lianhao-lu lianhao.lu@intel.com Lianhao Lu -liemmn liem.m.nguyen@gmail.com Liem Nguyen -liemmn liem_m_nguyen@hp.com Liem Nguyen -liemmn liem.m.nguyen@hp.com Liem Nguyen -likitha-shetty likitha.shetty@citrix.com Likitha Shetty -lin-hua-cheng lin-hua.cheng@hp.com Lin Hua Cheng -liquid-x liquid@kt.com Eohyung Lee -litong01 litong01@us.ibm.com Tong Li -long-wang long.wang@bj.cs2c.com.cn wanglong -lorinh lorin@isi.edu Lorin Hochstein -lorinh lorin@nimbisservices.com Lorin Hochstein -lrqrun lrqrun@gmail.com lrqrun -lucasagomes lucasagomes@gmail.com Lucas Alvares Gomes -luis-fernandez-alvarez luis.fernandez.alvarez@cern.ch Luis Fernandez -lzy-dev lzy.dev@gmail.com Zhi Yan Liu -madhav-puri madhav.puri@gmail.com Madhav Puri -mail-zhang-yee mail.zhang.yee@gmail.com Yee -rackerhacker major.hayden@rackspace.com Major Hayden -rackerhacker major@mhtx.net Major Hayden -malini-k-bhandaru malini.k.bhandaru@intel.com Malini Bhandaru -mana-62-1-11 mana.62.1.11@gmail.com Mana Kaneko -mandarvaze mandar.vaze@vertex.co.in Mandar Vaze -btorch marcelo.martins@rackspace.com Marcelo Martins -markmcclain mark.mcclain@dreamhost.com Mark McClain -markmc markmc@redhat.com Mark McLoughlin -markwash mark.washenberger@markwash.net Mark Washenberger -gz martin.packman@canonical.com Martin Packman -masumotok masumotok@nttdata.co.jp Kei Masumoto -mate-lakat mate.lakat@citrix.com Mate Lakat -mat-o mat@grove.me.uk Mat Grove -mathieu-rohon mathieu.rohon@gmail.com mathieu rohon -cerberus matt.dietz@rackspace.com Matt Dietz -matthias-sigxcpu matthias@sigxcpu.org Matthias Schmitz -matt-nycresistor matt.joyce@cloudscaling.com Matt Joyce -mattstep mattstep@mattstep.net Matt Stephenson -maurosr maurosr@linux.vnet.ibm.com Mauro Sergio Martins Rodrigues -hubcap mbasnigh@rackspace.com Michael Basnight -hubcap mbasnight@gmail.com Michael Basnight -mdegerne mdegerne@gmail.com Mandell -mdragon mdragon@rackspace.com Monsyne Dragon -meizu647 meizu647@gmail.com dk647 -melwitt melwitt@yahoo-inc.com Melanie Witt -notmyname me@not.mn John Dickinson -mgius7096 mgius7096@gmail.com Mark Gius -gundlach michael.gundlach@rackspace.com Michael Gundlach -mihgen mihgen@gmail.com Mike Scherbakov -mikalstill mikal@stillhq.com Michael Still -redbo mike-launchpad@weirdlooking.com Mike Barton -milner mike.milner@canonical.com Mike Milner -novas0x2a mike@pistoncloud.com Mike Lundy -redbo mike@weirdlooking.com Mike Barton -mikeyp-3 mikeyp@LaHondaResearch.org Mike Pittaro -mjfork mjfork@us.ibm.com Michael Fork -mkkang mkkang@isi.edu Mikyung Kang -mdrnstm m@metacloud.com Morgan Fainberg -mnaser mnaser@vexxhost.com Mohammed Naser -mordred mordred@inaugust.com Monty Taylor -moreira-belmiro-email-lists moreira.belmiro.email.lists@gmail.com Belmiro Moreira -morita-kazutaka morita.kazutaka@gmail.com Kazutaka Morita -motokentsai motokentsai@gmail.com MotoKen -amotoki motoki@da.jp.nec.com Akihiro Motoki -motonobu motonobu@gmail.com Motonobu Ichimura -locke105 mrodden@us.ibm.com Mathew Odden -mrunge mrunge@redhat.com Matthias Runge -matt-sherborne msherborne@gmail.com Matthew Sherborne -msinhore msinhore@gmail.com msinhore -mszilagyi mszilagyi@gmail.com Michael Szilagyi -nachiappan-veerappan-nachiappan nachiappan.veerappan-nachiappan@hp.com Nachiappan -nati-ueno nachi@nttmcl.com Nachi Ueno -naehring naehring@b1-systems.de Andre Naehring -mathrock nathanael.i.burton@gmail.com Nathanael Burton -mathrock nathanael.i.burton.work@gmail.com Nathanael Burton -rellerreller nathan.reller@jhuapl.edu Nathan Reller -nati-ueno-s nati.ueno@gmail.com Nachi Ueno -ironcamel naveedm9@gmail.com Naveed Massjouni -ndipanov ndipanov@redhat.com Nikola Đipanov -nick-craig-wood nick@craig-wood.com Nick Craig-Wood -bartos nick@pistoncloud.com Nick Bartos -nickshobe nickshobe@gmail.com Nicholas Shobe -nicolas.simonds nic@metacloud.com Nicolas Simonds -nikhil-komawar nikhil.komawar@rackspace.com nikhil komawar -ning ning@zmanda.com ning_zhang -niuwl586-v niuwl586@gmail.com Tony NIU -nicholaskuechler nkuechler@gmail.com Nicholas Kuechler -nobodycam nobodycam@gmail.com Chris Krelle -arata776 notsu@virtualtech.jp Arata Notsu -chemikadze nsokolov@griddynamics.com Nikolay Sokolov -obondarev obondarev@mirantis.com Oleg Bondarev -oldsharp oldsharp@163.com Ray Chen -oliver-leahy-l oliver.leahy@hp.com Ollie Leahy -njohnston onewheeldrive.net@gmail.com Neil Johnston -oomichi oomichi@mxs.nes.nec.co.jp Ken'ichi Ohmichi -alyseo openstack@alyseo.com Alyseo -parthipan parthipan@hp.com Loganathan Parthipan -pmezard patrick@mezard.eu Patrick Mezard -pauldbourke paul-david.bourke@hp.com Paul Bourke -paul-mcmillan paul.mcmillan@nebula.com Paul McMillan -pksunkara pavan.sss1991@gmail.com Pavan Kumar Sunkara -p-draigbrady pbrady@redhat.com Pádraig Brady -pcm pcm@cisco.com Paul Michali -p-draigbrady p@draigbrady.com Pádraig Brady -pednape pednape@gmail.com Pedro Navarro Pérez -pengyuwei pengyuwei@gmail.com Peng YuWei -philip-day philip.day@hp.com Phil Day -pjz pj@place.org Paul Jimenez -ppyy ppyy@pubyun.com Peng Yong -prasad-tanay prasad.tanay@gmail.com Harsh Prasad -psedlak psedlak@redhat.com Pavel Sedlák -pshkitin pshkitin@griddynamics.com Pavel Shkitin -psiwczak psiwczak@mirantis.com Piotr Siwczak -rafadurancastaneda rafadurancastaneda@gmail.com Rafael Durán Castañeda -rkhardalian rafi@metacloud.com Rafi Khardalian -rainya-mosher-m rainya.mosher@rackspace.com Rainya Mosher -rajarammallya rajarammallya@gmail.com Rajaram Mallya -ram-nalluri ram_nalluri@persistent.co.in rampradeep -russellb rbryant@redhat.com Russell Bryant -rconradharris rconradharris@gmail.com Rick Harris -reese-sm reese.sm@gmail.com Stephanie Reese -reldan reldan@oscloud.ru Eldar Nugaev -renier-h renierm@us.ibm.com Renier Morales -renukaapte renuka.apte@citrix.com Renuka Apte -rhafer rhafer@suse.de Ralf Haferkamp -rconradharris rick.harris@rackspace.com Rick Harris -dendrobates rick@openstack.org Rick Clark -ripal-nathuji ripal.nathuji@calxeda.com Ripal Nathuji -rjuvvadi rjuvvadi@hcl.com Ramana Juvvadi -rkukura rkukura@redhat.com Robert Kukura -rlane rlane@wikimedia.org Ryan Lane -rloo rloo@yahoo-inc.com Ruby Loo -r-mibu r-mibu@cq.jp.nec.com Ryota Mibu -rnirmal rnirmal@gmail.com Nirmal Ranganathan -rohitagarwalla roagarwa@cisco.com Rohit Agarwalla -lifeless robertc@robertcollins.net Robert Collins -racb robie.basak@canonical.com Robie Basak -robin-norwood robin.norwood@gmail.com Robin Norwood -kanaderohan rohan.kanade@nttdata.com Rohan -rohitkarajgi rohit.karajgi@nttdata.com Rohit Karajgi -roland-hochmuth-s roland.hochmuth@hp.com Roland Hochmuth -ronenkat ronenkat@il.ibm.com RonenKat -ron-pedde ron@pedde.com Ron Pedde -rpodolyaka rpodolyaka@mirantis.com Roman Podolyaka -prykhodchenko rprikhodchenko@mirantis.com Roman Prykhodchenko -rushiagr rushi.agr@gmail.com Rushi Agrawal -russell russell@nimbula.com Russell Cloran -russell-sim russell.sim@gmail.com Russell Sim -rvaknin rvaknin@redhat.com Rami Vaknin -9-sa sa@hydre.org Stephane ANGOT -salvatore-orlando salv.orlando@gmail.com Salvatore Orlando -sammiestoel sammiestoel@gmail.com Sam Stoelinga -torgomatic sam@swiftstack.com Samuel Merritt -sandy-sandywalsh sandy@sandywalsh.com Sandy Walsh -sandy-walsh sandy.walsh@rackspace.com Sandy Walsh -santhoshkumar santhom@thoughtworks.com Santhosh Kumar Muniraj -saschpe saschpe@suse.de Sascha Peilicke -sasimpson sasimpson@gmail.com Scott Simpson -sateesh-chodapuneedi sateesh.chodapuneedi@citrix.com Sateesh -sathish-nagappan sathish.nagappan@nebula.com Sathish Nagappan -houshengbo sbhou@cn.ibm.com Vincent Hou -sdague sdague@linux.vnet.ibm.com Sean Dague -sdake sdake@redhat.com Steven Dake -scollins sean@coreitpro.com Sean M. Collins -sean-mccully sean.mccully@rackspace.com Sean McCully -serge-maskalik serge_maskalik@yahoo.com Serge Maskalik -shane-wang shane.wang@intel.com Shane Wang -shardy shardy@redhat.com Steven Hardy -shh sharis@brocade.com Shiv Haris -shweta-ap05 shpadubi@cisco.com Shweta P -dshrews shrewsbury.dave@gmail.com David Shrewsbury -shrutiranade38 shrutiranade38@gmail.com Shruti Ranade -simplylizz simplylizz@gmail.com Anton V. Yanchenko -singn singn@netapp.com Navneet -sirisha-devineni sirisha_devineni@persistent.co.in Sirisha Devineni -sirish-bitra-gmail sirish.bitra@gmail.com sirish chandra bitra -siyingchun siyingchun@sina.com Yingchun Si -sleepsonthefloor sleepsonthefloor@gmail.com Anthony Young -slukjanov slukjanov@mirantis.com Sergey Lukjanov -smoser smoser@ubuntu.com Scott Moser -snaiksat snaiksat@cisco.com Sumit Naiksatam -sogabe sogabe@iij.ad.jp Takashi Sogabe -soheil-h-y soheil@cs.toronto.edu Soheil Hassas Yeganeh -somikbehera somikbehera@gmail.com Somik Behera -somikbehera somik@nicira.com Somik Behera -soren soren@linux2go.dk Soren Hansen -soren soren@openstack.org Soren Hansen -soren sorhanse@cisco.com Soren Hansen -salvatore-orlando sorlando@nicira.com Salvatore Orlando -sorrison sorrison@gmail.com Sam Morrison -torgomatic spam@andcheese.org Samuel Merritt -sshturm sshturm@mirantis.com Shturm Svetlana -stanislaw-pitucha stanislaw.pitucha@hp.com Stanislaw Pitucha -stef-ummon stelford@internap.com stelford -sgran stephen.gran@guardian.co.uk Stephen Gran -stephen-mulcahy stephen.mulcahy@hp.com stephen mulcahy -stevemar stevemar@ca.ibm.com Steve Martinelli -steve-stevebaker steve@stevebaker.org Steve Baker -sthaha sthaha@redhat.com Sunil Thaha -sthakkar sthakkar@vmware.com Sachin Thakkar -stuart-mclaren stuart.mclaren@hp.com Stuart McLaren -sulochan-acharya sulochan.acharya@rackspace.co.uk Sulochan Acharya -snaiksat sumitnaiksatam@gmail.com Sumit Naiksatam -5-suzuki suzuki@midokura.com Takaaki Suzuki -pandemicsyn syn@ronin.io Florian Hines -tagami-keisuke tagami.keisuke@lab.ntt.co.jp Keisuke Tagami -tagliapietra.alessandro tagliapietra.alessandro@gmail.com Alessandro Tagliapietra -tfukushima tfukushima@dcl.info.waseda.ac.jp Taku Fukushima -therese-mchale therese.mchale@hp.com Therese McHale -the-william-kelly the.william.kelly@gmail.com William Kelly -ttx thierry@openstack.org Thierry Carrez -thingee thingee@gmail.com Mike Perez -thrawn01 thrawn01@gmail.com Derrick Wippler -throughnothing throughnothing@gmail.com William Wolf -ethuleau thuleau@gmail.com Édouard Thuleau -timjr timjr@yahoo-inc.com Tim Daly Jr. -tim-simpson tim.simpson@rackspace.com Tim Simpson -tatyana-leontovich tleontov@yahoo-inc.com Tatyana Leontovich -tmello tmello@linux.vnet.ibm.com Tiago Rodrigues de Mello -toan-nguyen toan.nguyen@rackspace.com Toan Nguyen -xtoddx todd@ansolabs.com Todd Willey -tzn tomasz@napierala.org Tomasz 'Zen' Napierala -tom-hancock tom.hancock@hp.com Tom Hancock -tomoe tomoe@midokura.com Tomoe Sugihara -tpot tpot@hp.com Tim Potter -treinish treinish@linux.vnet.ibm.com Matthew Treinish -tres tres@treshenry.net Tres Henry -tr3buchet trey.morris@rackspace.com Trey Morris -troy-toman troy.toman@rackspace.com Troy Toman -truijllo truijllo@crs4.it truijllo -tsuyuzaki-kota tsuyuzaki.kota@lab.ntt.co.jp Kota Tsuyuzaki -ttrifonov t.trifonov@gmail.com Tihomir Trifonov -tpatil tushar.vitthal.patil@gmail.com Tushar Patil -tylesmit tylesmit@cisco.com Tyler Smith -dtynan tynan@hp.com Dermot Tynan -unicell unicell@gmail.com unicell -usrleon usrleon@gmail.com Max Lvov -vaddi-kiran vaddi_kiran@persistent.co.in sasikiran -vash-vasiliyshlykov vash@vasiliyshlykov.org Vasiliy Shlykov -vkhomenko vasiliyk@yahoo-inc.com Vasyl Khomenko -vickymsee vickymsee@gmail.com Victoria Martínez de la Cruz -victor-lowther victor.lowther@gmail.com vlowther -vito-ordaz victor.rodionov@nexenta.com Victor Rodionov -vijaya-erukala vijaya_erukala@persistent.co.in Vijaya Erukala -vinkeshb vinkeshb@thoughtworks.com Vinkesh Banka -vishvananda vishvananda@gmail.com Vish Ishaya -vishvananda vishvananda@yahoo.com Vish Ishaya -vivekys vivek.ys@gmail.com vivek.ys -vladimir.p vladimir@zadarastorage.com Vladimir Popovski -vuntz vuntz@suse.com Vincent Untz -walter-boring walter.boring@hp.com Walt Boring -wayne-walls wayne.walls@rackspace.com Wayne A. Walls -weiyuanke123 weiyuanke123@gmail.com weiyuanke -wenjianhn wenjianhn@gmail.com Jian Wen -throughnothing will.wolf@rackspace.com William Wolf -wanglong wl3617@qq.com drabbit -wu-wenxiang wu.wenxiang@99cloud.net Wu Wenxiang -xchenum xchenum@gmail.com Simon -xiaoquqi xiaoquqi@gmail.com Ray -xiaoxi-chen xiaoxi.chen@intel.com xiaoxi_chen -xing-yang xing.yang@emc.com Xing Yang -xtoddx xtoddx@gmail.com Todd Willey -opencompute xuchenx@gmail.com Sean Chen -xu-haiwei xu-haiwei@mxw.nes.nec.co.jp Haiwei Xu -xuhj xuhj@linux.vnet.ibm.com Alex Xu -wenhao-x xuwenhao2008@gmail.com Wenhao Xu -xychu2008 xychu2008@gmail.com Ethan Chu -xyj-asmy xyj.asmy@gmail.com xyj -ywang19 yaguang.wang@intel.com yaguang wang -yamahata yamahata@valinux.co.jp Isaku Yamahata -ymzk37 yamazaki-mitsuhiko@cnt.mxc.nes.nec.co.jp Mitsuhiko Yamazaki -yinliu2 yinliu2@cisco.com Ying Liu -ykaneko0929 ykaneko0929@gmail.com Yoshihiro Kaneko -yogesh-srikrishnan yogesh.srikrishnan@rackspace.com Yogeshwar -yolanda.robla yolanda.robla@canonical.com Yolanda Robla -yorik-sar yorik.sar@gmail.com Yuriy Taraday -yosef-4 yosef@cloudscaling.com Yosef Berman -tamura-yoshiaki yoshi@midokura.jp Yoshiaki Tamura -yuan-zhou yuan.zhou@intel.com Zhou Yuan -james-li-3 yueli.m@gmail.com James Li -yufang521247 yufang521247@gmail.com Yufang Zhang -yugsuo yugsuo@gmail.com Yug Suo -yunhong-jiang yunhong.jiang@intel.com jiang, yunhong -yunmao yunmao@gmail.com Yun Mao -yusuke yusuke@nttmcl.com MURAOKA Yusuke -yuxcer yuxcer@126.com Yuxingchao -yuxcer yuxcer@gmail.com Yuxingchao -yuyuehill yuyuehill@gmail.com hill -zaitcev zaitcev@kotori.zaitcev.us Pete Zaitcev -zaneb zbitter@redhat.com Zane Bitter -zedshaw zedshaw@zedshaw.com Zed A. Shaw -zhangchao010 zhangchao010@huawei.com zhangchao -zzs zhesen@nttmcl.com Jason Zhang -zhhuabj zhhuabj@cn.ibm.com Hua Zhang -zhiteng-huang zhiteng.huang@intel.com Huang Zhiteng -zyluo zhongyue.nah@intel.com Zhongyue Luo -zhoudongshu zhoudshu@gmail.com zhoudonshu -zhang-hare zhuadl@cn.ibm.com Edward -ziad-sawalha ziad.sawalha@rackspace.com Ziad Sawalha -gholt z-launchpad@brim.net gholt -zrzhit zrzhit@gmail.com Rongze Zhu -zulcss zulcss@ubuntu.com Chuck Short -aababilov aababilo@yahoo-inc.com Alessio Ababilov -glikson glikson@il.ibm.com Alex Glikson -izbyshev izbyshev@ispras.ru Alexey Izbyshev -neoshades hillad@gmail.com Andy Hill -armando-migliaccio armando.migliaccio@eu.citrix.com Armando Migliaccio -asomya asomya@cisco.com Arvind Somya -bgh brad@nicira.com Brad Hall -bgh bhall@nicira.com Brad Hall -broskos broskos@internap.com Brent Roskos -c-kassen c.kassen@telekom.de Christoph Kassen -cthiel-suse cthiel@suse.com Christoph Thiel -0x44 chris@pistoncloud.com Christopher MacGown -0x44 ignoti+github@gmail.com Christopher MacGown -0x44 chris@slicehost.com Christopher MacGown -yazirian dan.dillinger@sonian.net Dan Dillinger -darren-birkett darren.birkett@gmail.com Darren Birkett -dazworrall darren@iweb.co.uk Darren Worrall -diego-parrilla-santamaria diego.parrilla@stackops.com Diego Parrilla -emilienm emilien.macchi@stackops.com Emilien Macchi -eday eday@oddments.org Eric Day -flwang flwang@cn.ibm.com Fei Long Wang -flepied frederic.lepied@enovance.com Frederic Lepied -gagupta gaurav@denali-systems.com Gaurav Gupta -gregory-althaus galthaus@austin.rr.com Greg Althaus -greglange glange@rackspace.com Greg Lange -ishii-hisaharu ishii.hisaharu@lab.ntt.co.jp Hisaharu Ishii -ijw-ubuntu iawells@cisco.com Ian Wells -jamesli-olsf yueli.m@gmail.com James Li -jasonstraw jason.straw@rackspace.com Jason Straw -jaypipes jaypipes@gmail.com Jay Pipes -jaypipes jpipes@serialcoder Jay Pipes -jiangy jiangyong.hn@gmail.com Jiang Yong -jsuh jsuh@isi.edu Jinwoo 'Joseph' Suh -jogo joe.gordon0@gmail.com Joe Gordon -johannes johannes@squeeze.(none) Johannes Erdfelt -jrd-q jrd@jrd.org John Dunning -john-eo joon.eo@gmail.com John Eo -johngarbutt john.garbutt@rackspace.com John Garbutt -breu breu@breu.org Joseph W. Breu -juergh juerg.haefliger@hp.com Juerg Haefliger -kjharke k.jonathan.harker@hp.com K Jonathan Harker -k.c.wang kc.wang@bigswitch.com KC Wang -kbringard kbringard@attinteractive.com Kevin Bringard -leamhall leam.hall@mailtrust.com Leam -markwash mark.washenberger@rackspace.com Mark Washenberger -maru mnewby@internap.com Maru Newby -u-matt-h matt@cloudscaling.com Matthew Hooker -sileht mehdi.abaakouk@enovance.com Mehdi Abaakouk -mshuler mshuler@rackspace.com Michael Shuler -noguchimn noguchimn@nttdata.co.jp Muneyuki Noguchi -nicholas-mistry nmistry@gmail.com Nicholas Mistry -nick-craig-wood nick@craig-wood.com Nick Craig-Wood -pcm pcm@cisco.com Paul Michali -pvo paul@substation9.com Paul Voccio -pvo pvoccio@castor.local Paul Voccio -pvo paul@openstack.org Paul Voccio -pvo paul.voccio@rackspace.com Paul Voccio -pshkitin pshkitin@griddynamics.com Pavel Shkitin -pednape pednape@gmail.com Pedro Navarro Perez -peter-a-portante peter.portante@redhat.com Peter Portante -philip-knouff philip.knouff@mailtrust.com Philip Knouff -psiwczak psiwczak@internap.com Piotr Siwczak -rkhardalian rafi@metacloud.com Rafi Khardalian -rtb rainer.toebbicke@cern.ch Rainer Toebbicke -lifeless rbtcollins@hp.com Robert Collins -rohitagarwalla rohitagarwalla@gmail.com Rohit Agarwalla -rpodolyaka rpodolyaka@mirantis.com Roman Podolyaka -rsokolkov rsokolkov@mirantis.com Roman Sokolkov -mr-rods rosario.disomma@dreamhost.com Rosario Di Somma -rlucio rlucio@internap.com Ryan Lucio -ryu-midokura ryu@midokura.jp Ryu Ishimoto -scott-devoid devoid@anl.gov Scott Devoid -slukjanov slukjanov@mirantis.com Sergey Lukjanov -krum-spencer nibz@cat.pdx.edu Spencer Krum -sdake sdake@redhat.com Steven Dake -sulochan-acharya sulochan@gmail.com Sulochan Acharya -r-thorsten thorsten@atomia.com Thorsten Tarrach -unmesh-gurjar unmesh.gurjar@vertex.co.in Unmesh Gurjar -unmesh-gurjar unmesh.gurjar@nttdata.com Unmesh Gurjar -victor-lowther victor.lowther@gmail.com Victor Lowther -yunshen yun.shen@hp.com Yun Shen -lzy-dev zhiyanl@cn.ibm.com Zhi Yan Liu -ziad-sawalha gihub@highbridgellc.com Ziad Sawalha -ethuleau edouard.thuleau@cloudwatt.com Édouard Thuleau -akscram ikharin@mirantis.com Ilya Kharin -nsavin nsavin@griddynamics.com Nikita Savin -ahaldin ahaldin@griddynamics.com Anton Haldin -hovyakov hovyakov@griddynamics.com Dmitry Hovyakov -sklimoff sklimoff@griddynamics.com Stan Klimoff -mkerrin michael.kerrin@hp.com Michael Kerrin -spzala spzala@us.ibm.com Sahdev Zala -skraynev skraynev@mirantis.com Sergey Kraynev -nelson-crynwr nelson@crynwr.com Russ Nelson -nelson-crynwr nelson@nelson-laptop Russ Nelson -nakamura-h nakamura-h@mxd.nes.nec.co.jp Hidekazu Nakamura -rizumu tom@rizu.mu Thomas Schreiber -usrleon mlvov@mirantis.com Lvov Maxim -senhuang senhuang@cisco.com Senhua Huang -yhasan yhasan@cisco.com Yousuf Hasan -wdec-ietf wdec.ietf@gmail.com Wojciech Dec -pkilambi pkilambi@cisco.com Pradeep Kilambi -pkilambi praddevel@gmail.com Pradeep Kilambi -pamor pamor@cisco.com Patrick Amor -nidonato nidonato@cisco.com Nicholas Donato -michael-ogorman michael.ogorman@gmail.com Michael O'Gorman -michaeltchapman michchap@cisco.com Michael Chapman -mvoelker mvoelker@cisco.com Mark T. Voelker -laksharm laksharm@cisco.com Lakshmi Sharma -jdenisco jdenisco@cisco.com John DeNisco -jennchen jennchen@cisco.com Jennifer Chen -tmazur tmazur@mirantis.com Tatiana Mazur -aignatov aignatov@mirantis.com Alexander Ignatov -asakhnov asakhnov@mirantis.com Alexander Sakhnov -vvechkanov vvechkanov@mirantis.com Vladimir Vechkanov - -# update on 13-May-13 -rohara rohara@redhat.com Ryan O'Hara -leblancd leblancd@cisco.com Dane LeBlanc -otherwiseguy twilson@redhat.com Terry Wilson -mouad-benchchaoui m.benchchaoui@cloudbau.de Mouad Benchchaoui -rcurran rcurran@cisco.com Rich Curran -maru marun@redhat.com Maru Newby -smoser smoser@brickies.net Scott Moser -jshepher galstrom21@gmail.com Justin Shepherd -habukao xiu.yushen@gmail.com Osamu Habuka -eafonichev eafonichev@mirantis.com Evgeniy Afonichev -asalkeld asalkeld@redhat.com Angus Salkeld -spn surya_prabhakar@dell.com Surya Prabhakar -steve-stevebaker sbaker@redhat.com Steve Baker -john-dunning jrd@redhat.com John Dunning -fmanco filipe.manco@gmail.com Filipe Manco -d1b dmitriy.budnik@gmail.com Dmitriy Budnik -jiajun-xu jiajun.xu@intel.com jiajun xu -gpernot gpernot@praksys.org Guillaume Pernot -torandu sean@torandu.com Sean Gallagher -mvidner mvidner@suse.cz Martin Vidner -clint-fewbar clint@fewbar.com Clint Byrum -bob-melander bob.melander@gmail.com Bob Melander -slicknik slicknik@gmail.com Nikhil Manchanda -lyda.google kevin@ie.suberic.net Kevin Lyda -jruzicka jruzicka@redhat.com Jakub Ruzicka -imsplitbit imsplitbit@gmail.com Daniel Salinas -stephen-ma stephen.ma@hp.com Stephen Ma -andrea-frittoli andrea.frittoli@hp.com Andrea Frittoli -jerome-gallard jerome.david.gallard@gmail.com Jérôme Gallard -tim-miller-0 tim.miller.0@gmail.com Tim Miller -chmouel launchpad@chmouel.com Chmouel Boudjnah -johndescs michalon@igbmc.fr Jonathan Michalon -iwienand iwienand@redhat.com Ian Wienand -zealot0630 zealot0630@gmail.com Zang MingJie -cbjchen cbjchen@cn.ibm.com Liang Chen -bartosz-gorski bartosz.gorski@ntti3.com Bartosz Górski -mhu-s mhu@enovance.com Matthieu Huin -derek-morton derek.morton25@gmail.com Derek Morton -phongdly phongdly@us.ibm.com Phong Doan Ly -novas0x2a mike@fluffypenguin.org Mike Lundy -jamielennox jlennox@redhat.com Jamie Lennox -james-slagle james.slagle@gmail.com James Slagle -kannan arangamani.kannan@gmail.com Kannan Manickam -armando-migliaccio amigliaccio@nicira.com Armando Migliaccio -adriansmith adrian@17od.com Adrian Smith -jasondunsmore jasondunsmore@gmail.com Jason Dunsmore -victor-r-howard victor.r.howard@gmail.com Victor Howard -gtt116 gtt116@gmail.com TianTian Gao -jsavak jsavak@gmail.com Joe Savak -john-brzozowski jjmb@jjmb.com John Jason Brzozowski -vodmat-news vodmat.news@gmail.com Mattieu Puel -jiyou09 jiyou09@gmail.com You Ji -john-lenihan john.lenihan@hp.com John Lenihan -guohliu guohliu@cn.ibm.com GuoHui LIu -v-joseph joseph@cloudscaling.com Joseph Glanville -dmitry-x dmitry@spikhalskiy.com Dmitry Spikhalskiy -joe-hakim-rahme joe.hakim.rahme@enovance.com Joe Hakim Rahme -xuhanp xuhanp@cn.ibm.com Xuhan Peng -armando-migliaccio amigliaccio@nicira.com armando-migliaccio -crayz allanfeid@gmail.com Allan Feid -james-branen james.branen@hp.com Jim Branen -yuyangbj yuyangbj@cn.ibm.com Yang Yu -academicgareth gareth@unitedstack.com Kun Huang -anastasia-karpinska akarpinska@griddynamics.com Anastasia Karpinska -niu-zglinux niu.zglinux@gmail.com Zhenguo Niu -eyerediskin sskripnick@mirantis.com Sergey Skripnick -leo-toyoda toyoda-reo@cnt.mxw.nes.nec.co.jp Leo Toyoda -david-wilde-rackspace david.wilde@rackspace.com Dave Wilde -talkain tal.kain@ravellosystems.com Tal Kain -sylvain-afchain sylvain.afchain@enovance.com Sylvain Afchain -ifarkas ifarkas@redhat.com Imre Farkas -tsedovic tomas@sedovic.cz Tomas Sedovic -andrew-mccrae andy.mccrae@googlemail.com Andy McCrae -mriedem mriedem@us.ibm.com Matt Riedemann -david-martin dmartls1@gmail.com David Martin -tzumainn tzumainn@redhat.com Tzu-Mainn Chen -edward-hope-morley opentastic@gmail.com Edward Hope-Morley -leseb sebastien.han@enovance.com Sebastien Han -sadasu sadasu@cisco.com Sandhya Dasu -pete5 peter@gridcentric.ca Peter Feiner -matt-wagner matt.wagner@redhat.com Matt Wagner -yacine-b yacine@alyseo.com Yacine Kheddache -512-francois-o63 francois@alyseo.com Francois Billard -francine-ransy francine.ransy@gmail.com Francine Ransy -vsergeyev vsergeyev@mirantis.com Victor Sergeyev -starodubcevna starodubcevna@gmail.com Nikolay Starodubtsev -mgagne mgagne@iweb.com Mathieu Gagné -irenab irenab@mellanox.com Irena Berezovsky -luiz-ozaki luiz.ozaki@gmail.com Luiz Ozaki -xinxin-shu xinxin.shu@intel.com shu, xinxin -lmatter lmatter@coraid.com Larry Matter -bob-ball bob.ball@citrix.com Bob Ball -dflorea dflorea@cisco.com Dan Florea -david-hill david.hill@ubisoft.com David Hill -greg-ball greg.ball@rackspace.com Greg Ball -dukov dukov@mirantis.com Dmitry Ukov -amir-sadoughi amir.sadoughi@gmail.com Amir Sadoughi -christoph-gysin christoph.gysin@gmail.com Christoph Gysin -0xffea 0xffea@gmail.com David Höppner -yogesh-srikrishnan yoga80@yahoo.com Yogeshwar Srikrishnan -imelnikov imelnikov@griddynamics.com Ivan Melnikov -jvarlamova jvarlamova@mirantis.com Julia Varlamova -anton0 anfrolov@mirantis.com Anton Frolov -nprivalova nprivalova@mirantis.com Nadya Privalova -sreshetniak sreshetniak@mirantis.com Sergey Reshetnyak -vrovachev vrovachev@mirantis.com Vadim Rovachev -yzveryanskyy yzveryanskyy@mirantis.com Yuriy Zveryanskyy -eyuzlikeev eyuzlikeev@mirantis.com Eduard Yuzlikeev -ityaptin ityaptin@mirantis.com Ilya Tyaptin -iberezovskiy iberezovskiy@mirantis.com Ivan Berezovskiy - -# update 03-Jun-13 -aovchinnikov aovchinnikov@mirantis.com Alexey Ovchinnikov -andreserl andres.rodriguez@canonical.com Andres Rodriguez -bruno-semperlotti bruno.semperlotti@gmail.com Bruno Semperlotti -shrinand shrinand@maginatics.com Shri Javadekar -alex-gaynor alex.gaynor@gmail.com Alex Gaynor -carl-baldwin carl.baldwin@hp.com Carl Baldwin -ema ema@linux.it Emanuele Rocca -christophe.sauthier christophe.sauthier@objectif-libre.com Christophe Sauthier -jtomasek jtomasek@redhat.com Jiri Tomasek -bradjones jones.bradley@me.com Bradley Jones -yportnova yportnov@yahoo-inc.com Yuliya Portnova -jan-provaznik jprovazn@redhat.com Jan Provaznik -azilli mkislinska@griddynamics.com Marharyta Kislinska -rmoore08 rmoore08@gmail.com Ryan Moore -akamyshnikova akamyshnikova@mirantis.com Ann Kamyshnikova -mukul18 mukul18@gmail.com Mukul Patel -lakhindr lakhinder.walia@hds.com Lakhinder Walia -amalabasha princessbasha@gmail.com Amala Basha -kanzhe-jiang kanzhe@gmail.com Kanzhe Jiang -fujioka-yuuichi fujioka.yuuichi@gmail.com fujioka yuuichi -ryu-midokura ryu@midokura.com Ryu Ishimoto -jordan-pittier jordan.pittier@gmail.com Jordan Pittier -shengjie-min shengjie_min@dell.com Shengjie Min -jpeeler-z jpeeler@redhat.com Jeff Peeler -alexei-kornienko alexei.kornienko@gmail.com Alexei Kornienko -morellon thiago.morello@locaweb.com.br Thiago Morello -dmitrymex dmescheryakov@mirantis.com Dmitry Mescheryakov -nkonovalov nkonovalov@mirantis.com Nikita Konovalov -farrellee matt@redhat.com Matthew Farrellee -ylobankov ylobankov@mirantis.com Yaroslav Lobankov -ruhe rkamaldinov@mirantis.com Ruslan Kamaldinov -akuznetsov akuznetsov@mirantis.com Alexander Kuznetsov -akuno anita.kuno@enovance.com Anita Kuno -mtaylor-s mtaylor@redhat.com Martyn Taylor -nijaba nick.barcet@canonical.com Nicolas Barcet -steven-berler steven.berler@dreamhost.com Steven Berler -gmb graham.binns@canonical.com Graham Binns -endre-karlson endre.karlson@gmail.com Endre Karlson -frossigneux francois.rossigneux@inria.fr François Rossigneux -maksimov stanislav_m@dell.com Stas Maksimov -swann-w swann.croiset@bull.net Swann Croiset -nealph phil.neal@hp.com Phil Neal -soulascedric soulascedric@gmail.com Cédric Soulas -xingzhou xingzhou@cn.ibm.com xingzhou -terriyu teryu@alum.mit.edu Terri Yu -imain imain@redhat.com Ian Main -calfonso calfonso@redhat.com Chris Alfonso -gblomqui gblomqui@redhat.com Greg Blomquist -pierre-freund pierre.freund@gmail.com Pierre Freund -robert-van-leeuwen robert.vanleeuwen@spilgames.com Robert van Leeuwen -gfidente gfidente@redhat.com Giulio Fidente -therve therve@gmail.com Thomas Herve -andrew-plunk andrew.plunk@rackspace.com Andrew Plunk -winson-c-chan winson.c.chan@intel.com Winson Chan -simon-pasquier pasquier.simon@gmail.com Simon Pasquier - -# update 05-Jun-13 -sross-7 sross@redhat.com Solly Ross -pschaef pschaef@de.ibm.com Patrick Schaefer -sergey.vilgelm sergey.vilgelm@gmail.com Sergey Vilgelm -jolyon git@limilo.com Jolyon Brown -jay-lau-513 jay.lau.513@gmail.com Jay Lau -satya-patibandla satya.patibandla@tcs.com Satyanarayana Patibandla -liyingjun liyingjun1988@gmail.com Liyingjun -yosshy a-yoshiyama@bu.jp.nec.com Akira Yoshiyama -aarti-kriplani aarti.kriplani@rackspace.com Aarti Kriplani -novel rbogorodskiy@mirantis.com Roman Bogorodskiy -yanglyy yanglyy@cn.ibm.com YangLei -jsbryant jsbryant@us.ibm.com Jay S. Bryant -jenny-shieh jenny.shieh@hp.com jenny-shieh -jenny-shieh jenny.shieh@hp.com Jenny Shieh -derek-chiang derek.chiang@nebula.com Derek Chiang -edward-hope-morley edward.hope-morley@canonical.com Edward Hope-Morley -yuzawataka yuzawataka@intellilink.co.jp Yuzawa Takahiko -jcallicoat jordan.callicoat@rackspace.com Jordan Callicoat -hovyakov dkhovyakov@griddynamics.com Dmitry Khovyakov -hyerle hyerle@hp.com Robert Hyerle -carlos-garza carlos.garza@rackspace.com Carlos Garza -venkateshsampath venkatesh.sampath@outlook.com Venkatesh Sampath -robert-myers robert.myers@rackspace.com Robert Myers -pekowski pekowski@gmail.com Raymond Pekowski -alex-meade hatboy112@yahoo.com Alex Meade -kiall kiall@hp.com Kiall Mac Innes -aditirav aditirav@thoughtworks.com Aditi Raveesh -a-gorodnev agorodnev@mirantis.com Alexander Gorodnev -xbsd-nikolay nsobolevsky@mirantis.com Nikolay Sobolevsky -yamamoto yamamoto@valinux.co.jp Yamamoto Takashi -sdeaton2 sdeaton2@gmail.com Steven Deaton -hughsaunders hugh@wherenow.org Hugh Saunders -genggjh gengjh@cn.ibm.com David Geng -lklrmn lklrmn@gmail.com Leah Klearman -fabien-boucher fabien.boucher@enovance.com Fabien Boucher -sdague sean@dague.net Sean Dague -jmatt jmatt@jmatt.org J. Matt Peterson -hyphon-zh ghj114@gmail.com Hyphon Zhang -hartsock hartsocks@vmware.com Shawn Hartsock -aarti-kriplani aarti.kriplani@rackspace.com Aarti Kriplani -guochbo guochbo@cn.ibm.com Chang Bo Guo -krishna1256 krishna1256@gmail.com Sai Krishna Sripada -fujioka-yuuichi-d fujioka-yuuichi@zx.mxh.nes.nec.co.jp fujioka yuuichi -rpothier rpothier@cisco.com Robert Pothier -debo ddutta@gmail.com Debo~ Dutta -dbailey-k dbailey@hp.com Darragh Bailey -ghe.rivero ghe.rivero@hp.com Ghe Rivero -justin-hopper justin.hopper@hp.com Justin Hopper -kgriffs kurt.griffiths@rackspace.com Kurt Griffiths -zyuan zhihao.yuan@rackspace.com Zhihao Yuan -bryan-davidson bryan.davidson@rackspace.com Bryan Davidson -lichray lichray@gmail.com Zhihao Yuan -eap-x eap@hp.com Eric Pendergrass -kaushikc kaushik.chandrashekar@rackspace.com Kaushik Chandrashekar -malini-kamalambal malini.kamalambal@rackspace.com Malini Kamalambal -kevin-carter kevin.carter@rackspace.com Kevin Carter -radix chris.armstrong@rackspace.com Christopher Armstrong - -# Update 11-Jun-13 -xyj-asmy yejia@unitedstack.com Yejia Xu -toabctl thomasbechtold@jpberlin.de Thomas Bechtold -blak111 kevin.benton@bigswitch.com Kevin Benton -matthew-macdonald-wallace matthew.macdonald-wallace@hp.com Matthew Macdonald-Wallace -jianingy jianingy@unitedstack.com Jianing Yang -satish-0 satish@aristanetworks.com Satish Mohan -razique razique.mahroua@gmail.com Razique Mahroua -mikeyp-3 mikeyp@lahondaresearch.org Mike Pittaro -guanxiaohua2k6 guanxiaohua2k6@gmail.com Xiaohua Guan -tylern-u tylern@pistoncloud.com Tyler North -sagar-r-nikam sagar.r.nikam@gmail.com Sagar Nikam -danehans danehans@cisco.com Daneyon Hansen -shiju-p shiju.p@gmail.com Shiju -karin-levenstein karin.levenstein@rackspace.com Karin Levenstein -wbatterson wbatterson@brinkster.com Walter Batterson -diane-fleming diane.fleming@rackspace.com Diane Fleming -razique razique.mahroua@gmail.com Razique Mahroua -jproulx jon@jonproulx.com Jonathan Proulx -pmsangal puneet@inmovi.net Puneet Sangal -kbringard kbringard@att.com Kevin Bringard -jproulx jon@csail.mit.edu Jonathan Proulx -ppouliot peter@pouliot.net Peter Pouliot -ken-pepple ken.pepple@cloudtp.com Ken Pepple -frodenas frodenas@gmail.com Ferran Rodenas -john-davidge jodavidg@cisco.com John Davidge -colinmcnamara colin@2cups.com Colin McNamara -anniec anniec@yahoo-inc.com Annie Cheng -han-sebastien han.sebastien@gmail.com Sébastien Han -woprandi william.oprandi@gmail.com William Oprandi -everett-toews everett.toews@rackspace.com Everett Toews -jeff-d-halter jeff.d.halter@gmail.com Jeff Halter -jafletch jafletch@cisco.com Jack Peter Fletcher -bill-rich bill.rich@gmail.com Bill Rich -ejkern ejkern@mac.com Ed Kern -entropyworks yazz.atlas@hp.com Yazz Atlas -bknowles bknowles@momentumsi.com Brad Knowles -bkerensa bkerensa@ubuntu.com Benjamin Kerensa -phil-hopkins-a phil.hopkins@rackspace.com Phil Hopkins -pps-pranav pps.pranav@gmail.com Pranav Salunke -phil-hopkins-a phil.hopkins@rackspace.com Phil Hopkins -razique razique.mahroua@gmail.com Razique Mahroua -chris-ricker chris.ricker@gmail.com Chris Ricker -sgordon sgordon@redhat.com Stephen Gordon -mandoonandy andy@aptira.com Andy McCallum -jay-clark jay.clark@gmail.com Jay Clark -sheeprine sheeprine@nullplace.com Stéphane Albert -kvdveer koert@cloudvps.com Koert van der Veer -jens-christian-fischer jens-christian.fischer@switch.ch Jens-Christian Fischer -jaegerandi aj@suse.de Andreas Jaeger -lmorchard me@lmorchard.com Les Orchard -fifieldt tom@openstack.org Tom Fifield -enakai enakai@redhat.com Etsuji Nakai -nati-ueno nachi@ntti3.com Nachi Ueno -wugc wugc@cn.ibm.com Guang Chun Wu -k3vinmcdonald k3vinmcdonald@gmail.com Kevin McDonald - -# Update 14-Jun-13 -davewalker davewalker@ubuntu.com Dave Walker -niu-zglinux niu.zglinux@gmail.com Zhenguo Niu (牛振国) -haomai haomai@unitedstack.com Haomai Wang -maheshp maheshp@thoughtworks.com Mahesh Panchaksharaiah -mark-seger mark.seger@hp.com Mark Seger -abhiabhi-sr abhiabhi.sr@gmail.com Abhinav Srivastava -harlowja harlowja@gmail.com Joshua Harlow -egallen erwan.gallen@cloudwatt.com Erwan Gallen -mattt416 mattt@defunct.ca Matt Thompson -viraj-hardikar-n viraj.hardikar@hp.com Viraj Hardikar -rcritten rcritten@redhat.com Rob Crittenden -jiangwt100 wentian@unitedstack.com Jim Jiang -yugsuo guangyu@unitedstack.com Guangyu Suo -jdillaman dillaman@redhat.com Jason Dillaman - -# Update 18-Jun-13 -epavlova epavlova@mirantis.com Katrin Pavlova -kiran-kumar-vaddi kiran-kumar.vaddi@hp.com Kiran Kumar Vaddi -prem-karat prem.karat@linux.vnet.ibm.com Prem Karat -xqueralt xqueralt@redhat.com Xavier Queralt -jordan-pittier jordan.pittier-ext@cloudwatt.com Jordan Pittier -bdpayne bdpayne@acm.org Bryan D. Payne -forrest-r forrest@research.att.com Andrew Forrest - -# Robots -openstack review@openstack.org Gerrit Code Review -openstack jenkins@review.openstack.org Jenkins -openstack jenkins@openstack.org OpenStack Jenkins - -# Update 21-Jun-13 -saschpe saschpe@gmx.de Sascha Peilicke -jiataotj jiataotj@cn.ibm.com David Jia -skuicloud skuicloud@gmail.com Kui Shi -selvait90 selvait90@gmail.com Selvakumar Arumugam -redheadflyundershadow sneezezhang@cienet.com.cn Lei Zhang -akscram akscram@gmail.com Ilya Kharin -randall-burt randall.burt@rackspace.com Randall Burt -fengqian-gao fengqian.gao@intel.com Fengqian.Gao -jeffmilstea jeffmilstea@gmail.com Jeff Milstead -awoods-0 awoods@internap.com Anthony Woods -jonesld jonesld@us.ibm.com Daniel Jones diff --git a/etc/openstack.conf b/etc/openstack.conf deleted file mode 100644 index 27cfe4229..000000000 --- a/etc/openstack.conf +++ /dev/null @@ -1,27 +0,0 @@ -[DEFAULT] -# Run in debug mode? -# debug = False - -# Database parameters -# db_driver = sqlite -# db_user = operator -# db_password = None -# db_database = /opt/stack/data/stackalytics.sqlite -# db_hostname = localhost - -# Extensions -# extensions = CommitsLOC,MessageDetails - -# Root for all project sources. The tool will iterate over its contents -# sources_root = /opt/stack/repos - -# email mappings (e.g. collected from .mailmap files) -# email_aliases = etc/email-aliases -# mappings from domains to company names -# domain2company = etc/domain-company -# mappings from emails to company names -# email2company = etc/email-company -# mappings from launchpad ids to emails and user names -# launchpad2email = etc/launchpad-ids -# mappings from launchpad id to company name -# launchpad2company = etc/launchpad-company diff --git a/etc/stackalytics.conf b/etc/stackalytics.conf new file mode 100644 index 000000000..c4dcae893 --- /dev/null +++ b/etc/stackalytics.conf @@ -0,0 +1,24 @@ +[DEFAULT] +# Run in debug mode? +# debug = False + +# Default data +# default-data = etc/default_data.json + +# The folder that holds all project sources to analyze +# sources_root = ../metric-root-tmp + +# Runtime storage URI +# runtime_storage_uri = memcached://127.0.0.1:11211 + +# URI of persistent storage +# persistent_storage_uri = mongodb://localhost + +# Update persistent storage with default data +# read-default-data = False + +# Repo poll period in seconds +# repo_poll_period = 300 + +# Address of update handler +# frontend_update_address = http://user:user@localhost/update/%s \ No newline at end of file diff --git a/etc/test_default_data.json b/etc/test_default_data.json new file mode 100644 index 000000000..9f719d3c3 --- /dev/null +++ b/etc/test_default_data.json @@ -0,0 +1,121 @@ +{ + "users": [ + { + "launchpad_id": "foo", + "user_name": "Pupkin", + "emails": ["a@a"], + "companies": [ + { + "company_name": "Uno", + "end_date": "2013-Jan-01" + }, + { + "company_name": "Duo", + "end_date": null + } + ] + } + ], + + "companies": [ + { + "company_name": "Mirantis", + "domains": ["mirantis.com"] + }, + { + "company_name": "*independent", + "domains": [""] + }, + { + "company_name": "Hewlett-Packard", + "domains": ["hp.com"] + }, + { + "company_name": "Intel", + "domains": ["intel.com"] + } + ], + + "repos": [ + { + "branches": ["master"], + "name": "Quantum Client", + "type": "core", + "uri": "git://github.com/openstack/python-quantumclient.git", + "releases": [ + { + "release_name": "Folsom", + "tag_from": "folsom-1", + "tag_to": "2.1" + }, + { + "release_name": "Grizzly", + "tag_from": "2.1", + "tag_to": "2.2.1" + }, + { + "release_name": "Havana", + "tag_from": "2.2.1", + "tag_to": "HEAD" + } + ] + }, + { + "branches": ["master"], + "name": "Keystone", + "type": "core", + "uri": "git://github.com/openstack/keystone.git", + "releases": [ + { + "release_name": "Essex", + "tag_from": "2011.3", + "tag_to": "2012.1" + }, + { + "release_name": "Folsom", + "tag_from": "2012.1", + "tag_to": "2012.2" + }, + { + "release_name": "Grizzly", + "tag_from": "2012.2", + "tag_to": "2013.1" + }, + { + "release_name": "Havana", + "tag_from": "2013.1", + "tag_to": "HEAD" + } + ] + } + ], + + "releases": [ + { + "release_name": "ALL", + "start_date": "2010-May-01", + "end_date": "now" + }, + { + "release_name": "Essex", + "start_date": "2011-Oct-01", + "end_date": "2012-Apr-01" + }, + { + "release_name": "Folsom", + "start_date": "2012-Apr-01", + "end_date": "2012-Oct-01" + }, + { + "release_name": "Grizzly", + "start_date": "2012-Oct-01", + "end_date": "2013-Apr-01" + }, + { + "release_name": "Havana", + "start_date": "2013-Apr-01", + "end_date": "now" + } + ] + +} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 8bfbc3e54..b89eb065b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,12 @@ d2to1>=0.2.10,<0.3 -pbr>=0.5.16,<0.6 -#MySQL-python -#pysqlite -#git+git://github.com/MetricsGrimoire/RepositoryHandler.git#egg=repositoryhandler-0.5 -#git+git://github.com/SoftwareIntrospectionLab/guilty.git#egg=guilty-2.1 -launchpadlib Flask>=0.9 Flask-Gravatar -oslo.config -pylibmc +iso8601 +launchpadlib +http://tarballs.openstack.org/oslo.config/oslo.config-1.2.0a2.tar.gz#egg=oslo.config-1.2.0a2 +pbr>=0.5.16,<0.6 +psutil +python-memcached +pymongo +sh +six diff --git a/stackalytics/__init__.py b/stackalytics/__init__.py new file mode 100644 index 000000000..c9d84b54b --- /dev/null +++ b/stackalytics/__init__.py @@ -0,0 +1 @@ +__author__ = 'ishakhat' diff --git a/stackalytics/openstack/__init__.py b/stackalytics/openstack/__init__.py new file mode 100644 index 000000000..c9d84b54b --- /dev/null +++ b/stackalytics/openstack/__init__.py @@ -0,0 +1 @@ +__author__ = 'ishakhat' diff --git a/stackalytics/openstack/common/__init__.py b/stackalytics/openstack/common/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/stackalytics/openstack/common/importutils.py b/stackalytics/openstack/common/importutils.py new file mode 100644 index 000000000..aea041d20 --- /dev/null +++ b/stackalytics/openstack/common/importutils.py @@ -0,0 +1,68 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack Foundation. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +""" +Import related utilities and helper functions. +""" + +import sys +import traceback + + +def import_class(import_str): + """Returns a class from a string including module and class.""" + mod_str, _sep, class_str = import_str.rpartition('.') + try: + __import__(mod_str) + return getattr(sys.modules[mod_str], class_str) + except (ValueError, AttributeError): + raise ImportError('Class %s cannot be found (%s)' % + (class_str, + traceback.format_exception(*sys.exc_info()))) + + +def import_object(import_str, *args, **kwargs): + """Import a class and return an instance of it.""" + return import_class(import_str)(*args, **kwargs) + + +def import_object_ns(name_space, import_str, *args, **kwargs): + """Tries to import object from default namespace. + +Imports a class and return an instance of it, first by trying +to find the class in a default namespace, then failing back to +a full path if not found in the default namespace. +""" + import_value = "%s.%s" % (name_space, import_str) + try: + return import_class(import_value)(*args, **kwargs) + except ImportError: + return import_class(import_str)(*args, **kwargs) + + +def import_module(import_str): + """Import a module.""" + __import__(import_str) + return sys.modules[import_str] + + +def try_import(import_str, default=None): + """Try to import a module and if it fails return default.""" + try: + return import_module(import_str) + except ImportError: + return default diff --git a/stackalytics/openstack/common/jsonutils.py b/stackalytics/openstack/common/jsonutils.py new file mode 100644 index 000000000..f1d442c06 --- /dev/null +++ b/stackalytics/openstack/common/jsonutils.py @@ -0,0 +1,169 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# Copyright 2011 Justin Santa Barbara +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +''' +JSON related utilities. + +This module provides a few things: + + 1) A handy function for getting an object down to something that can be + JSON serialized. See to_primitive(). + + 2) Wrappers around loads() and dumps(). The dumps() wrapper will + automatically use to_primitive() for you if needed. + + 3) This sets up anyjson to use the loads() and dumps() wrappers if anyjson + is available. +''' + + +import datetime +import functools +import inspect +import itertools +import json +import types +import xmlrpclib + +import six + +from stackalytics.openstack.common import timeutils + + +_nasty_type_tests = [inspect.ismodule, inspect.isclass, inspect.ismethod, + inspect.isfunction, inspect.isgeneratorfunction, + inspect.isgenerator, inspect.istraceback, inspect.isframe, + inspect.iscode, inspect.isbuiltin, inspect.isroutine, + inspect.isabstract] + +_simple_types = (types.NoneType, int, basestring, bool, float, long) + + +def to_primitive(value, convert_instances=False, convert_datetime=True, + level=0, max_depth=3): + """Convert a complex object into primitives. + + Handy for JSON serialization. We can optionally handle instances, + but since this is a recursive function, we could have cyclical + data structures. + + To handle cyclical data structures we could track the actual objects + visited in a set, but not all objects are hashable. Instead we just + track the depth of the object inspections and don't go too deep. + + Therefore, convert_instances=True is lossy ... be aware. + + """ + # handle obvious types first - order of basic types determined by running + # full tests on nova project, resulting in the following counts: + # 572754 + # 460353 + # 379632 + # 274610 + # 199918 + # 114200 + # 51817 + # 26164 + # 6491 + # 283 + # 19 + if isinstance(value, _simple_types): + return value + + if isinstance(value, datetime.datetime): + if convert_datetime: + return timeutils.strtime(value) + else: + return value + + # value of itertools.count doesn't get caught by nasty_type_tests + # and results in infinite loop when list(value) is called. + if type(value) == itertools.count: + return six.text_type(value) + + # FIXME(vish): Workaround for LP bug 852095. Without this workaround, + # tests that raise an exception in a mocked method that + # has a @wrap_exception with a notifier will fail. If + # we up the dependency to 0.5.4 (when it is released) we + # can remove this workaround. + if getattr(value, '__module__', None) == 'mox': + return 'mock' + + if level > max_depth: + return '?' + + # The try block may not be necessary after the class check above, + # but just in case ... + try: + recursive = functools.partial(to_primitive, + convert_instances=convert_instances, + convert_datetime=convert_datetime, + level=level, + max_depth=max_depth) + if isinstance(value, dict): + return dict((k, recursive(v)) for k, v in value.iteritems()) + elif isinstance(value, (list, tuple)): + return [recursive(lv) for lv in value] + + # It's not clear why xmlrpclib created their own DateTime type, but + # for our purposes, make it a datetime type which is explicitly + # handled + if isinstance(value, xmlrpclib.DateTime): + value = datetime.datetime(*tuple(value.timetuple())[:6]) + + if convert_datetime and isinstance(value, datetime.datetime): + return timeutils.strtime(value) + elif hasattr(value, 'iteritems'): + return recursive(dict(value.iteritems()), level=level + 1) + elif hasattr(value, '__iter__'): + return recursive(list(value)) + elif convert_instances and hasattr(value, '__dict__'): + # Likely an instance of something. Watch for cycles. + # Ignore class member vars. + return recursive(value.__dict__, level=level + 1) + else: + if any(test(value) for test in _nasty_type_tests): + return six.text_type(value) + return value + except TypeError: + # Class objects are tricky since they may define something like + # __iter__ defined but it isn't callable as list(). + return six.text_type(value) + + +def dumps(value, default=to_primitive, **kwargs): + return json.dumps(value, default=default, **kwargs) + + +def loads(s): + return json.loads(s) + + +def load(s): + return json.load(s) + + +try: + import anyjson +except ImportError: + pass +else: + anyjson._modules.append((__name__, 'dumps', TypeError, + 'loads', ValueError, 'load')) + anyjson.force_implementation(__name__) diff --git a/stackalytics/openstack/common/log.py b/stackalytics/openstack/common/log.py new file mode 100644 index 000000000..29c165ea3 --- /dev/null +++ b/stackalytics/openstack/common/log.py @@ -0,0 +1,559 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack Foundation. +# Copyright 2010 United States Government as represented by the +# Administrator of the National Aeronautics and Space Administration. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +"""Openstack logging handler. + +This module adds to logging functionality by adding the option to specify +a context object when calling the various log methods. If the context object +is not specified, default formatting is used. Additionally, an instance uuid +may be passed as part of the log message, which is intended to make it easier +for admins to find messages related to a specific instance. + +It also allows setting of formatting information through conf. + +""" + +import ConfigParser +import cStringIO +import inspect +import itertools +import logging +import logging.config +import logging.handlers +import os +import sys +import traceback + +from oslo.config import cfg + +# from quantum.openstack.common.gettextutils import _ +from stackalytics.openstack.common import importutils +from stackalytics.openstack.common import jsonutils +# from quantum.openstack.common import local + + +_DEFAULT_LOG_DATE_FORMAT = "%Y-%m-%d %H:%M:%S" + +common_cli_opts = [ + cfg.BoolOpt('debug', + short='d', + default=False, + help='Print debugging output (set logging level to ' + 'DEBUG instead of default WARNING level).'), + cfg.BoolOpt('verbose', + short='v', + default=False, + help='Print more verbose output (set logging level to ' + 'INFO instead of default WARNING level).'), +] + +logging_cli_opts = [ + cfg.StrOpt('log-config', + metavar='PATH', + help='If this option is specified, the logging configuration ' + 'file specified is used and overrides any other logging ' + 'options specified. Please see the Python logging module ' + 'documentation for details on logging configuration ' + 'files.'), + cfg.StrOpt('log-format', + default=None, + metavar='FORMAT', + help='A logging.Formatter log message format string which may ' + 'use any of the available logging.LogRecord attributes. ' + 'This option is deprecated. Please use ' + 'logging_context_format_string and ' + 'logging_default_format_string instead.'), + cfg.StrOpt('log-date-format', + default=_DEFAULT_LOG_DATE_FORMAT, + metavar='DATE_FORMAT', + help='Format string for %%(asctime)s in log records. ' + 'Default: %(default)s'), + cfg.StrOpt('log-file', + metavar='PATH', + deprecated_name='logfile', + help='(Optional) Name of log file to output to. ' + 'If no default is set, logging will go to stdout.'), + cfg.StrOpt('log-dir', + deprecated_name='logdir', + help='(Optional) The base directory used for relative ' + '--log-file paths'), + cfg.BoolOpt('use-syslog', + default=False, + help='Use syslog for logging.'), + cfg.StrOpt('syslog-log-facility', + default='LOG_USER', + help='syslog facility to receive log lines') +] + +generic_log_opts = [ + cfg.BoolOpt('use_stderr', + default=True, + help='Log output to standard error') +] + +log_opts = [ + cfg.StrOpt('logging_context_format_string', + default='%(asctime)s.%(msecs)03d %(process)d %(levelname)s ' + '%(name)s [%(request_id)s %(user)s %(tenant)s] ' + '%(instance)s%(message)s', + help='format string to use for log messages with context'), + cfg.StrOpt('logging_default_format_string', + default='%(asctime)s.%(msecs)03d %(process)d %(levelname)s ' + '%(name)s [-] %(instance)s%(message)s', + help='format string to use for log messages without context'), + cfg.StrOpt('logging_debug_format_suffix', + default='%(funcName)s %(pathname)s:%(lineno)d', + help='data to append to log format when level is DEBUG'), + cfg.StrOpt('logging_exception_prefix', + default='%(asctime)s.%(msecs)03d %(process)d TRACE %(name)s ' + '%(instance)s', + help='prefix each line of exception output with this format'), + cfg.ListOpt('default_log_levels', + default=[ + 'amqplib=WARN', + 'sqlalchemy=WARN', + 'boto=WARN', + 'suds=INFO', + 'keystone=INFO', + 'eventlet.wsgi.server=WARN' + ], + help='list of logger=LEVEL pairs'), + cfg.BoolOpt('publish_errors', + default=False, + help='publish error events'), + cfg.BoolOpt('fatal_deprecations', + default=False, + help='make deprecations fatal'), + + # NOTE(mikal): there are two options here because sometimes we are handed + # a full instance (and could include more information), and other times we + # are just handed a UUID for the instance. + cfg.StrOpt('instance_format', + default='[instance: %(uuid)s] ', + help='If an instance is passed with the log message, format ' + 'it like this'), + cfg.StrOpt('instance_uuid_format', + default='[instance: %(uuid)s] ', + help='If an instance UUID is passed with the log message, ' + 'format it like this'), +] + +CONF = cfg.CONF +CONF.register_cli_opts(common_cli_opts) +CONF.register_cli_opts(logging_cli_opts) +CONF.register_opts(generic_log_opts) +CONF.register_opts(log_opts) + +# our new audit level +# NOTE(jkoelker) Since we synthesized an audit level, make the logging +# module aware of it so it acts like other levels. +logging.AUDIT = logging.INFO + 1 +logging.addLevelName(logging.AUDIT, 'AUDIT') + + +try: + NullHandler = logging.NullHandler +except AttributeError: # NOTE(jkoelker) NullHandler added in Python 2.7 + class NullHandler(logging.Handler): + def handle(self, record): + pass + + def emit(self, record): + pass + + def createLock(self): + self.lock = None + + +def _dictify_context(context): + if context is None: + return None + if not isinstance(context, dict) and getattr(context, 'to_dict', None): + context = context.to_dict() + return context + + +def _get_binary_name(): + return os.path.basename(inspect.stack()[-1][1]) + + +def _get_log_file_path(binary=None): + logfile = CONF.log_file + logdir = CONF.log_dir + + if logfile and not logdir: + return logfile + + if logfile and logdir: + return os.path.join(logdir, logfile) + + if logdir: + binary = binary or _get_binary_name() + return '%s.log' % (os.path.join(logdir, binary),) + + +class BaseLoggerAdapter(logging.LoggerAdapter): + + def audit(self, msg, *args, **kwargs): + self.log(logging.AUDIT, msg, *args, **kwargs) + + +class LazyAdapter(BaseLoggerAdapter): + def __init__(self, name='unknown', version='unknown'): + self._logger = None + self.extra = {} + self.name = name + self.version = version + + @property + def logger(self): + if not self._logger: + self._logger = getLogger(self.name, self.version) + return self._logger + + +class ContextAdapter(BaseLoggerAdapter): + warn = logging.LoggerAdapter.warning + + def __init__(self, logger, project_name, version_string): + self.logger = logger + self.project = project_name + self.version = version_string + + @property + def handlers(self): + return self.logger.handlers + + def deprecated(self, msg, *args, **kwargs): + stdmsg = _("Deprecated: %s") % msg + if CONF.fatal_deprecations: + self.critical(stdmsg, *args, **kwargs) + raise DeprecatedConfig(msg=stdmsg) + else: + self.warn(stdmsg, *args, **kwargs) + + def process(self, msg, kwargs): + if 'extra' not in kwargs: + kwargs['extra'] = {} + extra = kwargs['extra'] + + context = kwargs.pop('context', None) + # if not context: + # context = getattr(local.store, 'context', None) + if context: + extra.update(_dictify_context(context)) + + instance = kwargs.pop('instance', None) + instance_extra = '' + if instance: + instance_extra = CONF.instance_format % instance + else: + instance_uuid = kwargs.pop('instance_uuid', None) + if instance_uuid: + instance_extra = (CONF.instance_uuid_format + % {'uuid': instance_uuid}) + extra.update({'instance': instance_extra}) + + extra.update({"project": self.project}) + extra.update({"version": self.version}) + extra['extra'] = extra.copy() + return msg, kwargs + + +class JSONFormatter(logging.Formatter): + def __init__(self, fmt=None, datefmt=None): + # NOTE(jkoelker) we ignore the fmt argument, but its still there + # since logging.config.fileConfig passes it. + self.datefmt = datefmt + + def formatException(self, ei, strip_newlines=True): + lines = traceback.format_exception(*ei) + if strip_newlines: + lines = [itertools.ifilter( + lambda x: x, + line.rstrip().splitlines()) for line in lines] + lines = list(itertools.chain(*lines)) + return lines + + def format(self, record): + message = {'message': record.getMessage(), + 'asctime': self.formatTime(record, self.datefmt), + 'name': record.name, + 'msg': record.msg, + 'args': record.args, + 'levelname': record.levelname, + 'levelno': record.levelno, + 'pathname': record.pathname, + 'filename': record.filename, + 'module': record.module, + 'lineno': record.lineno, + 'funcname': record.funcName, + 'created': record.created, + 'msecs': record.msecs, + 'relative_created': record.relativeCreated, + 'thread': record.thread, + 'thread_name': record.threadName, + 'process_name': record.processName, + 'process': record.process, + 'traceback': None} + + if hasattr(record, 'extra'): + message['extra'] = record.extra + + if record.exc_info: + message['traceback'] = self.formatException(record.exc_info) + + return jsonutils.dumps(message) + + +def _create_logging_excepthook(product_name): + def logging_excepthook(type, value, tb): + extra = {} + if CONF.verbose: + extra['exc_info'] = (type, value, tb) + getLogger(product_name).critical(str(value), **extra) + return logging_excepthook + + +class LogConfigError(Exception): + + message = ('Error loading logging config %(log_config)s: %(err_msg)s') + + def __init__(self, log_config, err_msg): + self.log_config = log_config + self.err_msg = err_msg + + def __str__(self): + return self.message % dict(log_config=self.log_config, + err_msg=self.err_msg) + + +def _load_log_config(log_config): + try: + logging.config.fileConfig(log_config) + except ConfigParser.Error as exc: + raise LogConfigError(log_config, str(exc)) + + +def setup(product_name): + """Setup logging.""" + if CONF.log_config: + _load_log_config(CONF.log_config) + else: + _setup_logging_from_conf() + sys.excepthook = _create_logging_excepthook(product_name) + + +def set_defaults(logging_context_format_string): + cfg.set_defaults(log_opts, + logging_context_format_string= + logging_context_format_string) + + +def _find_facility_from_conf(): + facility_names = logging.handlers.SysLogHandler.facility_names + facility = getattr(logging.handlers.SysLogHandler, + CONF.syslog_log_facility, + None) + + if facility is None and CONF.syslog_log_facility in facility_names: + facility = facility_names.get(CONF.syslog_log_facility) + + if facility is None: + valid_facilities = facility_names.keys() + consts = ['LOG_AUTH', 'LOG_AUTHPRIV', 'LOG_CRON', 'LOG_DAEMON', + 'LOG_FTP', 'LOG_KERN', 'LOG_LPR', 'LOG_MAIL', 'LOG_NEWS', + 'LOG_AUTH', 'LOG_SYSLOG', 'LOG_USER', 'LOG_UUCP', + 'LOG_LOCAL0', 'LOG_LOCAL1', 'LOG_LOCAL2', 'LOG_LOCAL3', + 'LOG_LOCAL4', 'LOG_LOCAL5', 'LOG_LOCAL6', 'LOG_LOCAL7'] + valid_facilities.extend(consts) + raise TypeError(('syslog facility must be one of: %s') % + ', '.join("'%s'" % fac + for fac in valid_facilities)) + + return facility + + +def _setup_logging_from_conf(): + log_root = getLogger(None).logger + for handler in log_root.handlers: + log_root.removeHandler(handler) + + if CONF.use_syslog: + facility = _find_facility_from_conf() + syslog = logging.handlers.SysLogHandler(address='/dev/log', + facility=facility) + log_root.addHandler(syslog) + + logpath = _get_log_file_path() + if logpath: + filelog = logging.handlers.WatchedFileHandler(logpath) + log_root.addHandler(filelog) + + if CONF.use_stderr: + streamlog = ColorHandler() + log_root.addHandler(streamlog) + + elif not CONF.log_file: + # pass sys.stdout as a positional argument + # python2.6 calls the argument strm, in 2.7 it's stream + streamlog = logging.StreamHandler(sys.stdout) + log_root.addHandler(streamlog) + + if CONF.publish_errors: + handler = importutils.import_object( + "quantum.openstack.common.log_handler.PublishErrorsHandler", + logging.ERROR) + log_root.addHandler(handler) + + datefmt = CONF.log_date_format + for handler in log_root.handlers: + # NOTE(alaski): CONF.log_format overrides everything currently. This + # should be deprecated in favor of context aware formatting. + if CONF.log_format: + handler.setFormatter(logging.Formatter(fmt=CONF.log_format, + datefmt=datefmt)) + log_root.info('Deprecated: log_format is now deprecated and will ' + 'be removed in the next release') + else: + handler.setFormatter(ContextFormatter(datefmt=datefmt)) + + if CONF.debug: + log_root.setLevel(logging.DEBUG) + elif CONF.verbose: + log_root.setLevel(logging.INFO) + else: + log_root.setLevel(logging.WARNING) + + for pair in CONF.default_log_levels: + mod, _sep, level_name = pair.partition('=') + level = logging.getLevelName(level_name) + logger = logging.getLogger(mod) + logger.setLevel(level) + +_loggers = {} + + +def getLogger(name='unknown', version='unknown'): + if name not in _loggers: + _loggers[name] = ContextAdapter(logging.getLogger(name), + name, + version) + return _loggers[name] + + +def getLazyLogger(name='unknown', version='unknown'): + """Returns lazy logger. + + Creates a pass-through logger that does not create the real logger + until it is really needed and delegates all calls to the real logger + once it is created. + """ + return LazyAdapter(name, version) + + +class WritableLogger(object): + """A thin wrapper that responds to `write` and logs.""" + + def __init__(self, logger, level=logging.INFO): + self.logger = logger + self.level = level + + def write(self, msg): + self.logger.log(self.level, msg) + + +class ContextFormatter(logging.Formatter): + """A context.RequestContext aware formatter configured through flags. + + The flags used to set format strings are: logging_context_format_string + and logging_default_format_string. You can also specify + logging_debug_format_suffix to append extra formatting if the log level is + debug. + + For information about what variables are available for the formatter see: + http://docs.python.org/library/logging.html#formatter + + """ + + def format(self, record): + """Uses contextstring if request_id is set, otherwise default.""" + # NOTE(sdague): default the fancier formating params + # to an empty string so we don't throw an exception if + # they get used + for key in ('instance', 'color'): + if key not in record.__dict__: + record.__dict__[key] = '' + + if record.__dict__.get('request_id', None): + self._fmt = CONF.logging_context_format_string + else: + self._fmt = CONF.logging_default_format_string + + if (record.levelno == logging.DEBUG and + CONF.logging_debug_format_suffix): + self._fmt += " " + CONF.logging_debug_format_suffix + + # Cache this on the record, Logger will respect our formated copy + if record.exc_info: + record.exc_text = self.formatException(record.exc_info, record) + return logging.Formatter.format(self, record) + + def formatException(self, exc_info, record=None): + """Format exception output with CONF.logging_exception_prefix.""" + if not record: + return logging.Formatter.formatException(self, exc_info) + + stringbuffer = cStringIO.StringIO() + traceback.print_exception(exc_info[0], exc_info[1], exc_info[2], + None, stringbuffer) + lines = stringbuffer.getvalue().split('\n') + stringbuffer.close() + + if CONF.logging_exception_prefix.find('%(asctime)') != -1: + record.asctime = self.formatTime(record, self.datefmt) + + formatted_lines = [] + for line in lines: + pl = CONF.logging_exception_prefix % record.__dict__ + fl = '%s%s' % (pl, line) + formatted_lines.append(fl) + return '\n'.join(formatted_lines) + + +class ColorHandler(logging.StreamHandler): + LEVEL_COLORS = { + logging.DEBUG: '\033[00;32m', # GREEN + logging.INFO: '\033[00;36m', # CYAN + logging.AUDIT: '\033[01;36m', # BOLD CYAN + logging.WARN: '\033[01;33m', # BOLD YELLOW + logging.ERROR: '\033[01;31m', # BOLD RED + logging.CRITICAL: '\033[01;31m', # BOLD RED + } + + def format(self, record): + record.color = self.LEVEL_COLORS[record.levelno] + return logging.StreamHandler.format(self, record) + + +class DeprecatedConfig(Exception): + message = ("Fatal call to deprecated config: %(msg)s") + + def __init__(self, msg): + super(Exception, self).__init__(self.message % dict(msg=msg)) diff --git a/stackalytics/openstack/common/timeutils.py b/stackalytics/openstack/common/timeutils.py new file mode 100644 index 000000000..ac2441bcb --- /dev/null +++ b/stackalytics/openstack/common/timeutils.py @@ -0,0 +1,187 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack Foundation. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +""" +Time related utilities and helper functions. +""" + +import calendar +import datetime + +import iso8601 + + +# ISO 8601 extended time format with microseconds +_ISO8601_TIME_FORMAT_SUBSECOND = '%Y-%m-%dT%H:%M:%S.%f' +_ISO8601_TIME_FORMAT = '%Y-%m-%dT%H:%M:%S' +PERFECT_TIME_FORMAT = _ISO8601_TIME_FORMAT_SUBSECOND + + +def isotime(at=None, subsecond=False): + """Stringify time in ISO 8601 format.""" + if not at: + at = utcnow() + st = at.strftime(_ISO8601_TIME_FORMAT + if not subsecond + else _ISO8601_TIME_FORMAT_SUBSECOND) + tz = at.tzinfo.tzname(None) if at.tzinfo else 'UTC' + st += ('Z' if tz == 'UTC' else tz) + return st + + +def parse_isotime(timestr): + """Parse time from ISO 8601 format.""" + try: + return iso8601.parse_date(timestr) + except iso8601.ParseError as e: + raise ValueError(e.message) + except TypeError as e: + raise ValueError(e.message) + + +def strtime(at=None, fmt=PERFECT_TIME_FORMAT): + """Returns formatted utcnow.""" + if not at: + at = utcnow() + return at.strftime(fmt) + + +def parse_strtime(timestr, fmt=PERFECT_TIME_FORMAT): + """Turn a formatted time back into a datetime.""" + return datetime.datetime.strptime(timestr, fmt) + + +def normalize_time(timestamp): + """Normalize time in arbitrary timezone to UTC naive object.""" + offset = timestamp.utcoffset() + if offset is None: + return timestamp + return timestamp.replace(tzinfo=None) - offset + + +def is_older_than(before, seconds): + """Return True if before is older than seconds.""" + if isinstance(before, basestring): + before = parse_strtime(before).replace(tzinfo=None) + return utcnow() - before > datetime.timedelta(seconds=seconds) + + +def is_newer_than(after, seconds): + """Return True if after is newer than seconds.""" + if isinstance(after, basestring): + after = parse_strtime(after).replace(tzinfo=None) + return after - utcnow() > datetime.timedelta(seconds=seconds) + + +def utcnow_ts(): + """Timestamp version of our utcnow function.""" + return calendar.timegm(utcnow().timetuple()) + + +def utcnow(): + """Overridable version of utils.utcnow.""" + if utcnow.override_time: + try: + return utcnow.override_time.pop(0) + except AttributeError: + return utcnow.override_time + return datetime.datetime.utcnow() + + +def iso8601_from_timestamp(timestamp): + """Returns a iso8601 formated date from timestamp.""" + return isotime(datetime.datetime.utcfromtimestamp(timestamp)) + + +utcnow.override_time = None + + +def set_time_override(override_time=datetime.datetime.utcnow()): + """Overrides utils.utcnow. + + Make it return a constant time or a list thereof, one at a time. + """ + utcnow.override_time = override_time + + +def advance_time_delta(timedelta): + """Advance overridden time using a datetime.timedelta.""" + assert(not utcnow.override_time is None) + try: + for dt in utcnow.override_time: + dt += timedelta + except TypeError: + utcnow.override_time += timedelta + + +def advance_time_seconds(seconds): + """Advance overridden time by seconds.""" + advance_time_delta(datetime.timedelta(0, seconds)) + + +def clear_time_override(): + """Remove the overridden time.""" + utcnow.override_time = None + + +def marshall_now(now=None): + """Make an rpc-safe datetime with microseconds. + + Note: tzinfo is stripped, but not required for relative times. + """ + if not now: + now = utcnow() + return dict(day=now.day, month=now.month, year=now.year, hour=now.hour, + minute=now.minute, second=now.second, + microsecond=now.microsecond) + + +def unmarshall_time(tyme): + """Unmarshall a datetime dict.""" + return datetime.datetime(day=tyme['day'], + month=tyme['month'], + year=tyme['year'], + hour=tyme['hour'], + minute=tyme['minute'], + second=tyme['second'], + microsecond=tyme['microsecond']) + + +def delta_seconds(before, after): + """Return the difference between two timing objects. + + Compute the difference in seconds between two date, time, or + datetime objects (as a float, to microsecond resolution). + """ + delta = after - before + try: + return delta.total_seconds() + except AttributeError: + return ((delta.days * 24 * 3600) + delta.seconds + + float(delta.microseconds) / (10 ** 6)) + + +def is_soon(dt, window): + """Determines if time is going to happen in the next window seconds. + + :params dt: the time + :params window: minimum seconds to remain to consider the time not soon + + :return: True if expiration is within the given duration + """ + soon = (utcnow() + datetime.timedelta(seconds=window)) + return normalize_time(dt) <= soon diff --git a/stackalytics/processor/__init__.py b/stackalytics/processor/__init__.py new file mode 100644 index 000000000..c9d84b54b --- /dev/null +++ b/stackalytics/processor/__init__.py @@ -0,0 +1 @@ +__author__ = 'ishakhat' diff --git a/stackalytics/processor/commit_processor.py b/stackalytics/processor/commit_processor.py new file mode 100644 index 000000000..2ee3d4387 --- /dev/null +++ b/stackalytics/processor/commit_processor.py @@ -0,0 +1,177 @@ +# Copyright (c) 2013 Mirantis Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import re + +from launchpadlib import launchpad +from oslo.config import cfg + +LOG = logging.getLogger(__name__) + + +COMMIT_PROCESSOR_DUMMY = 0 +COMMIT_PROCESSOR_CACHED = 1 + + +class CommitProcessor(object): + def __init__(self, persistent_storage): + self.persistent_storage = persistent_storage + + def process(self, commit_iterator): + pass + + +class DummyProcessor(CommitProcessor): + def __init__(self, persistent_storage): + super(DummyProcessor, self).__init__(persistent_storage) + + def process(self, commit_iterator): + return commit_iterator + + +class CachedProcessor(CommitProcessor): + def __init__(self, persistent_storage): + super(CachedProcessor, self).__init__(persistent_storage) + + companies = persistent_storage.get_companies() + self.domains_index = {} + for company in companies: + for domain in company['domains']: + self.domains_index[domain] = company['company_name'] + + users = persistent_storage.get_users() + self.users_index = {} + for user in users: + for email in user['emails']: + self.users_index[email] = user + + LOG.debug('Cached commit processor is instantiated') + + def _find_company(self, companies, date): + for r in companies: + if date < r['end_date']: + return r['company_name'] + return companies[-1]['company_name'] + + def _get_company_by_email(self, email): + name, at, domain = email.partition('@') + if domain: + parts = domain.split('.') + for i in range(len(parts), 1, -1): + m = '.'.join(parts[len(parts) - i:]) + if m in self.domains_index: + return self.domains_index[m] + return None + + def _unknown_user_email(self, email): + + lp_profile = None + if not re.match(r'[^@]+@[^@]+\.[^@]+', email): + LOG.debug('User email is not valid %s' % email) + else: + LOG.debug('Lookup user email %s at Launchpad' % email) + lp = launchpad.Launchpad.login_anonymously(cfg.CONF.launchpad_user) + try: + lp_profile = lp.people.getByEmail(email=email) + except Exception as error: + LOG.warn('Lookup of email %s failed %s' % + (email, error.message)) + if not lp_profile: + # user is not found in Launchpad, create dummy record for commit + # update + LOG.debug('Email is not found at Launchpad, mapping to nobody') + user = { + 'launchpad_id': None, + 'companies': [{ + 'company_name': self.domains_index[''], + 'end_date': 0 + }] + } + else: + # get user's launchpad id from his profile + launchpad_id = lp_profile.name + LOG.debug('Found user %s' % launchpad_id) + + # check if user with launchpad_id exists in persistent storage + persistent_user_iterator = self.persistent_storage.get_users( + launchpad_id=launchpad_id) + + for persistent_user in persistent_user_iterator: + break + else: + persistent_user = None + + if persistent_user: + # user already exist, merge + LOG.debug('User exists in persistent storage, add new email') + persistent_user_email = persistent_user['emails'][0] + if persistent_user_email not in self.users_index: + raise Exception('User index is not valid') + user = self.users_index[persistent_user_email] + user['emails'].append(email) + self.persistent_storage.update_user(user) + else: + # add new user + LOG.debug('Add new user into persistent storage') + company = (self._get_company_by_email(email) or + self.domains_index['']) + user = { + 'launchpad_id': launchpad_id, + 'user_name': lp_profile.display_name, + 'emails': [email], + 'companies': [{ + 'company_name': company, + 'end_date': 0, + }], + } + self.persistent_storage.insert_user(user) + + # update local index + self.users_index[email] = user + return user + + def _update_commit_with_user_data(self, commit): + email = commit['author_email'].lower() + if email in self.users_index: + user = self.users_index[email] + else: + user = self._unknown_user_email(email) + commit['launchpad_id'] = user['launchpad_id'] + company = self._get_company_by_email(email) + if not company: + company = self._find_company(user['companies'], commit['date']) + commit['company_name'] = company + + def process(self, commit_iterator): + + for commit in commit_iterator: + self._update_commit_with_user_data(commit) + + yield commit + + +class CommitProcessorFactory(object): + @staticmethod + def get_processor(commit_processor_type, persistent_storage): + LOG.debug('Factory is asked for commit processor type %s' % + commit_processor_type) + if commit_processor_type == COMMIT_PROCESSOR_DUMMY: + return DummyProcessor(persistent_storage) + elif commit_processor_type == COMMIT_PROCESSOR_CACHED: + return CachedProcessor(persistent_storage) + else: + raise Exception('Unknown commit processor type %s' % + commit_processor_type) diff --git a/stackalytics/processor/main.py b/stackalytics/processor/main.py new file mode 100644 index 000000000..818c8c5b4 --- /dev/null +++ b/stackalytics/processor/main.py @@ -0,0 +1,164 @@ +# Copyright (c) 2013 Mirantis Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import time + +from oslo.config import cfg +import psutil +from psutil import _error +import sh + +from stackalytics.openstack.common import log as logging +from stackalytics.openstack.common.timeutils import iso8601_from_timestamp +from stackalytics.processor import commit_processor +from stackalytics.processor.persistent_storage import PersistentStorageFactory +from stackalytics.processor.runtime_storage import RuntimeStorageFactory +from stackalytics.processor.vcs import VcsFactory + + +LOG = logging.getLogger(__name__) + +OPTS = [ + cfg.StrOpt('default-data', default='etc/default_data.json', + help='Default data'), + cfg.StrOpt('sources-root', default=None, required=True, + help='The folder that holds all project sources to analyze'), + cfg.StrOpt('runtime-storage-uri', default='memcached://127.0.0.1:11211', + help='Storage URI'), + cfg.StrOpt('frontend-update-address', + default='http://user:user@localhost/update/%s', + help='Address of update handler'), + cfg.StrOpt('repo-poll-period', default='300', + help='Repo poll period in seconds'), + cfg.StrOpt('persistent-storage-uri', default='mongodb://localhost', + help='URI of persistent storage'), + cfg.BoolOpt('sync-default-data', default=False, + help='Update persistent storage with default data. ' + 'Existing data is not overwritten'), + cfg.BoolOpt('force-sync-default-data', default=False, + help='Completely overwrite persistent storage with the ' + 'default data'), + cfg.StrOpt('launchpad-user', default='stackalytics-bot', + help='User to access Launchpad'), +] + + +def get_pids(): + uwsgi_dict = {} + for pid in psutil.get_pid_list(): + try: + p = psutil.Process(pid) + if p.cmdline and p.cmdline[0].find('/uwsgi '): + uwsgi_dict[p.pid] = p.parent + except _error.NoSuchProcess: + # the process may disappear after get_pid_list call, ignore it + pass + + result = set() + for pid in uwsgi_dict: + if uwsgi_dict[pid] in uwsgi_dict: + result.add(pid) + + return result + + +def update_pid(pid): + url = cfg.CONF.frontend_update_address % pid + sh.curl(url) + + +def update_pids(runtime_storage): + pids = get_pids() + if not pids: + return + runtime_storage.active_pids(pids) + current_time = time.time() + for pid in pids: + if current_time > runtime_storage.get_pid_update_time(pid): + update_pid(pid) + return current_time + + +def process_repo(repo, runtime_storage, processor): + uri = repo['uri'] + LOG.debug('Processing repo uri %s' % uri) + + vcs = VcsFactory.get_vcs(repo) + vcs.fetch() + + for branch in repo['branches']: + LOG.debug('Processing repo %s, branch %s' % (uri, branch)) + + head_commit_id = runtime_storage.get_head_commit_id(uri, branch) + + commit_iterator = vcs.log(branch, head_commit_id) + processed_commit_iterator = processor.process(commit_iterator) + runtime_storage.set_records(processed_commit_iterator) + + head_commit_id = vcs.get_head_commit_id(branch) + runtime_storage.set_head_commit_id(uri, branch, head_commit_id) + + +def update_repos(runtime_storage, persistent_storage): + current_time = time.time() + repo_update_time = runtime_storage.get_repo_update_time() + + if current_time < repo_update_time: + LOG.info('The next update is scheduled at %s. Skipping' % + iso8601_from_timestamp(repo_update_time)) + return + + repos = persistent_storage.get_repos() + processor = commit_processor.CommitProcessorFactory.get_processor( + commit_processor.COMMIT_PROCESSOR_CACHED, + persistent_storage) + + for repo in repos: + process_repo(repo, runtime_storage, processor) + + runtime_storage.set_repo_update_time(time.time() + + int(cfg.CONF.repo_poll_period)) + + +def main(): + # init conf and logging + conf = cfg.CONF + conf.register_cli_opts(OPTS) + conf.register_opts(OPTS) + conf() + + logging.setup('stackalytics') + LOG.info('Logging enabled') + + persistent_storage = PersistentStorageFactory.get_storage( + cfg.CONF.persistent_storage_uri) + + if conf.sync_default_data or conf.force_sync_default_data: + LOG.info('Going to synchronize persistent storage with default data ' + 'from file %s' % cfg.CONF.default_data) + persistent_storage.sync(cfg.CONF.default_data, + force=conf.force_sync_default_data) + return 0 + + runtime_storage = RuntimeStorageFactory.get_storage( + cfg.CONF.runtime_storage_uri) + + update_pids(runtime_storage) + + update_repos(runtime_storage, persistent_storage) + + +if __name__ == '__main__': + main() diff --git a/stackalytics/processor/persistent_storage.py b/stackalytics/processor/persistent_storage.py new file mode 100644 index 000000000..ec338ab7d --- /dev/null +++ b/stackalytics/processor/persistent_storage.py @@ -0,0 +1,150 @@ +# Copyright (c) 2013 Mirantis Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json +import logging +import re + +import pymongo + +from stackalytics.processor.user_utils import normalize_user + +LOG = logging.getLogger(__name__) + + +class PersistentStorage(object): + def __init__(self, uri): + pass + + def sync(self, default_data_file_name, force=False): + if force: + self.clean_all() + + default_data = self._read_default_persistent_storage( + default_data_file_name) + + self._build_index(default_data['repos'], 'uri', + self.get_repos, self.insert_repo) + self._build_index(default_data['companies'], 'company_name', + self.get_companies, self.insert_company) + self._build_index(default_data['users'], 'launchpad_id', + self.get_users, self.insert_user) + self._build_index(default_data['releases'], 'release_name', + self.get_releases, self.insert_release) + + def _build_index(self, default_data, primary_key, getter, inserter): + # loads all items from persistent storage + existing_items = set([item[primary_key] for item in getter()]) + # inserts items from default storage that are not in persistent storage + map(inserter, [item for item in default_data + if item[primary_key] not in existing_items]) + + def get_companies(self, **criteria): + pass + + def insert_company(self, company): + pass + + def get_repos(self, **criteria): + pass + + def insert_repo(self, repo): + pass + + def get_users(self, **criteria): + pass + + def insert_user(self, user): + pass + + def update_user(self, user): + pass + + def get_releases(self, **criteria): + pass + + def insert_release(self, release): + pass + + def clean_all(self): + pass + + def _read_default_persistent_storage(self, file_name): + try: + with open(file_name, 'r') as content_file: + content = content_file.read() + return json.loads(content) + except Exception as e: + LOG.error('Error while reading config: %s' % e) + + +class MongodbStorage(PersistentStorage): + def __init__(self, uri): + super(MongodbStorage, self).__init__(uri) + + self.client = pymongo.MongoClient(uri) + self.mongo = self.client.stackalytics + + self.mongo.companies.create_index([("company", pymongo.ASCENDING)]) + self.mongo.repos.create_index([("uri", pymongo.ASCENDING)]) + self.mongo.users.create_index([("launchpad_id", pymongo.ASCENDING)]) + self.mongo.releases.create_index([("releases", pymongo.ASCENDING)]) + + LOG.debug('Mongodb storage is created') + + def clean_all(self): + LOG.debug('Clear all tables') + self.mongo.companies.remove() + self.mongo.repos.remove() + self.mongo.users.remove() + self.mongo.releases.remove() + + def get_companies(self, **criteria): + return self.mongo.companies.find(criteria) + + def insert_company(self, company): + self.mongo.companies.insert(company) + + def get_repos(self, **criteria): + return self.mongo.repos.find(criteria) + + def insert_repo(self, repo): + self.mongo.repos.insert(repo) + + def get_users(self, **criteria): + return self.mongo.users.find(criteria) + + def insert_user(self, user): + self.mongo.users.insert(normalize_user(user)) + + def update_user(self, user): + normalize_user(user) + launchpad_id = user['launchpad_id'] + self.mongo.users.update({'launchpad_id': launchpad_id}, user) + + def get_releases(self, **criteria): + return self.mongo.releases.find(criteria) + + def insert_release(self, release): + self.mongo.releases.insert(release) + + +class PersistentStorageFactory(object): + @staticmethod + def get_storage(uri): + LOG.debug('Persistent storage is requested for uri %s' % uri) + match = re.search(r'^mongodb:\/\/', uri) + if match: + return MongodbStorage(uri) diff --git a/stackalytics/processor/runtime_storage.py b/stackalytics/processor/runtime_storage.py new file mode 100644 index 000000000..69ef80a2f --- /dev/null +++ b/stackalytics/processor/runtime_storage.py @@ -0,0 +1,196 @@ +# Copyright (c) 2013 Mirantis Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging + +import re +import urllib + +import memcache +from oslo.config import cfg + +LOG = logging.getLogger(__name__) + + +class RuntimeStorage(object): + def __init__(self, uri): + pass + + def set_records(self, records_iterator): + pass + + def get_head_commit_id(self, uri, branch): + pass + + def set_head_commit_id(self, uri, branch, head_commit_id): + pass + + def get_update(self, pid): + pass + + def active_pids(self, pids): + pass + + def get_pid_update_time(self, pid): + pass + + def set_pid_update_time(self, pid, time): + pass + + def get_repo_update_time(self): + pass + + def set_repo_update_time(self, time): + pass + + +class MemcachedStorage(RuntimeStorage): + + def __init__(self, uri): + super(MemcachedStorage, self).__init__(uri) + + stripped = re.sub(r'memcached:\/\/', '', uri) + if stripped: + storage_uri = stripped.split(',') + self.memcached = memcache.Client(storage_uri) + self._build_index() + else: + raise Exception('Invalid storage uri %s' % cfg.CONF.storage_uri) + + def set_records(self, records_iterator): + for record in records_iterator: + if record['commit_id'] in self.commit_id_index: + # update + record_id = self.commit_id_index[record['commit_id']] + old_record = self.memcached.get( + self._get_record_name(record_id)) + old_record['branches'] |= record['branches'] + LOG.debug('Update record %s' % record) + self.memcached.set(self._get_record_name(record_id), + old_record) + else: + # insert record + record_id = self._get_record_count() + record['record_id'] = record_id + LOG.debug('Insert new record %s' % record) + self.memcached.set(self._get_record_name(record_id), record) + self._set_record_count(record_id + 1) + + self._commit_update(record_id) + + def get_head_commit_id(self, uri, branch): + key = str(urllib.quote_plus(uri) + ':' + branch) + return self.memcached.get(key) + + def set_head_commit_id(self, uri, branch, head_commit_id): + key = str(urllib.quote_plus(uri) + ':' + branch) + self.memcached.set(key, head_commit_id) + + def get_update(self, pid): + last_update = self.memcached.get('pid:%s' % pid) + update_count = self._get_update_count() + + self.memcached.set('pid:%s' % pid, update_count) + self._set_pids(pid) + + if not last_update: + for record_id in range(0, self._get_record_count()): + yield self.memcached.get(self._get_record_name(record_id)) + else: + for update_id in range(last_update, update_count): + yield self.memcached.get(self._get_record_name( + self.memcached.get('update:%s' % update_id))) + + def active_pids(self, pids): + stored_pids = self.memcached.get('pids') or set() + for pid in stored_pids: + if pid not in pids: + self.memcached.delete('pid:%s' % pid) + self.memcached.delete('pid_update_time:%s' % pid) + + self.memcached.set('pids', pids) + + # remove unneeded updates + min_update = self._get_update_count() + for pid in pids: + n = self.memcached.get('pid:%s' % pid) + if n: + if n < min_update: + min_update = n + + first_valid_update_id = self.memcached.get('first_valid_update_id') + if not first_valid_update_id: + first_valid_update_id = 0 + + for i in range(first_valid_update_id, min_update): + self.memcached.delete('update:%s' % i) + + self.memcached.set('first_valid_update_id', min_update) + + def get_pid_update_time(self, pid): + return self.memcached.get('pid_update_time:%s' % pid) or 0 + + def set_pid_update_time(self, pid, time): + self.memcached.set('pid_update_time:%s' % pid, time) + + def get_repo_update_time(self): + return self.memcached.get('repo_update_time') or 0 + + def set_repo_update_time(self, time): + self.memcached.set('repo_update_time', time) + + def _get_update_count(self): + return self.memcached.get('update:count') or 0 + + def _set_pids(self, pid): + pids = self.memcached.get('pids') or set() + if pid in pids: + return + pids.add(pid) + self.memcached.set('pids', pids) + + def _get_record_name(self, record_id): + return 'record:%s' % record_id + + def _get_record_count(self): + return self.memcached.get('record:count') or 0 + + def _set_record_count(self, count): + self.memcached.set('record:count', count) + + def _get_all_records(self): + count = self.memcached.get('record:count') or 0 + for i in range(0, count): + yield self.memcached.get('record:%s' % i) + + def _commit_update(self, record_id): + count = self._get_update_count() + self.memcached.set('update:%s' % count, record_id) + self.memcached.set('update:count', count + 1) + + def _build_index(self): + self.commit_id_index = {} + for record in self._get_all_records(): + self.commit_id_index[record['commit_id']] = record['record_id'] + + +class RuntimeStorageFactory(object): + + @staticmethod + def get_storage(uri): + LOG.debug('Runtime storage is requested for uri %s' % uri) + match = re.search(r'^memcached:\/\/', uri) + if match: + return MemcachedStorage(uri) diff --git a/stackalytics/processor/user_utils.py b/stackalytics/processor/user_utils.py new file mode 100644 index 000000000..d436c3b81 --- /dev/null +++ b/stackalytics/processor/user_utils.py @@ -0,0 +1,58 @@ +# Copyright (c) 2013 Mirantis Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import datetime +import time + + +def normalize_user(user): + user['emails'] = [email.lower() for email in user['emails']] + user['launchpad_id'] = user['launchpad_id'].lower() + + for c in user['companies']: + end_date_numeric = 0 + if c['end_date']: + end_date_numeric = date_to_timestamp(c['end_date']) + c['end_date'] = end_date_numeric + + # sort companies by end_date + def end_date_comparator(x, y): + if x["end_date"] == 0: + return 1 + elif y["end_date"] == 0: + return -1 + else: + return cmp(x["end_date"], y["end_date"]) + + user['companies'].sort(cmp=end_date_comparator) + return user + + +def date_to_timestamp(d): + if d == 'now': + return int(time.time()) + return int(time.mktime( + datetime.datetime.strptime(d, '%Y-%b-%d').timetuple())) + + +def timestamp_to_week(timestamp): + # Jan 4th 1970 is the first Sunday in the Epoch + return (timestamp - 3 * 24 * 3600) // (7 * 24 * 3600) + + +def week_to_date(week): + timestamp = week * 7 * 24 * 3600 + 3 * 24 * 3600 + return (datetime.datetime.fromtimestamp(timestamp). + strftime('%Y-%m-%d %H:%M:%S')) diff --git a/stackalytics/processor/vcs.py b/stackalytics/processor/vcs.py new file mode 100644 index 000000000..b0c5e8ab5 --- /dev/null +++ b/stackalytics/processor/vcs.py @@ -0,0 +1,175 @@ +# Copyright (c) 2013 Mirantis Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import logging + +import os +import re + +from oslo.config import cfg +import sh + + +LOG = logging.getLogger(__name__) + + +class Vcs(object): + def __init__(self, repo): + self.repo = repo + + def fetch(self): + pass + + def log(self, branch, head_commit_id): + pass + + def get_head_commit_id(self, branch): + pass + + +GIT_LOG_PARAMS = [ + ('commit_id', '%H'), + ('date', '%at'), + ('author', '%an'), + ('author_email', '%ae'), + ('author_email', '%ae'), + ('subject', '%s'), + ('message', '%b'), +] +GIT_LOG_FORMAT = ''.join([(r[0] + ':' + r[1] + '%n') + for r in GIT_LOG_PARAMS]) + 'diff_stat:' +DIFF_STAT_PATTERN = ('[^\d]+(\d+)\s+[^\s]*\s+changed' + '(,\s+(\d+)\s+([^\d\s]*)\s+(\d+)?)?') +GIT_LOG_PATTERN = re.compile(''.join([(r[0] + ':(.*?)\n') + for r in GIT_LOG_PARAMS]) + + 'diff_stat:' + DIFF_STAT_PATTERN, + re.DOTALL) + +MESSAGE_PATTERNS = { + 'bug_id': re.compile('bug\s+#?([\d]{5,7})', re.IGNORECASE), + 'blueprint_id': re.compile('blueprint\s+([\w-]{6,})', re.IGNORECASE), + 'change_id': re.compile('Change-Id: (I[0-9a-f]{40})', re.IGNORECASE), +} + + +class Git(Vcs): + + def __init__(self, repo): + super(Git, self).__init__(repo) + uri = self.repo['uri'] + match = re.search(r'([^\/]+)\.git$', uri) + if match: + self.module = match.group(1) + else: + raise Exception('Unexpected uri %s for git' % uri) + self.release_index = {} + + def _chdir(self): + folder = os.path.normpath(cfg.CONF.sources_root + '/' + self.module) + os.chdir(folder) + + def fetch(self): + LOG.debug('Fetching repo uri %s' % self.repo['uri']) + + folder = os.path.normpath(cfg.CONF.sources_root + '/' + self.module) + + if not os.path.exists(folder): + os.chdir(cfg.CONF.sources_root) + sh.git('clone', '%s' % self.repo['uri']) + os.chdir(folder) + else: + self._chdir() + sh.git('pull', 'origin') + + for release in self.repo['releases']: + release_name = release['release_name'].lower() + tag_range = release['tag_from'] + '..' + release['tag_to'] + git_log_iterator = sh.git('log', '--pretty=%H', tag_range, + _tty_out=False) + for commit_id in git_log_iterator: + self.release_index[commit_id.strip()] = release_name + + def log(self, branch, head_commit_id): + LOG.debug('Parsing git log for repo uri %s' % self.repo['uri']) + + self._chdir() + sh.git('checkout', '%s' % branch) + commit_range = 'HEAD' + if head_commit_id: + commit_range = head_commit_id + '..HEAD' + output = sh.git('log', '--pretty=%s' % GIT_LOG_FORMAT, '--shortstat', + '-M', '--no-merges', commit_range, _tty_out=False) + + for rec in re.finditer(GIT_LOG_PATTERN, str(output)): + i = 1 + commit = {} + for param in GIT_LOG_PARAMS: + commit[param[0]] = unicode(rec.group(i), 'utf8') + i += 1 + + commit['files_changed'] = int(rec.group(i)) + i += 1 + lines_changed_group = rec.group(i) + i += 1 + lines_changed = rec.group(i) + i += 1 + deleted_or_inserted = rec.group(i) + i += 1 + lines_deleted = rec.group(i) + i += 1 + + if lines_changed_group: # there inserted or deleted lines + if not lines_deleted: + if deleted_or_inserted[0] == 'd': # deleted + lines_deleted = lines_changed + lines_changed = 0 + + commit['lines_added'] = int(lines_changed or 0) + commit['lines_deleted'] = int(lines_deleted or 0) + + for key in MESSAGE_PATTERNS: + match = re.search(MESSAGE_PATTERNS[key], commit['message']) + if match: + commit[key] = match.group(1) + else: + commit[key] = None + + commit['date'] = int(commit['date']) + commit['module'] = self.module + commit['branches'] = set([branch]) + if commit['commit_id'] in self.release_index: + commit['release'] = self.release_index[commit['commit_id']] + else: + commit['release'] = None + + yield commit + + def get_head_commit_id(self, branch): + LOG.debug('Get head commit for repo uri %s' % self.repo['uri']) + + self._chdir() + sh.git('checkout', '%s' % branch) + return str(sh.git('rev-parse', 'HEAD')).strip() + + +class VcsFactory(object): + + @staticmethod + def get_vcs(repo): + uri = repo['uri'] + LOG.debug('Factory is asked for Vcs uri %s' % uri) + match = re.search(r'\.git$', uri) + if match: + return Git(repo) + #todo others vcs to be implemented diff --git a/test-requirements.txt b/test-requirements.txt index 3a144b769..d27f5fdf0 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -7,7 +7,7 @@ hacking>=0.5.3,<0.6 coverage discover fixtures>=0.3.12 -mox +mock python-subunit testrepository>=0.0.13 testtools>=0.9.22 diff --git a/tests/unit/test_commit_processor.py b/tests/unit/test_commit_processor.py new file mode 100644 index 000000000..112e143e9 --- /dev/null +++ b/tests/unit/test_commit_processor.py @@ -0,0 +1,231 @@ +from launchpadlib import launchpad +import mock +from oslo.config import cfg +import testtools + +from stackalytics.processor import commit_processor +from stackalytics.processor import persistent_storage + + +class TestCommitProcessor(testtools.TestCase): + def setUp(self): + super(TestCommitProcessor, self).setUp() + + p_storage = mock.Mock(persistent_storage.PersistentStorage) + p_storage.get_companies = mock.Mock(return_value=[ + { + 'company_name': 'SuperCompany', + 'domains': ['super.com', 'super.no'] + }, + { + "domains": ["nec.com", "nec.co.jp"], + "company_name": "NEC" + }, + { + 'company_name': '*independent', + 'domains': [''] + }, + ]) + self.user = { + 'launchpad_id': 'john_doe', 'user_name': 'John Doe', + 'emails': ['johndoe@gmail.com', 'jdoe@super.no'], + 'companies': [ + {'company_name': '*independent', + 'end_date': 1234567890}, + {'company_name': 'SuperCompany', + 'end_date': 0}, + ] + } + p_storage.get_users = mock.Mock(return_value=[ + self.user, + ]) + + self.persistent_storage = p_storage + self.commit_processor = commit_processor.CachedProcessor(p_storage) + self.launchpad_patch = mock.patch('launchpadlib.launchpad.Launchpad') + self.launchpad_patch.start() + cfg.CONF = mock.MagicMock() + + def tearDown(self): + super(TestCommitProcessor, self).tearDown() + self.launchpad_patch.stop() + + def test_get_company_by_email_mapped(self): + email = 'jdoe@super.no' + res = self.commit_processor._get_company_by_email(email) + self.assertEquals('SuperCompany', res) + + def test_get_company_by_email_with_long_suffix_mapped(self): + email = 'man@mxw.nes.nec.co.jp' + res = self.commit_processor._get_company_by_email(email) + self.assertEquals('NEC', res) + + def test_get_company_by_email_with_long_suffix_mapped_2(self): + email = 'man@mxw.nes.nec.com' + res = self.commit_processor._get_company_by_email(email) + self.assertEquals('NEC', res) + + def test_get_company_by_email_not_mapped(self): + email = 'foo@boo.com' + res = self.commit_processor._get_company_by_email(email) + self.assertEquals(None, res) + + def test_update_commit_existing_user(self): + commit = { + 'author_email': 'johndoe@gmail.com', + 'date': 1999999999, + } + self.commit_processor._update_commit_with_user_data(commit) + + self.assertEquals('SuperCompany', commit['company_name']) + self.assertEquals('john_doe', commit['launchpad_id']) + + def test_update_commit_existing_user_old_job(self): + commit = { + 'author_email': 'johndoe@gmail.com', + 'date': 1000000000, + } + self.commit_processor._update_commit_with_user_data(commit) + + self.assertEquals('*independent', commit['company_name']) + self.assertEquals('john_doe', commit['launchpad_id']) + + def test_update_commit_existing_user_new_email_known_company(self): + """ + User is known to LP, his email is new to us, and maps to other company + Should return other company instead of those mentioned in user db + """ + email = 'johndoe@nec.co.jp' + commit = { + 'author_email': email, + 'date': 1999999999, + } + lp_mock = mock.MagicMock() + launchpad.Launchpad.login_anonymously = mock.Mock(return_value=lp_mock) + lp_profile = mock.Mock() + lp_profile.name = 'john_doe' + lp_mock.people.getByEmail = mock.Mock(return_value=lp_profile) + user = self.user.copy() + # tell storage to return existing user + self.persistent_storage.get_users.return_value = [user] + + self.commit_processor._update_commit_with_user_data(commit) + + self.persistent_storage.update_user.assert_called_once_with(user) + lp_mock.people.getByEmail.assert_called_once_with(email=email) + self.assertIn(email, user['emails']) + self.assertEquals('NEC', commit['company_name']) + self.assertEquals('john_doe', commit['launchpad_id']) + + def test_update_commit_existing_user_new_email_unknown_company(self): + """ + User is known to LP, but his email is new to us. Should match + the user and return current company + """ + email = 'johndoe@yahoo.com' + commit = { + 'author_email': email, + 'date': 1999999999, + } + lp_mock = mock.MagicMock() + launchpad.Launchpad.login_anonymously = mock.Mock(return_value=lp_mock) + lp_profile = mock.Mock() + lp_profile.name = 'john_doe' + lp_mock.people.getByEmail = mock.Mock(return_value=lp_profile) + user = self.user.copy() + # tell storage to return existing user + self.persistent_storage.get_users.return_value = [user] + + self.commit_processor._update_commit_with_user_data(commit) + + self.persistent_storage.update_user.assert_called_once_with(user) + lp_mock.people.getByEmail.assert_called_once_with(email=email) + self.assertIn(email, user['emails']) + self.assertEquals('SuperCompany', commit['company_name']) + self.assertEquals('john_doe', commit['launchpad_id']) + + def test_update_commit_new_user(self): + """ + User is known to LP, but new to us + Should add new user and set company depending on email + """ + email = 'smith@nec.com' + commit = { + 'author_email': email, + 'date': 1999999999, + } + lp_mock = mock.MagicMock() + launchpad.Launchpad.login_anonymously = mock.Mock(return_value=lp_mock) + lp_profile = mock.Mock() + lp_profile.name = 'smith' + lp_profile.display_name = 'Smith' + lp_mock.people.getByEmail = mock.Mock(return_value=lp_profile) + self.persistent_storage.get_users.return_value = [] + + self.commit_processor._update_commit_with_user_data(commit) + + lp_mock.people.getByEmail.assert_called_once_with(email=email) + self.assertEquals('NEC', commit['company_name']) + self.assertEquals('smith', commit['launchpad_id']) + + def test_update_commit_new_user_unknown_to_lb(self): + """ + User is new to us and not known to LP + Should set user name and empty LPid + """ + email = 'inkognito@avs.com' + commit = { + 'author_email': email, + 'date': 1999999999, + } + lp_mock = mock.MagicMock() + launchpad.Launchpad.login_anonymously = mock.Mock(return_value=lp_mock) + lp_mock.people.getByEmail = mock.Mock(return_value=None) + self.persistent_storage.get_users.return_value = [] + + self.commit_processor._update_commit_with_user_data(commit) + + lp_mock.people.getByEmail.assert_called_once_with(email=email) + self.assertEquals('*independent', commit['company_name']) + self.assertEquals(None, commit['launchpad_id']) + + def test_update_commit_new_user_lb_raises_error(self): + """ + LP raises error during getting user info + """ + email = 'smith@avs.com' + commit = { + 'author_email': email, + 'date': 1999999999, + } + lp_mock = mock.MagicMock() + launchpad.Launchpad.login_anonymously = mock.Mock(return_value=lp_mock) + lp_mock.people.getByEmail = mock.Mock(return_value=None, + side_effect=Exception) + self.persistent_storage.get_users.return_value = [] + + self.commit_processor._update_commit_with_user_data(commit) + + lp_mock.people.getByEmail.assert_called_once_with(email=email) + self.assertEquals('*independent', commit['company_name']) + self.assertEquals(None, commit['launchpad_id']) + + def test_update_commit_invalid_email(self): + """ + User's email is malformed + """ + email = 'error.root' + commit = { + 'author_email': email, + 'date': 1999999999, + } + lp_mock = mock.MagicMock() + launchpad.Launchpad.login_anonymously = mock.Mock(return_value=lp_mock) + lp_mock.people.getByEmail = mock.Mock(return_value=None) + self.persistent_storage.get_users.return_value = [] + + self.commit_processor._update_commit_with_user_data(commit) + + self.assertEquals(0, lp_mock.people.getByEmail.called) + self.assertEquals('*independent', commit['company_name']) + self.assertEquals(None, commit['launchpad_id']) diff --git a/tests/unit/test_dashboard.py b/tests/unit/test_dashboard.py deleted file mode 100644 index ae0c46b2f..000000000 --- a/tests/unit/test_dashboard.py +++ /dev/null @@ -1,22 +0,0 @@ -import os -import tempfile -import unittest - -from dashboard import dashboard - - -class DashboardTestCase(unittest.TestCase): - - def setUp(self): - self.db_fd, dashboard.app.config['DATABASE'] = tempfile.mkstemp() - dashboard.app.config['TESTING'] = True - self.app = dashboard.app.test_client() - # dashboard.init_db() - - def tearDown(self): - os.close(self.db_fd) - os.unlink(dashboard.app.config['DATABASE']) - - def test_home_page(self): - rv = self.app.get('/') - assert rv.status_code == 200 diff --git a/tests/unit/test_vcs.py b/tests/unit/test_vcs.py new file mode 100644 index 000000000..dd6d497c1 --- /dev/null +++ b/tests/unit/test_vcs.py @@ -0,0 +1,110 @@ +import mock +import os +import testtools + +from oslo.config import cfg + +from stackalytics.processor import vcs + + +class TestVcsProcessor(testtools.TestCase): + def setUp(self): + super(TestVcsProcessor, self).setUp() + + self.repo = { + 'uri': 'git://github.com/dummy.git', + 'releases': [] + } + self.git = vcs.Git(self.repo) + cfg.CONF.sources_root = '' + os.chdir = mock.Mock() + + def test_git_log(self): + with mock.patch('sh.git') as git_mock: + git_mock.return_value = ''' +commit_id:b5a416ac344160512f95751ae16e6612aefd4a57 +date:1369119386 +author:Akihiro MOTOKI +author_email:motoki@da.jp.nec.com +author_email:motoki@da.jp.nec.com +subject:Remove class-based import in the code repo +message:Fixes bug 1167901 + +This commit also removes backslashes for line break. + +Change-Id: Id26fdfd2af4862652d7270aec132d40662efeb96 + +diff_stat: + + 21 files changed, 340 insertions(+), 408 deletions(-) +commit_id:5be031f81f76d68c6e4cbaad2247044aca179843 +date:1370975889 +author:Monty Taylor +author_email:mordred@inaugust.com +author_email:mordred@inaugust.com +subject:Remove explicit distribute depend. +message:Causes issues with the recent re-merge with setuptools. Advice from +upstream is to stop doing explicit depends. + +Change-Id: I70638f239794e78ba049c60d2001190910a89c90 + +diff_stat: + + 1 file changed, 1 deletion(-) +commit_id:92811c76f3a8308b36f81e61451ec17d227b453b +date:1369831203 +author:Mark McClain +author_email:mark.mcclain@dreamhost.com +author_email:mark.mcclain@dreamhost.com +subject:add readme for 2.2.2 +message:Change-Id: Id32a4a72ec1d13992b306c4a38e73605758e26c7 + +diff_stat: + + 1 file changed, 8 insertions(+) +commit_id:92811c76f3a8308b36f81e61451ec17d227b453b +date:1369831203 +author:John Doe +author_email:john.doe@dreamhost.com +author_email:john.doe@dreamhost.com +subject:add readme for 2.2.2 +message:Change-Id: Id32a4a72ec1d13992b306c4a38e73605758e26c7 + +diff_stat: + + 0 files changed +commit_id:92811c76f3a8308b36f81e61451ec17d227b453b +date:1369831203 +author:Doug Hoffner +author_email:mark.mcclain@dreamhost.com +author_email:mark.mcclain@dreamhost.com +subject:add readme for 2.2.2 +message:Change-Id: Id32a4a72ec1d13992b306c4a38e73605758e26c7 + +diff_stat: + + 0 files changed, 0 insertions(+), 0 deletions(-) + ''' + + commits = list(self.git.log('dummy', 'dummy')) + self.assertEquals(5, len(commits)) + + self.assertEquals(21, commits[0]['files_changed']) + self.assertEquals(340, commits[0]['lines_added']) + self.assertEquals(408, commits[0]['lines_deleted']) + + self.assertEquals(1, commits[1]['files_changed']) + self.assertEquals(0, commits[1]['lines_added']) + self.assertEquals(1, commits[1]['lines_deleted']) + + self.assertEquals(1, commits[2]['files_changed']) + self.assertEquals(8, commits[2]['lines_added']) + self.assertEquals(0, commits[2]['lines_deleted']) + + self.assertEquals(0, commits[3]['files_changed']) + self.assertEquals(0, commits[3]['lines_added']) + self.assertEquals(0, commits[3]['lines_deleted']) + + self.assertEquals(0, commits[4]['files_changed']) + self.assertEquals(0, commits[4]['lines_added']) + self.assertEquals(0, commits[4]['lines_deleted']) diff --git a/tox.ini b/tox.ini index d768f8f3e..534194b9c 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py27,pep8 +envlist = py26,py27,pep8 [testenv] setenv = VIRTUAL_ENV={envdir} @@ -26,7 +26,8 @@ downloadcache = ~/cache/pip [flake8] # E125 continuation line does not distinguish itself from next logical line -ignore = E125 +# H404 multi line docstring should start with a summary +ignore = E125,H404 show-source = true builtins = _ exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,tools,pycvsanaly2