summaryrefslogtreecommitdiff
path: root/src/talks/now-what.hbs
diff options
context:
space:
mode:
Diffstat (limited to 'src/talks/now-what.hbs')
-rw-r--r--src/talks/now-what.hbs365
1 files changed, 365 insertions, 0 deletions
diff --git a/src/talks/now-what.hbs b/src/talks/now-what.hbs
new file mode 100644
index 0000000..9a1a4a9
--- /dev/null
+++ b/src/talks/now-what.hbs
@@ -0,0 +1,365 @@
1<!doctype html>
2<html lang="en">
3
4 <head>
5 <meta charset="utf-8">
6
7 <title>OpenStack works ... so now what?</title>
8 </head>
9 <body>
10
11 <section id="who-am-i-hp" class="slide level2">
12 <h1>Who am I?</h1>
13 <img style="float:right; margin-right:24pt" src="/images/hp-logo.png"/>
14 <p> Distinguished Technologist </p>
15 <p> HP Cloud </p>
16 </section>
17
18 <section id="who-am-i-openstack" class="slide level2">
19 <h1>Who am I?</h1>
20 <img style="float:right; margin-right:24pt" src="/images/openstack-cloud-software-vertical-large.png" />
21 <p>Technical Committee</p>
22 <p>Foundation Board of Directors</p>
23 <p>Developer Infrastructure Core Team</p>
24 </section>
25
26 <section id="what-are-we-going-to-talk-about" class="slide level2">
27 <h1>What are we going to talk about?</h1>
28 <ul>
29 <li>OpenStack</li>
30 <li>My application</li>
31 <li>Your applications</li>
32 </ul>
33 </section>
34
35 <section class="slide level2">
36 <img src="/images/openstack-software-diagram.png"
37 alt="OpenStack" />
38 </section>
39
40 <section class="slide level2">
41 <p>As an application developer,<br />
42 I want to deploy and run an application on the internet<br />
43 so that my customers all over the world can consume it.</p>
44 </section>
45
46 <section class="slide level2">
47 <p>As an application developer,<br />
48 I want to deploy the application across multiple clouds<br />
49 so that my service survives issues in any one of them.</p>
50 </section>
51 <section class="slide level2">
52 <h1>THIS WORKS</h1>
53 <h3>I'm doing it myself as we speak</h3>
54 <img style="float:right; margin-right:24pt" src="/images/graphite.openstack.org.png"/>
55
56
57 <p class='fragment'>10-20k VMs per-day</p>
58 <p class='fragment'>3 (soon to be 6) clouds</p>
59 <p class='fragment'>Only using OpenStack APIs</p>
60
61 </section>
62
63 <section id="openstack-infra" data-transition='zoom'>
64 <h1>OpenStack Infra</h1>
65 </section>
66
67 <section id="tooling-automation-and-ci-for-openstack-project" class="slide level2" data-transition='zoom'>
68 <h1>Tooling, Automation and CI for OpenStack Project</h1>
69 </section>
70
71 <section id="developers" class="slide level2" data-transition='zoom'>
72 <h1>2000 Developers</h1>
73 </section>
74
75 <section id="gated-commits" class="slide level2" data-transition='zoom'>
76 <h1>Gated Commits</h1>
77 <p>Every commit is fully integration tested (twice) before landing</p>
78 </section>
79
80 <section id="each-test-runs-on-a-single-use-cloud-slave" class="slide level2" data-transition='zoom'>
81 <h1>Each Test Runs on a Single Use Cloud Slave</h1>
82 <p>This is that "cloud scale out" part</p>
83 </section>
84
85 <section id="million-test-jobs-in-the-last-6-months" class="slide level2" data-transition='zoom'>
86 <h1>1.7 Million Test Jobs in the last 6 Months</h1>
87 </section>
88
89 <section id="million-tests-in-a-month" class="slide level2" data-transition='zoom'>
90 <h1>15 Million Tests in a month</h1>
91 </section>
92
93 <section id="terabytes-of-log-data-in-six-months" class="slide level2" data-transition='zoom'>
94 <h1>18 Terabytes of Log Data in six months</h1>
95 </section>
96
97 <section id="we-have-no-servers" class="slide level2" data-transition='zoom'>
98 <h1>We have no servers</h1>
99 <p>It all runs across HP and Rackspace Public Clouds.</p>
100 </section>
101
102 <section id="architecture" class="slide level2">
103 <h1>Architecture</h1>
104 <p><img src="/images/infra_architecture.jpg" alt="image" /></p>
105 </section>
106
107 <section class="slide level2">
108 <h1>Gerrit</h1>
109 <ul>
110 <li class="fragment">
111 Traditional 'Enterprise' Java Application</li>
112 <li class="fragment">Single Nova VM, Cinder Volume</li>
113 <li class="fragment">Scale out farm of git replicas</li>
114 </ul>
115 </section>
116
117 <section class="slide level2">
118 <img src="/images/gerrit-graph.png" />
119 </section>
120
121 <section class="slide level2">
122 <h1>Fun Numbers</h1>
123 <ul>
124 <li>2500 changes every week</li>
125 <li>15000 change <em>revisions</em> every week</li>
126 <li>10,000 new changes every 42 days</li>
127 </ul>
128 </section>
129
130 <section class="slide level2">
131 <img src="/images/what-happens.png" />
132 </section>
133
134 <section class="slide level2">
135 <h1>nodepool</h1>
136 <ul>
137 <li class="fragment">Cloud Native</li>
138 <li class="fragment">
139 Purpose built in Python</li>
140 <li class="fragment">Keeps a pool of ready to go nodes</li>
141 <li class="fragment">Multi-cloud</li>
142 <li class="fragment">Fully elastic - responds to demand</li>
143 </ul>
144 </section>
145
146 <section class="slide level2">
147 <img style="float:left; margin-left:24pt; width:35%;" src="/images/gerrit-graph.png" />
148 <img style="float:right; margin-right:24pt; width: 50%;" src="/images/nodepool-graph.png" />
149 </section>
150
151 <section class="slide level2">
152 <h1>OpenStack Works!</h1>
153 <p class='fragment'>What next?</p>
154 <p class='fragment'>Make it easier</p>
155 </section>
156
157 <section class="slide level2">
158 <h1>Basic things you want to do</h1>
159
160 <p class='fragment'>Get (make/fetch/find) a base image</p>
161 <p class='fragment'>Upload it to each cloud</p>
162 <p class='fragment'>Boot a VM on one or more of the clouds</p>
163 <p class='fragment'>Ensure it's on the Internet</p>
164 </section>
165
166 <section class="slide level2">
167 <h1>We've made this harder than it should be</h1>
168 </section>
169
170 <section class="slide level2">
171 <h1>Get a base image</h1>
172 <p class='fragment'>OpenStack diskimage-builder</p>
173 <p class='fragment'>packer</p>
174 <p class='fragment'>Download pre-built image from Ubuntu/RedHat/SuSE</p>
175 </section>
176
177 <section class="slide level2">
178 <h1>Problem: hypervisor image file format</h1>
179 <ul>
180 <li class='fragment'>
181 Rackspace uses VHD
182 </li>
183 <li class='fragment'>
184 HP uses qcow2
185 </li>
186 <li class='fragment'>
187 DreamHost uses RAW
188 </li>
189 </ul>
190 </section>
191
192 <section class="slide level2">
193 <h1>Problem: image API version</h1>
194 <ul>
195 <li class='fragment'>
196 HP uses v1
197 </li>
198 <li class='fragment'>
199 vexxhost uses v2
200 </li>
201 </ul>
202 <p class="fragment">Good news! We made a plan for this at
203 the summit</p>
204 </section>
205
206 <section class="slide level2">
207 <h1>Problem: image task vs. PUT</h1>
208 <pre>
209swift upload --object-name local-image-filename images image-name
210glance task-create
211 --type=import
212 --input='{"import_from": "images/image-name",
213 "image_properties" : {"name": "My Image Name"}}'
214 </pre>
215 <pre>
216glance image-create --name=image-name --file=local-image-filename
217 </pre>
218 </section>
219
220 <section class="slide level2">
221 <h1>Problem: Ensure it's on the Internet</h1>
222 <ul>
223 <li class='fragment'>Cloud has externally routable IP from neutron (RunAbove, OVH)</li>
224 <li class='fragment'>Cloud has externally routable IP neutron AND supports optional private tenant networks (vexxhost)</li>
225 <li class='fragment'>Cloud has private tenant network provided by neutron and requires floating IP (HP, Dreamhost)</li>
226 <li class='fragment'>Cloud only has private tenant network provided by nova-network and requires floating-ip for external routing (auro)</li>
227 <li class='fragment'>Cloud has externally routable IP from neutron but no neutron APIs (Rackspace)</li>
228 </ul>
229 </section>
230
231 <section class="slide level2">
232 <h1>Maybe in code ...</h1>
233 <pre>
234def get_server_external_ipv4(cloud, server):
235 if cloud.has_service('network'):
236 try:
237 server_ports = cloud.search_ports(
238 filters={'device_id': server.id})
239 ext_nets = cloud.search_networks(filters={'router:external': True})
240 except NeutronClientException as e:
241 pass # fall through
242 else:
243 for net in ext_nets:
244 for port in server_ports:
245 if net['id'] == port['network_id']:
246 for ip in port['fixed_ips']:
247 if _utils.is_ipv4(ip['ip_address']):
248 return ip['ip_address']
249 ext_ip = get_server_ip(server, key_name='public')
250 if ext_ip is not None:
251 return ext_ip
252 for interfaces in server.addresses.values():
253 for interface in interfaces:
254 if _utils.is_ipv4(interface['addr']) and \
255 _utils.is_globally_routable_ipv4(interface['addr']):
256 return interface['addr']
257 return None
258 </pre>
259 </section>
260
261 <section class="slide level2">
262 <h1>I think we can do better than that</h1>
263 </section>
264
265 <section class="slide level2">
266 <h1>What am I doing about it?</h1>
267 </section>
268
269 <section class="slide level2">
270 <h1>os-client-config</h1>
271 <h3>http://git.openstack.org/cgit/openstack/os-client-config</h3>
272 <p>A library to handle config information for openstack clients</p>
273 <p>Tracks differences in vendors that can't be discovered</p>
274 <p>In use in python-openstackclient and ansible</p>
275 </section>
276
277 <section class="slide level2">
278 <h1>os-client-config</h1>
279 <p>~/.config/openstack/clouds.yaml</p>
280 <pre>
281clouds:
282 hp-mordred:
283 profile: hp
284 auth:
285 username: mordred@inaugust.com
286 password: XXXXXXXXXXXXX
287 project_name: mordred@inaugust.com
288 region_name: region-b.geo-1
289 dreamhost:
290 profile: dreamhost
291 auth:
292 username: montay6
293 project_name: dhc2111978
294 password: XXXXXXXXXXXXX
295 region_name: RegionOne
296 </pre>
297 </section>
298
299 <section class="slide level2">
300 <h1>shade</h1>
301 <h3>http://git.openstack.org/cgit/openstack-infra/shade</h3>
302 <p>A library to wrap business logic around client libraries</p>
303 <pre>
304cloud.create_image('image-name', filename='image-filename.qcow2')
305cloud.create_server('my-server', image='immage-name', auto_ip=True)
306 </pre>
307 <p>In use in Infra Nodepool and ansible</p>
308 </section>
309
310 <section class="slide level2">
311 <h1>ansible</h1>
312 <p>Brand new modules, based on shade</p>
313 <p>Coming in 2.0 release</p>
314 <pre>
315- os_keypair:
316 cloud: hp-mordred
317 name: mordred
318 public_key_file: ~/.ssh/id_rsa.pub
319- os_image:
320 cloud: hp-mordred
321 name: Monty Ubuntu
322 file: ubuntu.vhd
323- os_server:
324 cloud: hp-mordred
325 name: my-server
326 flavor_ram: 1024
327 image: Monty Ubuntu
328 </pre>
329 </section>
330
331 <section class="slide level2">
332 <h1>ansible</h1>
333 <p>multi-cloud support</p>
334 <pre>
335- os_keypair:
336 cloud: "{{ item }"
337 name: mordred
338 public_key_file: ~/.ssh/id_rsa.pub
339 with-items:
340 - vexxhost
341 - rackspace
342 - mordred-hp
343 - ovh
344 </pre>
345 </section>
346
347 <section class="slide level2">
348 <h1>What should we do about it?</h1>
349 <ul>
350 <li>
351 Get back to basics
352 </li><li>
353 shade existence is a bug
354 </li><li>
355 Make some decisions about divergences in the basic levels
356 </li><li>
357 Take a stand even if one of our product managers disagrees
358 </li><li>
359 Ensure that simple things are simple
360 </li>
361 </ul>
362 </section>
363
364 </body>
365</html>