diff options
-rw-r--r-- | src/images/Robbie_Williams_Cannes_2015.jpg | bin | 0 -> 61274 bytes | |||
-rw-r--r-- | src/talks/global-interop.hbs | 534 |
2 files changed, 534 insertions, 0 deletions
diff --git a/src/images/Robbie_Williams_Cannes_2015.jpg b/src/images/Robbie_Williams_Cannes_2015.jpg new file mode 100644 index 0000000..e802301 --- /dev/null +++ b/src/images/Robbie_Williams_Cannes_2015.jpg | |||
Binary files differ | |||
diff --git a/src/talks/global-interop.hbs b/src/talks/global-interop.hbs new file mode 100644 index 0000000..c7b4b66 --- /dev/null +++ b/src/talks/global-interop.hbs | |||
@@ -0,0 +1,534 @@ | |||
1 | <!doctype html> | ||
2 | <html lang="en"> | ||
3 | |||
4 | <head> | ||
5 | <meta charset="utf-8"> | ||
6 | |||
7 | <title>Global OpenStack: the Power of Cloud Interoperability</title> | ||
8 | |||
9 | </head> | ||
10 | <body> | ||
11 | |||
12 | <section id="who-am-i-redhat" class="slide level2"> | ||
13 | <h1>Who am I?</h1> | ||
14 | <img style="float:right; margin:24pt" src="/images/Logo_RH_CMYK_Default.jpg" /> | ||
15 | <p> Office of Technology </p> | ||
16 | <p> Zuul </p> | ||
17 | <p> Ansible </p> | ||
18 | </section> | ||
19 | |||
20 | <section id="who-am-i-openstack" class="slide level2"> | ||
21 | <h1>Who am I?</h1> | ||
22 | <img style="float:right; margin-right:24pt; width:300px; height: auto" src="/images/openstack-cloud-software-vertical-large.png" /> | ||
23 | <p>Technical Committee</p> | ||
24 | <p>Developer Infrastructure Core Team</p> | ||
25 | <p>Former Foundation Board of Directors</p> | ||
26 | <p>PTL of shade project</p> | ||
27 | </section> | ||
28 | |||
29 | <section class="slide level2"> | ||
30 | <p> | ||
31 | I want to deploy and run an application on the internet | ||
32 | so that my customers all over the world can consume it.</p> | ||
33 | </section> | ||
34 | |||
35 | <section class="slide level2"> | ||
36 | <p> | ||
37 | I want to deploy the application across multiple clouds or regions | ||
38 | so that my service survives issues in any one of them.</p> | ||
39 | </section> | ||
40 | |||
41 | <section class="slide level2"> | ||
42 | <p> | ||
43 | I want to deploy the application in a location of my choosing | ||
44 | so that I can comply with regulatory demands.</p> | ||
45 | </section> | ||
46 | |||
47 | <section class="slide level2"> | ||
48 | <h1>THIS WORKS</h1> | ||
49 | <h3>I'm doing it myself as we speak</h3> | ||
50 | <img style="float:right; margin-right:24pt" src="/images/graphite.openstack.org.png"/> | ||
51 | |||
52 | |||
53 | <p class='fragment'>20k VMs per-day</p> | ||
54 | <p class='fragment'>20 Cloud Regions in 9 clouds</p> | ||
55 | <p class='fragment'>Only using OpenStack APIs</p> | ||
56 | |||
57 | </section> | ||
58 | |||
59 | <section id="openstack-infra" data-transition='zoom'> | ||
60 | <h1>OpenStack Infra</h1> | ||
61 | </section> | ||
62 | |||
63 | <section id="tooling-automation-and-ci-for-openstack-project" class="slide level2" data-transition='zoom'> | ||
64 | <h1>Tooling, Automation and CI for OpenStack Project</h1> | ||
65 | </section> | ||
66 | |||
67 | <section id="developers" class="slide level2" data-transition='zoom'> | ||
68 | <h1>2000 Developers</h1> | ||
69 | </section> | ||
70 | |||
71 | <section id="gated-commits" class="slide level2" data-transition='zoom'> | ||
72 | <h1>Gated Commits</h1> | ||
73 | <p>Every commit is fully integration tested (twice) before landing</p> | ||
74 | </section> | ||
75 | |||
76 | <section id="each-test-runs-on-a-single-use-cloud-slave" class="slide level2" data-transition='zoom'> | ||
77 | <h1>Each Test Runs on a Single Use Cloud Slave</h1> | ||
78 | <p>This is that "cloud scale out" part</p> | ||
79 | </section> | ||
80 | |||
81 | <section id="kjph" class="slide level2" data-transition='zoom'> | ||
82 | <h1>2 kjph</h1> | ||
83 | </section> | ||
84 | |||
85 | <section id="kilo-jobs-per-hour" class="slide level2" data-transition='zoom'> | ||
86 | <h1>2 KJPH (kilo-jobs per hour)</h1> | ||
87 | </section> | ||
88 | |||
89 | <section id="our-vms-are-everywhere" class="slide level2"> | ||
90 | <h1>Our VMs are everywhere</h1> | ||
91 | <h3>Public Clouds</h3> | ||
92 | <ul> | ||
93 | <li>Rackspace: Dallas, Chicago, DC</li> | ||
94 | <li>Internap: New Jersey, Montreal</li> | ||
95 | <li>OVH: Strassbourg, Gravelines</li> | ||
96 | <li>Citycloud: London, Los Angeles, Stockholm</li> | ||
97 | </ul> | ||
98 | <h3>Managed Private Clouds</h3> | ||
99 | <ul> | ||
100 | <li>OpenStack Innovation Center: San Antonio</li> | ||
101 | <li>Red Hat TripleO: Phoenix</li> | ||
102 | </ul> | ||
103 | </section> | ||
104 | |||
105 | <section id="we-also-have-servers" class="slide level2"> | ||
106 | <h1>Private Cloud</h1> | ||
107 | <h2>Infra Cloud</h2> | ||
108 | <ul> | ||
109 | <li>Hardware donated by HPE: Houston</li> | ||
110 | <li>Community run cloud using OpenStack Puppet</li> | ||
111 | <li>Bare Metal managed with Bifrost/Ironic</li> | ||
112 | </ul> | ||
113 | </section> | ||
114 | |||
115 | <section id="architecture" class="slide level2"> | ||
116 | <p><img src="/images/infra-zuul-architecture.png" alt="image" /></p> | ||
117 | </section> | ||
118 | |||
119 | <section class="slide level2"> | ||
120 | <h1>Gerrit</h1> | ||
121 | <ul> | ||
122 | <li class="fragment"> | ||
123 | Traditional 'Enterprise' Java Application</li> | ||
124 | <li class="fragment">Single Nova VM, Cinder Volume</li> | ||
125 | <li class="fragment">Scale out farm of git replicas</li> | ||
126 | </ul> | ||
127 | </section> | ||
128 | |||
129 | <section class="slide level2"> | ||
130 | <h1>nodepool</h1> | ||
131 | <ul> | ||
132 | <li class="fragment">Cloud Native</li> | ||
133 | <li class="fragment"> | ||
134 | Purpose built in Python</li> | ||
135 | <li class="fragment">Keeps a pool of ready to go nodes</li> | ||
136 | <li class="fragment">Multi-cloud</li> | ||
137 | <li class="fragment">Fully elastic - responds to demand</li> | ||
138 | </ul> | ||
139 | </section> | ||
140 | |||
141 | <section class="slide level2"> | ||
142 | <h1>How do we do this?</h1> | ||
143 | </section> | ||
144 | |||
145 | <section class="slide level2"> | ||
146 | <h1>Control plane</h1> | ||
147 | <h3>http://git.openstack.org/cgit/openstack-infra/system-config</h3> | ||
148 | <ul> | ||
149 | <li>All server config management in git</li> | ||
150 | <li>Puppet manages the servers: puppet apply</li> | ||
151 | <li>Ansible runs puppet: ansible puppet module</li> | ||
152 | <li>Ansible OpenStack Dynamic Inventory</li> | ||
153 | <li>Only thing not public are keys and secrets</li> | ||
154 | </ul> | ||
155 | </section> | ||
156 | |||
157 | <section class="slide level2"> | ||
158 | <h1>os-client-config</h1> | ||
159 | <h3>http://git.openstack.org/cgit/openstack/os-client-config</h3> | ||
160 | <p>A library to handle config information for openstack clients</p> | ||
161 | <p>Tracks differences in vendors that can't be discovered</p> | ||
162 | <p>In use in python-openstackclient, shade and ansible</p> | ||
163 | </section> | ||
164 | |||
165 | <section class="slide level2"> | ||
166 | <h1>os-client-config</h1> | ||
167 | <p>~/.config/openstack/clouds.yaml</p> | ||
168 | <pre> | ||
169 | clouds: | ||
170 | citycloud: | ||
171 | profile: citycloud | ||
172 | auth: | ||
173 | username: mordred | ||
174 | password: XXXXXXXXXXXXXXXXXXXXX | ||
175 | project_id: 65222a4d09ea4c68934fa1028c77f394 | ||
176 | user_domain_id: d0919bd5e8d74e49adf0e145807ffc38 | ||
177 | project_domain_id: d0919bd5e8d74e49adf0e145807ffc38 | ||
178 | regions: | ||
179 | - Kna1 | ||
180 | - Sto2 | ||
181 | - Lon1 | ||
182 | dreamcompute: | ||
183 | profile: dreamhost | ||
184 | auth: | ||
185 | username: montay6 | ||
186 | project_name: dhc2111978 | ||
187 | password: XXXXXXXXXXXXX | ||
188 | region_name: RegionOne | ||
189 | </pre> | ||
190 | </section> | ||
191 | |||
192 | <section class="slide level2"> | ||
193 | <h1>shade</h1> | ||
194 | <h3>http://git.openstack.org/cgit/openstack-infra/shade</h3> | ||
195 | <p>A library to wrap business logic around client libraries</p> | ||
196 | <pre> | ||
197 | cloud.create_image('image-name', filename='image-filename.qcow2') | ||
198 | cloud.create_server('my-server', image='immage-name', auto_ip=True) | ||
199 | </pre> | ||
200 | <p>In use in Infra Nodepool and ansible</p> | ||
201 | </section> | ||
202 | |||
203 | <section class="slide level2"> | ||
204 | <h1>ansible</h1> | ||
205 | <p>Based on shade</p> | ||
206 | <pre> | ||
207 | - os_keypair: | ||
208 | cloud: citycloud | ||
209 | name: mordred | ||
210 | public_key_file: ~/.ssh/id_rsa.pub | ||
211 | - os_image: | ||
212 | cloud: citycloud | ||
213 | name: Monty Ubuntu | ||
214 | file: ubuntu.vhd | ||
215 | - os_server: | ||
216 | cloud: citycloud | ||
217 | name: my-server | ||
218 | flavor_ram: 1024 | ||
219 | image: Monty Ubuntu | ||
220 | </pre> | ||
221 | </section> | ||
222 | |||
223 | <section class="slide level2"> | ||
224 | <h1>ansible</h1> | ||
225 | <h2>Add my keypair to 30 Regions in 13 clouds<h2> | ||
226 | <pre><code> | ||
227 | - os_keypair: | ||
228 | cloud: "{{ item.cloud }}" | ||
229 | region_name: "{{ item.region_name }}" | ||
230 | name: mordred | ||
231 | public_key_file: ~/.ssh/id_rsa.pub | ||
232 | with-items: | ||
233 | - {cloud: vexxhost, region_name: ca-ymq-1} | ||
234 | - {cloud: ovh, region_name: SBG1} | ||
235 | - {cloud: ovh, region_name: BHS1} | ||
236 | - {cloud: ovh, region_name: GRA1} | ||
237 | - {cloud: citycloud, region_name: Buf1} | ||
238 | - {cloud: citycloud, region_name: La1} | ||
239 | - {cloud: citycloud, region_name: Fra1} | ||
240 | - {cloud: citycloud, region_name: Lon1} | ||
241 | - {cloud: citycloud, region_name: Sto2} | ||
242 | - {cloud: citycloud, region_name: Kna1} | ||
243 | - {cloud: internap, region_name: ams01} | ||
244 | - {cloud: internap, region_name: da01} | ||
245 | - {cloud: internap, region_name: nyj01} | ||
246 | - {cloud: internap, region_name: sin01} | ||
247 | - {cloud: internap, region_name: sjc01} | ||
248 | - {cloud: infracloud, region_name: vanilla} | ||
249 | - {cloud: infracloud, region_name: chocolate} | ||
250 | - {cloud: fuga, region_name: cystack} | ||
251 | - {cloud: datacentred, region_name: sal01} | ||
252 | - {cloud: clouda, region_name: regionOne} | ||
253 | - {cloud: auro, region_name: van1} | ||
254 | - {cloud: ustack, region_name: bj1} | ||
255 | - {cloud: zetta, region_name: no-osl1} | ||
256 | - {cloud: kiss, region_name: region1} | ||
257 | - {cloud: rax, region_name: IAD} | ||
258 | - {cloud: rax, region_name: ORD} | ||
259 | - {cloud: rax, region_name: SYD} | ||
260 | - {cloud: rax, region_name: LON} | ||
261 | - {cloud: rax, region_name: DFW} | ||
262 | - {cloud: rax, region_name: HKG} | ||
263 | </code></pre> | ||
264 | </section> | ||
265 | |||
266 | <section class="slide level2"> | ||
267 | <h1>nodepool</h1> | ||
268 | <ul> | ||
269 | <li>Use shade to treat all cloud regions as one giant cloud</li> | ||
270 | <li>diskimage-builder makes identical base images for each</li> | ||
271 | <li>Pre-cache network artifacts in disk images</li> | ||
272 | <li>glean instead of cloud-init to handle no-DHCP on Rackspace</li> | ||
273 | <li>Pre-spins warm pool - always keep min-ready number of nodes</li> | ||
274 | </ul> | ||
275 | </section> | ||
276 | |||
277 | <section class="slide level2"> | ||
278 | <h1>OpenStack Works!</h1> | ||
279 | <p class='fragment'>Why should you care?</p> | ||
280 | <p class='fragment'>Is interop really important?</p> | ||
281 | </section> | ||
282 | |||
283 | <section class="slide level2"> | ||
284 | <h1>Run what you want</h1> | ||
285 | <p class='fragment'>Cloud-native application</p> | ||
286 | <p class='fragment'>Traditional Java web application</p> | ||
287 | <p class='fragment'>High-performance Database on Baremetal</p> | ||
288 | </section> | ||
289 | |||
290 | <section class="slide level2"> | ||
291 | <h1>Run it where you want</h1> | ||
292 | <ul> | ||
293 | <li>Geography</li> | ||
294 | <li>Delivery Model</li> | ||
295 | </ul> | ||
296 | |||
297 | </section> | ||
298 | |||
299 | <section class="slide level2"> | ||
300 | <h1>Geography</h1> | ||
301 | <ul> | ||
302 | <li>Put it near your users</li> | ||
303 | <li>Don't put it in an US data center</li> | ||
304 | <li>Locality Requirements</li> | ||
305 | <li class='fragment'>What if you have customers in China?</li> | ||
306 | <li class='fragment'>What if you also have customers in Sweden?</li> | ||
307 | </ul> | ||
308 | </section> | ||
309 | |||
310 | <section class="slide level2"> | ||
311 | <h1>Delivery Model</h1> | ||
312 | <ul> | ||
313 | <li>Public</li> | ||
314 | <li>Hosted Private</li> | ||
315 | <li>Managed Private On-Premise</li> | ||
316 | <li>Run your own</li> | ||
317 | </ul> | ||
318 | </section> | ||
319 | |||
320 | <section class="slide level2" data-transition='zoom'> | ||
321 | <h1>China’s Sinorail Information Cloud</h1> | ||
322 | </section> | ||
323 | |||
324 | <section class="slide level2" data-transition='zoom'> | ||
325 | <h1>Billions of Passengers</h1> | ||
326 | </section> | ||
327 | |||
328 | <section class="slide level2" data-transition='zoom'> | ||
329 | <h1>Anybody <em>REALLY</em> think that should just run in a | ||
330 | Public Cloud?</h1> | ||
331 | </section> | ||
332 | |||
333 | <section class="slide level2" data-transition='zoom'> | ||
334 | <h1>Anybody <em>REALLY</em> think that should run in a | ||
335 | Public Cloud owned by a US company?</h1> | ||
336 | </section> | ||
337 | |||
338 | <section class="slide level2" data-transition='zoom'> | ||
339 | <h1>What about the China National Offshore Oil Corp?</h1> | ||
340 | </section> | ||
341 | |||
342 | <section class="slide level2" data-transition='zoom'> | ||
343 | <h1>or the State Grid of China?</h1> | ||
344 | </section> | ||
345 | |||
346 | <section class="slide level2"> | ||
347 | <img src="/images/six-years-in.png" /> | ||
348 | </section> | ||
349 | |||
350 | <section class="slide level2"> | ||
351 | <h1>Chinese OpenStack</h1> | ||
352 | <p><small>sorted alphabetically</small></p> | ||
353 | <p>99 Cloud</p> | ||
354 | <p>China Mobile</p> | ||
355 | <p>China National Offshore Oil Corp</p> | ||
356 | <p>China Telecom</p> | ||
357 | <p>China Unicom</p> | ||
358 | <p>EasyStack</p> | ||
359 | <p>Huawei</p> | ||
360 | <p>Inspur</p> | ||
361 | <p>Sinorail</p> | ||
362 | <p>State Grid of China</p> | ||
363 | <p>T2 Cloud</p> | ||
364 | <p>Tencent</p> | ||
365 | <p>UMCloud</p> | ||
366 | <p>UnitedStack</p> | ||
367 | <p>ZTE</p> | ||
368 | </section> | ||
369 | |||
370 | <section class="slide level2"> | ||
371 | <h1>European Public OpenStack</h1> | ||
372 | <p>CityCloud: Sweden, UK, US</p> | ||
373 | <p>Datacentred: UK</p> | ||
374 | <p>Elastx: Sweden</p> | ||
375 | <p>Enter Cloud Suite: Italy, Germany</p> | ||
376 | <p>Fugo: Netherlands</p> | ||
377 | <p>Internap: Netherlands, US, Singapore</p> | ||
378 | <p>OTC: Frankfurt</p> | ||
379 | <p>OVH: France, US</p> | ||
380 | <p>Switch: Switzerland</p> | ||
381 | <p>Ultimum: Czech Republic</p> | ||
382 | <p>Zetta: Norway</p> | ||
383 | <p>kiss.cloud: Netherlands</p> | ||
384 | </section> | ||
385 | |||
386 | <section class="slide level2"> | ||
387 | <h1>Other Public OpenStack</h1> | ||
388 | <p>Auro: Vancouver</p> | ||
389 | <p>Catalyst: New Zealand</p> | ||
390 | <p>Conoha: Japan, Singapore, US</p> | ||
391 | <p>Dreamhost: US</p> | ||
392 | <p>Ormuco: Canada + Federated</p> | ||
393 | <p>Vexxhost: Canada</p> | ||
394 | </section> | ||
395 | |||
396 | <section class="slide level2"> | ||
397 | <h1>What about the US?</h1> | ||
398 | <img class='fragment' | ||
399 | style="float:right; margin:24pt; height:400px; width: auto" | ||
400 | src="/images/Robbie_Williams_Cannes_2015.jpg" /> | ||
401 | <p class='fragment'>Robbie Williams</p> | ||
402 | <p class='fragment'>Best-selling British solo artist in the UK</p> | ||
403 | <p class='fragment'>Best-selling non-Latino artist in Latin America</p> | ||
404 | <p class='fragment'>Basically unknown in the US</p> | ||
405 | </section> | ||
406 | |||
407 | <section class="slide level2"> | ||
408 | <h1>OpenStack Community is Designed for Collaboration</h1> | ||
409 | </section> | ||
410 | |||
411 | <section class="slide level2"> | ||
412 | <h1>In the OpenStack Project, all participants are Equal</h1> | ||
413 | </section> | ||
414 | |||
415 | <section class="slide level2"> | ||
416 | <p><em>We</em> aren't going to remove something <em>you</em> need...</p> | ||
417 | <p class='fragement'>because we <em>ARE</em> you.</p> | ||
418 | </section> | ||
419 | |||
420 | <section class="slide level2"> | ||
421 | <h1>I'm in this to make the world better. The whole world.</h1> | ||
422 | </section> | ||
423 | |||
424 | <section class="slide level2"> | ||
425 | <h1>Why does Interop Matter</h1> | ||
426 | </section> | ||
427 | |||
428 | <section class="slide level2"> | ||
429 | <h1>Is Sinorail going to run China's Train system with | ||
430 | an app they download from an App Store?<h1> | ||
431 | <p class='fragment'>Nope</p> | ||
432 | </section> | ||
433 | |||
434 | <section class="slide level2"> | ||
435 | <h1>Are they going to let me run VMs for OpenStack Infra | ||
436 | Nodepool on their Cloud?</h1> | ||
437 | <p class='fragment'>Nope</p> | ||
438 | <p class='fragment'><small>That would be SUPER cool though!</small></p> | ||
439 | </section> | ||
440 | |||
441 | <section class="slide level2"> | ||
442 | <h1>Who cares if China National Offshore Oil Corp, State Grid of China | ||
443 | and Deutsche Telecom's clouds work the same?<h1> | ||
444 | </section> | ||
445 | |||
446 | <section class="slide level2"> | ||
447 | <h1>It's all about the tools</h1> | ||
448 | <ul> | ||
449 | <li>Ansible</li> | ||
450 | <li>Terraform</li> | ||
451 | <li>Spinnaker</li> | ||
452 | <li>Zuul</li> | ||
453 | <li class='fragment'>Zuul v3 is almost out and will blow your mind</li> | ||
454 | </ul> | ||
455 | </section> | ||
456 | |||
457 | <section class="slide level2"> | ||
458 | <h1>It's about spending resources wisely</h1> | ||
459 | <p>If China National Offshore Oil Corp, State Grid of China and | ||
460 | Sinorail all run Interoperable OpenStack Clouds ...</p> | ||
461 | <p>they share not just the OpenStack Cloud software itself... </p> | ||
462 | <p>they <em>ALSO</em> share consumption and orchestration software.</p> | ||
463 | <p class='fragment'>It's like I work for all of you!</p> | ||
464 | <p class='fragment'>It's like we all work with each other</p> | ||
465 | </section> | ||
466 | |||
467 | <section class="slide level2"> | ||
468 | <h1>China, and the rest of the Global Community, understands the power | ||
469 | of collaborating on our shared problems.</h1> | ||
470 | </section> | ||
471 | |||
472 | <section class="slide level2"> | ||
473 | <h1>What are we doing to help you with Interop?</h1> | ||
474 | </section> | ||
475 | |||
476 | <section class="slide level2"> | ||
477 | <h1>Interop Working Group</h1> | ||
478 | <ul> | ||
479 | <li>Trademark focused: What must work to use the name OpenStack</li> | ||
480 | <li>If you get some OpenStack from a Vendor, how do you know it's good | ||
481 | OpenStack</li> | ||
482 | </ul> | ||
483 | </section> | ||
484 | |||
485 | <section class="slide level2"> | ||
486 | <h1>API Working Group</h1> | ||
487 | <ul> | ||
488 | <li>Upstream Technical Committee Group</li> | ||
489 | <li><a href='http://specs.openstack.org/openstack/api-wg/'> | ||
490 | http://specs.openstack.org/openstack/api-wg/</a></li> | ||
491 | <li>Started publishing <em>API Consumption</em> guidelines</li> | ||
492 | </ul> | ||
493 | </section> | ||
494 | |||
495 | <section class="slide level2"> | ||
496 | <h1>API Working Group Consumption Specs</h1> | ||
497 | |||
498 | <ul> | ||
499 | <li><a href='http://specs.openstack.org/openstack/api-wg/guidelines/consuming-catalog.html'> | ||
500 | Consuming the Catalog: http://specs.openstack.org/openstack/api-wg/guidelines/consuming-catalog.html</a></li> | ||
501 | <li><a href='https://review.openstack.org/#/c/459405/'>Version Discovery: https://review.openstack.org/#/c/459405/</a></li> | ||
502 | <li><a href='https://service-types.openstack.org/'>Service Types Authority: https://service-types.openstack.org/</a></li> | ||
503 | </ul> | ||
504 | </section> | ||
505 | |||
506 | <section class="slide level2"> | ||
507 | <h1>API Consumers Mailing List</h1> | ||
508 | <p><a href='http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-api-consumers'>http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-api-consumers</a></p> | ||
509 | <p>Collaboration between SDK, Framework, Tool Authors</p> | ||
510 | <p>Python, Go, Java, Ruby, Javascript ... </p> | ||
511 | </section> | ||
512 | |||
513 | <section class="slide level2"> | ||
514 | <h1>Writing Software!</h1> | ||
515 | <ul> | ||
516 | <li>shade SDK: <a href='https://docs.openstack.org/shade/latest/'> | ||
517 | https://docs.openstack.org/shade/latest/</a></li> | ||
518 | <li>Ansible OpenStack: <a href='http://docs.ansible.com/ansible/latest/list_of_cloud_modules.html#openstack'> | ||
519 | http://docs.ansible.com/ansible/latest/list_of_cloud_modules.html#openstack</a></li> | ||
520 | <li>oaktree: Federation API</li> | ||
521 | <li>TriCircle: Multi-cloud Networking</li> | ||
522 | <li>Zuul: Insanely scalable CI/CD</li> | ||
523 | </ul> | ||
524 | <p>All of these can use help!</p> | ||
525 | </section> | ||
526 | |||
527 | <section class="slide level2"> | ||
528 | <h1>OpenStack gives you the power to make the choices that | ||
529 | are right for you, your business, your users, your country | ||
530 | and the world.</h1> | ||
531 | </section> | ||
532 | |||
533 | </body> | ||
534 | </html> | ||