Skip to content

Commit 6c7961c

Browse files
committed
First commit
0 parents  commit 6c7961c

15 files changed

Lines changed: 52610 additions & 0 deletions

PRESENTER_SCRIPT.md

Lines changed: 281 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,281 @@
1+
# Presenter Script — PCD Feature Flags
2+
3+
**Total runtime:** ~7 minutes (5 min slides + 60s live demo + buffer).
4+
**Format:** [stage directions] regular text = what you say out loud.
5+
6+
---
7+
8+
## Before you start
9+
10+
- Open `~/pcd-feature-flags.pptx` in presenter mode.
11+
- Make sure the 3 Terminal windows are visible on screen: T1 flagd, T2 service, T3 operator.
12+
- Confirm T1 says flagd is running. Confirm T2 is printing gray "legacy" lines once per second.
13+
- T3 has the flag set to off and the usage hint visible.
14+
15+
---
16+
17+
## Slide 1 — Title
18+
19+
[10 seconds]
20+
21+
> "Hey everyone. I'm Mahi. I'm going to show you something that took us one day to ship across three repos, seven pull requests — and it lets any PCD operator change backend service behavior in **30 seconds** without restarting a single pod."
22+
23+
[pause, let the tagline land]
24+
25+
> "No restart. No redeploy. No ticket. Let me show you why that matters."
26+
27+
[advance]
28+
29+
---
30+
31+
## Slide 2 — The Problem
32+
33+
[45 seconds]
34+
35+
> "PCD has nine backend services running per DU: hamgr, nova, neutron, cinder, masakari, glance, and a few more. **None of them can change behavior at runtime.**"
36+
37+
[click — show the bullet list]
38+
39+
> "Every time we ship a new feature, it goes one of two ways. Either it ships binary-on — the code is in production the moment the deploy lands, and we cross our fingers. Or it ships behind a static config option, where toggling it means restarting the service — which is a customer-visible blip on the DU."
40+
41+
> "Neither of those is what good infrastructure teams do anymore. They use feature flags."
42+
43+
[brief pause]
44+
45+
> "And here's the kicker: DUs now run as Kubernetes namespaces with helm-deployed pods. The platform has moved on. **Our toggle story has not.**"
46+
47+
[advance]
48+
49+
---
50+
51+
## Slide 3 — The Solution
52+
53+
[45 seconds]
54+
55+
> "So we adopted **flagd**. It's the CNCF reference implementation of the OpenFeature spec. One stateless pod per DU namespace. It reads flags from a Kubernetes ConfigMap, and hot-reloads when an operator runs `kubectl edit`."
56+
57+
[click — show the bullet list]
58+
59+
> "On the consumer side, services use the **upstream** OpenFeature SDK and the upstream flagd-provider — directly. No Platform9 wrapper. No new pf9-flags repo. About twenty lines of code per service to wire it in."
60+
61+
[gesture to pills]
62+
63+
> "We did both languages in parallel — Go for hamgr, Python for nova — using the **same** flag schema, **same** wire protocol, **same** SDK family on both sides."
64+
65+
[emphasize]
66+
67+
> "We chose, integrated, and shipped. We did **not** invent."
68+
69+
[advance]
70+
71+
---
72+
73+
## Slide 4 — Architecture
74+
75+
[40 seconds]
76+
77+
> "Here's how it works end-to-end."
78+
79+
[trace with finger or laser]
80+
81+
> "An operator types `kubectl edit cm/flagd-config` in a DU namespace. The Kubernetes API server validates the JSON and writes etcd. The kubelet on the node syncs that ConfigMap to disk inside the flagd pod, usually within thirty seconds."
82+
83+
> "flagd has an inotify watch on that file. The moment it changes, flagd reloads and pushes the new value out over a gRPC stream to every consumer that's subscribed."
84+
85+
> "On the consumer side — hamgr, nova-api, future neutron — the OpenFeature SDK keeps an in-process cache. So when application code calls `BooleanValue`, it's a sub-microsecond memory read."
86+
87+
[bottom of slide]
88+
89+
> "Operator edit to service eval: about thirty seconds, ninety-ninth percentile. No restart, anywhere."
90+
91+
[advance]
92+
93+
---
94+
95+
## Slide 5 — What We Shipped
96+
97+
[30 seconds]
98+
99+
> "Seven pull requests across three repos in one day. Foundation chart, end-to-end test, both pilot consumers, both chart wirings, and a usage doc."
100+
101+
[gesture at table]
102+
103+
> "PR 677 is the foundation — everything else depends on it. After that, the consumer work and the chart wiring split cleanly into independent PRs that can merge in any order."
104+
105+
> "Every single one has unit tests, helm template snapshot tests, and went through two-stage automated code review — spec compliance first, then code quality. **Production-ready, not hackathon-grade.**"
106+
107+
[advance]
108+
109+
---
110+
111+
## Slide 6 — Pilot Consumers
112+
113+
[40 seconds]
114+
115+
> "Here's what consuming a flag actually looks like, in both pilots."
116+
117+
[gesture left]
118+
119+
> "On the Go side, in hamgr — we call `initFlags()` once at startup. At a call site, we ask the OpenFeature client for a boolean value, passing a caller default — that's the value you get if flagd is unreachable. **Every eval is fail-open.** The service never crashes because of the flag system."
120+
121+
[gesture right]
122+
123+
> "Python is exactly the same shape. `init_flags()` at startup, `get_boolean_value` at the call site. Different syntax — same semantics."
124+
125+
> "Adding a third consumer — neutron, cinder, whatever — is the same pattern. Less than a day each."
126+
127+
[advance]
128+
129+
---
130+
131+
## Slide 7 — DEMO
132+
133+
[10 seconds — keep it short, switch to terminal]
134+
135+
> "Okay — enough slides. Let's see it."
136+
137+
[switch displays to the 3 Terminal windows]
138+
139+
---
140+
141+
## **LIVE DEMO** — 60 seconds
142+
143+
[Point at T1]
144+
145+
> "On the left, that's flagd running. It's watching a JSON file — in production this would be a Kubernetes ConfigMap, mounted as a file."
146+
147+
[Point at T2]
148+
149+
> "In the middle, that's a fake hamgr service. It's polling the flag `hamgr.fast_evac` once per second. Right now the flag is **off**, so it's printing the legacy path — serial migration, 96 seconds."
150+
151+
[Point at T3, then type slowly]
152+
153+
> "Now I'm the operator. In real life this is `kubectl edit cm/flagd-config`. For the demo I'm using a shell script that toggles the same JSON file directly."
154+
155+
[Type in T3, but don't hit Enter yet]
156+
157+
```
158+
./flip.sh on
159+
```
160+
161+
> "Watch the middle window."
162+
163+
[Hit Enter]
164+
165+
[Wait 2-3 seconds — the service will flip to green within 1 second]
166+
167+
> "There it goes. Cycle six was legacy. Cycle seven is the FAST path — parallel migration, twelve seconds. Notice the yellow arrow: **'flag flipped on, switched to fast path on cycle 7'**."
168+
169+
[Pause for effect]
170+
171+
> "And the rollback, just as fast:"
172+
173+
[Type and hit Enter]
174+
175+
```
176+
./flip.sh off
177+
```
178+
179+
[Wait 2-3 seconds]
180+
181+
> "Back to legacy. Service never restarted. Pods never recycled. No incident, no escalation, no on-call wake-up. **Sub-second mitigation.**"
182+
183+
[Switch back to slides]
184+
185+
---
186+
187+
## Slide 8 — What the audience just saw
188+
189+
[Skip this slide if the live demo worked. Use it only if the demo failed — read out the transcript instead.]
190+
191+
[15 seconds, only if needed]
192+
193+
> "What you would have just seen — flag off for two cycles, then I flipped it on, service switched within one second, ran four cycles of FAST, then I flipped it off, and it rolled back within one second. Same outcome whether it's a demo on my laptop or a real DU with a real operator running kubectl."
194+
195+
[advance]
196+
197+
---
198+
199+
## Slide 9 — Production Parity
200+
201+
[40 seconds]
202+
203+
> "I want to be very clear about one thing. **The demo is the production path.** It is not a simulation. It is not a sketch."
204+
205+
[gesture at table]
206+
207+
> "The only thing different between what you just saw and what runs on a real DU: the flag file is on local disk instead of in a ConfigMap, and flagd is a host process instead of a pod. **Everything else is identical** — same SDK, same provider, same wire protocol, same flag schema, same service code."
208+
209+
> "When this merges to production, we don't rewrite anything. We just change `localhost:8013` to a Kubernetes Service DNS name. Which the helm chart already does for us."
210+
211+
[advance]
212+
213+
---
214+
215+
## Slide 10 — Why this wins
216+
217+
[40 seconds]
218+
219+
> "Six reasons this is worth shipping."
220+
221+
[run down bullets quickly, hitting the punchy ones]
222+
223+
> "One — zero reinvention. flagd is CNCF, OpenFeature is the standard."
224+
225+
> "Two — already production-ready. Tests, reviews, e2e."
226+
227+
> "Three — working code, not slides. You just watched it work."
228+
229+
> "Four — extensible. Same pattern adds the rest of our services in days, not weeks."
230+
231+
> "Five — operators already know `kubectl edit`. Zero new tools. K8s RBAC already gates who can flip what."
232+
233+
> "Six — fail-open. If flagd is down, every service still works. They just get the caller default. **Nothing crashes.**"
234+
235+
[advance]
236+
237+
---
238+
239+
## Slide 11 — What's next
240+
241+
[30 seconds]
242+
243+
> "Today's scope is intentionally narrow: boolean flags, per-DU, backend pods only. That covers ninety percent of what we need right now."
244+
245+
[gesture at bullets]
246+
247+
> "Everything you'd want next — per-tenant targeting, percent rollouts, string flags, hypervisor-side support, an audit dashboard — is already supported by flagd's spec. We don't have to rebuild anything. **We just add code on top of the same foundation.**"
248+
249+
[advance]
250+
251+
---
252+
253+
## Slide 12 — Thanks
254+
255+
[15 seconds — closing punchline]
256+
257+
> "Thanks for watching."
258+
259+
[pause]
260+
261+
> "**No restart. No redeploy. No incident.** Questions?"
262+
263+
---
264+
265+
## If something breaks during the demo
266+
267+
- **flagd won't start (port conflict):** kill the old one — `pkill flagd` — then re-run `./start-flagd.sh`.
268+
- **Service shows red errors:** flagd isn't up yet. Restart the service with `./start-service.sh` after confirming flagd is healthy.
269+
- **flip.sh edits the file but service doesn't react:** confirm flagd is the one watching that exact file — its logs in T1 should mention `flags.json`. As a fallback, restart the service; it re-reads the current flag state at startup.
270+
- **Tabs aren't aligned:** use slide 8 (the transcript slide) to walk through what would have happened.
271+
272+
---
273+
274+
## Pre-show checklist
275+
276+
- [ ] Slides open in presenter mode
277+
- [ ] 3 Terminal windows visible, arranged left-to-right
278+
- [ ] T1 shows flagd running, no errors in the last 30 seconds
279+
- [ ] T2 shows the service printing gray "legacy" lines every second
280+
- [ ] T3 shows the flag set to "off" (run `./flip.sh off` to confirm)
281+
- [ ] Audience can see all three windows from the back of the room (zoom font if needed)

0 commit comments

Comments
 (0)