 Okay. Hello everyone. Welcome to You've Got to Stack Somewhere. It's a hands-on workshop with the OpenStack command line interface. My name is Matt Dorn. This is Wade Lewis. Hello. These are Rackspace folks here that are going to be helping out today in the crowd. Rackspace engineers and architects that will be here to assist. If you have a problem today, we're going to be doing quite a bit of command lines. So just raise your hand and they'll come and help you. That way we can proceed forward with the rest of the talk. So they're here to help out. Yeah. So we want to get through this. We're going to be experimenting a little bit here. So we want to get through this as quick as possible, but making sure it's efficient and you guys are grabbing the concepts. Okay. So if you do have a problem, any question, just raise your hand. A Racker will come and assist you. Okay. So let's start off with some context. Okay. First of all, I want to find out who you guys are. I see a lot of apples in the audience, some windows. How many people actually use windows on a daily basis? Awesome. That's like a little less than half. How about Linux? Wow. Mostly Linux people. Okay. How many of you use Apple? Apple people. Okay. Cool. How many of you consider yourself VMware people? You live in vSphere. You're constantly using vSphere web client. You're waiting for it to load. You're watching the little things spin and nothing's coming up. I know. I feel you. I know. How many of you use Amazon web services? AWS. Okay. A few of you guys. Okay. How many of you use OpenStack on the dashboard but not the CLI? I'm really interested in knowing about this. How many of you guys just use the dashboard but you've never actually touched the CLI? So one, two, three, four. Okay. About five people. Okay. That's interesting. Okay. How many of you are engineers? Can you just consider yourself an engineer? Okay. How many of you are developers? Okay. Cool. We have some developers here. And how many people are in management? A couple of people. Okay. In the back there. Okay. How many of you remove a USB stick from a computer without seeing if they're moving by hitting the eject button? Yeah. Same here. Us too. Yeah. Yeah. Okay. So again, fanatical support is what we're all about at Rackspace. So anytime during the workshop you get confused, something's not working, you have a question, just raise your hand. One of these guys will come over and help you out. Okay. So why are we here? We're going to tell a little story. I know many of you probably know this but I think sometimes when we're walking around in the summit here, all these terms flying around, we kind of lose the timeline. So what we're going to do here is we're actually going to go back in time a little bit. So why are we here? Back in the day, there was a developer, right? We wanted to put an application on a server, a physical server. At one time there was a person, a developer, who put an application and an actual database on a single physical server. This is a little before my time but someone had to have done this at some point, right? It had to have happened, right? What's the problem there? Single point of failure, right? Problem. So what do we do? We got a little smarter. We said, let's take the database, take it off the physical server, put it onto another server. Okay. What's the problem here? So, anybody? There's no right answer. We're just talking. What's that? Single point of failure. Single point of failure. Exactly right. Okay. Then we said, okay, let's do two physical machines, put that thing behind a load bouncer. We're all set and ready to go, right? Look at the database down there. We've got to replicate that to another physical server. Okay. This is all the headaches, all the pain that we used to deal with. How many people here used to deal with this kind of stuff? Okay, so quite a few of you. Do you remember? Okay, cool. And things are good here until what happens? More people are accessing my app. It's getting popular. It's on Dr. Phil or something like that. People start going in there, accessing, hitting my site. So what do I have to do? I have to call up Dell. I have to call up HP, get more physical servers. Okay. And this is just going to be a mess. Okay. We've got to replicate that whole thing to another data center. All right. So in 2003, 50 Cent had a number one hidden in the club. You guys remember this song? I don't have an audio hooked up, but Spotify. It's very popular. Okay. Mac and Media Flash ruled the web. You remember when you couldn't go to a restaurant website without like the music playing and said rendering? Remember that? And then here's a press release from Palo Alto in November 2003. This is VMware Incorporate, the global leader in virtual infrastructure software for industry standard systems today. Now it's the availability of VMware Virtual Center, featuring vMotion. How many of you guys know what vMotion is? You're probably wondering why I would tell my vMotion at CLI lab here. Okay. But we'll talk about this. So vMotion kind of changed the game a little bit. We have virtual machines here. Okay. If one of those virtual machines goes down, it can automatically get put to another hypervisor. If one of those physical servers goes down, that virtual machine automatically moves to another hypervisor. We have some shared storage here. Okay. And what do you think about this? So that's pretty amazing, right? But then the game kind of changes a little bit. So we have this enterprise virtualization 2.0 model. That's what we're going to call this. Many of you probably are running vSphere, maybe in your environment. Okay. But then in 2006, this is an actual press release. I looked this up. This is from Jeff Barth from Amazon. When EC2 comes out. Okay. So those of you that know about Amazon know about EC2. This changed the game, right? Because you have a credit card on the file. You're a kid in the basement. And this really provides power to developers. You can build your next hit, your next app on this thing. You have the limited resources. Okay. So developers build applications. They don't manage the data centers. You can quickly scale your application during times of success. So you can just go ahead and spin up how many ever you want and quickly handle failure elegantly. Okay. The thing fails. So this totally changes everything. Now, everything is great. Everyone is using AWS. But what's the problem here? The problem is that security is definitely a concern. Okay. Because your VM is sitting there. Your instance is sitting there with other people. People don't like that. Right. Security is an issue. And vendor lock-in. If I'm a developer and I code to AWS, it's going to be hard for me to migrate over to another cloud provider. Right. Because those APIs are different. Okay. And this kind of spawned what we know now is the open-source cloud awards of 2009. Okay. Eucalyptus, open nebula, open sacs. And we all know who kind of won this, right? Right. So over here. Okay. So those are two clouds, basically, that we have to understand in our head. Open sacs is a different beast. Right. Different than our beast for the world. See, with Virtual Relations 2.0, you have a GUI, you have a smart hardware. You have to add more resources to a VM. Okay. You have to scale up. Usually proprietary. Traditional software development. Cloud computing. AKA elastic cloud. As we have an API. Right. Commodity hardware. Add more into the scale out. I'm assuming you guys are familiar with the scale up, scale out concept. Typically open-source. We use a cloudy development model. Okay. Now, about your lab environment. Typically an open-sac lab environment. How many of you, again, consider yourself familiar with, pretty familiar with open-sac infrastructure? In general. Okay. So, typically in an open-sac lab environment, you have a couple controllers. You have a network node. A couple of network nodes for HA. Computs. Storage. But the environment you're going to access today is an all-in-one environment. Okay. That's powered by our Raxi's private cloud product. That's our opinionated way of deploying open-sac. Okay. And at any time, you're actually going to walk away. This is a live environment. You have internet. Make sure you're on the Wi-Fi. But after we're done, we're going to give you some USB sticks. We have an all-in-one appliance for VirtualBox that you can put in there. And anytime during the summit, you want to play around with this thing, please email me or Wade. Okay. We're happy to come find you. Just tell us where you are. We'll help you get this thing up and running. We'll help you use it. Okay. We'll help you understand it. Okay. So, your Kilo all-in-one node, you're going to be accessing. You're not accessing it directly. You're going to have a, we'll call it a Bastion-type server that you're going to be able to SSH into. And the reason why we're using a Bastion server is because we don't know what kind of weird environment you're running on your laptop. Okay. But the reality is, is that when we provide you with these credentials that we're going to hand out, you can do this from anywhere. With these command-line tools, with these OpenStack command-line tools, you can go into the Apple Store. Okay. And plug in your credentials for OpenStack and start spinning up instances right from the store. You can do this from anywhere as long as you have that client installed. So, understand that you don't have to SSH into anything to use these clients. This is what makes these things cloudy. This is what makes OpenStack cloudy. Right? So, on Kilo, this all-in-one node, you have Keystone. What's Keystone? What does it do? Okay. So, you know, yeah, Authentication, Identity, Glance is what? Images, Neutron, Networking, Nova, these things underneath are the only processes underneath there. Okay. Cinder? What? Okay. Horizon? Okay. In heat or registration? So, guess what? These all have APIs on top of them. Now, there are three ways that we can use OpenStack. In your mind, always be thinking about this. The three ways you can... Do you guys know the three ways? Who knows the three ways? That's right. That's right. It's exactly right. You're exactly right. Does anyone want to say free t-shirt? Maybe we can arrange that. So, the Horizon dashboard, the command line interface, and the API. And guess what? They all use the API. Okay? It's exactly right. So, here are some OpenStack API basics. If you're confused about what an API is, you're not sure, here are the real basics. Okay? So, basically, you send a username, password, an account name, or number, or whatever, to Keystone, right? And it gives you back a token. And something else. Does anyone know what it gives you back? Something else. Two things it gives you back. Token and what else? Service catalog. And a service catalog. I want you to think about this as the token being the wristband at the amusement park and the service catalog being the rides. Okay? To get on those rides in that service catalog, those rides we just talked about, Nova, Glantz, all those great rides, to get on them, you gotta give it a token, right? The token typically expires in 24 hours, but we can change that if we want. And then, after you have the token, to get on the ride, you send your request along with the token, and you get back a response. Now, in here, I want to get a list of all my running instances or VMs. We'll refer to them as instances. And I get back the ones that are currently running. But wouldn't it be awesome if I decided to type that and get that back? Just like that. I don't have to worry about that big blow. That's what the CLI provides for me. It runs the API calls in the background. It's all this. All right? So, everybody open up your Internet Explorer. You have to use Internet Explorer. So I'm sorry, everyone who hasn't, if you don't have Internet Explorer for Mac, it's not gonna work. Okay, that was a joke. Joke. All right. So, open up HTTP, go on, slash slash, summit.cloudtrade.me. Okay? And hopefully it opens up. Okay? And you can see there. Let's see if I can do this here. Here we go. Okay. So we have an open stack cheat sheet. Don't worry about that right now. That's for you to take home, download it, save it. If you have a Windows laptop, please click that link and download Putty if you don't already have it, because you're gonna need something called Putty to SSH into that bastion server. So Windows people, you're gonna plug in the credentials we're about to hand out right here. And then Apple and Linux people, you have it already built in. All right? Easy. Okay. So if we can hand out the credentials now, I'm gonna show you what's on there, what we're working with, what you're looking at. Paul, you need some. Okay, we only have about, how many do we have? Like 70. Yeah, we only have about 74. We can team up if we need to. I think we're gonna have to team up and we should be up and running here. Now the first thing you wanna do is you wanna look at this piece of paper and you look at this, your access node, that's what you're SSHing into. Okay? And then the password is what you're gonna use right here. So you're gonna SSH into the IP address provided underneath your access node and then you're going to use the password that's on here. Now, those of you who are connecting, can you confirm that you can connect okay? Yeah? Okay, good. Awesome. You guys out? Okay. The actual lab we're gonna be doing is available online. So even if you don't get a chance at the moment, you'll be able to see later on at your convenience. We'll have that loaded up on the USB drive. You can do all this. Please SSH as root, not as the user on the piece of paper. Okay? Because what you're gonna do is I want you to, after you connect the SSH, take this piece of paper, you don't have to do this, but to make things easier, rip off the access node. Okay? You'd only need this access node again because we don't trust that your environments are set up properly. Alright? That's the only reason why. Again, you can take these credentials and install the clients at the Apple Store or wherever. They would love that. Yeah, yeah. I know, I'm sure they would. Yeah. Or you could go down to the beautiful front here where the water... What's the name of that? What is the name of that? What's it called? The waterfront. The waterfront. Is it a lake or something? It's an inlet. Oh, it's an inlet. It's an inlet. I'll guess the real term. We have two more, by the way. If anybody doesn't have one, it needs one. Okay. So you could definitely go down there and... Yes. You need one? Step two. So I want the buddy up. Okay. So you could definitely go down there with your laptop and put these credentials in and access this cloud. Okay. So we're going to talk about Keystone first. Now, if you notice, I'm just going to... I'm not going to... I'm not going to go through... We want to use the CLI. So all I want to do is discuss a few key things about Keystone. The most important stuff. Okay. Two years ago, I came here to the OpenStack Summit. I didn't understand anything about OpenStack. I couldn't find a track like this to just tell me what I needed to know to get up and going. All right. Everything was way over my head. So Keystone handles authentication and not authorization. That means those of you who are Windows people, group policy. You know group policy, right? You live in Active Directory, right? You have group policy that says what a person can or cannot do. Keystone doesn't handle that. The policy is handled on the service level. Those services, gender glance, all that good stuff, that's where that policy files and says what somebody can and cannot do. This simply proves that you are who you say you are. And those users can be stored in MySQL database or MariaDB database. They can be stored in LDAP. You can even store them in Active Directory if you want to. But it handles authentication and not authorization. It gives you a token and service catalog. In your mind, when you think about Keystone, never forget this. It gives you a token and service catalog. Tenants, projects, and accounts mean the same thing. It's a weird thing to make things more complicated for you, but tenants, projects, and accounts mean the same thing. Here's an example. I have a couple of different projects. These are all isolated. The Biology Department, Aerospace, and Compsi. And you're going to be hearing about domains. Domains are kind of new. And domains is one level higher. So here we have the Texas Robotics Center, California, New York, and in there I have different projects. I'm not going to get into the details of this, but more or less, this is how you isolate your accounts. If you wanted to get Richard Dytriom, like the 50 Cent album, okay, then you would want to be able to have all of your customers, Starbucks, Tim Hortons, what have you, in different domains, right? Or perhaps different projects. It's the way you isolate your users, okay, or your accounts, your customers. All right. Okay. Now, if you hop on a boot-do box and you want to use Keystone, typically you guys only have user access. We're going to suspend our disbelief for a little bit and we're going to actually act like we're just operators of an open-stack cloud. We're not administrators. We're operators. Okay. Our boss just got a shiny, brand-new open-stack environment and we have to use it. Okay. And we're going to use this CLI to interact with it. So, we hop onto a boot-do box to get the Keystone client. You would actually do App Get, Install, Python-Keystone client on Red Hat. You would do Yom, Install, Python-Keystone client in Windows. If you have Python installed, you do PIP, Install, Python-Keystone client. All right. So, are we ready? Let's do this. Is everybody okay? Is everybody inside? You're ready? Okay. Awesome. So, what you're going to do is you're just going to type Keystone and you're going to notice, what's it going to say? It's not installed, right? So, what you're going to do is you're going to do App Get, Install, Python-Keystone client. Now, to get these commands, you can open up the web browser and click right there on Keystone. I'm going to make this bigger. Okay. I'm going to click Yes. After it's installed, go ahead and type Keystone again. Anytime you type that, just type Keystone, you can see you get the help file, all the different commands that you can run. Okay. Now, you want to type in Keystone Catalog and you're going to see what's going to happen. Okay. If you type in Keystone Catalog, it's going to ask for a concept. If you can just get one thing out of this session, it's that you need those credentials on your sheet in order to use the client. There are two different ways that you can provide those credentials. The first way is via just passing it via the command line. For example, once you have the client installed, you can pass it like that, pass your credentials on your sheet like this, but that's really annoying, right? You wouldn't want to do this all the time. You want to be able to use this thing swiftly, so what you want to do is you want to create a credentials file. So, look, you guys are Linux people, right? I never use Nano, but if you do, it's okay. I'm trying to make it very easy. What you're going to do is you're going to type in Nano and the OpenRC file that we created for you and you're going to put in your credentials found on your sheet. Remember, tear out that access node. We don't need it anymore. We're going to put in your credentials here. Is everybody about at that point right now or do we need to slow down a little bit? We're good? Thumbs up? All right. Awesome. I don't know why it's... Is there any way you can... Yeah, I can probably just move it over. I'll take it out of the whole screen. Okay. So after you get this populated, you're typing keystone catalog. Does everybody get any connection getting in the catalog? Yes? Please raise your hand if you're getting a connection. So some of you guys are having problems. Okay, that's right. Thank you. We do have to source it. You are sourcing it. If you look at the next exercise, you do have to source those credentials. And Matt, just to be clear, this IP you're typing in is what exactly? This is the keystone. This is the keystone endpoint itself? Yes. Okay. So make sure everybody knows. Okay. Now what we're going to do is after you set those credentials, you're going to source the credentials, you're going to bring your session here, your batch session. If you actually look at your variables, you'll see that it's providing the answers to this that the CLI is asking for. So this is just showing you how that works. And then you just do source. And we already did that. Okay, source open RC. And then now we should do keystone catalog. And you should be able to actually get a service catalog back. So please just, can someone just let me know if this is working for you? Is it working? Okay. Good. All right. We're good to go. Now, now that we have the service catalog, we're not administrators, but if you were an administrator, you would use this, you would use keystone. You could say keystone tenant list. And you'd be able to list your tenants. We're always going to have a services tenant. And you could say keystone user list dash dash tenant my project. Look at the users inside there. We have a tenant or project called services or service that has all of our service user names in there. We have keystone user role list. Look at the roles assigned to my admin. You have admin and underscore member underscore. Everyone always gets underscore member underscore. And again, this is what you would run if you were an administrator, but you guys don't have administrator access. But at least you get a visual for how this works. And if you wanted to create a new project, it would look like that in a real-world environment. You'd have these things that are inside these specific projects. Okay? Now, to do anything, I know you guys are probably eager to boot. Who here has never booted an OpenStack instance before? Okay? Awesome. So, you're going to have the opportunity to do that coming up here. So, there's two things that you need before you boot that instance. There are actually two specific things that you need. The first thing you need is an image. And the second thing you need is a network. So you can get to it. A network within OpenStack. Your question? What? For which one? It's it's hanging because it's probably trying to talk to an admin endpoint. You can do a dash-d-bug. You can do keystone dash-d-bug tenant list. It's a private IP. Yeah. That's probably why. You guys are not administrators. If if the endpoint was public and you didn't have the rights, yes, but that that admin endpoint is not. Oh, you're trying to exit out. Okay. Yeah. Thank you. All right. Okay. So we'll talk about glance real quick. We know glance is the image service. Name that disc format. Let's do this real quick. What's commonly used with I'm assuming that most of you guys probably know this. You seem like a pretty savvy bunch. So VMware ESXi, VMware Fusion, VMware Workstation. VMDK. VMDK. Exactly right. Virtual box. VDI. How about an archive file but not a little disk? I so. Yeah. Interviews by Microsoft. BHD. Without Kimu. This one's a little hard for some people that are new to this stuff. QCAL2. Amazon. AMI. And then we have the unstructured uncompressed disk image raw. Okay. So glance simply put. You have an API server that you're hitting. You can put images into it. You can take images out. Glance is you can use anything you want for the back end of glance. We're going to use the actual file system on that all in one as the back end where that image is going to go. We're going to use the actual file system on that all in one as the back end where that image is going to be stored. But you can use S3 if you want to from Amazon. You can use Swift. That's object storage, file system, HTTP. You can use a patchy server, wherever. All right. In fact, glance is really stupid. You could actually put a JPEG or whatever into it. It's not going to care. It's just storing the metadata associated with that image and the image itself. That's all it is. So let's use it. To install it, you do app get install python dash glance client on Ubuntu and on Red Hat yum install python dash glance client and on Windows pip install python dash glance client. Go ahead and do a glance image list. What it's going to do is show you that you have nothing in there. We don't have an image in there yet. We want to boot a VM. That's our goal, right? Many of you haven't boot it one yet. Then you use W get. You guys know W get, right? You guys said majority of your Linux people, right? Get files off the web server. This is what the Zuckerberg kid used to do, you know, I sound like I'm 80, the Facebook. Yeah. So, look what happens when you do that W get. It goes out and pulls down that image. And then when you run this command, glance image create and you can copy this directly from those exercises. All right? You don't have to type this stuff in. It's going to upload it to glance. This is the same thing as hitting the browse button on the dashboard and choosing the file from your local file system. Same thing. Okay? If you're a developer, what method would you use here? What method? Which, to get it, what about to put it in? Post or put? You can do a put, right? Or you can do a put. So, do a glance image list and you should have your image in there. We have a VMDK. Okay? Everybody good here? Is it all in there? Everybody good? Still downloading? So it completed downloading or did not complete downloading? We'll give it a second. Yeah, we'll give it a second. Tell us if we need to slow down a little bit. We're slowing down. It's loose, loose. Yeah. Okay. That's good. Good to hear. There it is. Okay. Now, we're going to dive in the neutron. Show of hands. Yeah, this one, Jordan's coming over to help you out. Okay. Okay. So, neutron, simply put, provides an API to allow your users to create networks, subnets and routers. Here's some terminology you should understand. Think about why you would use this, first of all. If you have Starbucks and Tim Hortons and everybody using your cloud, they need to have the ability to create networks. You provide an API for them to actually contact to communicate with to do that. Understand that it's a two-step process in creating a network. That's a little weird for people. Here we actually say network. Okay. You create a network. You can do a net create. We'll talk about that in a second. That's what a network is in neutron. Then you create a subnet. You specify a cider. Okay. That's the address range for our VMs. And then we have the concept of a port. It's just the key things that you need to understand. A port. A port is, think about a connection point. Think about that satisfying sound when you plug in your wired Ethernet cable. That actual connection point. Just like that. That is the port. There's usually a MAC address associated with that, right? And then here we have a DHCP server. There's another port. So if you understand this, you can understand neutron. Simply put. A funny story is that we actually, we ordered a whole bunch of USB Ethernet adapters and they all have the same MAC address. Pretty sketchy, huh? You remember that? Okay. So the neutron client, you can install it this way. Appget, install python, neutron client. Red hat, yum install python, dash neutron client. And windows, you do pip install python, dash neutron client. Okay. So real quick, I'm going to show you what you're going to do. You do neutron, neutron net list to see if you have any existing networks and guess what you're going to see? You will have one. You might be thinking, I didn't create that. What's that public network doing there? Well, think about it. You got Starbucks, McDonald's, Burger King, Tim Hortons. They all have, they're all using your cloud. They're all going to see this mysterious public network that is sort of lurking in everybody's account. What is that public network there for? Well, that's to give you access to the outside world. Okay. These VMs and instances are useless if you can't get them to talk out. Right? How are you going to run your package managers? How are you going to do, how are you going to run a web server on here? You're going to be able to talk out. That's what that public network is. Do a neutron net create private because that's our own private network that we need to spin up a VM. Then we do a neutron subnet create and create the actual subnet. We specify the cider there. Slash 24. We're kind of lazy, lazy subnetting. We'll just do that because everyone's always does that. Okay. And then we'll just do DHCP 10.002. That is the DHCP server that's going to be pulled out of that pool for the IP 10.002. Okay. So the net create is what exactly? Hanging? We can try. We work through this a few times. Let's see what happens. Is it working for anybody? Raise your hand. We'll take a look here and see. This is what we do for a living. Fix open stack. What users are they logged in as? Root? Okay. Let's make sure after so many. That's possible. Did it work for anybody at all? Okay. So a few people. I think he was probably the first guy that got it in there. No, I think it was a scale problem we have possibly. Let's see here. No, it's a little for allocation. We're taking a look here. Let's give us a second here. We're working on the back end. Pay no attention to the man behind the curtain. Yeah. I promise you, I feel so bad that these people have never spun up a VM before. All you wanted to do is spin up that VM. It's going to happen. We're going to make it happen. We're going to get there. How many here have actually used the Neutron client to create networks? Subnets. Okay. So this is all pretty new territory. That is true. You can. We'll get there. I mean, well, in this environment, you wouldn't be able to access that yet. Yeah. If we can't get it up, then we'll go ahead and we'll spin up an instance without the. We're restarting the Neutron server. I'm making a few changes on the backside. Yeah. Just a few seconds here and we'll have it. Is anybody here running Kilo yet? In production? No Kilo's. Oh, one. No. About Juno. Icehouse. Icehouse. Icehouse. Icehouse. To upgrade. This is why nobody does live demos. It's scary. What's up? Okay. So it looks like it's working. We've got a third of it. There's a few back servers that we're modifying. I want to restart a few of the Neutron services. One more. One more. The range of tenant network range. Tentate network range. If anybody has used OpenStack before, you'll know that the defaults are generally pretty conservative. So the first thing you run into is a quota issue of some sort. And knowing that, we should have probably adjusted it in hindsight. Right. What's OpenStack conference without a broken OpenStack? Okay, let's give it a shot. We got it. Okay. So we've created the network. And the next thing we're going to go ahead and do, create our subnet. Notice how we're specifying our range? Yes. No. You guys are all in a different tenant. Tenet 50, the number. Tenet and the number afterwards. You're all in a different tenant. So go ahead and run the subnet create. Notice how we're specifying the DNS server there? You guys know what that is, right? Google. Okay. So let's go ahead and do Neutron net list. Then we'll do Neutron subnet list. There's our subnet. There's our allocation pool. You guys remember what the DHCP server got? What IP address? What do you think? Well, I want you to think about this. When you guys are creating your subnets with this client, you've got to think about the IP addresses that have to be handed out to certain things, right? So you have 10.0.0.1, which is going to be a router. You might be thinking, well, we don't have a router. Well, guess what? It saves it because when you do create one, that's the IP address it's getting. And the second thing is going to be the DHCP server. 10.0.0.2. All right? And what do you think 10.0.0.3 is going to be when I boot a VM? What is that going to be? The instance IP address, right? So let's go ahead and we are going to move on to Nova. And real quick, if you guys want to know what the deal is with Nova, you should probably already know this. We've been walking around, but we all know Nova's not a hypervisor, right? It's just the layer on top, right? Questions so far? All right. So do you want to go ahead and walk them through the Nova exercises? If you want to install the client. If you don't already have the client, we're going to be that part in the lab. This is the fun part. This is where we actually get to boot an instance. So if you notice, you type the Nova command, and it probably should give you just the help returned after you install it. Let me see you click the button here. Go ahead and install it if you can. App, get, install it. Get ready to load the Python Nova client up. See if we can't get an instance boot here. If you type Nova again, you'll see it gives you a bunch of different options for the many parameters it has and features it has. Let's go ahead and just do an image list. And stop me if I'm going too fast. Because this is all very familiar to us. So if we're moving too quick, we'll slow it down. Yes, sir. There's a few. I couldn't name them off the top of my head. Basically, they both give you an insight into the image structure for OpenStack. Glance is going to be more particular, obviously, as it interfaces directly with the API. But that's kind of the nature of OpenStack across the board. You'll see a little bit of overlap among the clients. And so each kind of does a little bit of this and that, especially between Nova and Neutron. It's a very common thing to see. And from what I understand, we're actually moving forward to this all-in-one type client for all the different services. But that's in the future, I think, to solve a lot of those same questions. Okay. The question is, will there be a list of information that comes back from Glance that would not appear on Nova? It's using Glance to get that information. We'll double check and we'll definitely get back to you. Yeah, thank you. Glance would also show all tenants as well if you wanted so in Nova. So let's take a look at the flavor list here. Who here is familiar with what a Nova flavor is? Right? It's basically how you set up your VM. Disk, memory, CPU, t-shirt size, however you want to call it. It's basically the resources that you're going to assign to a particular VM. So what we're going to use here is the M1.micro flavor. And you can see just how it's specced out. Now notice here, we have how much memory it has, 256 megabytes, pretty small. We have a disk in ephemeral. When you see that disk in ephemeral, I want you to think C drive, D drive. Those of you who are Linux, I want you to think forward slash dev, forward slash what? VDA, VDB. Okay, that's what that is. That's the storage that's actually on the compute node itself. All right? C drive, D drive. Swap, we all know what that is. You want to allocate some swap space so you can see the memory on the machine. VCPUs, we know what those are, virtual CPUs. Received and transferred factor. We can actually alter the bandwidth coming out of that VM. One means 100%, but we can change it to like maybe 0.5, do half. Maybe you want to throttle particular people or on a certain flavor you don't want using all that bandwidth. You can lower that, turn that knob down a little bit. And then we have, it's public. Does everybody have the ability to utilize this flavor? Yes. Okay? Everybody across all tenants. This may be a generic version that you let your tenants use across the board. So all right, let's get to the good stuff. We've got the flavors, we've had our images. We're kind of building this thing up, these list of requirements that we need. We've set up our network. Okay? So we're going to be able to tie our thing together here with this last command. We're going to tell Nova to boot. Now, if I may, one of the features we haven't listed here is a debug option. You run into problems like we did today. We can get the client to tell us a lot more information back about what is actually going on and the type of response it's getting from the API. So we're going to go ahead and boot. You guys ready for this? Is anybody ready? Are you guys ready? We're launching the instance. This is it. I mean, if you haven't done this before. Payton's R, you probably already ran it. I'm guessing you probably ready. You probably ready. Everyone here are overachievers. All right. There it is. Boom. That's it. You're asking yourself, what is all this information? Well, this is all the metadata surrounding the actual instance. What it's got assigned, the image type, the ID. If you know anything about OpenStack, you know that ID is like the core of what you work with. Right? You attach it, show it, grab it from logs when it's not working. You can see the flavor type. You can just get a very high-level overview of what's going on. You can see that OpenStack's building it, scheduled it. And if you do the next command here, the NovaList, you can see that it is active and running. The ID of the instance, its name, its power state, and the network it's assigned to. And as Matt mentioned, it got the .3, right? So the first available, it picked up. It was assigned via DHCP, and we're off and running. So let's boot another one. Click that there. It's doing its thing. We go back and see the NovaList. And sure enough, our other one's already up and running. It's consecutive order, got .4 for the IP. And we've launched two instances. So let's take a look at it a little bit. Question. Yes, sir? The question is, how did it know to connect to that private network? Because that was the only network that you owned in your tenant. Your tenant, what is your tenant, sir? What is your number? Your one. Your one? Like the number one? So tenant one owned that private network. And it was the only one available to it. So it spun up the VM on that network that was only available. Yes. The default network. Yes. Yeah. And the second exercise coming up that we're going to do, you actually are going to force it to go on a specific network. Okay? We'll show you how that works. Coming up. So the really cool command here, NovaConsole-log. My first instance. This actually is just like turning on that VM. It's just like turning it on. Okay? You turn on the VM. The thing, you can see, you can see the whole emit stage, everything coming up. It's booting. It's booted. And then you have this login. But guess what? This is not how you actually log into the instance. This isn't it. To actually log into this thing, there's a couple different ways. But the way we're going to do it here is we're going to use something called SPICE, which is comparable to VNC. How many of you guys have used VNC? Just show your hands. And stuff's broken. Okay. Yeah, we all know VNC, right? We use it all the time. So go ahead and run that command. And you're going to get a URL. And like I mentioned before, you have to use Internet Explorer in order to use, in order to see everything in here. Okay? So if you don't have it on your computer, it's going to be a problem. Bad joke. Okay. So. Too soon. There we go. Put that link into your browser of choice. You have their prompt here. This is actually Ceros. I don't think I mentioned the operating system. Ceros is what we always use. It's really quick. It's really lightweight. We could, of course, do a boon-two if we wanted to, but it takes a little longer. Yeah. Yeah. Ceros is nice because it's so lightweight. You can do a lot of quick testing with it. And the SPICE console here, this is great, too, when you're running into trouble, right? Like, you can't get in over SSH for whatever reason. Your puppet config didn't work. Your Ansible Playbook didn't lay down SSH, right? So you need to get in. You've got this back way to get in here. And that's what we're going to show you. So if you're curious about the username and password, it's actually really easy to miss. So don't feel bad if you can't figure it out. Ceros has a login as. It's Ceros for the username. The password is Cubs win. Smiley face. And a smiley face. Yeah. Oh, the question is, is SPICE the default console for Horizon out of the box? I think it is not at this moment. It's always been NoVNC. Yes. Yeah, you would have to configure yourself within the Novacomp. So once you're inside, go ahead and try to ping 10.00.4. And you should get a response back. Everything's good. To quit the ping, if you don't have the dash C there, just do control X or control C. And you can even SSH into that instance if you wanted to. You could actually just do SSH, Ceros at 10.00.4. Yeah, that is correct. And you know what? We'll have an exercise coming up if we make it. We're pretty tight on time, but we're actually going to do it from a floating IP. And we'll talk about what that is if we can get to that. OK. So I'm not going to go in. I'm just going to say no, but you get the idea. This drives home the point. So we can just go ahead and close this SPICE window here in our browser. OK, and we'll move on to the next step. Is everybody good? Everybody OK? All right. I'm glad it's working. Let's move on to Cinder, one of my favorite topics. So real quick, I want to show you this because if you wanted a real visual for what just happened. OK, I'm going to just run this really quick. I don't mean to be stuck on Nova, but you did a Nova image list. You did a Nova flavor list. You booted an instance. It fetched that image from Glance, that image that we put in there on the second part there. And it wrote it to the file system because that's the default store, backend store, for Glance. And then it fetches it and copies it from Varlib Glance images. That's the default store for Glance. Copies it down to Varlib Nova instances on the compute node. Underscore base, underscore base. So that image has been copied and uncompressed. It's compressed in Glance. Once it's laid down in the compute node, it's uncompressed. So then it gets an IP address. You can see here. We booted another instance. And we're all set. Cinder. Block storage. How many of you guys are using block storage devices in your environment now? Yep. Awesome. EMC devices, et cetera. Well, we're going to do that with commodity hardware now in Cinder. And Cinder basically allows you to go and add block storage to these VMs that you've created. If you need a D drive for your application, guess what? Cinder is going to be the guy to do that for you. Now to install the Cinder client, when you think about Cinder, just like Wade said, just think about a USB drive. It's the simplest way to think about it. USB drive, right? What do you do with this thing? You plug it into one VM at a time, one computer at a time, that is. You can't plug it into multiple computers. You plug it into one computer. You format it. If you are using Cinder and you have a Windows instance, what's going to happen when you attach a block volume? What's going to happen? That little window pops up, right? That little bubble on the top, right? Are you going to disk management? Is it still called disk management in Windows? Windows people? Go in there. You're going to see that you have something newly attached. And then if you actually go to your Linux, I mean, just do a watch on FDisk, right? And you'll see it appear there, magically. It's pretty cool. So to install it. App can install. You'll do this for all your clients. Basically, this looks very familiar, right? We've seen this movie before. So time to attach. So this is how it's going to work. And I'm going to show you really quick. What we're going to do is we're going to do Cinder. Cinder type list. You might be wondering, well, what the heck? What are these types? What's going on here? Well, think about it. If you're running a cloud, right? And you want to offer those of you who use AWS. You know how you can get like SSD or you can get SATA? You have different flavors. You would have two types. You would have like your old junky SATA drives that have been sitting around for a long time as like a certain flavor, right? Or a certain type, excuse me. And then you might have those new fast, great SSDs as another type. So we'll say we have two types here. We have one that's good and one that's best. If you're curious what's going on behind the scenes, we're just talking about the client here. It's just LVM. Those of you who know LVM, take multiple physical disks, take those physical disks, put those into a single volume group. These are two volume groups. Good and best. Two volume groups here. We're going to Cinder create one as in one gigabyte. Dash-volume type best. Display name my first volume. And guess what? You own that volume. It's carved out a piece. It's done an LV create, a logical volume from that physical volume best. Excuse me, volume group best. And it's carved out. It's done an LV create behind the scenes. And it's you own that little volume there. And how does it get to the instance? What's the transport? What do you guys think it uses? Any guesses? Ischuzzi? Ischuzzi? Yeah, that's exactly right. That's exactly right. It uses ischuzzi. So what it's actually going to do is nova volume attach. You put the instance ID and the volume ID. Now, those of you who copy and paste this part in your exercises, you're going to notice it's going to come back. If you just copy and paste it, it's not going to work. You need to put nova volume attach, the instance ID, and the volume ID. The name of the VM and the idea of the volume. Or the idea of the instance and the idea of the volume. And look what happens. When you do that, an ischuzzi connection occurs. Just like that. This is great because a lot of you already have your ischuzzi networks for shared storage. So you plug it right into that and you're good to go. And then if you want to do a, notice how it appears, forward slash dev at VDB. And then you do a detach and it goes away. But you still own it and your data is still sitting on that volume. All right? Yes. You can actually do auto. You don't have to. There's an auto option. Yeah, it should work. Let's jump over real quick and do this. We go to sender. We're going to install the sender client. And then we'll just do a sender list. Sender type list. We'll create our volume. Okay? We'll do a sender list. All right? That's the ID for our sender volume we created. We'll do a nova list. And then we'll do this nova volume attach. The name of our instance. We'll do my first instance. And then we'll do the name of our volume there. And it's attached. No. You can't, I don't think from this, you have to use ID here. You can't do this one by name. And after we do that, we're going to do a nova get spice console. And we're going to get that same link there. Put that in. Okay? So my session is still open there. Fdisk sudo fdisk l. I should see I have VDB there. So what I want to do is I need to format the thing. And do you want to walk through? Sure. Yeah. So what we're doing here is Matt's going to go ahead and put the ext3 file system on the actual block device he just attached to his instance. Okay? Are we going too fast? We moved through those steps very quickly. Let us know if we need to slow down. Right? So once you format it, it's good to go, right? You right click windows, you format Linux, Mac. You go ahead and lay down the file system. We're going to use ext3 here. And we're going to go ahead and mount it up on a directory called extra space. So Matt created a directory. We're going to tell it, mount this file system onto this known directory called extra space so we can get to using it. And we're going to create some files here within that. Storage space. And if this is successful, we'll have added a file to the actual volume that we attached. Awesome. Take a look at it here. There it is. The file is sitting there on the volume. And now we're going to go ahead and mount it. You can also use dmessage. It's a great way to see what's going on whenever you start doing stuff like attaching devices. The kernel will yell at you if it sees a problem. fdisk is another great way to see what you've got as far as block device storage. Okay. Neutron part two. Okay guys, so this is what we should have right now. Everybody should be here. You've got a volume. It's not connected right now, but you own it. You have two instances. Pretty cool. You have this public network that's lingering in your tenant or project. All right. And what we're going to do is we're going to create another subnet. We're going to create another sub. This time it's going to be 10.1.0.0 slash 24. Notice how it's going to get the DHCP is going to be 10.1.0.2. We're going to say nova boot dash dash image. And notice this time, okay. We're moving quick. These slides will be available, by the way. So we can go back through and actually do the lab with the slide and see the animation and kind of there's a lot going on here, right? We're not doing this. I just want to show you this what's actually occurring. The problem here is that I don't have a second monitor. So it'd be nice to be able just to kind of while we're going through it, we could show you this somewhere else in the room so you can watch it. So before we actually put the commands in, I'm actually just going to show you this on what we're going to do first. This is what we're going to do. So notice that when we boot it this time, we're booting it this time. We're actually going to boot it and specify the network that we want to boot on. And we're going to specify the IP address. And when we boot that thing, it's going to be connected to our second subnet. And then we're going to try to log in there and we're going to try to ping. From my first instance, that's the one that we've been working in, the VM that we've been working in. We're going to try to ping that guy. Okay, the new one we just spun up. What do you think is going to happen? What do you think is going to happen when I try to ping that? It's not going to work, right? Why do you think it's not going to work? You need a router, right? We're going to have to create a router. So what we're going to do is create a router, neutron router-create, my router. Just like that. And guess what? You own that router. So Starbucks is spinning up routers, McDonald's is spinning up routers, Burger King, they're all spinning up routers. They own those routers. You run this command, neutron router-interface add, my router, and then the name of the subnet that you want to connect to that router. And it looks in your mind, when we work with this stuff every day, there are levels of, this is what's going on, right? So this is what you should be imagining. That subnet connecting directly to the router. That second subnet connecting directly to the router with that command there. Notice how that router gets the IP address that was allocated to it there when we actually created the subnet. And then we're going to try to ping, and it's going to hit the router first. And then is it going to work this time? It's going to work. Everybody get it to ping? Yes? Way behind? Sorry, we'll get the slides for you. Is everybody way behind? Do we need to stop? We have a question back here? Jordan. Yep. On the way. We will... Actually, are they on the USB drive? No, they're not on the USB drive. No, we'll post them on... How will we get them? Well, I think there's a, isn't there a shared site for like open stacks on it? Or you can actually all access all the slides from the... Yeah. Okay, yeah. All right, cool. Take a look at your network IDs. So this is going to fail here. Okay. So we got to spin up the router. The question is what again? I'm sorry, I can't hear you. Quota. I'm getting quota exceeded. Jordan's going to come over and see. Wait, maybe it's mine. No, it's right. I think it created it. Yeah, I created it. Okay, it's my fault. I was trying to create one in the one. So I went through. I think we ran it. Yeah. Okay, so we do a neutron port list. Remember what the port is, right? That connection point. So those are the things that are plugged into the router. And now we should be able to ping. Okay? Should be getting reply. Now, just to show you what we're going to do, the final goal here. Floating IPs. Is the idea of the floating IP. Think about this. If you're the operator of your cloud, right? And you have installed a web server on your VM. Apache, Nginx, whatever. How is your boss going to actually get to that instance? How is your boss going to access that, not even that instance, that web application that's sitting on there? How are they going to get to it? You can't give them the internal IP address, right? You've got to give them an external IP address. Well, how does that going to work? Well, what we have to do here is we say, Neutron router gateway set. My router. And we use that public network that sits in our, we all have access to. And that will actually connect that router to the public network. Now, when you do this, what it actually does behind the scenes, those of you familiar with IP tables, will create a SNAT rule. That's SNAT rule. All right? And what that means at that point is, you wouldn't use this at this point. People are not going to be able to talk to you. But guess what? You should be able to, at that point, when you run this command, go into that instance and ping openstack.org. Okay? You should be able to. You now have access out. All right? You now have access to the outside world. All right? Now, we don't have a one-to-one relationship yet between an IP address from that public subnet pool and an instance. We haven't done that yet. Right now, we just have access to the outside world. Our instances should be able to talk out. Then, we're going to go ahead and ping openstack.org. That should work fine. We'll do a Neutron port list. Now, you can, I don't want to be going quickly. I'm showing you how this, just the, you know, what we would do here. Neutron floating IP-create. This is actually the IP creation. It's going to pull an IP address. When you run this command, you get the instance ID, or it actually should be the port ID there, that you get from the previous command. And it will create a denat role in there. And that's where we get our one-to-one relationship between that instance and an external IP address. Then, of course, we have to add security group rules. I was going to say, just to remember, that instance ID there in the example is actually the port ID from the previous command. Yeah, it will. So the port that you're looking for is your my third instance port, or first instance port, actually. Yeah, the my first instance port. So that should be, if we walk over to their exercises here. I think it's the first one on the list. Let's see. Right here. So we go to the port list. You do a Neutron port list. We go to floating IP-create-port underscore ID equals, and then you're going to get the port associated with 10-003. 10-003 is my first instance. Question. Floating IP basically allows you to assign a particular IP to another VM. It basically, quote-unquote, floats, right? You can move it from instance to instance. So if you have that IP there for a reason, it's specific to an application. You've got a few different application servers. If you need that IP, you can move it around to each different VM. Yeah. You could do it. Exactly right. It's an address translation. The instance itself will never, the fixed IP that you get when DHCP ends it up, that's always going to be on the instance itself. There's the nath between the floating and the instance. The public network. Yeah. And just so you know, that floating IP address that you're going to get is not a true external IP address. So we have to suspend our disbelief there. Okay. But you can see there. I can talk to Google. I should be able to do opensack.org. Should be. Yeah. There we go. Okay. And then creating the floating IP. Neutron port list. We want to find 10-0-0-3. It's the first one on our list. We're going to use that ID right there. And this is where we can see the relationship between that internal IP and that external IP. And AWS, what do we call this? Elastic IPs, right? So it's right here. 172.29.248.34. Now obviously in order to get to SSH into this thing, we'd have to open up port 22, right? But here's the deal. What if we wanted to have someone access our web app? On just a regular web app. What port would you want to open up? Yeah, something like 80. What do you think it does behind the scenes? What do you think it's doing behind the scenes? To actually IP tables. Exactly right. It's just IP tables. 15 minutes. Okay. So we're going to go into our third instance. Okay. Log in. And then I want to go ahead and I want to try to ping that floating IP that I received. And I should get a response back. In fact, I can actually SSH via that IP address as well. So in a real world scenario, as long as we had 22 open and you can notice with the security group rules how we're saying from anywhere. ICMP2. And ICMP for ping. Okay, you've got it there. And then what you want to do is just want to go ahead and delete everything and blow everything away. One more time? Yeah, although you probably will still have a, the network is still there. Okay, and there's something called a namespace which will still be there. But the instances themselves should be gone. But the network is still there. If you have a router issue, then we would be diving in the namespaces, the concept of namespaces, how do you go into namespaces. We'd be looking at IP tables rules within the router namespace. Whole line of different ways we could troubleshoot that. But you would have to obviously be familiar with Linux networking. Yes, sir. You know, the answer to my question is it's basic. There's a guy next to you who wrote the book on Neutron. So he can answer a lot of those questions too. I think it's pretty straightforward. IP tables, right? Some ARP entries, some NAT entries, IP tables. I don't believe you can, no. Yeah, it's a very basic, it's a very basic router, okay? It's very simple. D NAT, SNAT. Yeah, it doesn't have anything crazy. You can disable SNAT if you want to, but it doesn't have... That's about as fancy as it gets. Oh, SCF and stuff like that. No, it's not like that. Okay. We are at seven minutes. Okay, so real quick... Is that right, seven minutes? Let's talk about... About ten minutes. Okay, ten minutes? Okay, cool. Let's talk about automation. Let's talk about how this works, okay? Now, those of you maybe unfamiliar with this? The EC2 metadata service. When Amazon came out, and people started using Amazon, there's this thing called the metadata service. How many of you guys have heard of metadata service? Before. Only a few people. Okay, so basically when the instant spins up, there was a way for it to contact during a NIT, during startup, it would actually talk out to a metadata service that was a non-routable IP address available at 169.254, 169.254. You guys know what SSH key pairs are? Right, we have a public key and a private key. They help us get into instances without being prompted for passwords. Really important when you do what this whole DevOps config management thing, right? So imagine if a SSH key pair, the public key was stored in Amazon, or somewhere in this metadata service. It's gonna bring down that key and put it on the actual instance so you can get in with your private key. You can not only limit it to SSH key pairs, you can put bash scripts in there, the instance name, it can retrieve information out of this thing. So this was really awesome. People started really getting into this. But when OpenStack came out, they said, okay, we'll do this whole metadata thing. We'll do this. We'll have a 169.254, 169.254, and they did that. But then they came out with something called config drive. Okay, so here's EC2 metadata service. We have this ability to hit this metadata service, get the stuff we want. And we first of all, we have to make sure that we have cloud init installed on those images. On those glance images, you gotta have cloud init installed. You can say app get install cloud init, yum install cloud init, or cloud init for Windows. You gotta have this thing installed in order to talk to the metadata service. What we're gonna call data sources. So back to OpenStack. OpenStack's version of this metadata service, their cool twist on it, is basically let's take that metadata service and bring it closer to the instance, to the point where it's actually an optical drive. That optical drive actually connects to the instance at boot. And it will grab information, cloud init will grab information during init out of that optical drive. Okay, there's tons of stuff in there that we can actually check out and see. And that's what config drive is. Bring the information closer to the instance. And this is when we get into doing crazy automation, whatever buzz word, you know, people like to be saying lately, that's what we're talking about here. So if we bounce over real quick, I think we might have a few minutes to try this out. Does everybody moved on from the router part? Good? Yeah. No, it's one or two. Okay, just let us know. I'll help you out with it. So when you install cloud init, I just wanna show you this real quick. When you install it for the first time, and again, you wanna make sure this is on your image, Serious has a light version of cloud init installed. No, we're showing one quick thing here. So this, I'm just showing you, when you install this thing on your image, it gives you the option of using data sources. Okay, you have this, and data sources can be, they can be an EC2 metadata service. They can be the config drive for OpenStack. And basically you can set a priority. You can say, hey, when this image boots up, will you please look to see if there's a config drive? If there's not a config drive, can you please look to see if there's an EC2 metadata service? And that's not there. You can use, you know, one of these other, maybe look at a file that should be already on the file system. These are what we call data sources. Just something that, when that instance boots, it can grab information. So I just wanted to show you this. It's kinda cool to see the configuration screen. So, key pairs. We said private public key pair. Key pairs are stored in, on the config drive, in OpenStack. And we can actually prove this to you by creating a key pair. So we run this nova command, key pair add. So we'll do that. We'll add the key pair. We'll trimot it. And that's important because the security settings have to be pretty tight. Otherwise, you'll get complaints. It won't work. And that's by default and by design. Okay. So there you can see we booted the instance. Gave it the key name, my key pair. Right? We took a look at it. And we're gonna take a look at the console log and take a look and see what is actually happening when this thing boots up. But we're gonna grep for the word data store. That means we're just gonna grab that string. Yeah, and you can see right there, it's like Wade said, config drive is one of the primary data source that's set there. And that was probably the first one you chose when you configured it, right? Yes. So now what we're gonna do is we're gonna hop into the instance, get that URL, log in with seros, cubs win. Okay, now what we wanna do is we want to run this command block ID. Most of you guys are Linux people. So check it out. DevSR0. What's SR0? Optical drive, right? Let's look what's on this thing. What's on this config drive thing? So we'll do pseudo mount, devSR0. We'll just do the mount directory. We'll go inside that directory. What's inside there? We have... Let's look inside the open stack directory here. A couple... Then we have this thing latest. And then we have this JSON file. All right? And if you're not familiar with what JSON is, it's basically a superset of XML, this machine readable format. And check it out. There's our public key. Sitting in there. So what it did was the instance spun up. It mounted the drive. It grabbed the public key off the drive, put that public key onto the instance itself in the folder, and then I was able to get in with my private key. Okay? We're good? All right. Well, that's it for today. We will get the clear slides up, and we'll get that out for you guys so you can continue to plug away at this. We appreciate your patience. If you have questions, we'll be up here afterwards. The slides will be on ClearSlide. We're going to have to figure out how to do that. We can probably get the OpenStack folks to link it on the website. We'll talk to them about that, see if they can't put something in there for our presentation. Today, we're going to tear it down. Yeah. But you know what you can do? Oh, yeah, we have the USB keys. We have the USB keys, and you can just load that up in your virtual box environment or parallels, whatever you'd like. We'll be up here for questions. Question back here? Yeah, I don't think that'd be a problem. Actually, you can get that image at download.zero-cloud.net. No, the OVA. Oh. The OVA. Oh, the OVA is on the USB. All right. What can you post online? Oh, I don't know. I'm not sure yet. We'll figure it out. I'm sorry. I don't know. Yeah, I don't know. I'm not sure. There'll be some things that are different. But if you have any problems, you can email me. OK, let me just put my info up again. OK. Thanks, guys. Look, you guys, we're handing out these USB drives. If you can't figure out how to get this thing running or you have questions, just email me. All right. Thank you, guys. Thanks to your patience. Thank you. Thanks to the Raxway skates, too, for helping troubleshoot.