blob: b77c41a8198fff063ec893353ed13a92d00a5e81 [file] [log] [blame]
Patrick Hieselc8076c32016-05-02 11:18:51 +02001#!/usr/bin/env python
2# Copyright (C) 2016 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16"""
17This script will populate an empty standard Gerrit instance with some
18data for local testing.
19
20This script requires 'requests'. If you do not have this module, run
21'pip3 install requests' to install it.
22
23TODO(hiesel): Make real git commits instead of empty changes
24TODO(hiesel): Add comments
25"""
26
27import atexit
28import json
29import os
30import random
31import shutil
32import subprocess
33import tempfile
34
35import requests
36import requests.auth
37
38DEFAULT_TMP_PATH = "/tmp"
39TMP_PATH = ""
40BASE_URL = "http://localhost:8080/a/"
41ACCESS_URL = BASE_URL + "access/"
42ACCOUNTS_URL = BASE_URL + "accounts/"
43CHANGES_URL = BASE_URL + "changes/"
44CONFIG_URL = BASE_URL + "config/"
45GROUPS_URL = BASE_URL + "groups/"
46PLUGINS_URL = BASE_URL + "plugins/"
47PROJECTS_URL = BASE_URL + "projects/"
48
49ADMIN_DIGEST = requests.auth.HTTPDigestAuth("admin", "secret")
50
51# GROUP_ADMIN stores a GroupInfo for the admin group (see Gerrit rest docs)
52# In addition, GROUP_ADMIN["name"] stores the admin group"s name.
53GROUP_ADMIN = {}
54
55HEADERS = {"Content-Type": "application/json", "charset": "UTF-8"}
56
57# Random names from US Census Data
58FIRST_NAMES = [
59 "Casey", "Yesenia", "Shirley", "Tara", "Wanda", "Sheryl", "Jaime", "Elaine",
60 "Charlotte", "Carly", "Bonnie", "Kirsten", "Kathryn", "Carla", "Katrina",
61 "Melody", "Suzanne", "Sandy", "Joann", "Kristie", "Sally", "Emma", "Susan",
62 "Amanda", "Alyssa", "Patty", "Angie", "Dominique", "Cynthia", "Jennifer",
63 "Theresa", "Desiree", "Kaylee", "Maureen", "Jeanne", "Kellie", "Valerie",
64 "Nina", "Judy", "Diamond", "Anita", "Rebekah", "Stefanie", "Kendra", "Erin",
65 "Tammie", "Tracey", "Bridget", "Krystal", "Jasmin", "Sonia", "Meghan",
66 "Rebecca", "Jeanette", "Meredith", "Beverly", "Natasha", "Chloe", "Selena",
67 "Teresa", "Sheena", "Cassandra", "Rhonda", "Tami", "Jodi", "Shelly", "Angela",
68 "Kimberly", "Terry", "Joanna", "Isabella", "Lindsey", "Loretta", "Dana",
69 "Veronica", "Carolyn", "Laura", "Karen", "Dawn", "Alejandra", "Cassie",
70 "Lorraine", "Yolanda", "Kerry", "Stephanie", "Caitlin", "Melanie", "Kerri",
71 "Doris", "Sandra", "Beth", "Carol", "Vicki", "Shelia", "Bethany", "Rachael",
72 "Donna", "Alexandra", "Barbara", "Ana", "Jillian", "Ann", "Rachel", "Lauren",
73 "Hayley", "Misty", "Brianna", "Tanya", "Danielle", "Courtney", "Jacqueline",
74 "Becky", "Christy", "Alisha", "Phyllis", "Faith", "Jocelyn", "Nancy",
75 "Gloria", "Kristen", "Evelyn", "Julie", "Julia", "Kara", "Chelsey", "Cassidy",
76 "Jean", "Chelsea", "Jenny", "Diana", "Haley", "Kristine", "Kristina", "Erika",
77 "Jenna", "Alison", "Deanna", "Abigail", "Melissa", "Sierra", "Linda",
78 "Monica", "Tasha", "Traci", "Yvonne", "Tracy", "Marie", "Maria", "Michaela",
79 "Stacie", "April", "Morgan", "Cathy", "Darlene", "Cristina", "Emily"
80 "Ian", "Russell", "Phillip", "Jay", "Barry", "Brad", "Frederick", "Fernando",
81 "Timothy", "Ricardo", "Bernard", "Daniel", "Ruben", "Alexis", "Kyle", "Malik",
82 "Norman", "Kent", "Melvin", "Stephen", "Daryl", "Kurt", "Greg", "Alex",
83 "Mario", "Riley", "Marvin", "Dan", "Steven", "Roberto", "Lucas", "Leroy",
84 "Preston", "Drew", "Fred", "Casey", "Wesley", "Elijah", "Reginald", "Joel",
85 "Christopher", "Jacob", "Luis", "Philip", "Mark", "Rickey", "Todd", "Scott",
86 "Terrence", "Jim", "Stanley", "Bobby", "Thomas", "Gabriel", "Tracy", "Marcus",
87 "Peter", "Michael", "Calvin", "Herbert", "Darryl", "Billy", "Ross", "Dustin",
88 "Jaime", "Adam", "Henry", "Xavier", "Dominic", "Lonnie", "Danny", "Victor",
89 "Glen", "Perry", "Jackson", "Grant", "Gerald", "Garrett", "Alejandro",
90 "Eddie", "Alan", "Ronnie", "Mathew", "Dave", "Wayne", "Joe", "Craig",
91 "Terry", "Chris", "Randall", "Parker", "Francis", "Keith", "Neil", "Caleb",
92 "Jon", "Earl", "Taylor", "Bryce", "Brady", "Max", "Sergio", "Leon", "Gene",
93 "Darin", "Bill", "Edgar", "Antonio", "Dalton", "Arthur", "Austin", "Cristian",
94 "Kevin", "Omar", "Kelly", "Aaron", "Ethan", "Tom", "Isaac", "Maurice",
95 "Gilbert", "Hunter", "Willie", "Harry", "Dale", "Darius", "Jerome", "Jason",
96 "Harold", "Kerry", "Clarence", "Gregg", "Shane", "Eduardo", "Micheal",
97 "Howard", "Vernon", "Rodney", "Anthony", "Levi", "Larry", "Franklin", "Jimmy",
98 "Jonathon", "Carl",
99]
100
101LAST_NAMES = [
102 "Savage", "Hendrix", "Moon", "Larsen", "Rocha", "Burgess", "Bailey", "Farley",
103 "Moses", "Schmidt", "Brown", "Hoover", "Klein", "Jennings", "Braun", "Rangel",
104 "Casey", "Dougherty", "Hancock", "Wolf", "Henry", "Thomas", "Bentley",
105 "Barnett", "Kline", "Pitts", "Rojas", "Sosa", "Paul", "Hess", "Chase",
106 "Mckay", "Bender", "Colins", "Montoya", "Townsend", "Potts", "Ayala", "Avery",
107 "Sherman", "Tapia", "Hamilton", "Ferguson", "Huang", "Hooper", "Zamora",
108 "Logan", "Lloyd", "Quinn", "Monroe", "Brock", "Ibarra", "Fowler", "Weiss",
109 "Montgomery", "Diaz", "Dixon", "Olson", "Robertson", "Arias", "Benjamin",
110 "Abbott", "Stein", "Schroeder", "Beck", "Velasquez", "Barber", "Nichols",
111 "Ortiz", "Burns", "Moody", "Stokes", "Wilcox", "Rush", "Michael", "Kidd",
112 "Rowland", "Mclean", "Saunders", "Chung", "Newton", "Potter", "Hickman",
113 "Ray", "Larson", "Figueroa", "Duncan", "Sparks", "Rose", "Hodge", "Huynh",
114 "Joseph", "Morales", "Beasley", "Mora", "Fry", "Ross", "Novak", "Hahn",
115 "Wise", "Knight", "Frederick", "Heath", "Pollard", "Vega", "Mcclain",
116 "Buckley", "Conrad", "Cantrell", "Bond", "Mejia", "Wang", "Lewis", "Johns",
117 "Mcknight", "Callahan", "Reynolds", "Norris", "Burnett", "Carey", "Jacobson",
118 "Oneill", "Oconnor", "Leonard", "Mckenzie", "Hale", "Delgado", "Spence",
119 "Brandt", "Obrien", "Bowman", "James", "Avila", "Roberts", "Barker", "Cohen",
120 "Bradley", "Prince", "Warren", "Summers", "Little", "Caldwell", "Garrett",
121 "Hughes", "Norton", "Burke", "Holden", "Merritt", "Lee", "Frank", "Wiley",
122 "Ho", "Weber", "Keith", "Winters", "Gray", "Watts", "Brady", "Aguilar",
123 "Nicholson", "David", "Pace", "Cervantes", "Davis", "Baxter", "Sanchez",
124 "Singleton", "Taylor", "Strickland", "Glenn", "Valentine", "Roy", "Cameron",
125 "Beard", "Norman", "Fritz", "Anthony", "Koch", "Parrish", "Herman", "Hines",
126 "Sutton", "Gallegos", "Stephenson", "Lozano", "Franklin", "Howe", "Bauer",
127 "Love", "Ali", "Ellison", "Lester", "Guzman", "Jarvis", "Espinoza",
128 "Fletcher", "Burton", "Woodard", "Peterson", "Barajas", "Richard", "Bryan",
129 "Goodman", "Cline", "Rowe", "Faulkner", "Crawford", "Mueller", "Patterson",
130 "Hull", "Walton", "Wu", "Flores", "York", "Dickson", "Barnes", "Fisher",
131 "Strong", "Juarez", "Fitzgerald", "Schmitt", "Blevins", "Villa", "Sullivan",
132 "Velazquez", "Horton", "Meadows", "Riley", "Barrera", "Neal", "Mendez",
133 "Mcdonald", "Floyd", "Lynch", "Mcdowell", "Benson", "Hebert", "Livingston",
134 "Davies", "Richardson", "Vincent", "Davenport", "Osborn", "Mckee", "Marshall",
135 "Ferrell", "Martinez", "Melton", "Mercer", "Yoder", "Jacobs", "Mcdaniel",
136 "Mcmillan", "Peters", "Atkinson", "Wood", "Briggs", "Valencia", "Chandler",
137 "Rios", "Hunter", "Bean", "Hicks", "Hays", "Lucero", "Malone", "Waller",
138 "Banks", "Myers", "Mitchell", "Grimes", "Houston", "Hampton", "Trujillo",
139 "Perkins", "Moran", "Welch", "Contreras", "Montes", "Ayers", "Hayden",
140 "Daniel", "Weeks", "Porter", "Gill", "Mullen", "Nolan", "Dorsey", "Crane",
141 "Estes", "Lam", "Wells", "Cisneros", "Giles", "Watson", "Vang", "Scott",
142 "Knox", "Hanna", "Fields",
143]
144
145
146def clean(json_string):
147 # Strip JSON XSS Tag
148 json_string = json_string.strip()
149 if json_string.startswith(")]}'"):
150 return json_string[5:]
151 return json_string
152
153
154def digest_auth(user):
155 return requests.auth.HTTPDigestAuth(user["username"], user["http_password"])
156
157
158def fetch_admin_group():
159 global GROUP_ADMIN
160 # Get admin group
161 r = json.loads(clean(requests.get(GROUPS_URL + "?suggest=ad&p=All-Projects",
162 headers=HEADERS,
163 auth=ADMIN_DIGEST).text))
164 admin_group_name = r.keys()[0]
165 GROUP_ADMIN = r[admin_group_name]
166 GROUP_ADMIN["name"] = admin_group_name
167
168
169def generate_random_text():
170 return " ".join([random.choice("lorem ipsum "
171 "doleret delendam "
172 "\n esse".split(" ")) for _ in xrange(1, 100)])
173
174
175def set_up():
176 global TMP_PATH
177 TMP_PATH = tempfile.mkdtemp()
178 atexit.register(clean_up)
179 os.makedirs(TMP_PATH + "/ssh")
180 os.makedirs(TMP_PATH + "/repos")
181 fetch_admin_group()
182
183
184def get_random_users(num_users):
Alice Kober-Sotzek28deb032016-10-07 15:30:14 +0200185 users = random.sample([(f, l) for f in FIRST_NAMES for l in LAST_NAMES],
186 num_users)
Patrick Hieselc8076c32016-05-02 11:18:51 +0200187 names = []
188 for u in users:
189 names.append({"firstname": u[0],
190 "lastname": u[1],
191 "name": u[0] + " " + u[1],
192 "username": u[0] + u[1],
Alice Kober-Sotzek28deb032016-10-07 15:30:14 +0200193 "email": u[0] + "." + u[1] + "@gerritcodereview.com",
Patrick Hieselc8076c32016-05-02 11:18:51 +0200194 "http_password": "secret",
195 "groups": []})
196 return names
197
198
199def generate_ssh_keys(gerrit_users):
200 for user in gerrit_users:
201 key_file = TMP_PATH + "/ssh/" + user["username"] + ".key"
202 subprocess.check_output(["ssh-keygen", "-f", key_file, "-N", ""])
203 with open(key_file + ".pub", "r") as f:
204 user["ssh_key"] = f.read()
205
206
207def create_gerrit_groups():
208 groups = [
209 {"name": "iOS-Maintainers", "description": "iOS Maintainers",
210 "visible_to_all": True, "owner": GROUP_ADMIN["name"],
211 "owner_id": GROUP_ADMIN["id"]},
212 {"name": "Android-Maintainers", "description": "Android Maintainers",
213 "visible_to_all": True, "owner": GROUP_ADMIN["name"],
214 "owner_id": GROUP_ADMIN["id"]},
215 {"name": "Backend-Maintainers", "description": "Backend Maintainers",
216 "visible_to_all": True, "owner": GROUP_ADMIN["name"],
217 "owner_id": GROUP_ADMIN["id"]},
218 {"name": "Script-Maintainers", "description": "Script Maintainers",
219 "visible_to_all": True, "owner": GROUP_ADMIN["name"],
220 "owner_id": GROUP_ADMIN["id"]},
221 {"name": "Security-Team", "description": "Sec Team",
222 "visible_to_all": False, "owner": GROUP_ADMIN["name"],
223 "owner_id": GROUP_ADMIN["id"]}]
224 for g in groups:
225 requests.put(GROUPS_URL + g["name"],
226 json.dumps(g),
227 headers=HEADERS,
228 auth=ADMIN_DIGEST)
229 return [g["name"] for g in groups]
230
231
232def create_gerrit_projects(owner_groups):
233 projects = [
234 {"id": "android", "name": "Android", "parent": "All-Projects",
235 "branches": ["master"], "description": "Our android app.",
236 "owners": [owner_groups[0]], "create_empty_commit": True},
237 {"id": "ios", "name": "iOS", "parent": "All-Projects",
238 "branches": ["master"], "description": "Our ios app.",
239 "owners": [owner_groups[1]], "create_empty_commit": True},
240 {"id": "backend", "name": "Backend", "parent": "All-Projects",
241 "branches": ["master"], "description": "Our awesome backend.",
242 "owners": [owner_groups[2]], "create_empty_commit": True},
243 {"id": "scripts", "name": "Scripts", "parent": "All-Projects",
244 "branches": ["master"], "description": "some small scripts.",
245 "owners": [owner_groups[3]], "create_empty_commit": True}]
246 for p in projects:
247 requests.put(PROJECTS_URL + p["name"],
248 json.dumps(p),
249 headers=HEADERS,
250 auth=ADMIN_DIGEST)
251 return [p["name"] for p in projects]
252
253
254def create_gerrit_users(gerrit_users):
255 for user in gerrit_users:
256 requests.put(ACCOUNTS_URL + user["username"],
257 json.dumps(user),
258 headers=HEADERS,
259 auth=ADMIN_DIGEST)
260
261
262def create_change(user, project_name):
263 random_commit_message = generate_random_text()
264 change = {
265 "project": project_name,
266 "subject": random_commit_message.split("\n")[0],
267 "branch": "master",
268 "status": "NEW",
269 }
270 requests.post(CHANGES_URL,
271 json.dumps(change),
272 headers=HEADERS,
273 auth=digest_auth(user))
274
275
276def clean_up():
277 shutil.rmtree(TMP_PATH)
278
279
280def main():
281 set_up()
282 gerrit_users = get_random_users(100)
283
284 group_names = create_gerrit_groups()
285 for idx, u in enumerate(gerrit_users):
286 u["groups"].append(group_names[idx % len(group_names)])
287 if idx % 5 == 0:
288 # Also add to security group
289 u["groups"].append(group_names[4])
290
291 generate_ssh_keys(gerrit_users)
292 create_gerrit_users(gerrit_users)
293
294 project_names = create_gerrit_projects(group_names)
295
296 for idx, u in enumerate(gerrit_users):
Alice Kober-Sotzek28deb032016-10-07 15:30:14 +0200297 for _ in xrange(random.randint(1, 5)):
298 create_change(u, project_names[4 * idx / len(gerrit_users)])
Patrick Hieselc8076c32016-05-02 11:18:51 +0200299
300main()