 I think, yeah, we're going to give it another minute or two, and then we'll just start going, as you've suggested. We'll end up out of time. And, you know, OK, let's get started. So first off, I'm going to start by introducing the three of us who will be working through the workshop today. So first up, we've got Graham Hayes. He's the guy over here. He's a software engineer with HP working on the DNS team. We've then got myself, Kyle Lakennis. I'm the tech lead for the DNS team in HP. And I'm the PTL of the Designate project. We also have Tim. That's this guy over here from Rackspace. He's a software engineer on their Cloud DNS team. So generally, what we're going to start with is we're going to go through the install. So everything on the VM that hopefully you all have booted by now, it's got Keystone, MySQL, Rabbit, all of that stuff pre-installed. It's got the Designate code base down. It's got all the PIP dependencies pre-installed. There shouldn't be any need to get out to the internet. So we're going to start walking through the install, showing you how it works, getting the various services up, and being able to use it. So then Graham is going to talk about operations, which effectively how to use it, the APIs, the CLIs, and the Horizon UI on top. So all of those will be covered in that. Then I'm going to talk through a little bit of our current Nova Neutron integration. So we have some very basic stuff in there today that will let you do enough automation around auto provisioning of DNS with whenever you boot and manage instances. Finally, we'll talk a little bit about how to get involved, how to contribute. So with that, I'm going to ask Tim to start off his section. Don't forget to turn your mic on. Good to go? Yep, wow. All right, so hopefully most of you have gotten a vagrant up and SSH'd, if not flagged down somebody walking around. Here, Kyle, have some drives. They're just stupid images. So I'm going to talk you through briefly what we're going to be installing today. So this is just an overview of what Designate kind of looks like from an architectural perspective. The first thing we're going to be installing is the Designate API, which is your basic REST API that validates JSON, that kind of thing. Talks to Keystone, which we already have installed for authentication purposes. Designate Central is where most of the business logic in Designate happens, and it talks to the database, which we're going to be using MySQL for this workshop. We're good, yeah. We're also going to be installing the PoolManager, which is a service that helps manage the proliferation of DNS data through the various name servers that Designate is managing. And we're also going to be installing MiniDNS, which is a very minimal DNS server that we've written that is responsible for talking DNS protocol directly to those DNS servers. And Designate Sync, which is responsible for consuming notifications from NOVA and Neutron and applying DNS changes via the rest of the stack. So, hopefully most of you are vagrant-upped in SSH'd. Maybe a quick, like, hands up if you are good to go. Yeah? That's much higher. That's much higher, all right. By the way, at any points, go ahead and raise your hand on something we'll promote with you if you get done. Just raise your hand, yeah. You can also install those online just by, like, Googling vagrant and virtual box. It might be a little slow, but you'll get there. Also, the directions for what I'm gonna be going through are back here at bit.ly Designate-workshop-steps. So, if you wanna follow along with what I'm doing, you should definitely go there. So, just give everybody a second to get there if you're not already. Going once, twice, okay. What's up? Oh, you bet. Sorry, there you go. Bit.ly Designate-workshop-steps. All right, cool. So, let's get started then. Woo, that's, I'm figuring out. Oh yeah, sorry about that. So, you guys should have seen this already. You should just take a second. Are we excited? Like, is this something that you guys have been looking forward to all day? Yeah, I knew it. DNS gets everybody all hot and bothered. Especially Joe back there. He's like, whoof. Whoops, we gotta kill your, yeah, we gotta kill your other one. Oh, we'll just halt it. So, everybody's good. I don't see any raised hands. So, I expect that everybody in the room is totally ready to rock. Yes? Wow. You guys are so smart. You guys should work in computers or something. We're getting ready now. So, most of you should be right about here by now. Your keyboard. So, we're gonna be fat fingering stuff a lot. So, just be ready for that. It's gonna be a good time. So, from the home directory, you should change into designate. And that's where most of, this is what you would get if you clone the repo. The first thing we're gonna do is install the requirements. This should be actually pretty easy because we've already done this for you. So, technically, I don't think this step is required. Yeah, all the requirements are already there. So, the next thing you wanna do is run python setup.py. I'm sorry, sudo python setup.py develop. And that's going to install the services into your local bin. So, the next thing is we're gonna go and kind of look at the configuration for designate quickly. We've already done a configuration for you. So, it'll be etsy no slash etsy, just etsy designate designate.conf. So, the configuration is pretty standard format. It's organized into sections. The default here is gonna be kind of a general config. Designate central, we haven't changed anything here. All the stuff that's commented out is by default. The API, you can see we've chosen Keystone for the authentication strategy. You can also do no authentication, if you please. v1, v2, and admin APIs are enabled. Here's the Keystone section. This is kind of important. We've done this for you, so don't worry about it. We sent your authentication, identity, URIs, tenant, users, and passwords, those things. So, all right, everybody's excited, I can tell. The next important thing will be the database connection, as you can imagine. So, we've just run right on the box here for you. That's the storage SQL alchemy section. And the last one that we really need to talk about for a second is the pool manager configuration. So, like I said earlier, the pool manager is responsible for orchestrating the proliferation of DNS data. So, this is going to be addressing the DNS servers that you're setting up with Designate directly. So, we've split them up into a couple of things. Name servers and targets. A great, really easy way to think about this is name servers are something you query, and targets are something that you write to. Somebody help him? Yeah? Well, I have a question. You have a question? All right, go for it. Yeah, we're gonna be using Power DNS for this demo. Oh, we'll get there. We'll get there, my man. All right, just hold on tight. It's gonna be a bumpy ride. No, it's not, okay. So, name servers are something that you query, just like you wouldn't realize, and targets are something that you write to. So, in this situation, you'll see that the name server is just a host in port. This would be your standard DNS server, port 53. And the target is, in this situation, Power DNS. So, it'll have specific options that it'll be pertaining to, writing to the actual thing. So, over here, there will be a database connection because Power DNS is a database backed DNS server. So, if that's confusing, or you wanna talk about that more, or you wanna know the difference between mini DNS and Power DNS, come chat with us afterwards. Yes, you? Oh, great, great question. So, these UUIDs are gonna be generated by you. It's kind of a middle step between moving this from config file to the database, by you, there's default ones here for you already to use. But yeah, if it's production, you'd be generating your own UUIDs for this. So, this is an important target ID right here. So, if I, you know what, it'll be fine. Don't worry about it. Yeah, so DNS, yeah, what's up? Okay, obviously, I need to explain this really quick. So, I'm gonna go back over to the slides very briefly. Customer-facing DNS servers, in this case, that we're going right here would be Power DNS. Mini DNS and the rest of designate, and specifically mini DNS, act as the DNS master for your setup. So, Power DNS is going to be, in this situation, slaving off of designates mini DNS. Is that? We're all good? All right, sweet. Just for this, it's just for this example. Bine 9 works just as well. Yes, so back-end plugins up there, or they don't say, it doesn't say plugins, the back-ends are pluggable, so there's a lot of servers that are supported. If you're curious about this kind of thing, I'm gonna be talking about it in-depth in our talk tomorrow at 11.40 a.m., somewhere in the morning. So, you should check that out. All right. So, now that you kind of got a little bit of a handle on the configuration, let's just create a log directory real quick. So, go back to your home directory, and just make logs. That's gonna be where all the logs for the stuff that we run in this demo will be. How much of that? What? You're keyboard dude, I'm... All right. Don't actually, no, okay, just create that. All right. Well good, no hands up, all right, sweet. So, you're probably gonna wanna copy this command from the page, but we're gonna create the database for Designate now. And I'm gonna fat finger this, so please bear with me for a minute. Somebody catch me if they actually see me do it. I did it. No applause, God, you guys. All right, thank you. The next thing we wanna do, because now it's just an empty database, so we're gonna run the migrations to get it up to scratch. So, that'll be Designate-Manage Database Sync. And if there's no log here, because we created that log directory earlier, but if you wanna see what that looks like, you can go and look at the log directory. It's a harmless bug. It's a harmless bug. Yeah, it's some. What if I ran this thing? It's all good, it's item potent. Okay, so the next thing you'll wanna do, you actually shouldn't have to do this step, because the PowerDNS database is created for you, but I'm just gonna show you. Yeah, it probably will. Yes, so the database already exists, so we're good to go there. Now this command, you're definitely going to want to copy and for your sanity, I'm gonna copy it. And this is copying a command that will sync the PowerDNS database. And what's really important to point out here is the UUID, I'm sorry, that was really small. Here you go, oops, Kyle's keyboard again. So what's really important to point out here is that the UUID that we have right there is the same one of the PowerDNS target that I was talking about earlier in the config. So, like I was saying, we were gonna write to that target, this is the UUID of that target. So the DesignateManagePowerDNS sync command is smart enough to go and sync the right database. Soon. The UUID version somewhere else. No, you can have multiple targets, so if you have, say, three bind servers, you can have three targets for all, one for each bind server. Well, for example, a bind you wouldn't need to do a database sync. We have one for PowerDNS because you write to one database and it replicates. Yeah, the bind setup is a little simpler in that respect. So next thing, we wanna restart PowerDNS to make sure that it's running and all things good. If that failed, then this is going really horribly, but it should be good. So now, the moment you've all been waiting for, we are gonna start the Designate Services Strat, no, I fixed it. Keep up, dude. I know, I know, it's okay. So we're gonna start Designate Central. These are the ones that we talked about earlier. API, MiniDNS, that's MDNS, and PoolManager. Give everybody a second to do that. Yeah, we're all good. Sweet. Okay, so now we need to set up Keystone so that Designate can talk to Keystone and authenticate for you. So let's get some credential. Why do I keep doing that? We're gonna get admin credentials so that we can set up Keystone. So you might wanna copy these commands from the sheet, the wiki page. So that's the service, and then we're going to create the endpoint that we're gonna be talking to for the rest of the demo. Sweet. And let's just make sure we did that right, and you should see similar output if you're following along. Keystone, thank you. No, I'm American and he's not, so obviously our things don't work together well. All right, so the next thing is we're gonna go, I mean, I blame him, I really just suck at typing. So the next thing we're gonna do is install the Designate command line client. So you go to Python-DesignateClient, and a similar thing, you would install the requirements here, but this has already been done for you, so we should be good to go. And similarly, install the service, good to go. Yes, oh, I'm sorry, yes, that's python-setup.py-develop. And the last thing that I'm gonna show you, then you'll miss me forever, is we're gonna go back to the home directory, and Designate, Contrib, Designate dashboard. So if you can pick up from my context clues, this is going to be the horizon dashboard for Designate. At this point, I would probably recommend going over to the Wiki page to copy the commands here. Just in case our internet is slow in here, we're gonna do the tiniest hack and truncate the requirements file because we've got a different version of one requirement that might take a long time to pull down if we're in here and the internet is slow. And so the next thing will be python-setup.py-s-dist to get a tarball of the dashboard. And now we're gonna install it. So that's sudo pip install dist as a directory slash star tar dot gz. There's a get shot versioned dashboard in there. And now I'm gonna get the dashboards enabled. So forgive me for copying these, but come on, you don't expect me to actually type those because that wouldn't go well. So that's just copying the dashboards over to the shared folder that horizon's gonna look in. And then the last thing is restart Apache. All good to go. So the last thing, and I dearly hope that this works for everybody as well as it's just about to work for me, is we're going to create a server. We're gonna create a server in designate and that serves the purpose of telling designate what you want your NS records to be for your setup. So that's gonna be the command line client, designate server dash create dash dash name, and then the name of your name server. One very important thing is to put the trailing dot on the host name because we do enforce that pretty much everywhere. And it all worked, so now we're good to go. Can you put your hand up if it didn't work so we can go around and help you? There is a install designate script in that home folder that will power through all of that. So if anybody ends up with a VM that's totally messed up, you can vagrant up and cheese to get this far again. So it'll get you all the way up until needing to run the server create command. So if there's anybody stuck, raise your hand and someone come over. That is a cheese to catch up if there's possibly some typos or something done. Chances are the designate API service isn't running. So if you do a, yeah, try running that install. It should mostly just go the whole way through. I don't think it will blow up if you've already done any of the steps and see if it works then. Anybody else? Yep. Yeah, so is that not on the key? Does anyone have any questions in general about what we've talked about? Yeah, servers are effectively what we use for NS records for domains. So in your credit domain, you have to have NS records at the top of each domain. That's what we use servers for. It's just the name for them in designate. Yeah, and that would expect you would have to have set up other glue records on your provider or use another method to get the host name pointed to the right IP. It should, or depending how you have a setup, it could be set up to talk to anyone. It could be, say you're using Akamai. It could be pointed to look at their servers or dynamic to look at their servers. In here, it makes no difference. It could just be the name and the NS records. This isn't connected to the internet, so it won't make any difference. We'll be doing dig out anyway. So yeah, but if you're doing this in production, that would have to point towards the end of the NS servers. Now, this just creates the NS records. You have to do the rest yourself manually. Pool ID, right. We, in Kilo, we implemented a thing called server pools. But the idea is you can have multiple pools of different servers with their own individual namespaces. So you could have a private pool on a user's network, or you could have one pool of servers for internal traffic, one pool for external traffic. That full functionality isn't available in Kilo, just the basis for it is. So that's why we have the pool IDs in the config file. At the moment, you run with one pool by default. You just have one pool. So it's the same as what we had in Juno, where we just manage a single set of servers. And it gives us building blocks, so in Liberty, we can actually get the multiple pools built out. Sync, oh, Designate Sync is a method. It's a program that listens to RabbitMQ and takes Celiometer notifications and then performs actions. So creates records, deletes records based on what the message on the queue is. There's a demo of that later on at the end. We use zone transfers. So that's what we wrote many DNS for. It sits there, and all your servers just do zone transfers off many DNS. We're fairly independent of the rest of the infrastructure. As long as, yeah, there shouldn't be any problems pushing using that. So we are going to start off by going to the horizon panels for this. So if you go to HTTP 127.0.0.1 colon 8080 slash horizon, it's going to be different for me for reasons. So we should see this interface. So you can log in as admin, and the password is password. It's highly secure, I know. So if you go to the Project tab on the top left, then there's a DNS tab, and in here we have domains. So there's a Project sub-tab at the very top level. So everyone at this point? No? Anyone else need help? OK, I'm going to quickly bring this up. So we're going to create a domain. You don't have a DNS tab. So again, we'll just create example.com. And again, you have to remember the trailing dot as well. It's admin and password. The username is admin, and the password is password. So now we will see the domain has been created. Example.com, and you have to remember the dot at the end of the dot com. So it's example.com. Email, just any valid email. Well, it doesn't even have to be valid. It has to look valid. Yes? Yeah, that's all you have to put in. You can put in a description if you like or a TTL. OK, is that everyone good to move on? Silence is permission. So we're going to create a record. Type A. Sorry, yes. Up the top right here is Create Record. And you have to put in the full record label and choose whatever IP address you like. For the record, you can put www.example.com. Whatever you'd like, I put in 10.0.0.1. Just at the top right, it has to be fully qualified. There has been debate about how to properly support short names. So when we get that resolved, it'll be available. Again, as long as it's a valid IP, we do validation checks on the actual data. But I'm going to switch back to the terminal. And here we can do we have the command line client, doesn't it? So we can list domains we have available. And we can list the records. And this will show all of the records we have. Yep, there we go. So we're just listing out the records on the zone there. We can also do, so for this name, we'll say we create a mail dot and type of A and data of, yeah, we support MX. But I noticed using A records for simplicity for this one. I will definitely type a MX record format. Tim wasn't wrong. This keyword is terrible. So we can create that. It's available. OK, I'm going to pause there. Is there anyone who has problems, questions? For example, for example.com, with this solution, if this was live on the internet, you'd have to get whoever you registered your domain with to publish the 10 NS records. They're called glue records. You publish them upstream. And if you're doing it internally, whoever runs your DNS internally, if they have a subdomain for you, they can publish them. Yep? I created a type A there, yep. You can create whatever records you want, whatever records we support, sorry. So that's the selection available. That's auto-created, because when we did the server create, that put the data in our database. And whenever we create a domain, then it goes to the database and goes, OK, the name server for this install is going to be this. And it automatically puts it in. You can create three servers, and they've come in as three. So you just multiple on, yep. No, we validate that it's a valid host name. We relay it through. So this is the serial number of the domain. I'm refresh. I don't remember the order. This is a special type of record called an SOA. And it contains the information about how long you should wait to refresh. You should retry. And when the data is considered invalid, so when it expires, yeah, that's how we do the zone transfers. We rely on the serial numbers incrementing for each change to get it. Yeah, we were valid with the RFCs. No, it has some level of ACO. We can transfer domains or zones between tenants. We are open to having the. What time does this one end? I'm trying to figure out how much time we have left. Six times we're finished. Sorry. Yes, there is more work to be done there. And we are open to feedback. If it suits within what we think the direction of the project is going, 100% will take it. We appreciate actual people's feedback, rather than us sitting in a room and shedding at the walls. It's come a long way. It's good. OK, I'm going to move on again quickly. So we also have Python bindings available. So if you want to interact with this programmatically, we can do that. So there's a file called example.py in the home folder. Open up with your editor of choice. It's not a war I want to get into. I'm there is one mistake when I wrote this script. So unfortunately, you will have to change this line here where it says tenant ID. That has to change to tenant name. Well, there's a variable for it, so we may as well use it. It's a project. So that line has to change to tenant name equals project. I'm aware that I am mixing all of the terms across all of OpenStack, but no user is set up right. So this is a very, very, very, very basic script. What it does is it goes to somewhere to get your external IP address, tries to create the record. If the record already exists, it updates it. It's simple, in theory. So if your external IP changed and the service gave back a different one, it will just replace it with a new one. So it actually worked. Sorry, I mean, of course it worked. Now when we look here, there is a me.example.com that was created with the external IP address that we're using for web hosting or for internet in the summit. Sorry, yes. I'll go back to the script. Tenants ID changes to tenant underscore name, and then it equals project. Get rid of the UUID string. We don't have any limit. I personally think that belongs somewhere further. You have something like repose, or low bounce, or a service that does your rate limiting. Yes, I think. The IP address it got. There is a website that all it does is returns in a header the IP address that you called it from. And I made a request to the website and got the IP address out of the header. That's an actual website. If you go there, they will give you your IP address. I wanted something easy to show, so I picked this. Nope, this creates an entirely different A record itself. OK, is there any other issues that people have right now? Yep. The which part? To check if there's, oh, we can, but none of this is connected up anywhere. I can dig out the servers. So for example, it returned the, and that's the parity in us that we were talking to. Reverse DNS, it isn't done by that call. It's a separate setup. We support pointer records. And with the zones, it's fine. We support it entirely. We have an extension to support neutrons floating IPs. If you want, I think there's going to be talk on that tomorrow, or just grab one of us. We can run through it with you. It's a little more in-depth. You have to dig through stuff to get it working. Any other questions, comments, problems? Create NS records? Because we manage these. It was a decision we made, and we're open to changing it. But currently, the way we have it deployed is the only people who can create NS records or admins. It's a change in policy. There's a policy.json file where you can change this. The major reason, though, is because we manage so much of it, and we're so reliant on it, that it really would make a difference for us if a user started messing with it. The user can't change their upstream name servers. The ones that are registered with their registrar. And it'll do the same thing. Right? It works? Great. Kyle, do you want to start talking about sync? Cool. All right, guys. Thank you. OK, so we're going to talk a little bit about the current integration we have with Designate and Nova Neutron. So this is what we've had for a little while. It's fairly basic, but it covers a good number of people's use cases. We have some much more thorough and advanced work in plan. We have a work session with Nova and Neutron tomorrow to try and get the necessary changes agreed on. So this is what we have today. And this will remain around, but hopefully we get something a bit more tighter over the next cycle. So we have this service called sync. Sync will listen in on Nova Neutrons or any other service that emits notifications. So it'll connect to Rabbit. And every time an instance is booted, deleted, floating IP is created, attached, detached, all of the various things will trigger an event to come out. Sorry, excuse me. We'll trigger an event to come out. Our service sync will then pull that event and run it through a couple of plugins. So we ship a couple of basic plugins. The one I'll show you today is called Neutron Floating IP. These are meant to be every single company has a different idea of what should happen when a VM is booted, when it comes to DNS. So we decided we weren't going to ship a standard something that most people would look at and go, it's so close, but it's still not right. We shipped a really basic sample. So these are meant to be pluggable. You'll turn around, you'll write it. The plugin will be 20 lines of code if it's a basic thing, or it'll be a few hundred lines of code if it's a more advanced thing. So I've actually talked through that already. The intent, as I said, organizations write plugins that reflect their specific use case, because it's always different. So to actually get this working, you drop into Neutron, you go in and you tell it about the notification driver and the notification topics. One issue we often find when people are trying to set this up is they also have Celiometer set up. If you have Celiometer, then the current notification topic will be used by Celiometer. That's comma separated list, but a comma add another one. You'll need Neutron to send two copies of the message. Otherwise, Celiometer will get it, or Designate will get it, but not both. So the same settings actually happen in Nova. I believe Trove has similar settings. A few others, pretty much any of the services using notifications, will have settings like that. And we'll be able to actually consume those events, pass them off to the plugins, and act on them. Within the Designate side, we have the sync service section, and we enable a list of plugins that we want to activate. We then have a Plugin specific section. We tell it what rabbit MQ exchange, and so on, to listen on. And our example here, we're going to use the display name you gave Nova, and a fixed domain for every instance that you ever boot. So obviously, that's not a very useful thing for reality, but it's a basic enough example. So you can do this in your VMs, by the way. These slides are up online, and you can walk through them afterwards. It takes a little bit too long, because of all the other services. So I won't do it live. But effectively, you would be able to run down through these steps, boot a VM, and you'd actually see instantly that testvm.example.com is there. So that's, again, just showing that we delete it. So I actually have a VM with this working. Am I in the right place? I am. I can. That's probably a little bit too big. All right, so there's one hanging around there. So I've enabled the Neutron floating IP handler. So I've got a VM booted. This is actually running in the vagrant VM on my box. So you can do the same. The slides are up online, and you can walk down through them. So you can turn around. I'm just going to remove it, because I left us in a bit of a state earlier. We can see there's a couple of records in here, www.male and me.example. So remember those. We're going to ignore them from the list in a minute. So we can turn around and add a floating IP to a VM and instantly have this new record created. In this case, I've configured it to use the ip.example.com. These commands take ages to actually get right. Yeah, there's a bunch of you have to go through all the Nova config files, the Neutron config files, the restart, all of these different services. So what will happen is we will consume the message. They will go into our plug-in, and at that point, if you think about how the architecture of Designate looked, you have this API service on the outside, and then you have this central service on the inside. The API layer is really dumb. All it does is validate JSON very, very little else, and it hands it off to Central. We did that very, very intentionally, because sync is just another API. It just happens to be a rabbit-based API into us. So we'll call out to Central, just like the API layer would. All the same code will get run. So you can think of it just like an API call has just arrived into us. We also have plans to do dynamic DNS and so on, where we have a DNS API in front of us. So people who are wanting to use NS Update or any of those will be able to just use it. So that sort of architecture of splitting Central out was to allow to have these multiple interfaces out front. Does that answer the question? OK, so we can see anyway that it went off and actually created that record. That's not the right config file. So the config there was reloading. IP. The config there was, I actually had set it to use, octet 0 to 3.domain instead of display name. So you can customize the pattern a little bit. But again, these plugins are meant to be written by you to do your exact pattern that you want. They are about 20 lines of code. Notification handler, look at the NOVO one. The entirety of the plugin is, my font is too big to see it on one screen, one screen worth and a half below us. That's the entirety of the integration to make it do that. So if you think about what you wanted to do when VMs get booted, when they get destroyed, when floating IPs are attached, think about those different actions and you're able to turn around and write a small bit of code that at least in a simple case ends up being five lines of code. And if you want to do something much more advanced, you can go ahead and do that. There was one production instance of Designate where they've gone hell for leather on sync and they've done a huge amount of customization on it. Can't really talk too much about it though here. Question? How are we managing to get them? So customer, so Designate would often be ran as part of the cloud. So in HP, we're a couple of desks over from the NOVO guys. We can, typically, you're running this all as one group. If you try and run Designate inside the cloud without privileged access to the message bus under cloud, then you won't be able to use sync. I know we ship a product called Helion OpenStack and we do something like this. We don't have sync, but for a different reason we have it, where in cloud workloads, we've managed to give privileged access to certain tenants so that they can get out to underneath. So if you are wanting to run it in cloud, you can. So if something fails, for example, so that is one of the big drawbacks of sync and why we're looking to do a much tighter integration. So the intent, the current spec that's up, one of the Neutron developers wrote it up. And their intent is that when a Neutron port is created, if it has a hostname associated with it, it will call out to Designate, create that. And if Designate fails to do so, it will fail the port create and allow it to actually come back up. Because we're listening effectively passively on it, if events get lost, it's difficult to... There's not a huge amount that can be done. Sorry? Okay, for the floating IPs, we're not doing split DNS yet, no. There was another question. So with the DNS mask instance, that Neutron is running. Right, so... Yes, absolutely. So one of the things we're looking to do soon is much tighter integration with Neutron, but this is a slightly different one than what I was talking a minute ago. So this would be the ability... One of the things we saw earlier is pools. The idea is you have more than one pool. And the idea is that you can have private pools. Private pools will live only with inside your Neutron network. And those would be injected into your DNS mask and fake. So if you create a domain, it automatically just works. And you would be able to expose them to the public if you want, but there'd be dedicated name servers in your Neutron network namespace that are tied into DNS mask. So that's ongoing work at the moment. Sorry? I hope so, but we don't have an exact plan for Liberty yet. Speak to that. Yeah? Yeah. Is that the intent? Yeah. We have one tomorrow. Tomorrow, I hope. Thursday, 1.30. Thursday, okay, so not tomorrow. Yes, anyway, yeah, we have some good plans for tighter integration between Nova Neutron. It's been... We've talked about it at the previous two summits, but other priorities came along. So at this point, we're going, I know that the designate folks and the DNS team are willing to go and do as much of the work as we humanly can in the other projects to get it done this cycle, if it's at all possible this cycle. So if we can get agreement between the teams, I think we'll get it done pretty quickly. You should ask him. Sorry, Alex, I had to do that. Alex looks after our LBAS team in HP. I don't actually know too much about their plans. Do you know if they're planning to do anything like that? Integration would designate, so load balancers are, you automatically get names or what integration do you want, you know? The answer, I guess, there is maybe. I don't have a good answer myself. I don't follow any other questions. All right, so the very last thing I will show you is a couple of ways to contribute to designate. So obviously the usual stuff, so if you can code, that's perfectly fine. We need people to report bugs, to help us try and reproduce bugs, to help us improve our documentation, to help people on IRC, and there's a huge amount of stuff even if you're not a developer. If you're a developer, great, we can use that, too. There's a whole bunch of links here, specifically things like generic open stack, how to contribute, garret workflows, the designate specific stuff below. We're on Launchpad, like all the other projects. We have a DevStack plugin if you're trying to set it up in that. Other than that, they're all generic links, just handy enough to have. We use IRC for all of our communication in OpenStack, so we have the hash OpenStack DNS channel. We have a weekly meeting. It's at 1700 UTC on Wednesdays. It's listed on the OpenStack meetings page if you forget the URL. Beyond that, file bugs and so on. I'm gonna go very quickly to this, because we're out of time. The last bit here, the link at the bottom, is a link to the slides. So all of the other, all of the other stuff that we've had in the slides will be visible. That's the one to remember. Go to that, and you'll get everything else. So any parting questions?