summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMonty Taylor <mordred@inaugust.com>2018-04-21 02:12:19 +0200
committerMonty Taylor <mordred@inaugust.com>2018-04-21 02:12:19 +0200
commitac692c16378fb9ff1d58f7b9505563c4b4b4d641 (patch)
treed5bd7bcccf285b54e58e49af67ec954f7ec7ceb7
parent5be1b057adf8a639f718409b2fd8986272d05ac0 (diff)
Add thousands of projects talk
-rw-r--r--src/thousands/cp437utf8.py69
-rw-r--r--src/thousands/images/01-gerrit.pngbin0 -> 126754 bytes
-rw-r--r--src/thousands/images/02-status1.pngbin0 -> 169213 bytes
-rw-r--r--src/thousands/images/03-status2.pngbin0 -> 58075 bytes
-rw-r--r--src/thousands/images/04-health.pngbin0 -> 40296 bytes
-rw-r--r--src/thousands/images/ansible.ans49
-rw-r--r--src/thousands/images/architecture.ans45
-rw-r--r--src/thousands/images/circle.ans49
-rw-r--r--src/thousands/images/color-gertty.ans57
-rwxr-xr-xsrc/thousands/images/convert.sh4
-rw-r--r--src/thousands/images/crd.ans29
-rw-r--r--src/thousands/images/cursor.ans47
-rw-r--r--src/thousands/images/cursor2.ans47
-rw-r--r--src/thousands/images/openstack.ans51
-rw-r--r--src/thousands/images/orig/ansible.ans49
-rw-r--r--src/thousands/images/orig/architecture.ans45
-rw-r--r--src/thousands/images/orig/circle.ans49
-rw-r--r--src/thousands/images/orig/color-gertty.ans57
-rw-r--r--src/thousands/images/orig/crd.ans29
-rw-r--r--src/thousands/images/orig/cursor.ans47
-rw-r--r--src/thousands/images/orig/cursor2.ans47
-rw-r--r--src/thousands/images/orig/openstack.ans51
-rw-r--r--src/thousands/images/orig/questions.ans27
-rw-r--r--src/thousands/images/orig/redhat.ans49
-rw-r--r--src/thousands/images/orig/startup1.ans39
-rw-r--r--src/thousands/images/orig/startup2.ans39
-rw-r--r--src/thousands/images/orig/td.ansbin0 -> 2433 bytes
-rw-r--r--src/thousands/images/orig/testslide.ans49
-rw-r--r--src/thousands/images/orig/title.ans45
-rw-r--r--src/thousands/images/orig/workflow.ans29
-rw-r--r--src/thousands/images/orig/zsim-00.ans43
-rw-r--r--src/thousands/images/orig/zsim-01.ans43
-rw-r--r--src/thousands/images/orig/zsim-02.ans43
-rw-r--r--src/thousands/images/orig/zsim-03.ans43
-rw-r--r--src/thousands/images/orig/zsim-04.ans43
-rw-r--r--src/thousands/images/orig/zsim-05.ans43
-rw-r--r--src/thousands/images/orig/zsim-06.ans43
-rw-r--r--src/thousands/images/orig/zsim-07.ans43
-rw-r--r--src/thousands/images/orig/zsim-08.ans43
-rw-r--r--src/thousands/images/orig/zsim-09.ans43
-rw-r--r--src/thousands/images/orig/zsim-10.ans43
-rw-r--r--src/thousands/images/orig/zsim-11.ans43
-rw-r--r--src/thousands/images/orig/zsim-12.ans43
-rw-r--r--src/thousands/images/orig/zsim-13.ans43
-rw-r--r--src/thousands/images/orig/zsim-14.ans43
-rw-r--r--src/thousands/images/orig/zsim-15.ans43
-rw-r--r--src/thousands/images/orig/zsim-16.ans43
-rw-r--r--src/thousands/images/orig/zsim-17.ans43
-rw-r--r--src/thousands/images/orig/zsim-18.ans43
-rw-r--r--src/thousands/images/orig/zsim-19.ans43
-rw-r--r--src/thousands/images/orig/zsim-20.ans43
-rw-r--r--src/thousands/images/orig/zsim-21.ans43
-rw-r--r--src/thousands/images/orig/zsim-22.ans43
-rw-r--r--src/thousands/images/orig/zsim-keyline.ans45
-rw-r--r--src/thousands/images/orig/zuul-status.ans49
-rw-r--r--src/thousands/images/orig/zuul.ans43
-rw-r--r--src/thousands/images/questions.ans27
-rw-r--r--src/thousands/images/redhat.ans49
-rw-r--r--src/thousands/images/startup1.ans39
-rw-r--r--src/thousands/images/startup2.ans39
-rw-r--r--src/thousands/images/td.ansbin0 -> 2737 bytes
-rw-r--r--src/thousands/images/testslide.ans49
-rw-r--r--src/thousands/images/title.ans45
-rw-r--r--src/thousands/images/workflow.ans29
-rw-r--r--src/thousands/images/zsim-00.ans43
-rw-r--r--src/thousands/images/zsim-01.ans43
-rw-r--r--src/thousands/images/zsim-02.ans43
-rw-r--r--src/thousands/images/zsim-03.ans43
-rw-r--r--src/thousands/images/zsim-04.ans43
-rw-r--r--src/thousands/images/zsim-05.ans43
-rw-r--r--src/thousands/images/zsim-06.ans43
-rw-r--r--src/thousands/images/zsim-07.ans43
-rw-r--r--src/thousands/images/zsim-08.ans43
-rw-r--r--src/thousands/images/zsim-09.ans43
-rw-r--r--src/thousands/images/zsim-10.ans43
-rw-r--r--src/thousands/images/zsim-11.ans43
-rw-r--r--src/thousands/images/zsim-12.ans43
-rw-r--r--src/thousands/images/zsim-13.ans43
-rw-r--r--src/thousands/images/zsim-14.ans43
-rw-r--r--src/thousands/images/zsim-15.ans43
-rw-r--r--src/thousands/images/zsim-16.ans43
-rw-r--r--src/thousands/images/zsim-17.ans43
-rw-r--r--src/thousands/images/zsim-18.ans43
-rw-r--r--src/thousands/images/zsim-19.ans43
-rw-r--r--src/thousands/images/zsim-20.ans43
-rw-r--r--src/thousands/images/zsim-21.ans43
-rw-r--r--src/thousands/images/zsim-22.ans43
-rw-r--r--src/thousands/images/zsim-keyline.ans45
-rw-r--r--src/thousands/images/zuul-status.ans49
-rw-r--r--src/thousands/images/zuul.ans43
-rwxr-xr-xsrc/thousands/start.sh8
-rw-r--r--src/thousands/thousands.rst1001
92 files changed, 4636 insertions, 0 deletions
diff --git a/src/thousands/cp437utf8.py b/src/thousands/cp437utf8.py
new file mode 100644
index 0000000..9b1b629
--- /dev/null
+++ b/src/thousands/cp437utf8.py
@@ -0,0 +1,69 @@
1# _______
2# ____________ _______ _\__ /_________ ___ _____
3# | _ _ \ _ | ____\ _ / | |/ _ \
4# | / / / / | | | /___/ _ | | / /
5# |___/___/ /___/____|________|___ | |_| |___|_____/
6# \__/ |___|
7#
8#
9# (c) 2009-2012 Wijnand Modderman-Lenstra <maze@pyth0n.org>
10# MIT License
11#
12
13CP437 = (
14 u'\u0000', u'\u0001', u'\u0002', u'\u0003', u'\u0004', u'\u0005',
15 u'\u0006', u'\u0007', u'\u0008', u'\u0009', u'\u000A', u'\u000B',
16 u'\u000C', u'\u000D', u'\u000E', u'\u000F', u'\u0010', u'\u0011',
17 u'\u0012', u'\u0013', u'\u0014', u'\u0015', u'\u0016', u'\u0017',
18 u'\u0018', u'\u0019', u'\u001A', u'\u001B', u'\u001C', u'\u001D',
19 u'\u001E', u'\u001F', u'\u0020', u'\u0021', u'\u0022', u'\u0023',
20 u'\u0024', u'\u0025', u'\u0026', u'\u0027', u'\u0028', u'\u0029',
21 u'\u002A', u'\u002B', u'\u002C', u'\u002D', u'\u002E', u'\u002F',
22 u'\u0030', u'\u0031', u'\u0032', u'\u0033', u'\u0034', u'\u0035',
23 u'\u0036', u'\u0037', u'\u0038', u'\u0039', u'\u003A', u'\u003B',
24 u'\u003C', u'\u003D', u'\u003E', u'\u003F', u'\u0040', u'\u0041',
25 u'\u0042', u'\u0043', u'\u0044', u'\u0045', u'\u0046', u'\u0047',
26 u'\u0048', u'\u0049', u'\u004A', u'\u004B', u'\u004C', u'\u004D',
27 u'\u004E', u'\u004F', u'\u0050', u'\u0051', u'\u0052', u'\u0053',
28 u'\u0054', u'\u0055', u'\u0056', u'\u0057', u'\u0058', u'\u0059',
29 u'\u005A', u'\u005B', u'\u005C', u'\u005D', u'\u005E', u'\u005F',
30 u'\u0060', u'\u0061', u'\u0062', u'\u0063', u'\u0064', u'\u0065',
31 u'\u0066', u'\u0067', u'\u0068', u'\u0069', u'\u006A', u'\u006B',
32 u'\u006C', u'\u006D', u'\u006E', u'\u006F', u'\u0070', u'\u0071',
33 u'\u0072', u'\u0073', u'\u0074', u'\u0075', u'\u0076', u'\u0077',
34 u'\u0078', u'\u0079', u'\u007A', u'\u007B', u'\u007C', u'\u007D',
35 u'\u007E', u'\u007F', u'\u00C7', u'\u00FC', u'\u00E9', u'\u00E2',
36 u'\u00E4', u'\u00E0', u'\u00E5', u'\u00E7', u'\u00EA', u'\u00EB',
37 u'\u00E8', u'\u00EF', u'\u00EE', u'\u00EC', u'\u00C4', u'\u00C5',
38 u'\u00C9', u'\u00E6', u'\u00C6', u'\u00F4', u'\u00F6', u'\u00F2',
39 u'\u00FB', u'\u00F9', u'\u00FF', u'\u00D6', u'\u00DC', u'\u00A2',
40 u'\u00A3', u'\u00A5', u'\u20A7', u'\u0192', u'\u00E1', u'\u00ED',
41 u'\u00F3', u'\u00FA', u'\u00F1', u'\u00D1', u'\u00AA', u'\u00BA',
42 u'\u00BF', u'\u2310', u'\u00AC', u'\u00BD', u'\u00BC', u'\u00A1',
43 u'\u00AB', u'\u00BB', u'\u2591', u'\u2592', u'\u2593', u'\u2502',
44 u'\u2524', u'\u2561', u'\u2562', u'\u2556', u'\u2555', u'\u2563',
45 u'\u2551', u'\u2557', u'\u255D', u'\u255C', u'\u255B', u'\u2510',
46 u'\u2514', u'\u2534', u'\u252C', u'\u251C', u'\u2500', u'\u253C',
47 u'\u255E', u'\u255F', u'\u255A', u'\u2554', u'\u2569', u'\u2566',
48 u'\u2560', u'\u2550', u'\u256C', u'\u2567', u'\u2568', u'\u2564',
49 u'\u2565', u'\u2559', u'\u2558', u'\u2552', u'\u2553', u'\u256B',
50 u'\u256A', u'\u2518', u'\u250C', u'\u2588', u'\u2584', u'\u258C',
51 u'\u2590', u'\u2580', u'\u03B1', u'\u00DF', u'\u0393', u'\u03C0',
52 u'\u03A3', u'\u03C3', u'\u00B5', u'\u03C4', u'\u03A6', u'\u0398',
53 u'\u03A9', u'\u03B4', u'\u221E', u'\u03C6', u'\u03B5', u'\u2229',
54 u'\u2261', u'\u00B1', u'\u2265', u'\u2264', u'\u2320', u'\u2321',
55 u'\u00F7', u'\u2248', u'\u00B0', u'\u2219', u'\u00B7', u'\u221A',
56 u'\u207F', u'\u00B2', u'\u25A0', u'\u00A0',
57)
58
59def convert(text):
60 return u''.join([CP437[ord(char)] for char in text])
61
62if __name__ == '__main__':
63 import sys
64 if len(sys.argv) < 2:
65 print >>sys.stderr, '%s <in> <out>' % (sys.argv[0],)
66 sys.exit(1)
67 d = file(sys.argv[1]).read()
68 out = open(sys.argv[2], 'w')
69 out.write(convert(d).encode('utf8'))
diff --git a/src/thousands/images/01-gerrit.png b/src/thousands/images/01-gerrit.png
new file mode 100644
index 0000000..2c8a2c4
--- /dev/null
+++ b/src/thousands/images/01-gerrit.png
Binary files differ
diff --git a/src/thousands/images/02-status1.png b/src/thousands/images/02-status1.png
new file mode 100644
index 0000000..7b350a8
--- /dev/null
+++ b/src/thousands/images/02-status1.png
Binary files differ
diff --git a/src/thousands/images/03-status2.png b/src/thousands/images/03-status2.png
new file mode 100644
index 0000000..0b2607d
--- /dev/null
+++ b/src/thousands/images/03-status2.png
Binary files differ
diff --git a/src/thousands/images/04-health.png b/src/thousands/images/04-health.png
new file mode 100644
index 0000000..750d32c
--- /dev/null
+++ b/src/thousands/images/04-health.png
Binary files differ
diff --git a/src/thousands/images/ansible.ans b/src/thousands/images/ansible.ans
new file mode 100644
index 0000000..0cadddf
--- /dev/null
+++ b/src/thousands/images/ansible.ans
@@ -0,0 +1,49 @@
1
2
3 ▄▄▄▄██████▄▄▄▄
4
5 ▄▄██████████████████▄▄
6
7 ▄██████████████████████████▄
8
9 ▄██████████████████████████████▄
10
11 ▄██████████████████████████████████▄
12
13 ▄██████████████████ █████████████████▄
14
15 â–█████████████████â–ˆ â–ˆ████████████████▌
16
17 ██████████████████ ▄ █████████████████
18
19 â–████████████████â–ˆ â–ˆ â–ˆ███████████████▌
20
21 █████████████████ ███ ████████████████
22
23 â–███████████████â–ˆ █████ â–ˆ██████████████▌
24
25 â–██████████████â–ˆ ▀▀███ â–ˆ█████████████▌
26
27 ██████████████ ▄ ▀▀█ █████████████
28
29 â–███████████â–ˆ ████▄▄ â–ˆ██████████▌
30
31 ███████████ ████████▄▄ ██████████
32
33 â–████████â–ˆ â–ˆ████████████▄ ████████▌
34
35 ▀███████ ████████████████▄▄▄████████▀
36
37 ▀██████████████████████████████████▀
38
39 ▀██████████████████████████████▀
40
41 ▀██████████████████████████▀
42
43 ▀▀██████████████████▀▀
44
45 ▀▀▀▀██████▀▀▀▀
46
47
48
49 \ No newline at end of file
diff --git a/src/thousands/images/architecture.ans b/src/thousands/images/architecture.ans
new file mode 100644
index 0000000..ad308eb
--- /dev/null
+++ b/src/thousands/images/architecture.ans
@@ -0,0 +1,45 @@
1
2
3
4
5
6
7 ┌─────────────â”
8
9 ┌───────┤ Zuul Merger │   
10
11 ┌────┴───â” └──┬───┬──────┘
12
13 ┌──┤ Gerrit ├──â” │ │
14
15 │ └────────┘ │ ┌─┘ │
16
17   │ ┌────────â” │ │ ┌──┴───â” ┌───────────────â”
18
19 ┌─────┼──┤  Web  ├──┼────┤ Zuul ├─────┤ Zuul Executor │ 
20
21 ____ │ └────┬───┘ │ │ └──┬───┘ │ ┌───────â” │
22
23 |... | │ ┌────┴───â” │ │ │ │  │Ansible│ │
24
25 |... | ├──┤ GitHub ├──┼─┘ │ └───┴───┬───┴───┘
26
27/______\ │ └────────┘ │ ┌────┴─────â” │
28
29 o │ ┌────────â” │ │ Nodepool │ │
30
31 -|- └──┤ Finger ├──┘ └────┬─────┘ │
32
33 / \ └────────┘ │ │
34
35 Dev Cloud │  │
36
37  Node 1 ─────────────┤
38
39  ...  │
40
41  Node 2 ─────────────┘
42
43(Not to scale)  
44
45 \ No newline at end of file
diff --git a/src/thousands/images/circle.ans b/src/thousands/images/circle.ans
new file mode 100644
index 0000000..291eb33
--- /dev/null
+++ b/src/thousands/images/circle.ans
@@ -0,0 +1,49 @@
1 ▄▄▄▀▀▀▀▄▄▄
2
3 ▄▄▀▀▀ ▀▀▀▄▄
4
5 ▄▀▀ ▀▀▄
6
7 ▄▀ ▀▄
8
9 ▄▀ ▀▄
10
11 ▄▀ ▀▄
12
13 ▄▀ ▀▄
14
15 â–ˆ â–ˆ
16
17 â–ˆ â–ˆ
18
19▄▀ ▀▄
20
21â–ˆ â–ˆ
22
23▀▄ ▄▀
24
25 â–ˆ â–ˆ
26
27 â–ˆ â–ˆ
28
29 ▀▄ ▄▀
30
31 ▀▄ ▄▀
32
33 ▀▄ ▄▀
34
35 ▀▄ ▄▀
36
37 ▀▄▄ ▄▄▀
38
39 ▀▀▄▄▄ ▄▄▄▀▀
40
41 ▀▀▀▄▄▄▄▀▀▀
42
43
44
45
46
47
48
49 \ No newline at end of file
diff --git a/src/thousands/images/color-gertty.ans b/src/thousands/images/color-gertty.ans
new file mode 100644
index 0000000..7530e70
--- /dev/null
+++ b/src/thousands/images/color-gertty.ans
@@ -0,0 +1,57 @@
1Change 31337
2
3Owner Carol
4
5Project hello-world
6
7Branch master
8
9
10
11Name Verified Code-Review
12
13Alice -1 
14
15Bob   -1 
16
17Zuul +1
18
19
20
21docs SUCCESS in 2m 37s
22
23python27 SUCCESS in 13m 21s
24
25
26
27Patch Set 1 4f0a5acfb3752dd1d2fb9153e0f3277c9bcc35ad 
28
29README.txt +2,-0
30
31src/hello.py +28,-4
32
33
34
35< Review > < Diff > < Local Checkout > < Local Cherry-Pick >
36
37
38
39Alice
40
41 This change seems gratuitous. I like it!
42
43Bob
44
45 This is a really good start but i have serious concerns about the
46
47 whitespace choices you have made.
48
49
50
51
52
53
54
55
56
57 \ No newline at end of file
diff --git a/src/thousands/images/convert.sh b/src/thousands/images/convert.sh
new file mode 100755
index 0000000..9acce64
--- /dev/null
+++ b/src/thousands/images/convert.sh
@@ -0,0 +1,4 @@
1#!/bin/sh -x
2
3cd orig
4find . -type f -name \*.ans -exec python ../../cp437utf8.py {} ../{} \;
diff --git a/src/thousands/images/crd.ans b/src/thousands/images/crd.ans
new file mode 100644
index 0000000..4b4436d
--- /dev/null
+++ b/src/thousands/images/crd.ans
@@ -0,0 +1,29 @@
1* nova 1001,12 Add SSH host keys to intance metadata
2
3 Change-ID: I0ac10
4
5* devstack 1020,6 Configure nova to return host keys
6
7 Change-ID: I0bc10
8
9 Depends-On: I0ac10
10
11* novaclient 1030,3 Add test that host keys are returned
12
13 Change-ID: I0dc10
14
15 Depends-On: I0bc10
16
17* shade 1040,1 Return host keys on instance creation
18
19 Change-ID: I0ec10
20
21 Depends-On: I0dc10
22
23* nodepool 1050,5 Verify host keys when booting nodes
24
25 Change-ID: I0fc10
26
27 Depends-On: I0ec10
28
29 \ No newline at end of file
diff --git a/src/thousands/images/cursor.ans b/src/thousands/images/cursor.ans
new file mode 100644
index 0000000..6d4d108
--- /dev/null
+++ b/src/thousands/images/cursor.ans
@@ -0,0 +1,47 @@
1â–ˆ
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 â–ˆ
46
47 \ No newline at end of file
diff --git a/src/thousands/images/cursor2.ans b/src/thousands/images/cursor2.ans
new file mode 100644
index 0000000..a9fe285
--- /dev/null
+++ b/src/thousands/images/cursor2.ans
@@ -0,0 +1,47 @@
1â–ˆ
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 â–ˆ
46
47 \ No newline at end of file
diff --git a/src/thousands/images/openstack.ans b/src/thousands/images/openstack.ans
new file mode 100644
index 0000000..e7a66f4
--- /dev/null
+++ b/src/thousands/images/openstack.ans
@@ -0,0 +1,51 @@
1  â–„â–„â–„â–„â–„â–„â–„â–„â–„â–„â–„ 
2
3 ▄▄▄▄▄▄▄▄▄▄▄▄█████████████████████████▄▄
4
5 █████████████████████████████████████████▄
6
7â–█████████████████▄▄▄▄▄▄▄▄▄▄▄▄▄██████████▄█▌
8
9â–██████▄███████████████████████████████████â–Œ
10
11â–█████â–████████████████████████████████████â–Œ
12
13â–██████████████████████████████████████████â–Œ
14
15 ▀███████████▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█..██â–███████â–Œ
16
17 â–„â–„..â–ˆ███████â–Œ  â– ..â–ˆ▀▀▀████▌
18
19â–███..▀▀▀▀▀██▌ â–██ â–ˆ▄▄▄████â–Œ
20
21â–█████▄▄▄▄▄██â–Œ â–████â–███████â–Œ
22
23â–████████████â–Œ â–████â–███████â–Œ
24
25â–████████████â–Œ â–████â–███████â–Œ
26
27â–████████████â–Œ â–████â–███████â–Œ
28
29 ▀███████████â–Œ â–.. â–ˆâ–███████â–Œ
30
31 ▄▄██████████▌  ▄▄▄▄▄████.. ▀▀▀████▌
32
33â–██..â–ˆ████▀▀▀███████████████████████▄▄▄████â–Œ
34
35â–███..████â–„â–„â–„██████████████████████████████â–Œ
36
37â–████████████▄██████████████▄▄▄▄▄██████████â–Œ
38
39 █████████████████████████████████████████▀▌
40
41 â–██████████████████████████████████████▀▀â–€ 
42
43 â–████████████████████████████▀▀▀▀▀▀▀▀▀ 
44
45 ▀█▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ 
46
47
48
49
50
51 \ No newline at end of file
diff --git a/src/thousands/images/orig/ansible.ans b/src/thousands/images/orig/ansible.ans
new file mode 100644
index 0000000..8605d51
--- /dev/null
+++ b/src/thousands/images/orig/ansible.ans
@@ -0,0 +1,49 @@
1
2
3 ÜÜÜÜÛÛÛÛÛÛÜÜÜÜ
4
5 ÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜ
6
7 ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜ
8
9 ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜ
10
11 ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜ
12
13 ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜ
14
15 ÞÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ
16
17 ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Ü ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
18
19 ÞÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Û ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ
20
21 ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
22
23 ÞÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ
24
25 ÞÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ßßÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ
26
27 ÛÛÛÛÛÛÛÛÛÛÛÛÛÛ Ü ßßÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛ
28
29 ÞÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÜÜ ÛÛÛÛÛÛÛÛÛÛÛÝ
30
31 ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÜÜ ÛÛÛÛÛÛÛÛÛÛ
32
33 ÞÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÜ ÛÛÛÛÛÛÛÛÝ
34
35 ßÛÛÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÛÛÛÛÛÛÛÛß
36
37 ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛß
38
39 ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛß
40
41 ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛß
42
43 ßßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛßß
44
45 ßßßßÛÛÛÛÛÛßßßß
46
47
48
49 \ No newline at end of file
diff --git a/src/thousands/images/orig/architecture.ans b/src/thousands/images/orig/architecture.ans
new file mode 100644
index 0000000..94b0720
--- /dev/null
+++ b/src/thousands/images/orig/architecture.ans
@@ -0,0 +1,45 @@
1
2
3
4
5
6
7 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
8
9 ÚÄÄÄÄÄÄÄ´ Zuul Merger ³
10
11 ³ ÀÄÄÄÄÄÄÂÄÄÄÄÄÄÙ
12
13 ³ ³
14
15 ³ ³
16
17  ÚÄÄÄÄÁÄÄÄ¿ ÚÄÄÁÄÄÄ¿ ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
18
19 ÚÄÄÄÄÄÄÄ´ Gerrit ÃÄÄÄÄÄÄÄ´ Zuul ÃÄÄÄÄÄ´ Zuul Launcher ³
20
21 ____ ÀÄÄÄÄÄÄÄÄÙ ÀÄÄÂÄÄÄÙ ³ ÚÄÄÄÄÄÄÄ¿ ³
22
23 |... | ³ ³  ³Ansible³ ³ 
24
25 |... | ³ ÀÄÄÄÁÄÄÄÂÄÄÄÁÄÄÄÙ
26
27/______\ ÚÄÄÄÄÁÄÄÄÄÄ¿ ³
28
29 o ³ Nodepool ³ ³
30
31 -|-   ÀÄÄÄÄÂÄÄÄÄÄÙ ³
32
33 / \ ³ ³
34
35 Dev Cloud ³  ³
36
37  Node 1 ÄÄÄÄÄÄÄÄÄÄÄÄÄ´
38
39  ...  ³
40
41  Node 2 ÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
42
43(Not to scale)  
44
45 \ No newline at end of file
diff --git a/src/thousands/images/orig/circle.ans b/src/thousands/images/orig/circle.ans
new file mode 100644
index 0000000..d21b2bb
--- /dev/null
+++ b/src/thousands/images/orig/circle.ans
@@ -0,0 +1,49 @@
1 ÜÜÜßßßßÜÜÜ
2
3 ÜÜßßß ßßßÜÜ
4
5 Üßß ßßÜ
6
7 Üß ßÜ
8
9 Üß ßÜ
10
11 Üß ßÜ
12
13 Üß ßÜ
14
15 Û Û
16
17 Û Û
18
19Üß ßÜ
20
21Û Û
22
23ßÜ Üß
24
25 Û Û
26
27 Û Û
28
29 ßÜ Üß
30
31 ßÜ Üß
32
33 ßÜ Üß
34
35 ßÜ Üß
36
37 ßÜÜ ÜÜß
38
39 ßßÜÜÜ ÜÜÜßß
40
41 ßßßÜÜÜÜßßß
42
43
44
45
46
47
48
49 \ No newline at end of file
diff --git a/src/thousands/images/orig/color-gertty.ans b/src/thousands/images/orig/color-gertty.ans
new file mode 100644
index 0000000..7530e70
--- /dev/null
+++ b/src/thousands/images/orig/color-gertty.ans
@@ -0,0 +1,57 @@
1Change 31337
2
3Owner Carol
4
5Project hello-world
6
7Branch master
8
9
10
11Name Verified Code-Review
12
13Alice -1 
14
15Bob   -1 
16
17Zuul +1
18
19
20
21docs SUCCESS in 2m 37s
22
23python27 SUCCESS in 13m 21s
24
25
26
27Patch Set 1 4f0a5acfb3752dd1d2fb9153e0f3277c9bcc35ad 
28
29README.txt +2,-0
30
31src/hello.py +28,-4
32
33
34
35< Review > < Diff > < Local Checkout > < Local Cherry-Pick >
36
37
38
39Alice
40
41 This change seems gratuitous. I like it!
42
43Bob
44
45 This is a really good start but i have serious concerns about the
46
47 whitespace choices you have made.
48
49
50
51
52
53
54
55
56
57 \ No newline at end of file
diff --git a/src/thousands/images/orig/crd.ans b/src/thousands/images/orig/crd.ans
new file mode 100644
index 0000000..4b4436d
--- /dev/null
+++ b/src/thousands/images/orig/crd.ans
@@ -0,0 +1,29 @@
1* nova 1001,12 Add SSH host keys to intance metadata
2
3 Change-ID: I0ac10
4
5* devstack 1020,6 Configure nova to return host keys
6
7 Change-ID: I0bc10
8
9 Depends-On: I0ac10
10
11* novaclient 1030,3 Add test that host keys are returned
12
13 Change-ID: I0dc10
14
15 Depends-On: I0bc10
16
17* shade 1040,1 Return host keys on instance creation
18
19 Change-ID: I0ec10
20
21 Depends-On: I0dc10
22
23* nodepool 1050,5 Verify host keys when booting nodes
24
25 Change-ID: I0fc10
26
27 Depends-On: I0ec10
28
29 \ No newline at end of file
diff --git a/src/thousands/images/orig/cursor.ans b/src/thousands/images/orig/cursor.ans
new file mode 100644
index 0000000..d9f6da9
--- /dev/null
+++ b/src/thousands/images/orig/cursor.ans
@@ -0,0 +1,47 @@
1Û
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 Û
46
47 \ No newline at end of file
diff --git a/src/thousands/images/orig/cursor2.ans b/src/thousands/images/orig/cursor2.ans
new file mode 100644
index 0000000..93d8570
--- /dev/null
+++ b/src/thousands/images/orig/cursor2.ans
@@ -0,0 +1,47 @@
1Û
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 Û
46
47 \ No newline at end of file
diff --git a/src/thousands/images/orig/openstack.ans b/src/thousands/images/orig/openstack.ans
new file mode 100644
index 0000000..4f689c7
--- /dev/null
+++ b/src/thousands/images/orig/openstack.ans
@@ -0,0 +1,51 @@
1  ÜÜÜÜÜÜÜÜÜÜÜ 
2
3 ÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜ
4
5 ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜ
6
7ÞÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÜÜÜÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÜÛÝ
8
9ÞÛÛÛÛÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ
10
11ÞÛÛÛÛÛÞÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ
12
13ÞÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ
14
15 ßÛÛÛÛÛÛÛÛÛÛÛßßßßßßßßßßßßßßßßßÛ..ÛÛÞÛÛÛÛÛÛÛÝ
16
17 ÜÜ..ÛÛÛÛÛÛÛÛÝ  Þ ..ÛßßßÛÛÛÛÝ
18
19ÞÛÛÛ..ßßßßßÛÛÝ ÞÛÛ ÛÜÜÜÛÛÛÛÝ
20
21ÞÛÛÛÛÛÜÜÜÜÜÛÛÝ ÞÛÛÛÛÞÛÛÛÛÛÛÛÝ
22
23ÞÛÛÛÛÛÛÛÛÛÛÛÛÝ ÞÛÛÛÛÞÛÛÛÛÛÛÛÝ
24
25ÞÛÛÛÛÛÛÛÛÛÛÛÛÝ ÞÛÛÛÛÞÛÛÛÛÛÛÛÝ
26
27ÞÛÛÛÛÛÛÛÛÛÛÛÛÝ ÞÛÛÛÛÞÛÛÛÛÛÛÛÝ
28
29 ßÛÛÛÛÛÛÛÛÛÛÛÝ Þ.. ÛÞÛÛÛÛÛÛÛÝ
30
31 ÜÜÛÛÛÛÛÛÛÛÛÛÝ  ÜÜÜÜÜÛÛÛÛ.. ßßßÛÛÛÛÝ
32
33ÞÛÛ..ÛÛÛÛÛßßßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÛÛÛÛÝ
34
35ÞÛÛÛ..ÛÛÛÛÜÜÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ
36
37ÞÛÛÛÛÛÛÛÛÛÛÛÛÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜÜÜÜÛÛÛÛÛÛÛÛÛÛÝ
38
39 ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛßÝ
40
41 ÞÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛßßß 
42
43 ÞÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛßßßßßßßßß 
44
45 ßÛßßßßßßßßßßßßßßßßßßßßßßßßß 
46
47
48
49
50
51 \ No newline at end of file
diff --git a/src/thousands/images/orig/questions.ans b/src/thousands/images/orig/questions.ans
new file mode 100644
index 0000000..ae2e90a
--- /dev/null
+++ b/src/thousands/images/orig/questions.ans
@@ -0,0 +1,27 @@
1
2
3
4
5
6
7
8
9 ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
10
11 Û Ü ÜÜÜÜÜ  Ü Û
12
13 Û ÛÛÛßßÛÛÜ Û
14
15 Û ßß  ÜÛÛÛ Û
16
17 Û  ÛÛÛßß Û
18
19 Û ßß Û
20
21 Û ÛÛÜ Û
22
23 Û ß ßßß ß Û
24
25 ßßßßßßßßßßßßßßßß
26
27 \ No newline at end of file
diff --git a/src/thousands/images/orig/redhat.ans b/src/thousands/images/orig/redhat.ans
new file mode 100644
index 0000000..f297fd0
--- /dev/null
+++ b/src/thousands/images/orig/redhat.ans
@@ -0,0 +1,49 @@
1
2
3  ÜÛÛÛÛÜÜÜÜÛÛÛÜÜÜÜ
4
5  ÛßÛÛÛÛÛÛÛÛÛÛÜ ÛÜ 
6
7 ÞÛÜ ßß ÜÛÛÛÛÛÛÛÛÛÛÜ
8
9 ÛÛÛ ÜÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ 
10
11  ÜÜÛÛÛ   ßßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜ
12
13  ÛÛÛÛÛÛÜ    ßßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ
14
15  ÞÛÛÛÛÛÛÛÜ   ßÛÛÛÛÛÛÛÛÛÛß ÛÛÜÜ
16
17 ÞÛÛÛÛÛÛÛÛÛÜÜ    ÛÛÛÛÛÛÛÛÛÜÛÛÛÛÛÛÝ 
18
19 ßÛÛÛÛÛÛÛÛÛÛÛÛÜÜ ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÝ
20
21 ßßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛß
22
23 ÞÛÛÜ   ßßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛß 
24
25  ßÛÛÛÜÛÛÜ  ßßßßÛÛÛÛÛÛÛÛßßßß 
26
27 ÜÜÛÛÜ ÛÛÛÛÛÜ ÜÜ ÜÜ ÜÜÜ 
28
29 ÛÛÛÛÛÛÛÛÜÜÜÛÛÛÛÛÛÛÜÜÛÛÛÛÛÛÛÛÛÛÛ 
30
31 ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÜÜßßÜÛÛÛÝ ÜÜ 
32
33 ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛ 
34
35 ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛß ÜÜÛÛÛÛß  
36
37 ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛß ÜÛÛÛÛÛß   
38
39 ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛß 
40
41 ßÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛßß 
42
43 ßßßÛÛÛÛÛßßß 
44
45
46
47
48
49 \ No newline at end of file
diff --git a/src/thousands/images/orig/startup1.ans b/src/thousands/images/orig/startup1.ans
new file mode 100644
index 0000000..3510a93
--- /dev/null
+++ b/src/thousands/images/orig/startup1.ans
@@ -0,0 +1,39 @@
1 ÚÄÄÄÄÄÄ¿
2
3 ³ Zuul ³
4
5 ÀÄÄÂÄÄÄÙ
6
7 ³
8
9 ÚÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÁÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄ¿
10
11 ³ ³ ³ ³ ³ ³ ³ ³
12
13ÚÄÁÄ¿ ÚÄÁÄ¿ ÚÄÁÄ¿ ÚÄÁÄ¿ ÚÄÁÄ¿ ÚÄÁÄ¿ ÚÄÁÄ¿ ÚÄÁÄ¿
14
15³zm1³ ³zm2³ ³zm3³ ³zm4³ ³zm5³ ³zm6³ ³zm7³ ³zm8³
16
17ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ
18
19nova keyst swift devst tmpst glanc dg projc
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37  
38
39 \ No newline at end of file
diff --git a/src/thousands/images/orig/startup2.ans b/src/thousands/images/orig/startup2.ans
new file mode 100644
index 0000000..3093800
--- /dev/null
+++ b/src/thousands/images/orig/startup2.ans
@@ -0,0 +1,39 @@
1 ÚÄÄÄÄÄÄ¿
2
3 ³ Zuul ³
4
5 ÀÄÄÂÄÄÄÙ
6
7 ³
8
9 ÚÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÁÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄ¿
10
11 ³ ³ ³ ³ ³ ³ ³ ³
12
13ÚÄÁÄ¿ ÚÄÁÄ¿ ÚÄÁÄ¿ ÚÄÁÄ¿ ÚÄÁÄ¿ ÚÄÁÄ¿ ÚÄÁÄ¿ ÚÄÁÄ¿
14
15³zm1³ ³zm2³ ³zm3³ ³zm4³ ³zm5³ ³zm6³ ³zm7³ ³zm8³
16
17ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ ÀÄÄÄÙ
18
19nova keyst swift devst tmpst glanc dg projc
20
21mastr newt mitak mastr mastr diabl mastr mastr
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37  
38
39 \ No newline at end of file
diff --git a/src/thousands/images/orig/td.ans b/src/thousands/images/orig/td.ans
new file mode 100644
index 0000000..c0c5cd6
--- /dev/null
+++ b/src/thousands/images/orig/td.ans
Binary files differ
diff --git a/src/thousands/images/orig/testslide.ans b/src/thousands/images/orig/testslide.ans
new file mode 100644
index 0000000..5505907
--- /dev/null
+++ b/src/thousands/images/orig/testslide.ans
@@ -0,0 +1,49 @@
1ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
2
3º ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ º
4
5º ³ ³ º
6
7º ³ ³ º
8
9º ³  Test Slide  Test Slide  ³ º
10
11º ³  Test Slide  Test Slide  ³ º
12
13º ³  Test Slide  Test Slide  ³ º
14
15º ³  Test Slide  Test Slide  ³ º
16
17º ³  Test Slide  Test Slide  ³ º
18
19º ³  Test Slide  Test Slide  ³ º
20
21º ³  Test Slide  Test Slide  ³ º
22
23º ³ Test Slide  Test Slide  ³ º
24
25º ³  Test Slide  Test Slide  ³ º
26
27º ³  Test Slide  Test Slide  ³ º
28
29º ³  Test Slide  Test Slide  ³ º
30
31º ³  Test Slide  Test Slide  ³ º
32
33º ³  Test Slide  Test Slide  ³ º
34
35º ³  Test Slide  Test Slide  ³ º
36
37º ³  Test Slide  Test Slide  ³ º
38
39º ³  Test Slide  Test Slide  ³ º
40
41º ³ ³ º
42
43º ³ ³ º
44
45º ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ º
46
47ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
48
49 \ No newline at end of file
diff --git a/src/thousands/images/orig/title.ans b/src/thousands/images/orig/title.ans
new file mode 100644
index 0000000..82ef305
--- /dev/null
+++ b/src/thousands/images/orig/title.ans
@@ -0,0 +1,45 @@
1 ______________ .ÄÄ. .ÄÄ. ______________
2
3( (  \ \_____)____(_____/ /  ) )
4
5 \ ) `ÄÄÄÄÄ'   `ÄÄÄÄÄ' ( /
6
7 )/   \(
8
9 /'  REST APIs and the Return of the  `\ 
10
11O   ___ ___ _ _ ___ ___ _ ___   O
12
13³  / __/ _ \| \| / __|/ _ \| | | __| ³
14
15³ | (_| (_) | .` \__ \ (_) | |__| _|  ³
16
17³  \___\___/|_|\_|___/\___/|____|___| ³
18
19³ ³
20
21³ Application ³
22
23³ ³
24
25O  James E. Blair <corvus@inaugust.com>  O
26
27 \. ./ 
28
29 )\  ,____ ____,  /(
30
31 / ) / ____\ ____ /____ \ ( \
32
33( (_________/_/ ) ( \_\_________) )
34
35 ~-'  `ÄÄ' `ÄÄ'  `-~ 
36
37
38
39
40
41
42
43
44
45 \ No newline at end of file
diff --git a/src/thousands/images/orig/workflow.ans b/src/thousands/images/orig/workflow.ans
new file mode 100644
index 0000000..067cc56
--- /dev/null
+++ b/src/thousands/images/orig/workflow.ans
@@ -0,0 +1,29 @@
1 Hack Review Test
2
3 ========= ========== ==========
4
5
6
7 push approve
8
9 +-------------+ +-------------+
10
11 | | | |
12
13 +------+--+ +--v----+--+ +--v-------+
14
15 | | | | | |
16
17 | $EDITOR | | Gerrit | | Zuul |
18
19 | | | | | |
20
21 +------^--+ +--+----^--+ +--+-------+
22
23 | | | |
24
25 +-------------+ +-------------+
26
27 clone merge
28
29 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-00.ans b/src/thousands/images/orig/zsim-00.ans
new file mode 100644
index 0000000..4f9ed82
--- /dev/null
+++ b/src/thousands/images/orig/zsim-00.ans
@@ -0,0 +1,43 @@
100 Zuul Git
2
3
4
5 Nova Keystone
6
7 þbadbeef þbeefcab
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-01.ans b/src/thousands/images/orig/zsim-01.ans
new file mode 100644
index 0000000..a087092
--- /dev/null
+++ b/src/thousands/images/orig/zsim-01.ans
@@ -0,0 +1,43 @@
101 Zuul Git
2
3 ÚÄÄÄ¿
4
5 ³ÞÛݳ Nova #1 Nova Keystone
6
7 ÀÄÄÄÙ þbadbeef þbeefcab
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-02.ans b/src/thousands/images/orig/zsim-02.ans
new file mode 100644
index 0000000..8f2938c
--- /dev/null
+++ b/src/thousands/images/orig/zsim-02.ans
@@ -0,0 +1,43 @@
102 Zuul Git
2
3 ÚÄÄÄ¿
4
5 ³ÞÛݳ Nova #1 ÛÛÛÛÛÛÛÛÛ Nova Keystone
6
7 ÀÄÄÄÙ ÛÛÛÛÛÛÛÛÛ þbadbeef þbeefcab
8
9 ÛÛÛÛÛÛÛÛÛ
10
11 ÛÛÛÛÛÛÛÛÛ
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-03.ans b/src/thousands/images/orig/zsim-03.ans
new file mode 100644
index 0000000..1186441
--- /dev/null
+++ b/src/thousands/images/orig/zsim-03.ans
@@ -0,0 +1,43 @@
103 Zuul Git
2
3 ÚÄÄÄ¿
4
5 ³ÞÛݳ Nova #1 ÛÛÛÛÛÛÛÛÛ Nova Keystone
6
7 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ þbadbeef þbeefcab
8
9 ³ ÛÛÛÛÛÛÛÛÛ
10
11 ³ ÛÛÛÛÛÛÛÛÛ
12
13 ÚÄÁÄ¿
14
15 ³ÞÛݳ Keystone #2
16
17 ÀÄÄÄÙ
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-04.ans b/src/thousands/images/orig/zsim-04.ans
new file mode 100644
index 0000000..8344a58
--- /dev/null
+++ b/src/thousands/images/orig/zsim-04.ans
@@ -0,0 +1,43 @@
104 Zuul Git
2
3 ÚÄÄÄ¿
4
5 ³ÞÛݳ Nova #1 ÛÛÛÛÛÛÛÛÛ Nova Keystone
6
7 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ þbadbeef þbeefcab
8
9 ³ ÛÛÛÛÛÛÛÛÛ
10
11 ³ ÛÛÛÛÛÛÛÛÛ
12
13 ÚÄÁÄ¿
14
15 ³ÞÛݳ Keystone #2 ÛÛÛÛÛÛÛÛÛ
16
17 ÀÄÄÄÙ ÛÛÛÛÛÛÛÛÛ
18
19 ÛÛÛÛÛÛÛÛÛ
20
21 ÛÛÛÛÛÛÛÛÛ
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-05.ans b/src/thousands/images/orig/zsim-05.ans
new file mode 100644
index 0000000..948d831
--- /dev/null
+++ b/src/thousands/images/orig/zsim-05.ans
@@ -0,0 +1,43 @@
105 Zuul Git
2
3 ÚÄÄÄ¿
4
5 ³ÞÛݳ Nova #1 ÛÛÛÛÛÛÛÛÛ Nova Keystone
6
7 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ þbadbeef þbeefcab
8
9 ³ ÛÛÛÛÛÛÛÛÛ
10
11 ³ ÛÛÛÛÛÛÛÛÛ
12
13 ÚÄÁÄ¿
14
15 ³ÞÛݳ Keystone #2 ÛÛÛÛÛÛÛÛÛ
16
17 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
18
19 ³ ÛÛÛÛÛÛÛÛÛ
20
21 ³ ÛÛÛÛÛÛÛÛÛ
22
23 ÚÄÁÄ¿
24
25 ³ÞÛݳ Nova #3
26
27 ÀÄÄÄÙ
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-06.ans b/src/thousands/images/orig/zsim-06.ans
new file mode 100644
index 0000000..be6cf1b
--- /dev/null
+++ b/src/thousands/images/orig/zsim-06.ans
@@ -0,0 +1,43 @@
106 Zuul Git
2
3 ÚÄÄÄ¿
4
5 ³ÞÛݳ Nova #1 ÛÛÛÛÛÛÛÛÛ Nova Keystone
6
7 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ þbadbeef þbeefcab
8
9 ³ ÛÛÛÛÛÛÛÛÛ
10
11 ³ ÛÛÛÛÛÛÛÛÛ
12
13 ÚÄÁÄ¿
14
15 ³ÞÛݳ Keystone #2 ÛÛÛÛÛÛÛÛÛ
16
17 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
18
19 ³ ÛÛÛÛÛÛÛÛÛ
20
21 ³ ÛÛÛÛÛÛÛÛÛ
22
23 ÚÄÁÄ¿
24
25 ³ÞÛݳ Nova #3 ÛÛÛÛÛÛÛÛÛ
26
27 ÀÄÄÄÙ ÛÛÛÛÛÛÛÛÛ
28
29 ÛÛÛÛÛÛÛÛÛ
30
31 ÛÛÛÛÛÛÛÛÛ
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-07.ans b/src/thousands/images/orig/zsim-07.ans
new file mode 100644
index 0000000..e827b4f
--- /dev/null
+++ b/src/thousands/images/orig/zsim-07.ans
@@ -0,0 +1,43 @@
107 Zuul Git
2
3 ÚÄÄÄ¿
4
5 ³ÞÛݳ Nova #1 ÛÛÛÛÛÛÛÛÛ Nova Keystone
6
7 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ þbadbeef þbeefcab
8
9 ³ ÛÛÛÛÛÛÛÛÛ
10
11 ³ ÛÛÛÛÛÛÛÛÛ
12
13 ÚÄÁÄ¿
14
15 ³ÞÛݳ Keystone #2 ÛÛÛÛÛÛÛÛÛ
16
17 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
18
19 ³ ÛÛÛÛÛÛÛÛÛ
20
21 ³ ÛÛÛÛÛÛÛÛÛ
22
23 ÚÄÁÄ¿
24
25 ³ÞÛݳ Nova #3 ÛÛÛÛÛÛÛÛÛ
26
27 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
28
29 ³ ÛÛÛÛÛÛÛÛÛ
30
31 ³ ÛÛÛÛÛÛÛÛÛ
32
33 ÚÄÁÄ¿
34
35 ³ÞÛݳ Nova #4
36
37 ÀÄÄÄÙ
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-08.ans b/src/thousands/images/orig/zsim-08.ans
new file mode 100644
index 0000000..e7d5ca5
--- /dev/null
+++ b/src/thousands/images/orig/zsim-08.ans
@@ -0,0 +1,43 @@
108 Zuul Git
2
3 ÚÄÄÄ¿
4
5 ³ÞÛݳ Nova #1 ÛÛÛÛÛÛÛÛÛ Nova Keystone
6
7 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ þbadbeef þbeefcab
8
9 ³ ÛÛÛÛÛÛÛÛÛ
10
11 ³ ÛÛÛÛÛÛÛÛÛ
12
13 ÚÄÁÄ¿
14
15 ³ÞÛݳ Keystone #2 ÛÛÛÛÛÛÛÛÛ
16
17 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
18
19 ³ ÛÛÛÛÛÛÛÛÛ
20
21 ³ ÛÛÛÛÛÛÛÛÛ
22
23 ÚÄÁÄ¿
24
25 ³ÞÛݳ Nova #3 ÛÛÛÛÛÛÛÛÛ
26
27 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
28
29 ³ ÛÛÛÛÛÛÛÛÛ
30
31 ³ ÛÛÛÛÛÛÛÛÛ
32
33 ÚÄÁÄ¿
34
35 ³ÞÛݳ Nova #4 ÛÛÛÛÛÛÛÛÛ
36
37 ÀÄÄÄÙ ÛÛÛÛÛÛÛÛÛ
38
39 ÛÛÛÛÛÛÛÛÛ
40
41 ÛÛÛÛÛÛÛÛÛ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-09.ans b/src/thousands/images/orig/zsim-09.ans
new file mode 100644
index 0000000..c5a6f3a
--- /dev/null
+++ b/src/thousands/images/orig/zsim-09.ans
@@ -0,0 +1,43 @@
109 Zuul Git
2
3 ÚÄÄÄ¿
4
5 ³ÞÛݳ Nova #1 ÛÛÛÛÛÛÛÛÛ Nova Keystone
6
7 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ þbadbeef þbeefcab
8
9 ³ ÛÛÛÛÛÛÛÛÛ
10
11 ³ ÛÛÛÛÛÛÛÛÛ
12
13 ÚÄÁÄ¿
14
15 ³ÞÛݳ Keystone #2 FAILURE
16
17 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
18
19 ³ ÛÛÛÛÛÛÛÛÛ
20
21 ³ ÛÛÛÛÛÛÛÛÛ
22
23 ÚÄÁÄ¿
24
25 ³ÞÛݳ Nova #3 ÛÛÛÛÛÛÛÛÛ
26
27 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
28
29 ³ ÛÛÛÛÛÛÛÛÛ
30
31 ³ ÛÛÛÛÛÛÛÛÛ
32
33 ÚÄÁÄ¿
34
35 ³ÞÛݳ Nova #4 ÛÛÛÛÛÛÛÛÛ
36
37 ÀÄÄÄÙ ÛÛÛÛÛÛÛÛÛ
38
39 ÛÛÛÛÛÛÛÛÛ
40
41 ÛÛÛÛÛÛÛÛÛ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-10.ans b/src/thousands/images/orig/zsim-10.ans
new file mode 100644
index 0000000..85e80a2
--- /dev/null
+++ b/src/thousands/images/orig/zsim-10.ans
@@ -0,0 +1,43 @@
110 Zuul Git
2
3 ÚÄÄÄ¿
4
5 ³ÞÛݳ Nova #1 ÛÛÛÛÛÛÛÛÛ Nova Keystone
6
7 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ þbadbeef þbeefcab
8
9 ³ ÛÛÛÛÛÛÛÛÛ
10
11 ³ ÛÛÛÛÛÛÛÛÛ
12
13 ÚÄÁÄ¿
14
15 ³ÞÛݳ Keystone #2 FAILURE
16
17 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
18
19 ³ ÛÛÛÛÛÛÛÛÛ
20
21 ³ ÛÛÛÛÛÛÛÛÛ
22
23 ÚÄÁÄ¿
24
25 ³ÞÛݳ Nova #3 CANCELED
26
27 ÀÄÂÄÙ CANCELED
28
29 ³ CANCELED
30
31 ³ CANCELED
32
33 ÚÄÁÄ¿
34
35 ³ÞÛݳ Nova #4 CANCELED
36
37 ÀÄÄÄÙ CANCELED
38
39 CANCELED
40
41 CANCELED .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-11.ans b/src/thousands/images/orig/zsim-11.ans
new file mode 100644
index 0000000..0a7b7e2
--- /dev/null
+++ b/src/thousands/images/orig/zsim-11.ans
@@ -0,0 +1,43 @@
111 Zuul Git
2
3 ÚÄÄÄ¿
4
5 ³ÞÛݳ Nova #1 ÛÛÛÛÛÛÛÛÛ Nova Keystone
6
7 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ þbadbeef þbeefcab
8
9 ÀÄÄ¿ ÛÛÛÛÛÛÛÛÛ
10
11 ³ ÛÛÛÛÛÛÛÛÛ
12
13 ÚÄÁÄ¿
14
15 ³ÞÛݳ Keystone #2 FAILURE
16
17 ÀÄÄÄÙ SUCCESS
18
19 ÛÛÛÛÛÛÛÛÛ
20
21 ÛÛÛÛÛÛÛÛÛ
22
23 ÚÄÄÄ¿
24
25 ³ÞÛݳ Nova #3
26
27 ÀÄÂÄÙ
28
29 ³
30
31 ³
32
33 ÚÄÁÄ¿
34
35 ³ÞÛݳ Nova #4
36
37 ÀÄÄÄÙ
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-12.ans b/src/thousands/images/orig/zsim-12.ans
new file mode 100644
index 0000000..072d29b
--- /dev/null
+++ b/src/thousands/images/orig/zsim-12.ans
@@ -0,0 +1,43 @@
112 Zuul Git
2
3 ÚÄÄÄ¿
4
5 ³ÞÛݳ Nova #1 SUCCESS Nova Keystone
6
7 ÀÄÂÄÙ SUCCESS þbadbeef þbeefcab
8
9 ÃÄÄ¿ ÛÛÛÛÛÛÛÛÛ
10
11 ³ ³ ÛÛÛÛÛÛÛÛÛ
12
13 ³ÚÄÁÄ¿
14
15 ³³ÞÛݳ Keystone #2 FAILURE
16
17 ³ÀÄÄÄÙ SUCCESS
18
19 ³ ÛÛÛÛÛÛÛÛÛ
20
21 ³ ÛÛÛÛÛÛÛÛÛ
22
23 ÚÄÁÄ¿
24
25 ³ÞÛݳ Nova #3 ÛÛÛÛÛÛÛÛÛ
26
27 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
28
29 ³ ÛÛÛÛÛÛÛÛÛ
30
31 ³ ÛÛÛÛÛÛÛÛÛ
32
33 ÚÄÁÄ¿
34
35 ³ÞÛݳ Nova #4
36
37 ÀÄÄÄÙ
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-13.ans b/src/thousands/images/orig/zsim-13.ans
new file mode 100644
index 0000000..cf656e3
--- /dev/null
+++ b/src/thousands/images/orig/zsim-13.ans
@@ -0,0 +1,43 @@
113 Zuul Git
2
3 ÚÄÄÄ¿
4
5 ³ÞÛݳ Nova #1 SUCCESS Nova Keystone
6
7 ÀÄÂÄÙ SUCCESS þbadbeef þbeefcab
8
9 ÃÄÄ¿ ÛÛÛÛÛÛÛÛÛ
10
11 ³ ³ SUCCESS
12
13 ³ÚÄÁÄ¿
14
15 ³³ÞÛݳ Keystone #2 FAILURE
16
17 ³ÀÄÄÄÙ SUCCESS
18
19 ³ ÛÛÛÛÛÛÛÛÛ
20
21 ³ ÛÛÛÛÛÛÛÛÛ
22
23 ÚÄÁÄ¿
24
25 ³ÞÛݳ Nova #3 ÛÛÛÛÛÛÛÛÛ
26
27 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
28
29 ³ ÛÛÛÛÛÛÛÛÛ
30
31 ³ ÛÛÛÛÛÛÛÛÛ
32
33 ÚÄÁÄ¿
34
35 ³ÞÛݳ Nova #4 ÛÛÛÛÛÛÛÛÛ
36
37 ÀÄÄÄÙ ÛÛÛÛÛÛÛÛÛ
38
39 ÛÛÛÛÛÛÛÛÛ
40
41 ÛÛÛÛÛÛÛÛÛ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-14.ans b/src/thousands/images/orig/zsim-14.ans
new file mode 100644
index 0000000..0151210
--- /dev/null
+++ b/src/thousands/images/orig/zsim-14.ans
@@ -0,0 +1,43 @@
114 Zuul Git
2
3 ÚÄÄÄ¿
4
5 ³ÞÛݳ Nova #1 SUCCESS Nova Keystone
6
7 ÀÄÂÄÙ SUCCESS þbadbeef þbeefcab
8
9 ÃÄÄ¿ SUCCESS
10
11 ³ ³ SUCCESS
12
13 ³ÚÄÁÄ¿
14
15 ³³ÞÛݳ Keystone #2 FAILURE
16
17 ³ÀÄÄÄÙ SUCCESS
18
19 ³ ÛÛÛÛÛÛÛÛÛ
20
21 ³ ÛÛÛÛÛÛÛÛÛ
22
23 ÚÄÁÄ¿
24
25 ³ÞÛݳ Nova #3 ÛÛÛÛÛÛÛÛÛ
26
27 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
28
29 ³ ÛÛÛÛÛÛÛÛÛ
30
31 ³ ÛÛÛÛÛÛÛÛÛ
32
33 ÚÄÁÄ¿
34
35 ³ÞÛݳ Nova #4 ÛÛÛÛÛÛÛÛÛ
36
37 ÀÄÄÄÙ ÛÛÛÛÛÛÛÛÛ
38
39 ÛÛÛÛÛÛÛÛÛ
40
41 ÛÛÛÛÛÛÛÛÛ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-15.ans b/src/thousands/images/orig/zsim-15.ans
new file mode 100644
index 0000000..eb63977
--- /dev/null
+++ b/src/thousands/images/orig/zsim-15.ans
@@ -0,0 +1,43 @@
115 Zuul Git
2
3
4
5 Nova Keystone
6
7 þbadbeef þbeefcab
8
9 þ#1
10
11
12
13 ³ÚÄÄÄ¿
14
15 ³³ÞÛݳ Keystone #2 FAILURE
16
17 ³ÀÄÄÄÙ SUCCESS
18
19 ³ ÛÛÛÛÛÛÛÛÛ
20
21 ³ ÛÛÛÛÛÛÛÛÛ
22
23 ÚÄÁÄ¿
24
25 ³ÞÛݳ Nova #3 ÛÛÛÛÛÛÛÛÛ
26
27 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
28
29 ³ ÛÛÛÛÛÛÛÛÛ
30
31 ³ ÛÛÛÛÛÛÛÛÛ
32
33 ÚÄÁÄ¿
34
35 ³ÞÛݳ Nova #4 ÛÛÛÛÛÛÛÛÛ
36
37 ÀÄÄÄÙ ÛÛÛÛÛÛÛÛÛ
38
39 ÛÛÛÛÛÛÛÛÛ
40
41 ÛÛÛÛÛÛÛÛÛ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-16.ans b/src/thousands/images/orig/zsim-16.ans
new file mode 100644
index 0000000..d007060
--- /dev/null
+++ b/src/thousands/images/orig/zsim-16.ans
@@ -0,0 +1,43 @@
116 Zuul Git
2
3
4
5 Nova Keystone
6
7 þbadbeef þbeefcab
8
9 þ#1
10
11
12
13 ³ÚÄÄÄ¿
14
15 ³³ÞÛݳ Keystone #2 FAILURE
16
17 ³ÀÄÄÄÙ SUCCESS
18
19 ³ SUCCESS
20
21 ³ SUCCESS
22
23 ÚÄÁÄ¿
24
25 ³ÞÛݳ Nova #3 ÛÛÛÛÛÛÛÛÛ
26
27 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
28
29 ³ ÛÛÛÛÛÛÛÛÛ
30
31 ³ ÛÛÛÛÛÛÛÛÛ
32
33 ÚÄÁÄ¿
34
35 ³ÞÛݳ Nova #4 ÛÛÛÛÛÛÛÛÛ
36
37 ÀÄÄÄÙ ÛÛÛÛÛÛÛÛÛ
38
39 ÛÛÛÛÛÛÛÛÛ
40
41 ÛÛÛÛÛÛÛÛÛ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-17.ans b/src/thousands/images/orig/zsim-17.ans
new file mode 100644
index 0000000..14c9258
--- /dev/null
+++ b/src/thousands/images/orig/zsim-17.ans
@@ -0,0 +1,43 @@
117 Zuul Git
2
3
4
5 Nova Keystone
6
7 þbadbeef þbeefcab
8
9 þ#1
10
11
12
13
14
15
16
17
18
19
20
21
22
23 ÚÄÄÄ¿
24
25 ³ÞÛݳ Nova #3 ÛÛÛÛÛÛÛÛÛ
26
27 ÀÄÂÄÙ ÛÛÛÛÛÛÛÛÛ
28
29 ³ ÛÛÛÛÛÛÛÛÛ
30
31 ³ ÛÛÛÛÛÛÛÛÛ
32
33 ÚÄÁÄ¿
34
35 ³ÞÛݳ Nova #4 ÛÛÛÛÛÛÛÛÛ
36
37 ÀÄÄÄÙ ÛÛÛÛÛÛÛÛÛ
38
39 ÛÛÛÛÛÛÛÛÛ
40
41 ÛÛÛÛÛÛÛÛÛ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-18.ans b/src/thousands/images/orig/zsim-18.ans
new file mode 100644
index 0000000..ed780ea
--- /dev/null
+++ b/src/thousands/images/orig/zsim-18.ans
@@ -0,0 +1,43 @@
118 Zuul Git
2
3
4
5 Nova Keystone
6
7 þbadbeef þbeefcab
8
9 þ#1
10
11
12
13
14
15
16
17
18
19
20
21
22
23 ÚÄÄÄ¿
24
25 ³ÞÛݳ Nova #3  SUCCESS 
26
27 ÀÄÂÄÙ  SUCCESS 
28
29 ³  SUCCESS 
30
31 ³  SUCCESS 
32
33 ÚÄÁÄ¿
34
35 ³ÞÛݳ Nova #4 ÛÛÛÛÛÛÛÛÛ
36
37 ÀÄÄÄÙ ÛÛÛÛÛÛÛÛÛ
38
39 ÛÛÛÛÛÛÛÛÛ
40
41 ÛÛÛÛÛÛÛÛÛ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-19.ans b/src/thousands/images/orig/zsim-19.ans
new file mode 100644
index 0000000..c82b91c
--- /dev/null
+++ b/src/thousands/images/orig/zsim-19.ans
@@ -0,0 +1,43 @@
119 Zuul Git
2
3
4
5 Nova Keystone
6
7 þbadbeef þbeefcab
8
9 þ#1
10
11 þ#3
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 ÚÄÄÄ¿
34
35 ³ÞÛݳ Nova #4  SUCCESS 
36
37 ÀÄÄÄÙ  SUCCESS 
38
39 ÛÛÛÛÛÛÛÛÛ
40
41  SUCCESS  .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-20.ans b/src/thousands/images/orig/zsim-20.ans
new file mode 100644
index 0000000..4d75d8b
--- /dev/null
+++ b/src/thousands/images/orig/zsim-20.ans
@@ -0,0 +1,43 @@
120 Zuul Git
2
3
4
5 Nova Keystone
6
7 þbadbeef þbeefcab
8
9 þ#1
10
11 þ#3
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 ÚÄÄÄ¿
34
35 ³ÞÛݳ Nova #4  SUCCESS 
36
37 ÀÄÄÄÙ  SUCCESS 
38
39  SUCCESS 
40
41  SUCCESS  .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-21.ans b/src/thousands/images/orig/zsim-21.ans
new file mode 100644
index 0000000..5847053
--- /dev/null
+++ b/src/thousands/images/orig/zsim-21.ans
@@ -0,0 +1,43 @@
121 Zuul Git
2
3
4
5 Nova Keystone
6
7 þbadbeef þbeefcab
8
9 þ#1
10
11 þ#3
12
13 þ#4
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-22.ans b/src/thousands/images/orig/zsim-22.ans
new file mode 100644
index 0000000..3ad7700
--- /dev/null
+++ b/src/thousands/images/orig/zsim-22.ans
@@ -0,0 +1,43 @@
122 Zuul Git
2
3
4
5 Nova Keystone
6
7 þbadbeef :(
8
9 þ#1
10
11 þ#3
12
13 þ#4
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/orig/zsim-keyline.ans b/src/thousands/images/orig/zsim-keyline.ans
new file mode 100644
index 0000000..a2c3fb5
--- /dev/null
+++ b/src/thousands/images/orig/zsim-keyline.ans
@@ -0,0 +1,45 @@
1 Zuul Git
2
3
4
5 [X] Nova #1 SUCCESS Nova Keystone
6
7 | SUCCESS * HEAD * HEAD
8
9 |--+ OOOOOOOOO..
10
11 | | SUCCESS
12
13 | |
14
15 | [X] Keystone #2 FAILURE
16
17 | SUCCESS
18
19 | OOOOOOO....
20
21 | OOOOOOOOO..
22
23 |
24
25 [X] Nova #3 OOOOOOO....
26
27 | OOOOOOO....
28
29 | OOOOO......
30
31 | OOOOOO.....
32
33 |
34
35 [X] Nova #4 OOOO.......
36
37 OOOO.......
38
39 OO.........
40
41 OOO........
42
43
44
45 \ No newline at end of file
diff --git a/src/thousands/images/orig/zuul-status.ans b/src/thousands/images/orig/zuul-status.ans
new file mode 100644
index 0000000..d21c0ca
--- /dev/null
+++ b/src/thousands/images/orig/zuul-status.ans
@@ -0,0 +1,49 @@
1 
2
3  Check   Gate  Post 
4
5[ ]+-----------------+ [ ]+-----------------+ [ ]+-----------------+
6
7   |nova 45:20 | | |nova 45:20 |   |nova 45:20 |
8
9   |321465 13:37 | | |321465 13:37 |   |321465 13:37 |
10
11 +-----------------+ | +-----------------+ +-----------------+
12
13 | pep8 SUCCESS| | | pep8 SUCCESS| | pep8 SUCCESS|
14
15 | docs  xx  | | | docs  xx  | | docs  xx  |
16
17 | python27 x  | | | python27 x  | | python27 x  |
18
19 | tempest x  | | | tempest x  | | tempest x  |
20
21 +-----------------+ | +-----------------+ +-----------------+
22
23 |  Release  
24
25[ ]+-----------------+  +[ ]+---------------+ 
26
27   |nova 45:20 |  |   |nova 45:20 | 
28
29   |321465 13:37 |  |   |321465 13:37 | 
30
31 +-----------------+  | +---------------+ 
32
33 | pep8 FAILURE|  |   
34
35 | docs  xx  | [ ]+-----------------+  
36
37 | python27 x  |   |nova 45:20 |  
38
39 | tempest x  |   |321465 13:37 |  
40
41 +-----------------+   +-----------------+  
42
43   
44
45 
46
47 
48
49 \ No newline at end of file
diff --git a/src/thousands/images/orig/zuul.ans b/src/thousands/images/orig/zuul.ans
new file mode 100644
index 0000000..8442c58
--- /dev/null
+++ b/src/thousands/images/orig/zuul.ans
@@ -0,0 +1,43 @@
1ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͵³³³ÆÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
2
3 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´³ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
4
5 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄijÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
6
7
8
9
10
11
12
13  _____ _
14
15 |__ / _ _ _| |
16
17 / / | | | | | | |
18
19 / /| |_| | |_| | |
20
21 /____\__,_|\__,_|_|
22
23
24
25
26
27
28
29
30
31
32
33 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄijÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
34
35 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´³ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
36
37ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͵³³³ÆÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
38
39
40
41
42
43 \ No newline at end of file
diff --git a/src/thousands/images/questions.ans b/src/thousands/images/questions.ans
new file mode 100644
index 0000000..450e9ac
--- /dev/null
+++ b/src/thousands/images/questions.ans
@@ -0,0 +1,27 @@
1
2
3
4
5
6
7
8
9 â–„â–„â–„â–„â–„â–„â–„â–„â–„â–„â–„â–„â–„â–„â–„â–„
10
11 â–ˆ â–„ â–„â–„â–„â–„â–„  â–„ â–ˆ
12
13 █ ███▀▀██▄ █
14
15 █ ▀▀  ▄███ █
16
17 █  ███▀▀ █
18
19 █ ▀▀ █
20
21 █ ██▄ █
22
23 █ ▀ ▀▀▀ ▀ █
24
25 ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
26
27 \ No newline at end of file
diff --git a/src/thousands/images/redhat.ans b/src/thousands/images/redhat.ans
new file mode 100644
index 0000000..ca7597e
--- /dev/null
+++ b/src/thousands/images/redhat.ans
@@ -0,0 +1,49 @@
1
2
3  ▄████▄▄▄▄███▄▄▄▄
4
5  █▀██████████▄ █▄ 
6
7 â–█▄ ▀▀ ▄██████████▄
8
9 ███ ▄███████████████ 
10
11  ▄▄███   ▀▀██████████████████▄
12
13  ██████▄    ▀▀███████████████▌
14
15  â–███████▄   ▀██████████▀ ██▄▄
16
17 â–█████████▄▄    █████████▄██████▌ 
18
19 ▀████████████▄▄ ███████████████▌
20
21 ▀▀████████████████████████████▀
22
23 â–██▄   ▀▀█████████████████████▀ 
24
25  ▀███▄██▄  ▀▀▀▀████████▀▀▀▀ 
26
27 ▄▄██▄ █████▄ ▄▄ ▄▄ ▄▄▄ 
28
29 ████████▄▄▄███████▄▄███████████ 
30
31 █████████████████████▄▄▀▀▄███▌ ▄▄ 
32
33 ▀███████████████████████████ █████ 
34
35 ▀███████████████████████▀ ▄▄████▀  
36
37 ▀████████████████████▀ ▄█████▀   
38
39 ▀██████████████████████▀ 
40
41 ▀███████████████▀▀ 
42
43 ▀▀▀█████▀▀▀ 
44
45
46
47
48
49 \ No newline at end of file
diff --git a/src/thousands/images/startup1.ans b/src/thousands/images/startup1.ans
new file mode 100644
index 0000000..c657cdb
--- /dev/null
+++ b/src/thousands/images/startup1.ans
@@ -0,0 +1,39 @@
1 ┌──────â”
2
3 │ Zuul │
4
5 └──┬───┘
6
7 │
8
9 ┌─────┬─────┬─────┬──┴──┬─────┬─────┬─────â”
10
11 │ │ │ │ │ │ │ │
12
13┌─┴─┠┌─┴─┠┌─┴─┠┌─┴─┠┌─┴─┠┌─┴─┠┌─┴─┠┌─┴─â”
14
15│zm1│ │zm2│ │zm3│ │zm4│ │zm5│ │zm6│ │zm7│ │zm8│
16
17└───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘
18
19nova keyst swift devst tmpst glanc dg projc
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37  
38
39 \ No newline at end of file
diff --git a/src/thousands/images/startup2.ans b/src/thousands/images/startup2.ans
new file mode 100644
index 0000000..65e44fb
--- /dev/null
+++ b/src/thousands/images/startup2.ans
@@ -0,0 +1,39 @@
1 ┌──────â”
2
3 │ Zuul │
4
5 └──┬───┘
6
7 │
8
9 ┌─────┬─────┬─────┬──┴──┬─────┬─────┬─────â”
10
11 │ │ │ │ │ │ │ │
12
13┌─┴─┠┌─┴─┠┌─┴─┠┌─┴─┠┌─┴─┠┌─┴─┠┌─┴─┠┌─┴─â”
14
15│zm1│ │zm2│ │zm3│ │zm4│ │zm5│ │zm6│ │zm7│ │zm8│
16
17└───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘ └───┘
18
19nova keyst swift devst tmpst glanc dg projc
20
21mastr newt mitak mastr mastr diabl mastr mastr
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37  
38
39 \ No newline at end of file
diff --git a/src/thousands/images/td.ans b/src/thousands/images/td.ans
new file mode 100644
index 0000000..dcbf243
--- /dev/null
+++ b/src/thousands/images/td.ans
Binary files differ
diff --git a/src/thousands/images/testslide.ans b/src/thousands/images/testslide.ans
new file mode 100644
index 0000000..f2feea4
--- /dev/null
+++ b/src/thousands/images/testslide.ans
@@ -0,0 +1,49 @@
1â•”â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•—
2
3║ ┌──────────────────────────────────────────────────────────────┠║
4
5║ │ │ ║
6
7║ │ │ ║
8
9║ │  Test Slide  Test Slide  │ ║
10
11║ │  Test Slide  Test Slide  │ ║
12
13║ │  Test Slide  Test Slide  │ ║
14
15║ │  Test Slide  Test Slide  │ ║
16
17║ │  Test Slide  Test Slide  │ ║
18
19║ │  Test Slide  Test Slide  │ ║
20
21║ │  Test Slide  Test Slide  │ ║
22
23║ │ Test Slide  Test Slide  │ ║
24
25║ │  Test Slide  Test Slide  │ ║
26
27║ │  Test Slide  Test Slide  │ ║
28
29║ │  Test Slide  Test Slide  │ ║
30
31║ │  Test Slide  Test Slide  │ ║
32
33║ │  Test Slide  Test Slide  │ ║
34
35║ │  Test Slide  Test Slide  │ ║
36
37║ │  Test Slide  Test Slide  │ ║
38
39║ │  Test Slide  Test Slide  │ ║
40
41║ │ │ ║
42
43║ │ │ ║
44
45║ └──────────────────────────────────────────────────────────────┘ ║
46
47â•šâ•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
48
49 \ No newline at end of file
diff --git a/src/thousands/images/title.ans b/src/thousands/images/title.ans
new file mode 100644
index 0000000..c784327
--- /dev/null
+++ b/src/thousands/images/title.ans
@@ -0,0 +1,45 @@
1 ______________ .──. .──. ______________
2
3( (  \ \_____)____(_____/ /  ) )
4
5 \ ) `─────'   `─────' ( /
6
7 )/   \(
8
9 /'  REST APIs and the Return of the  `\ 
10
11O   ___ ___ _ _ ___ ___ _ ___   O
12
13│  / __/ _ \| \| / __|/ _ \| | | __| │
14
15│ | (_| (_) | .` \__ \ (_) | |__| _|  │
16
17│  \___\___/|_|\_|___/\___/|____|___| │
18
19│ │
20
21│ Application │
22
23│ │
24
25O  James E. Blair <corvus@inaugust.com>  O
26
27 \. ./ 
28
29 )\  ,____ ____,  /(
30
31 / ) / ____\ ____ /____ \ ( \
32
33( (_________/_/ ) ( \_\_________) )
34
35 ~-'  `──' `──'  `-~ 
36
37
38
39
40
41
42
43
44
45 \ No newline at end of file
diff --git a/src/thousands/images/workflow.ans b/src/thousands/images/workflow.ans
new file mode 100644
index 0000000..067cc56
--- /dev/null
+++ b/src/thousands/images/workflow.ans
@@ -0,0 +1,29 @@
1 Hack Review Test
2
3 ========= ========== ==========
4
5
6
7 push approve
8
9 +-------------+ +-------------+
10
11 | | | |
12
13 +------+--+ +--v----+--+ +--v-------+
14
15 | | | | | |
16
17 | $EDITOR | | Gerrit | | Zuul |
18
19 | | | | | |
20
21 +------^--+ +--+----^--+ +--+-------+
22
23 | | | |
24
25 +-------------+ +-------------+
26
27 clone merge
28
29 \ No newline at end of file
diff --git a/src/thousands/images/zsim-00.ans b/src/thousands/images/zsim-00.ans
new file mode 100644
index 0000000..bbfdc82
--- /dev/null
+++ b/src/thousands/images/zsim-00.ans
@@ -0,0 +1,43 @@
100 Zuul Git
2
3
4
5 Nova Keystone
6
7 â– badbeef â– beefcab
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-01.ans b/src/thousands/images/zsim-01.ans
new file mode 100644
index 0000000..742a968
--- /dev/null
+++ b/src/thousands/images/zsim-01.ans
@@ -0,0 +1,43 @@
101 Zuul Git
2
3 ┌───â”
4
5 │â–█▌│ Nova #1 Nova Keystone
6
7 └───┘ ■badbeef ■beefcab
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-02.ans b/src/thousands/images/zsim-02.ans
new file mode 100644
index 0000000..28809c2
--- /dev/null
+++ b/src/thousands/images/zsim-02.ans
@@ -0,0 +1,43 @@
102 Zuul Git
2
3 ┌───â”
4
5 │â–█▌│ Nova #1 █████████ Nova Keystone
6
7 └───┘ █████████ ■badbeef ■beefcab
8
9 █████████
10
11 █████████
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-03.ans b/src/thousands/images/zsim-03.ans
new file mode 100644
index 0000000..c6a2bfd
--- /dev/null
+++ b/src/thousands/images/zsim-03.ans
@@ -0,0 +1,43 @@
103 Zuul Git
2
3 ┌───â”
4
5 │â–█▌│ Nova #1 â–ˆ████████ Nova Keystone
6
7 └─┬─┘ █████████ ■badbeef ■beefcab
8
9 │ █████████
10
11 │ █████████
12
13 ┌─┴─â”
14
15 │â–█▌│ Keystone #2
16
17 └───┘
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-04.ans b/src/thousands/images/zsim-04.ans
new file mode 100644
index 0000000..8893ed8
--- /dev/null
+++ b/src/thousands/images/zsim-04.ans
@@ -0,0 +1,43 @@
104 Zuul Git
2
3 ┌───â”
4
5 │â–█▌│ Nova #1 █████████ Nova Keystone
6
7 └─┬─┘ █████████ ■badbeef ■beefcab
8
9 │ █████████
10
11 │ █████████
12
13 ┌─┴─â”
14
15 │â–█▌│ Keystone #2 █████████
16
17 └───┘ █████████
18
19 █████████
20
21 █████████
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-05.ans b/src/thousands/images/zsim-05.ans
new file mode 100644
index 0000000..be3cd9e
--- /dev/null
+++ b/src/thousands/images/zsim-05.ans
@@ -0,0 +1,43 @@
105 Zuul Git
2
3 ┌───â”
4
5 │â–█▌│ Nova #1 █████████ Nova Keystone
6
7 └─┬─┘ █████████ ■badbeef ■beefcab
8
9 │ █████████
10
11 │ █████████
12
13 ┌─┴─â”
14
15 │â–█▌│ Keystone #2 █████████
16
17 └─┬─┘ █████████
18
19 │ █████████
20
21 │ █████████
22
23 ┌─┴─â”
24
25 │â–█▌│ Nova #3
26
27 └───┘
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-06.ans b/src/thousands/images/zsim-06.ans
new file mode 100644
index 0000000..64de1d6
--- /dev/null
+++ b/src/thousands/images/zsim-06.ans
@@ -0,0 +1,43 @@
106 Zuul Git
2
3 ┌───â”
4
5 │â–█▌│ Nova #1 █████████ Nova Keystone
6
7 └─┬─┘ █████████ ■badbeef ■beefcab
8
9 │ █████████
10
11 │ █████████
12
13 ┌─┴─â”
14
15 │â–█▌│ Keystone #2 █████████
16
17 └─┬─┘ █████████
18
19 │ █████████
20
21 │ █████████
22
23 ┌─┴─â”
24
25 │â–█▌│ Nova #3 █████████
26
27 └───┘ █████████
28
29 █████████
30
31 █████████
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-07.ans b/src/thousands/images/zsim-07.ans
new file mode 100644
index 0000000..6a34279
--- /dev/null
+++ b/src/thousands/images/zsim-07.ans
@@ -0,0 +1,43 @@
107 Zuul Git
2
3 ┌───â”
4
5 │â–█▌│ Nova #1 █████████ Nova Keystone
6
7 └─┬─┘ █████████ ■badbeef ■beefcab
8
9 │ █████████
10
11 │ █████████
12
13 ┌─┴─â”
14
15 │â–█▌│ Keystone #2 █████████
16
17 └─┬─┘ █████████
18
19 │ █████████
20
21 │ █████████
22
23 ┌─┴─â”
24
25 │â–█▌│ Nova #3 â–ˆ████████
26
27 └─┬─┘ █████████
28
29 │ █████████
30
31 │ █████████
32
33 ┌─┴─â”
34
35 │â–█▌│ Nova #4
36
37 └───┘
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-08.ans b/src/thousands/images/zsim-08.ans
new file mode 100644
index 0000000..318c67b
--- /dev/null
+++ b/src/thousands/images/zsim-08.ans
@@ -0,0 +1,43 @@
108 Zuul Git
2
3 ┌───â”
4
5 │â–█▌│ Nova #1 █████████ Nova Keystone
6
7 └─┬─┘ █████████ ■badbeef ■beefcab
8
9 │ █████████
10
11 │ █████████
12
13 ┌─┴─â”
14
15 │â–█▌│ Keystone #2 ████████â–ˆ
16
17 └─┬─┘ █████████
18
19 │ █████████
20
21 │ █████████
22
23 ┌─┴─â”
24
25 │â–█▌│ Nova #3 █████████
26
27 └─┬─┘ █████████
28
29 │ █████████
30
31 │ █████████
32
33 ┌─┴─â”
34
35 │â–█▌│ Nova #4 █████████
36
37 └───┘ █████████
38
39 █████████
40
41 █████████ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-09.ans b/src/thousands/images/zsim-09.ans
new file mode 100644
index 0000000..441979f
--- /dev/null
+++ b/src/thousands/images/zsim-09.ans
@@ -0,0 +1,43 @@
109 Zuul Git
2
3 ┌───â”
4
5 │â–█▌│ Nova #1 █████████ Nova Keystone
6
7 └─┬─┘ █████████ ■badbeef ■beefcab
8
9 │ █████████
10
11 │ █████████
12
13 ┌─┴─â”
14
15 │â–█▌│ Keystone #2 FAILURE
16
17 └─┬─┘ █████████
18
19 │ █████████
20
21 │ █████████
22
23 ┌─┴─â”
24
25 │â–█▌│ Nova #3 █████████
26
27 └─┬─┘ █████████
28
29 │ █████████
30
31 │ █████████
32
33 ┌─┴─â”
34
35 │â–█▌│ Nova #4 â–ˆ████████
36
37 └───┘ █████████
38
39 █████████
40
41 █████████ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-10.ans b/src/thousands/images/zsim-10.ans
new file mode 100644
index 0000000..818789e
--- /dev/null
+++ b/src/thousands/images/zsim-10.ans
@@ -0,0 +1,43 @@
110 Zuul Git
2
3 ┌───â”
4
5 │â–█▌│ Nova #1 ████████â–ˆ Nova Keystone
6
7 └─┬─┘ █████████ ■badbeef ■beefcab
8
9 │ █████████
10
11 │ █████████
12
13 ┌─┴─â”
14
15 │â–█▌│ Keystone #2 FAILURE
16
17 └─┬─┘ █████████
18
19 │ █████████
20
21 │ █████████
22
23 ┌─┴─â”
24
25 │â–█▌│ Nova #3 CANCELED
26
27 └─┬─┘ CANCELED
28
29 │ CANCELED
30
31 │ CANCELED
32
33 ┌─┴─â”
34
35 │â–█▌│ Nova #4 CANCELED
36
37 └───┘ CANCELED
38
39 CANCELED
40
41 CANCELED .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-11.ans b/src/thousands/images/zsim-11.ans
new file mode 100644
index 0000000..ddb8bde
--- /dev/null
+++ b/src/thousands/images/zsim-11.ans
@@ -0,0 +1,43 @@
111 Zuul Git
2
3 ┌───â”
4
5 │â–█▌│ Nova #1 █████████ Nova Keystone
6
7 └─┬─┘ █████████ ■badbeef ■beefcab
8
9 └──┠█████████
10
11 │ █████████
12
13 ┌─┴─â”
14
15 │â–█▌│ Keystone #2 FAILURE
16
17 └───┘ SUCCESS
18
19 █████████
20
21 █████████
22
23 ┌───â”
24
25 │â–█▌│ Nova #3
26
27 └─┬─┘
28
29 │
30
31 │
32
33 ┌─┴─â”
34
35 │â–█▌│ Nova #4
36
37 └───┘
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-12.ans b/src/thousands/images/zsim-12.ans
new file mode 100644
index 0000000..69eef26
--- /dev/null
+++ b/src/thousands/images/zsim-12.ans
@@ -0,0 +1,43 @@
112 Zuul Git
2
3 ┌───â”
4
5 │â–█▌│ Nova #1 SUCCESS Nova Keystone
6
7 └─┬─┘ SUCCESS ■badbeef ■beefcab
8
9 ├──┠█████████
10
11 │ │ █████████
12
13 │┌─┴─â”
14
15 ││â–█▌│ Keystone #2 FAILURE
16
17 │└───┘ SUCCESS
18
19 │ █████████
20
21 │ █████████
22
23 ┌─┴─â”
24
25 │â–█▌│ Nova #3 █████████
26
27 └─┬─┘ █████████
28
29 │ █████████
30
31 │ █████████
32
33 ┌─┴─â”
34
35 │â–█▌│ Nova #4
36
37 └───┘
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-13.ans b/src/thousands/images/zsim-13.ans
new file mode 100644
index 0000000..5b8b54b
--- /dev/null
+++ b/src/thousands/images/zsim-13.ans
@@ -0,0 +1,43 @@
113 Zuul Git
2
3 ┌───â”
4
5 │â–█▌│ Nova #1 SUCCESS Nova Keystone
6
7 └─┬─┘ SUCCESS ■badbeef ■beefcab
8
9 ├──┠█████████
10
11 │ │ SUCCESS
12
13 │┌─┴─â”
14
15 ││â–█▌│ Keystone #2 FAILURE
16
17 │└───┘ SUCCESS
18
19 │ █████████
20
21 │ █████████
22
23 ┌─┴─â”
24
25 │â–█▌│ Nova #3 â–ˆ████████
26
27 └─┬─┘ █████████
28
29 │ █████████
30
31 │ █████████
32
33 ┌─┴─â”
34
35 │â–█▌│ Nova #4 █████████
36
37 └───┘ █████████
38
39 █████████
40
41 █████████ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-14.ans b/src/thousands/images/zsim-14.ans
new file mode 100644
index 0000000..f0ec335
--- /dev/null
+++ b/src/thousands/images/zsim-14.ans
@@ -0,0 +1,43 @@
114 Zuul Git
2
3 ┌───â”
4
5 │â–█▌│ Nova #1 SUCCESS Nova Keystone
6
7 └─┬─┘ SUCCESS ■badbeef ■beefcab
8
9 ├──┠SUCCESS
10
11 │ │ SUCCESS
12
13 │┌─┴─â”
14
15 ││â–█▌│ Keystone #2 FAILURE
16
17 │└───┘ SUCCESS
18
19 │ █████████
20
21 │ █████████
22
23 ┌─┴─â”
24
25 │â–█▌│ Nova #3 █████████
26
27 └─┬─┘ █████████
28
29 │ █████████
30
31 │ █████████
32
33 ┌─┴─â”
34
35 │â–█▌│ Nova #4 â–ˆ████████
36
37 └───┘ █████████
38
39 █████████
40
41 █████████ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-15.ans b/src/thousands/images/zsim-15.ans
new file mode 100644
index 0000000..5ea15df
--- /dev/null
+++ b/src/thousands/images/zsim-15.ans
@@ -0,0 +1,43 @@
115 Zuul Git
2
3
4
5 Nova Keystone
6
7 â– badbeef â– beefcab
8
9 â– #1
10
11
12
13 │┌───â”
14
15 ││â–█▌│ Keystone #2 FAILURE
16
17 │└───┘ SUCCESS
18
19 │ █████████
20
21 │ █████████
22
23 ┌─┴─â”
24
25 │â–█▌│ Nova #3 █████████
26
27 └─┬─┘ █████████
28
29 │ █████████
30
31 │ █████████
32
33 ┌─┴─â”
34
35 │â–█▌│ Nova #4 █████████
36
37 └───┘ █████████
38
39 █████████
40
41 █████████ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-16.ans b/src/thousands/images/zsim-16.ans
new file mode 100644
index 0000000..0d18c1b
--- /dev/null
+++ b/src/thousands/images/zsim-16.ans
@@ -0,0 +1,43 @@
116 Zuul Git
2
3
4
5 Nova Keystone
6
7 â– badbeef â– beefcab
8
9 â– #1
10
11
12
13 │┌───â”
14
15 ││â–█▌│ Keystone #2 FAILURE
16
17 │└───┘ SUCCESS
18
19 │ SUCCESS
20
21 │ SUCCESS
22
23 ┌─┴─â”
24
25 │â–█▌│ Nova #3 █████████
26
27 └─┬─┘ █████████
28
29 │ █████████
30
31 │ █████████
32
33 ┌─┴─â”
34
35 │â–█▌│ Nova #4 █████████
36
37 └───┘ █████████
38
39 █████████
40
41 █████████ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-17.ans b/src/thousands/images/zsim-17.ans
new file mode 100644
index 0000000..b301dc8
--- /dev/null
+++ b/src/thousands/images/zsim-17.ans
@@ -0,0 +1,43 @@
117 Zuul Git
2
3
4
5 Nova Keystone
6
7 â– badbeef â– beefcab
8
9 â– #1
10
11
12
13
14
15
16
17
18
19
20
21
22
23 ┌───â”
24
25 │â–█▌│ Nova #3 █████████
26
27 └─┬─┘ █████████
28
29 │ █████████
30
31 │ █████████
32
33 ┌─┴─â”
34
35 │â–█▌│ Nova #4 █████████
36
37 └───┘ █████████
38
39 █████████
40
41 █████████ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-18.ans b/src/thousands/images/zsim-18.ans
new file mode 100644
index 0000000..da25c2e
--- /dev/null
+++ b/src/thousands/images/zsim-18.ans
@@ -0,0 +1,43 @@
118 Zuul Git
2
3
4
5 Nova Keystone
6
7 â– badbeef â– beefcab
8
9 â– #1
10
11
12
13
14
15
16
17
18
19
20
21
22
23 ┌───â”
24
25 │â–█▌│ Nova #3  SUCCESS 
26
27 └─┬─┘  SUCCESS 
28
29 │  SUCCESS 
30
31 │  SUCCESS 
32
33 ┌─┴─â”
34
35 │â–█▌│ Nova #4 █████████
36
37 └───┘ █████████
38
39 █████████
40
41 █████████ .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-19.ans b/src/thousands/images/zsim-19.ans
new file mode 100644
index 0000000..14b9e51
--- /dev/null
+++ b/src/thousands/images/zsim-19.ans
@@ -0,0 +1,43 @@
119 Zuul Git
2
3
4
5 Nova Keystone
6
7 â– badbeef â– beefcab
8
9 â– #1
10
11 â– #3
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 ┌───â”
34
35 │â–█▌│ Nova #4  SUCCESS 
36
37 └───┘  SUCCESS 
38
39 █████████
40
41  SUCCESS  .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-20.ans b/src/thousands/images/zsim-20.ans
new file mode 100644
index 0000000..e1a3b8c
--- /dev/null
+++ b/src/thousands/images/zsim-20.ans
@@ -0,0 +1,43 @@
120 Zuul Git
2
3
4
5 Nova Keystone
6
7 â– badbeef â– beefcab
8
9 â– #1
10
11 â– #3
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 ┌───â”
34
35 │â–█▌│ Nova #4  SUCCESS 
36
37 └───┘  SUCCESS 
38
39  SUCCESS 
40
41  SUCCESS  .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-21.ans b/src/thousands/images/zsim-21.ans
new file mode 100644
index 0000000..ccfeef2
--- /dev/null
+++ b/src/thousands/images/zsim-21.ans
@@ -0,0 +1,43 @@
121 Zuul Git
2
3
4
5 Nova Keystone
6
7 â– badbeef â– beefcab
8
9 â– #1
10
11 â– #3
12
13 â– #4
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-22.ans b/src/thousands/images/zsim-22.ans
new file mode 100644
index 0000000..8be6db5
--- /dev/null
+++ b/src/thousands/images/zsim-22.ans
@@ -0,0 +1,43 @@
122 Zuul Git
2
3
4
5 Nova Keystone
6
7 â– badbeef :(
8
9 â– #1
10
11 â– #3
12
13 â– #4
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 .
42
43 \ No newline at end of file
diff --git a/src/thousands/images/zsim-keyline.ans b/src/thousands/images/zsim-keyline.ans
new file mode 100644
index 0000000..a2c3fb5
--- /dev/null
+++ b/src/thousands/images/zsim-keyline.ans
@@ -0,0 +1,45 @@
1 Zuul Git
2
3
4
5 [X] Nova #1 SUCCESS Nova Keystone
6
7 | SUCCESS * HEAD * HEAD
8
9 |--+ OOOOOOOOO..
10
11 | | SUCCESS
12
13 | |
14
15 | [X] Keystone #2 FAILURE
16
17 | SUCCESS
18
19 | OOOOOOO....
20
21 | OOOOOOOOO..
22
23 |
24
25 [X] Nova #3 OOOOOOO....
26
27 | OOOOOOO....
28
29 | OOOOO......
30
31 | OOOOOO.....
32
33 |
34
35 [X] Nova #4 OOOO.......
36
37 OOOO.......
38
39 OO.........
40
41 OOO........
42
43
44
45 \ No newline at end of file
diff --git a/src/thousands/images/zuul-status.ans b/src/thousands/images/zuul-status.ans
new file mode 100644
index 0000000..d21c0ca
--- /dev/null
+++ b/src/thousands/images/zuul-status.ans
@@ -0,0 +1,49 @@
1 
2
3  Check   Gate  Post 
4
5[ ]+-----------------+ [ ]+-----------------+ [ ]+-----------------+
6
7   |nova 45:20 | | |nova 45:20 |   |nova 45:20 |
8
9   |321465 13:37 | | |321465 13:37 |   |321465 13:37 |
10
11 +-----------------+ | +-----------------+ +-----------------+
12
13 | pep8 SUCCESS| | | pep8 SUCCESS| | pep8 SUCCESS|
14
15 | docs  xx  | | | docs  xx  | | docs  xx  |
16
17 | python27 x  | | | python27 x  | | python27 x  |
18
19 | tempest x  | | | tempest x  | | tempest x  |
20
21 +-----------------+ | +-----------------+ +-----------------+
22
23 |  Release  
24
25[ ]+-----------------+  +[ ]+---------------+ 
26
27   |nova 45:20 |  |   |nova 45:20 | 
28
29   |321465 13:37 |  |   |321465 13:37 | 
30
31 +-----------------+  | +---------------+ 
32
33 | pep8 FAILURE|  |   
34
35 | docs  xx  | [ ]+-----------------+  
36
37 | python27 x  |   |nova 45:20 |  
38
39 | tempest x  |   |321465 13:37 |  
40
41 +-----------------+   +-----------------+  
42
43   
44
45 
46
47 
48
49 \ No newline at end of file
diff --git a/src/thousands/images/zuul.ans b/src/thousands/images/zuul.ans
new file mode 100644
index 0000000..6369083
--- /dev/null
+++ b/src/thousands/images/zuul.ans
@@ -0,0 +1,43 @@
1â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•¡â”‚││╞â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
2
3 ────────────────────┤│├───────────────────
4
5 ──────────────────│─────────────────
6
7
8
9
10
11
12
13  _____ _
14
15 |__ / _ _ _| |
16
17 / / | | | | | | |
18
19 / /| |_| | |_| | |
20
21 /____\__,_|\__,_|_|
22
23
24
25
26
27
28
29
30
31
32
33 ──────────────────│─────────────────
34
35 ────────────────────┤│├───────────────────
36
37â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•¡â”‚││╞â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
38
39
40
41
42
43 \ No newline at end of file
diff --git a/src/thousands/start.sh b/src/thousands/start.sh
new file mode 100755
index 0000000..9eaf8b6
--- /dev/null
+++ b/src/thousands/start.sh
@@ -0,0 +1,8 @@
1#!/bin/sh
2
3mate-terminal --geometry 68x24 -x presentty $(pwd)/zuul.rst &
4#geeqie -t images &
5
6sleep 1
7
8mate-terminal --maximize -x presentty-console $(pwd)/zuul.rst &
diff --git a/src/thousands/thousands.rst b/src/thousands/thousands.rst
new file mode 100644
index 0000000..ec20202
--- /dev/null
+++ b/src/thousands/thousands.rst
@@ -0,0 +1,1001 @@
1. display in 68x24
2.. display in 88x24
3
4.. pygments yaml? (only file breaks (---) tinted)
5.. slide on high level v3 changes
6.. slide on nodepool
7
8.. transition:: dissolve
9 :duration: 0.4
10
11Test Slide
12==========
13.. hidetitle::
14
15.. ansi:: images/testslide.ans
16
17Testing Thousands of Python Projects Every Day
18==============================================
19
20Red Hat
21=======
22
23.. hidetitle::
24.. container:: handout
25
26 * I work for Red Hat in the CTO Office as the Chief Architect
27 for CI/CD
28
29.. ansi:: images/redhat.ans
30
31OpenStack
32=========
33
34.. container:: handout
35
36 * I work on OpenStack.
37 * I sit on the Board of Directors. I was on the Technical Committee
38
39.. hidetitle::
40.. ansi:: images/openstack.ans
41
42OpenStack Infra
43===============
44
45.. container:: handout
46
47 * My primary technical role with OpenStack is working on the OpenStack CI
48 system.
49
50::
51
52 "most insane CI infrastructure I've ever been a part of"
53
54 -- Alex Gaynor
55
56 "OpenStack Infra are like the SpaceX of CI"
57
58 -- Emily Dunham
59
60tl;dr
61=====
62
63 * multi repo
64 * integrated deliverable
65 * gated commits
66 * open tooling
67 * nobody is special
68 * there is no Dana, only Zuul
69
70OpenStack Is
71============
72
73 * Federated
74 * Distributed
75 * Large
76 * Open
77 * Not Alone
78
79Federated
80=========
81
82 * Hundreds of involved companies
83 * No 'main' company
84 * "Decisions are made by those who show up"
85 * Union of priorities/use cases
86
87Impact of being Federated
88=========================
89
90 * No company can appoint humans to project positions
91 * The project cannot fire anyone
92 * Variable background of contributors
93 * Heavy reliance on consensus-oriented democracy
94
95Distributed
96===========
97
98 * There is no office
99 * Contributor base is global
100 * Multitude of contributor backgrounds
101
102Impact of being Distributed
103===========================
104
105 * Constantly at odds with American Exceptionalism
106 * Tooling must empower all contributors, regardless of background,
107 skill level or cultural context
108 * Heavy preference for text-based communication
109 * Cannot assume US-centric needs or solutions
110
111Large numbers of
112================
113
114 * Contributors (\~2k in any given 6 month period)
115 * Changes
116 * Code Repositories (1904 as of this morning)
117
118OpenStack Scale Comparison
119==========================
120
121 * 2KJPH (2,000 jobs per hour)
122 * Build Nodes from 13 Regions of 5 Public and 2 Private OpenStack Clouds
123 * Rackspace, Internap, OVH, Vexxhost, CityCloud and Linaro, Limestone
124 * 10,000 changes merged per month
125
126OpenStack Scale Comparison
127==========================
128
129 * 2KJPH (2,000 jobs per hour)
130 * Nodes from 12 Regions of 5 Public and 1 Private OpenStack Clouds
131 * Rackspace, Internap, OVH, Vexxhost, CityCloud and Linaro, Limestone
132 * 10,000 changes merged per month
133
134 By comparison, our friends at the amazing project Ansible received
135 13,000 changes and had merged 8,000 of them in its first 4 years.
136
137Four Opens
138==========
139
140 * Open Source
141 (we don't hold back Enterprise features, we don't cripple things)
142 * Open Design
143 (design process open to all, decisions are not made inside company doors)
144 * Open Development
145 (public source code, public code review, all code is reviewed and gated)
146 * Open Community
147 (lazy consensus, democratic leadership from participants,
148 public logged meetings in IRC, public archived mailing lists)
149
150Nobody is Special
151=================
152
153 * No dictators
154 * Aggressively egalitarian
155 * No "pay for play"
156
157Fifth Open - Four Opens Applied to the Infrastructure
158=====================================================
159
160 * All tools must be Open Source
161 * Any external services must by Open Source
162 * Strongly avoid single-vendor
163
164All Tools are Open Source
165=========================
166
167.. hidetitle::
168
169No Developer is ever be required to use a proprietary tool
170to work on OpenStack.
171
172Sixth Open - Four Opens Applied to Operations
173=============================================
174
175 * Ops driven by git/code-review - not by humans running commands
176 * Run as many things CD as possible
177 * Infrastructure team operates the same as the project
178 * Core reviewer status and root access are earned
179 * Human-initiated ops actions (running commands, clicking a UI) are a bug
180 * Keys/secrets are not Open :)
181
182We're Not Alone
183===============
184
185 * Dependencies (libvirt/kvm/xen, mysql/pg, rabbit,
186 python/javascript, ceph/gluster, ansible/salt/puppet/chef, ovs/odl)
187 * Adjacencies (kubernetes, ansible, terraform, opnfv, spinnaker)
188 * Vendors (plugins, products, services, distros)
189
190Lessons from a massive, openly-developed project
191================================================
192
193 Thierry Carrez is speaking at 14:45 today with more on this.
194
195Developer Process In a Nutshell
196===============================
197
198 * Code Review - nobody has direct commit/push access
199 * 3rd-Party CI for vendors
200 * Gated Commits
201
202Gated Commits
203=============
204
205::
206
207 Hack Review Test
208 ========= ========== ==========
209
210 push approve
211 +-------------+ +-------------+
212 | | | |
213 +------+--+ +--v----+--+ +--v-------+
214 | | | | | |
215 | $EDITOR | | Gerrit | | Zuul |
216 | | | | | |
217 +------^--+ +--+----^--+ +--+-------+
218 | | | |
219 +-------------+ +-------------+
220 clone merge
221
222Gating
223======
224
225Every change proposed for a repository is tested before it merges.
226
227Co-gating
228=========
229
230Changes to a set of repositories merge monotonically such
231that each change is tested with the current state of all
232other related repositories before it merges.
233
234Parallel Co-gating
235==================
236
237Changes are serialized such that each change is tested
238with all of the changes ahead of it to satisfy the
239gating requirement while being able to run tests for
240multiple changes simultaneously.
241
242Zuul
243====
244
245 * Custom-written multi-repo parallel co-gating engine
246 * When to run
247 * Where to run it
248 * With what git states
249 * How to respond to results
250
251Zuul Architecture
252=================
253
254.. ansi:: images/architecture.ans
255
256Zuul is written in Python 3.5
257=============================
258
259Not just for OpenStack
260======================
261
262 * Zuul v3 is in production for OpenStack (in OpenStack VMs)
263
264 Also running at:
265
266 * BMW (control plane in OpenShift)
267 * Godaddy (control plane in Kubernetes)
268 * OpenContrail
269 * OpenLab
270 * others ...
271
272Zuul is not a general purpose automation framework
273==================================================
274
275Zuul in a nutshell
276==================
277
278 * Listens for code events
279 * Prepares appropriate job config and git repo states
280 * Allocates nodes for test jobs
281 * Pushes git repo states to nodes
282 * Runs user-defined Ansible playbooks
283 * Collects/reports results
284 * Potentially merges change
285
286Zuul Simulation
287===============
288.. transition:: pan
289.. container:: handout
290
291 * That was a lot of words - let's walk through it one step at a time
292 * Here we have two git repos, called nova and keystone, and their
293 current HEAD state
294
295.. ansi:: images/zsim-00.ans
296
297Zuul Simulation
298===============
299.. transition:: cut
300.. container:: handout
301
302 * A change is approved for Nova
303
304.. ansi:: images/zsim-01.ans
305
306Zuul Simulation
307===============
308.. transition:: cut
309.. container:: handout
310
311 * Zuul starts running jobs for it
312 * The tests will test the current state of nova and keystone PLUS this nova
313 change
314
315.. ansi:: images/zsim-02.ans
316
317Zuul Simulation
318===============
319.. transition:: cut
320.. container:: handout
321
322 * A change is approved for Keystone
323
324.. ansi:: images/zsim-03.ans
325
326Zuul Simulation
327===============
328.. transition:: cut
329.. container:: handout
330
331 * The tests will test the current state of nova and keystone PLUS this nova
332 change
333
334.. ansi:: images/zsim-04.ans
335
336Zuul Simulation
337===============
338.. transition:: cut
339.. container:: handout
340
341 * todo
342
343.. ansi:: images/zsim-05.ans
344
345Zuul Simulation
346===============
347.. transition:: cut
348.. container:: handout
349
350 * todo
351
352.. ansi:: images/zsim-06.ans
353
354Zuul Simulation
355===============
356.. transition:: cut
357.. container:: handout
358
359 * todo
360
361.. ansi:: images/zsim-07.ans
362
363Zuul Simulation
364===============
365.. transition:: cut
366.. container:: handout
367
368 * todo
369
370.. ansi:: images/zsim-08.ans
371
372Zuul Simulation
373===============
374.. transition:: cut
375.. container:: handout
376
377 * todo
378
379.. ansi:: images/zsim-09.ans
380
381Zuul Simulation
382===============
383.. transition:: cut
384.. container:: handout
385
386 * todo
387
388.. ansi:: images/zsim-10.ans
389
390Zuul Simulation
391===============
392.. transition:: cut
393.. container:: handout
394
395 * todo
396
397.. ansi:: images/zsim-11.ans
398
399Zuul Simulation
400===============
401.. transition:: cut
402.. container:: handout
403
404 * todo
405
406.. ansi:: images/zsim-12.ans
407
408Zuul Simulation
409===============
410.. transition:: cut
411.. container:: handout
412
413 * todo
414
415.. ansi:: images/zsim-13.ans
416
417Zuul Simulation
418===============
419.. transition:: cut
420.. container:: handout
421
422 * todo
423
424.. ansi:: images/zsim-14.ans
425
426Zuul Simulation
427===============
428.. transition:: cut
429.. container:: handout
430
431 * todo
432
433.. ansi:: images/zsim-15.ans
434
435Zuul Simulation
436===============
437.. transition:: cut
438.. container:: handout
439
440 * todo
441
442.. ansi:: images/zsim-16.ans
443
444Zuul Simulation
445===============
446.. transition:: cut
447.. container:: handout
448
449 * todo
450
451.. ansi:: images/zsim-17.ans
452
453Zuul Simulation
454===============
455.. transition:: cut
456.. container:: handout
457
458 * todo
459
460.. ansi:: images/zsim-18.ans
461
462Zuul Simulation
463===============
464.. transition:: cut
465.. container:: handout
466
467 * todo
468
469.. ansi:: images/zsim-19.ans
470
471Zuul Simulation
472===============
473.. transition:: cut
474.. container:: handout
475
476 * todo
477
478.. ansi:: images/zsim-20.ans
479
480Zuul Simulation
481===============
482.. transition:: cut
483.. container:: handout
484
485 * todo
486
487.. ansi:: images/zsim-21.ans
488
489Zuul Simulation
490===============
491.. transition:: cut
492.. container:: handout
493
494 * todo
495
496.. ansi:: images/zsim-22.ans
497
498Jobs
499====
500
501* Jobs run on nodes from nodepool (static or dynamic)
502* Metadata defined in Zuul's configuration
503* Execution content in Ansible (with live streaming!)
504* Jobs may be defined centrally or in the repo being tested
505* Jobs have contextual variants that simplify configuration
506
507Shared Job Configs
508==================
509
510* Job config repos are all in git
511* Designed to support directly sharing job configurations
512* git.zuul-ci.org/zuul-jobs repo is a 'standard library'
513 to be directly shared between zuul installations
514
515Job
516===
517
518.. code:: yaml
519
520 - job:
521 name: base
522 parent: null
523 description: |
524 The base job for Zuul.
525 timeout: 1800
526 nodeset:
527 nodes:
528 - name: primary
529 label: centos-7
530 pre-run: playbooks/base/pre.yaml
531 post-run:
532 - playbooks/base/post-ssh.yaml
533 - playbooks/base/post-logs.yaml
534 secrets:
535 - site_logs
536
537Simple Job
538==========
539
540.. code:: yaml
541
542 - job:
543 name: tox
544 pre-run: playbooks/setup-tox.yaml
545 run: playbooks/tox.yaml
546 post-run: playbooks/fetch-tox-output.yaml
547
548 - job:
549 name: tox-py27
550 parent: tox
551 vars:
552 tox_envlist: py27
553
554Playbooks
555=========
556
557* Jobs run Ansible playbooks
558* Playbooks may be defined centrally or in the repo being tested
559* Playbooks can use roles from current or other Zuul repos
560 (or Galaxy, coming soon)
561* Playbooks are run on the zuul-executor using bubblewrap
562 https://github.com/projectatomic/bubblewrap
563* Playbooks are not allowed to execute content on 'localhost'
564
565Devstack-gate / Tempest Playbook
566================================
567
568.. code:: yaml
569
570 # devstack-gate / tempest playbook
571 hosts: all
572 roles:
573 - setup-multinode-networking
574 - partition-swap
575 - configure-mirrors
576 - run-devstack
577 - run-tempest
578
579Simple Shell Playbook
580=====================
581
582.. code:: yaml
583
584 hosts: controller
585 tasks:
586 - shell: ./run_tests.sh
587
588Test Like Production
589====================
590
591If you use Ansible for deployment, your test and deployment processes
592and playbooks are the same
593
594What if you don't use Ansible?
595==============================
596
597OpenStack Infra Control Plane uses Puppet
598=========================================
599
600.. code:: yaml
601
602 # In git.openstack.org/openstack-infra/project-config/roles/legacy-install-afs-with-puppet/tasks/main.yaml
603 - name: Install puppet
604 shell: ./install_puppet.sh
605 args:
606 chdir: "{{ ansible_user_dir }}/src/git.openstack.org/openstack-infra/system-config"
607 environment:
608 # Skip setting up pip, our images have already done this.
609 SETUP_PIP: "false"
610 become: yes
611
612 - name: Copy manifest
613 copy:
614 src: manifest.pp
615 dest: "{{ ansible_user_dir }}/manifest.pp"
616
617 - name: Run puppet
618 puppet:
619 manifest: "{{ ansible_user_dir }}/manifest.pp"
620 become: yes
621
622
623Cross-Project Example Problem
624=============================
625
626 * User reports bug in shade - auto_ip is not discovering their NAT properly
627 * Two fixes, one to detection algorithm, one to config override
628 * Config override requires adding support to os-client-config
629 * Once support is added to os-client-config, it can be consumed in shade
630 * How do we integration test this without releasing os-client-config?
631
632Cross-Project Dependencies
633==========================
634
635Testing or gating dependencies (including jobs) manually specified by
636developers
637
638.. container:: progressive
639
640 * shade https://review.openstack.org/513913/
641
642 Add unittest tips jobs
643
644 Change-ID: I5b411be5c5aa43535fa89a51d6099aadd7a8ea60
645 * os-client-config https://review.openstack.org/513915
646
647 Add shade-tox-tips jobs
648
649 Change-ID: Ie3e9a4deca1d74b94e810e87e130706fe15fe2c9
650
651 Depends-On: https://review.openstack.org/513913/
652 * os-client-config https://review.openstack.org/513751/
653
654 Added nat_source flag for networks
655
656 Change-ID: I3d8dd6d734a1013d2d4a43e11c3538c3a345820b
657
658 * shade https://review.openstack.org/#/c/513914
659
660 Add support for configured NAT source variable
661
662 Change-Id: I4b50c2323a487b5ce90f9d38a48be249cfb739c5
663
664 Depends-On: https://review.openstack.org/513914
665
666shade: Add unittest tips jobs
667=============================
668
669* In git.openstack.org/openstack-infra/shade/.zuul.yaml:
670
671.. code:: yaml
672
673 - job:
674 name: shade-tox-py27-tips
675 parent: openstack-tox-py27
676 description: |
677 Run tox python 27 unittests against master of important libs
678 required-projects:
679 - openstack-infra/shade
680 - openstack/keystoneauth
681 - openstack/os-client-config
682
683 - job:
684 name: shade-tox-py35-tips
685 parent: openstack-tox-py35
686 description: |
687 Run tox python 35 unittests against master of important libs
688 required-projects:
689 - openstack-infra/shade
690 - openstack/keystoneauth
691 - openstack/os-client-config
692
693shade: Add unittest tips project-template
694=========================================
695
696* In git.openstack.org/openstack-infra/shade/.zuul.yaml:
697
698.. code:: yaml
699
700 - project-template:
701 name: shade-tox-tips
702 check:
703 jobs:
704 - shade-tox-py27-tips
705 - shade-tox-py35-tips
706 gate:
707 jobs:
708 - shade-tox-py27-tips
709 - shade-tox-py35-tips
710
711shade: Add unittest tips project-template to project
712====================================================
713
714* In git.openstack.org/openstack-infra/shade/.zuul.yaml:
715
716.. code:: yaml
717
718 - project:
719 templates:
720 - publish-to-pypi
721 - publish-openstack-sphinx-docs
722 - shade-tox-tips
723
724os-client-config: Add shade-tox-tips jobs
725=========================================
726
727* In git.openstack.org/openstack/os-client-config/.zuul.yaml:
728
729.. code:: yaml
730
731 - project:
732 templates:
733 - shade-tox-tips
734
735os-client-config: Add nat_source flag for networks
736==================================================
737
738::
739
740 diff --git a/os_client_config/cloud_config.py b/os_client_config/cloud_config.py
741 index 2e97629..d1a6983 100644
742 --- a/os_client_config/cloud_config.py
743 +++ b/os_client_config/cloud_config.py
744 @@ -581,3 +581,10 @@ class CloudConfig(object):
745 if net['nat_destination']:
746 return net['name']
747 return None
748 +
749 + def get_nat_source(self):
750 + """Get network used for NAT source."""
751 + for net in self.config['networks']:
752 + if net.get('nat_source'):
753 + return net['name']
754 + return None
755
756shade: Add support for configured NAT source variable
757=====================================================
758
759::
760
761 Zuul 10-21 13:57
762 Patch Set 5: Verified-1
763 Build failed.
764 openstack-tox-pep8 SUCCESS in 2m 29s
765 openstack-tox-py27 FAILURE in 2m 34s
766 build-openstack-releasenotes SUCCESS in 2m 47s
767 openstack-tox-py35 FAILURE in 2m 41s
768 openstack-tox-cover POST_FAILURE in 3m 52s (non-voting)
769 build-openstack-sphinx-docs SUCCESS in 2m 57s
770 shade-tox-py27-tips SUCCESS in 3m 18s
771 shade-tox-py35-tips SUCCESS in 2m 28s
772
773OpenStack Github Support for Cross Community Testing
774====================================================
775
776 * OpenStack does not use Github, but other people do
777 * Github App "OpenStack Zuul"
778 * App added to github project by project admin
779 * Project aded to OpenStack's main.yaml
780 * Test interactions between OpenStack and important adjacent communities
781 * https://github.com/ansible/ansible/pull/20974
782
783Cross Source Dependencies
784=========================
785
786.. container:: progressive
787
788 * shade https://review.openstack.org/539563
789
790 Shift voting flag and test_matrix_branch for ansible-devel job
791
792 Change-ID: Ic9d3983de641dbe618c65b2cbf2dcfa3686575df
793
794 * ansible https://github.com/ansible/ansible/pull/34925
795
796 continue fact gathering even without dmidecode
797
798 * ansible https://github.com/ansible/ansible/pull/20974
799
800 Make a generalized OpenStack cloud constructor
801
802 Depends-On: https://review.openstack.org/539563
803 Depends-On: https://github.com/ansible/ansible/pull/34925
804
805Nodesets for Multi-node Jobs
806============================
807
808.. code:: yaml
809
810 - nodeset:
811 name: ceph-cluster
812 nodes:
813 - name: controller
814 label: centos-7
815 - name: compute1
816 label: fedora-26
817 - name: compute2
818 label: fedora-26
819 groups:
820 - name: ceph-osd
821 nodes:
822 - controller
823 - name: ceph-monitor
824 nodes:
825 - controller
826 - compute1
827 - compute2
828
829Multi-node Job
830==============
831
832* nodesets are provided to Ansible for jobs in inventory
833
834.. code:: yaml
835
836 - job:
837 name: ceph-multinode
838 nodeset: ceph-cluster
839 run: playbooks/install-ceph.yaml
840
841Multi-node Ceph Job Content
842===========================
843
844.. code:: yaml
845
846 - hosts: all
847 roles:
848 - install-ceph
849 - hosts: ceph-osd
850 roles:
851 - start-ceph-osd
852 - hosts: ceph-monitor
853 roles:
854 - start-ceph-monitor
855 - hosts: all
856 roles:
857 - do-something-interesting
858
859Projects
860========
861
862* Projects are git repositories
863* Specify a set of jobs for each pipeline
864* golang git repo naming as been adopted:
865
866::
867
868 zuul@ubuntu-xenial:~$ find /home/zuul/src -mindepth 3 -maxdepth 3 -type d
869 /home/zuul/src/git.openstack.org/openstack-infra/shade
870 /home/zuul/src/git.openstack.org/openstack/keystoneauth
871 /home/zuul/src/git.openstack.org/openstack/os-client-config
872 /home/zuul/src/github.com/ansible/ansible
873
874Project with Job Dependencies
875=============================
876
877.. code:: yaml
878
879 # In git.openstack.org/openstack-infra/project-config:
880 - project:
881 name: openstack/nova
882 release:
883 jobs:
884 - build-artifacts
885 - upload-tarball:
886 dependencies: build-artifacts
887 - upload-pypi:
888 dependencies: build-artifacts
889 - notify-mirror:
890 dependencies:
891 - upload-tarball
892 - upload-pypi
893
894Secrets
895=======
896
897* Inspired by Kubernetes Secrets API
898* Projects can add named encrypted secrets to their .zuul.yaml file
899* Jobs can request to use secrets by name
900* Jobs using secrets are not reconfigured speculatively
901* Secrets can only be used by the same project they are defined in
902* Public key per project:
903 ``{{ zuul_url }}/tenant/{{ tenant }}/key/{{ project }}.pub``
904
905Secret Example (note, no admins had to enable this)
906===================================================
907
908.. code:: yaml
909
910 # In git.openstack.org/openstack/loci/.zuul.yaml:
911 - secret:
912 name: loci_docker_login
913 data:
914 user: !encrypted/pkcs1-oaep
915 - r8Nbpq5olmfLF035BZ/CUoFLIdhvBi/49KuochOAHbvns+xMiho3C7MEFzYDqJX3IhHde
916 BICYOgK7qnyINOIZL2e7pl75rEdHQwJjSFUMkpdY6wEP7f9hpolj9xVp0ifHUVQqPHMRn
917 zoPFd8MEAHxH5GLmc2SWJ98E/QUqGltxBi1YRSZoCcNtq3tHFK5Y+xQlLhIseJ2HkpDs6
918 YXOGP9Qt4Va6sdyBcA90H+apSAcYA3Duu962ySZQAsYNui/3NQq3gLA+OZeyTJtcrh4hj
919 Rb5dBnDWfSrMpxdNkbPXXgbQaxO3T0L4jbaOF8VKEsiI9olBrOeV2M9ddYJjSsHGj4XR8
920 4vwS0+doB7np93fujiDuHVgdG8R40NW2GznyKRlRtzAORla7Mzw1Y1MokcUyY6p1LlLLl
921 wUuWYCCEuRciOPhZXQ2u42qju/zrK2/dPnO8HfUINSrN0WbNq14ZwPpbj0ro02oGPbtwu
922 OTw1z+N0Nc+GuLWlwYJGYM/z0UnvDR3WEBc2kXbVev9w4n0cB3RyphML2PDZZWbw8tjnX
923 h1VsAOJ0Qo4qq1K/ft95ypd+vtjkfepEgHEBmJNwutJa9IHAkGfrkO9VkpUTPpfffnPwz
924 d0/zaaadNl6MLQUSutRwY23YIIbv+fmukxw2vnJmvn6abkBlMya7KgtifwNA8c=
925 password: !encrypted/pkcs1-oaep
926 - gUEX4eY3JAk/Xt7Evmf/hF7xr6HpNRXTibZjrKTbmI4QYHlzEBrBbHey27Pt/eYvKKeKw
927 hk8MDQ4rNX7ZK1v+CKTilUfOf4AkKYbe6JFDd4z+zIZ2PAA7ZedO5FY/OnqrG7nhLvQHE
928 5nQrYwmxRp4O8eU5qG1dSrM9X+bzri8UnsI7URjqmEsIvlUqtybQKB9qQXT4d6mOeaKGE
929 5h6Ydkb9Zdi4Qh+GpCGDYwHZKu1mBgVK5M1G6NFMy1DYz+4NJNkTRe9J+0TmWhQ/KZSqo
930 4ck0x7Tb0Nr7hQzV8SxlwkaCTLDzvbiqmsJPLmzXY2jry6QsaRCpthS01vnj47itoZ/7p
931 taH9CoJ0Gl7AkaxsrDSVjWSjatTQpsy1ub2fuzWHH4ASJFCiu83Lb2xwYts++r8ZSn+mA
932 hbEs0GzPI6dIWg0u7aUsRWMOB4A+6t2IOJibVYwmwkG8TjHRXxVCLH5sY+i3MR+NicR9T
933 IZFdY/AyH6vt5uHLQDU35+5n91pUG3F2lyiY5aeMOvBL05p27GTMuixR5ZoHcvSoHHtCq
934 7Wnk21iHqmv/UnEzqUfXZOque9YP386RBWkshrHd0x3OHUfBK/WrpivxvIGBzGwMr2qAj
935 /AhJsfDXKBBbhGOGk1u5oBLjeC4SRnAcIVh1+RWzR4/cAhOuy2EcbzxaGb6VTM=
936
937Secret Example
938==============
939
940.. code:: yaml
941
942 # In git.openstack.org/openstack/loci/.zuul.yaml:
943 - job:
944 name: publish-loci-cinder
945 parent: loci-cinder
946 post-run: playbooks/push
947 secrets:
948 - loci_docker_login
949
950 # In git.openstack.org/openstack/loci/playbooks/push.yaml:
951 - hosts: all
952 tasks:
953 - include_vars: vars.yaml
954
955 - name: Push project to DockerHub
956 block:
957 - command: docker login -u {{ loci_docker_login.user }} -p {{ loci_docker_login.password }}
958 no_log: True
959 - command: docker push openstackloci/{{ project }}:{{ branch }}-{{ item.name }}
960 with_items: "{{ distros }}"
961
962
963What's Next?
964============
965
966* shared job doc generation
967* node providers
968 * kuberenetes
969 * OCI/docker
970 * Mac Stadium (for our Ansible friends)
971 * ec2
972* native container/kubernetes job execution
973
974Important Links
975===============
976
977* https://zuul-ci.org/
978* https://git.openstack.org/cgit/openstack-infra/zuul
979* https://docs.openstack.org/infra/zuul
980* https://docs.openstack.org/infra/manual/zuulv3.html
981* https://docs.openstack.org/infra/zuul-jobs/
982* https://docs.openstack.org/infra/openstack-zuul-jobs/
983* https://storyboard.openstack.org/#!/project/679
984* https://storyboard.openstack.org/#!/board/41
985* freenode:#zuul
986
987Questions
988=========
989
990.. ansi:: images/questions.ans
991
992Presentty
993=========
994.. hidetitle::
995.. transition:: pan
996.. figlet:: Presentty
997
998* Console presentations written in reStructuredText
999* Cross-fade, pan, tilt, cut transitions
1000* Figlet, cowsay!
1001* https://pypi.python.org/pypi/presentty