28deb034d0
The script generated only users with the same first name. In addition, only one change was created per user. In order to be able to test whether users can be found by their first name, different first names are used now. For each of those users, 1 to 5 changes are created to reflect a more natural user base, on which statistics don't yield the same values for all users. As we don't want to possibly specify valid gmail accounts, we use another suffix for the email address. Change-Id: Ieea72bb45a374eebaa2c51ec74789b337f256958
301 lines
13 KiB
Python
301 lines
13 KiB
Python
#!/usr/bin/env python
|
|
# Copyright (C) 2016 The Android Open Source Project
|
|
#
|
|
# 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.
|
|
|
|
"""
|
|
This script will populate an empty standard Gerrit instance with some
|
|
data for local testing.
|
|
|
|
This script requires 'requests'. If you do not have this module, run
|
|
'pip3 install requests' to install it.
|
|
|
|
TODO(hiesel): Make real git commits instead of empty changes
|
|
TODO(hiesel): Add comments
|
|
"""
|
|
|
|
import atexit
|
|
import json
|
|
import os
|
|
import random
|
|
import shutil
|
|
import subprocess
|
|
import tempfile
|
|
|
|
import requests
|
|
import requests.auth
|
|
|
|
DEFAULT_TMP_PATH = "/tmp"
|
|
TMP_PATH = ""
|
|
BASE_URL = "http://localhost:8080/a/"
|
|
ACCESS_URL = BASE_URL + "access/"
|
|
ACCOUNTS_URL = BASE_URL + "accounts/"
|
|
CHANGES_URL = BASE_URL + "changes/"
|
|
CONFIG_URL = BASE_URL + "config/"
|
|
GROUPS_URL = BASE_URL + "groups/"
|
|
PLUGINS_URL = BASE_URL + "plugins/"
|
|
PROJECTS_URL = BASE_URL + "projects/"
|
|
|
|
ADMIN_DIGEST = requests.auth.HTTPDigestAuth("admin", "secret")
|
|
|
|
# GROUP_ADMIN stores a GroupInfo for the admin group (see Gerrit rest docs)
|
|
# In addition, GROUP_ADMIN["name"] stores the admin group"s name.
|
|
GROUP_ADMIN = {}
|
|
|
|
HEADERS = {"Content-Type": "application/json", "charset": "UTF-8"}
|
|
|
|
# Random names from US Census Data
|
|
FIRST_NAMES = [
|
|
"Casey", "Yesenia", "Shirley", "Tara", "Wanda", "Sheryl", "Jaime", "Elaine",
|
|
"Charlotte", "Carly", "Bonnie", "Kirsten", "Kathryn", "Carla", "Katrina",
|
|
"Melody", "Suzanne", "Sandy", "Joann", "Kristie", "Sally", "Emma", "Susan",
|
|
"Amanda", "Alyssa", "Patty", "Angie", "Dominique", "Cynthia", "Jennifer",
|
|
"Theresa", "Desiree", "Kaylee", "Maureen", "Jeanne", "Kellie", "Valerie",
|
|
"Nina", "Judy", "Diamond", "Anita", "Rebekah", "Stefanie", "Kendra", "Erin",
|
|
"Tammie", "Tracey", "Bridget", "Krystal", "Jasmin", "Sonia", "Meghan",
|
|
"Rebecca", "Jeanette", "Meredith", "Beverly", "Natasha", "Chloe", "Selena",
|
|
"Teresa", "Sheena", "Cassandra", "Rhonda", "Tami", "Jodi", "Shelly", "Angela",
|
|
"Kimberly", "Terry", "Joanna", "Isabella", "Lindsey", "Loretta", "Dana",
|
|
"Veronica", "Carolyn", "Laura", "Karen", "Dawn", "Alejandra", "Cassie",
|
|
"Lorraine", "Yolanda", "Kerry", "Stephanie", "Caitlin", "Melanie", "Kerri",
|
|
"Doris", "Sandra", "Beth", "Carol", "Vicki", "Shelia", "Bethany", "Rachael",
|
|
"Donna", "Alexandra", "Barbara", "Ana", "Jillian", "Ann", "Rachel", "Lauren",
|
|
"Hayley", "Misty", "Brianna", "Tanya", "Danielle", "Courtney", "Jacqueline",
|
|
"Becky", "Christy", "Alisha", "Phyllis", "Faith", "Jocelyn", "Nancy",
|
|
"Gloria", "Kristen", "Evelyn", "Julie", "Julia", "Kara", "Chelsey", "Cassidy",
|
|
"Jean", "Chelsea", "Jenny", "Diana", "Haley", "Kristine", "Kristina", "Erika",
|
|
"Jenna", "Alison", "Deanna", "Abigail", "Melissa", "Sierra", "Linda",
|
|
"Monica", "Tasha", "Traci", "Yvonne", "Tracy", "Marie", "Maria", "Michaela",
|
|
"Stacie", "April", "Morgan", "Cathy", "Darlene", "Cristina", "Emily"
|
|
"Ian", "Russell", "Phillip", "Jay", "Barry", "Brad", "Frederick", "Fernando",
|
|
"Timothy", "Ricardo", "Bernard", "Daniel", "Ruben", "Alexis", "Kyle", "Malik",
|
|
"Norman", "Kent", "Melvin", "Stephen", "Daryl", "Kurt", "Greg", "Alex",
|
|
"Mario", "Riley", "Marvin", "Dan", "Steven", "Roberto", "Lucas", "Leroy",
|
|
"Preston", "Drew", "Fred", "Casey", "Wesley", "Elijah", "Reginald", "Joel",
|
|
"Christopher", "Jacob", "Luis", "Philip", "Mark", "Rickey", "Todd", "Scott",
|
|
"Terrence", "Jim", "Stanley", "Bobby", "Thomas", "Gabriel", "Tracy", "Marcus",
|
|
"Peter", "Michael", "Calvin", "Herbert", "Darryl", "Billy", "Ross", "Dustin",
|
|
"Jaime", "Adam", "Henry", "Xavier", "Dominic", "Lonnie", "Danny", "Victor",
|
|
"Glen", "Perry", "Jackson", "Grant", "Gerald", "Garrett", "Alejandro",
|
|
"Eddie", "Alan", "Ronnie", "Mathew", "Dave", "Wayne", "Joe", "Craig",
|
|
"Terry", "Chris", "Randall", "Parker", "Francis", "Keith", "Neil", "Caleb",
|
|
"Jon", "Earl", "Taylor", "Bryce", "Brady", "Max", "Sergio", "Leon", "Gene",
|
|
"Darin", "Bill", "Edgar", "Antonio", "Dalton", "Arthur", "Austin", "Cristian",
|
|
"Kevin", "Omar", "Kelly", "Aaron", "Ethan", "Tom", "Isaac", "Maurice",
|
|
"Gilbert", "Hunter", "Willie", "Harry", "Dale", "Darius", "Jerome", "Jason",
|
|
"Harold", "Kerry", "Clarence", "Gregg", "Shane", "Eduardo", "Micheal",
|
|
"Howard", "Vernon", "Rodney", "Anthony", "Levi", "Larry", "Franklin", "Jimmy",
|
|
"Jonathon", "Carl",
|
|
]
|
|
|
|
LAST_NAMES = [
|
|
"Savage", "Hendrix", "Moon", "Larsen", "Rocha", "Burgess", "Bailey", "Farley",
|
|
"Moses", "Schmidt", "Brown", "Hoover", "Klein", "Jennings", "Braun", "Rangel",
|
|
"Casey", "Dougherty", "Hancock", "Wolf", "Henry", "Thomas", "Bentley",
|
|
"Barnett", "Kline", "Pitts", "Rojas", "Sosa", "Paul", "Hess", "Chase",
|
|
"Mckay", "Bender", "Colins", "Montoya", "Townsend", "Potts", "Ayala", "Avery",
|
|
"Sherman", "Tapia", "Hamilton", "Ferguson", "Huang", "Hooper", "Zamora",
|
|
"Logan", "Lloyd", "Quinn", "Monroe", "Brock", "Ibarra", "Fowler", "Weiss",
|
|
"Montgomery", "Diaz", "Dixon", "Olson", "Robertson", "Arias", "Benjamin",
|
|
"Abbott", "Stein", "Schroeder", "Beck", "Velasquez", "Barber", "Nichols",
|
|
"Ortiz", "Burns", "Moody", "Stokes", "Wilcox", "Rush", "Michael", "Kidd",
|
|
"Rowland", "Mclean", "Saunders", "Chung", "Newton", "Potter", "Hickman",
|
|
"Ray", "Larson", "Figueroa", "Duncan", "Sparks", "Rose", "Hodge", "Huynh",
|
|
"Joseph", "Morales", "Beasley", "Mora", "Fry", "Ross", "Novak", "Hahn",
|
|
"Wise", "Knight", "Frederick", "Heath", "Pollard", "Vega", "Mcclain",
|
|
"Buckley", "Conrad", "Cantrell", "Bond", "Mejia", "Wang", "Lewis", "Johns",
|
|
"Mcknight", "Callahan", "Reynolds", "Norris", "Burnett", "Carey", "Jacobson",
|
|
"Oneill", "Oconnor", "Leonard", "Mckenzie", "Hale", "Delgado", "Spence",
|
|
"Brandt", "Obrien", "Bowman", "James", "Avila", "Roberts", "Barker", "Cohen",
|
|
"Bradley", "Prince", "Warren", "Summers", "Little", "Caldwell", "Garrett",
|
|
"Hughes", "Norton", "Burke", "Holden", "Merritt", "Lee", "Frank", "Wiley",
|
|
"Ho", "Weber", "Keith", "Winters", "Gray", "Watts", "Brady", "Aguilar",
|
|
"Nicholson", "David", "Pace", "Cervantes", "Davis", "Baxter", "Sanchez",
|
|
"Singleton", "Taylor", "Strickland", "Glenn", "Valentine", "Roy", "Cameron",
|
|
"Beard", "Norman", "Fritz", "Anthony", "Koch", "Parrish", "Herman", "Hines",
|
|
"Sutton", "Gallegos", "Stephenson", "Lozano", "Franklin", "Howe", "Bauer",
|
|
"Love", "Ali", "Ellison", "Lester", "Guzman", "Jarvis", "Espinoza",
|
|
"Fletcher", "Burton", "Woodard", "Peterson", "Barajas", "Richard", "Bryan",
|
|
"Goodman", "Cline", "Rowe", "Faulkner", "Crawford", "Mueller", "Patterson",
|
|
"Hull", "Walton", "Wu", "Flores", "York", "Dickson", "Barnes", "Fisher",
|
|
"Strong", "Juarez", "Fitzgerald", "Schmitt", "Blevins", "Villa", "Sullivan",
|
|
"Velazquez", "Horton", "Meadows", "Riley", "Barrera", "Neal", "Mendez",
|
|
"Mcdonald", "Floyd", "Lynch", "Mcdowell", "Benson", "Hebert", "Livingston",
|
|
"Davies", "Richardson", "Vincent", "Davenport", "Osborn", "Mckee", "Marshall",
|
|
"Ferrell", "Martinez", "Melton", "Mercer", "Yoder", "Jacobs", "Mcdaniel",
|
|
"Mcmillan", "Peters", "Atkinson", "Wood", "Briggs", "Valencia", "Chandler",
|
|
"Rios", "Hunter", "Bean", "Hicks", "Hays", "Lucero", "Malone", "Waller",
|
|
"Banks", "Myers", "Mitchell", "Grimes", "Houston", "Hampton", "Trujillo",
|
|
"Perkins", "Moran", "Welch", "Contreras", "Montes", "Ayers", "Hayden",
|
|
"Daniel", "Weeks", "Porter", "Gill", "Mullen", "Nolan", "Dorsey", "Crane",
|
|
"Estes", "Lam", "Wells", "Cisneros", "Giles", "Watson", "Vang", "Scott",
|
|
"Knox", "Hanna", "Fields",
|
|
]
|
|
|
|
|
|
def clean(json_string):
|
|
# Strip JSON XSS Tag
|
|
json_string = json_string.strip()
|
|
if json_string.startswith(")]}'"):
|
|
return json_string[5:]
|
|
return json_string
|
|
|
|
|
|
def digest_auth(user):
|
|
return requests.auth.HTTPDigestAuth(user["username"], user["http_password"])
|
|
|
|
|
|
def fetch_admin_group():
|
|
global GROUP_ADMIN
|
|
# Get admin group
|
|
r = json.loads(clean(requests.get(GROUPS_URL + "?suggest=ad&p=All-Projects",
|
|
headers=HEADERS,
|
|
auth=ADMIN_DIGEST).text))
|
|
admin_group_name = r.keys()[0]
|
|
GROUP_ADMIN = r[admin_group_name]
|
|
GROUP_ADMIN["name"] = admin_group_name
|
|
|
|
|
|
def generate_random_text():
|
|
return " ".join([random.choice("lorem ipsum "
|
|
"doleret delendam "
|
|
"\n esse".split(" ")) for _ in xrange(1, 100)])
|
|
|
|
|
|
def set_up():
|
|
global TMP_PATH
|
|
TMP_PATH = tempfile.mkdtemp()
|
|
atexit.register(clean_up)
|
|
os.makedirs(TMP_PATH + "/ssh")
|
|
os.makedirs(TMP_PATH + "/repos")
|
|
fetch_admin_group()
|
|
|
|
|
|
def get_random_users(num_users):
|
|
users = random.sample([(f, l) for f in FIRST_NAMES for l in LAST_NAMES],
|
|
num_users)
|
|
names = []
|
|
for u in users:
|
|
names.append({"firstname": u[0],
|
|
"lastname": u[1],
|
|
"name": u[0] + " " + u[1],
|
|
"username": u[0] + u[1],
|
|
"email": u[0] + "." + u[1] + "@gerritcodereview.com",
|
|
"http_password": "secret",
|
|
"groups": []})
|
|
return names
|
|
|
|
|
|
def generate_ssh_keys(gerrit_users):
|
|
for user in gerrit_users:
|
|
key_file = TMP_PATH + "/ssh/" + user["username"] + ".key"
|
|
subprocess.check_output(["ssh-keygen", "-f", key_file, "-N", ""])
|
|
with open(key_file + ".pub", "r") as f:
|
|
user["ssh_key"] = f.read()
|
|
|
|
|
|
def create_gerrit_groups():
|
|
groups = [
|
|
{"name": "iOS-Maintainers", "description": "iOS Maintainers",
|
|
"visible_to_all": True, "owner": GROUP_ADMIN["name"],
|
|
"owner_id": GROUP_ADMIN["id"]},
|
|
{"name": "Android-Maintainers", "description": "Android Maintainers",
|
|
"visible_to_all": True, "owner": GROUP_ADMIN["name"],
|
|
"owner_id": GROUP_ADMIN["id"]},
|
|
{"name": "Backend-Maintainers", "description": "Backend Maintainers",
|
|
"visible_to_all": True, "owner": GROUP_ADMIN["name"],
|
|
"owner_id": GROUP_ADMIN["id"]},
|
|
{"name": "Script-Maintainers", "description": "Script Maintainers",
|
|
"visible_to_all": True, "owner": GROUP_ADMIN["name"],
|
|
"owner_id": GROUP_ADMIN["id"]},
|
|
{"name": "Security-Team", "description": "Sec Team",
|
|
"visible_to_all": False, "owner": GROUP_ADMIN["name"],
|
|
"owner_id": GROUP_ADMIN["id"]}]
|
|
for g in groups:
|
|
requests.put(GROUPS_URL + g["name"],
|
|
json.dumps(g),
|
|
headers=HEADERS,
|
|
auth=ADMIN_DIGEST)
|
|
return [g["name"] for g in groups]
|
|
|
|
|
|
def create_gerrit_projects(owner_groups):
|
|
projects = [
|
|
{"id": "android", "name": "Android", "parent": "All-Projects",
|
|
"branches": ["master"], "description": "Our android app.",
|
|
"owners": [owner_groups[0]], "create_empty_commit": True},
|
|
{"id": "ios", "name": "iOS", "parent": "All-Projects",
|
|
"branches": ["master"], "description": "Our ios app.",
|
|
"owners": [owner_groups[1]], "create_empty_commit": True},
|
|
{"id": "backend", "name": "Backend", "parent": "All-Projects",
|
|
"branches": ["master"], "description": "Our awesome backend.",
|
|
"owners": [owner_groups[2]], "create_empty_commit": True},
|
|
{"id": "scripts", "name": "Scripts", "parent": "All-Projects",
|
|
"branches": ["master"], "description": "some small scripts.",
|
|
"owners": [owner_groups[3]], "create_empty_commit": True}]
|
|
for p in projects:
|
|
requests.put(PROJECTS_URL + p["name"],
|
|
json.dumps(p),
|
|
headers=HEADERS,
|
|
auth=ADMIN_DIGEST)
|
|
return [p["name"] for p in projects]
|
|
|
|
|
|
def create_gerrit_users(gerrit_users):
|
|
for user in gerrit_users:
|
|
requests.put(ACCOUNTS_URL + user["username"],
|
|
json.dumps(user),
|
|
headers=HEADERS,
|
|
auth=ADMIN_DIGEST)
|
|
|
|
|
|
def create_change(user, project_name):
|
|
random_commit_message = generate_random_text()
|
|
change = {
|
|
"project": project_name,
|
|
"subject": random_commit_message.split("\n")[0],
|
|
"branch": "master",
|
|
"status": "NEW",
|
|
}
|
|
requests.post(CHANGES_URL,
|
|
json.dumps(change),
|
|
headers=HEADERS,
|
|
auth=digest_auth(user))
|
|
|
|
|
|
def clean_up():
|
|
shutil.rmtree(TMP_PATH)
|
|
|
|
|
|
def main():
|
|
set_up()
|
|
gerrit_users = get_random_users(100)
|
|
|
|
group_names = create_gerrit_groups()
|
|
for idx, u in enumerate(gerrit_users):
|
|
u["groups"].append(group_names[idx % len(group_names)])
|
|
if idx % 5 == 0:
|
|
# Also add to security group
|
|
u["groups"].append(group_names[4])
|
|
|
|
generate_ssh_keys(gerrit_users)
|
|
create_gerrit_users(gerrit_users)
|
|
|
|
project_names = create_gerrit_projects(group_names)
|
|
|
|
for idx, u in enumerate(gerrit_users):
|
|
for _ in xrange(random.randint(1, 5)):
|
|
create_change(u, project_names[4 * idx / len(gerrit_users)])
|
|
|
|
main()
|