|
| 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