 My name is Paolo Pitzka and my colleague Daniel, we both work for Pulp, so you can go for it. What I try to introduce you today is the basics about the Pulp. And because this is the workshop, I will show you how to install the Pulp, how to sync some packages from PyPy. I won't show you like mirroring whole PyPy, although it's possible, but we don't have so big disks and connection. Then I will show you just a few workflows, how you can manage your packages, your repositories and so on. So basic interaction to Pulp, we are like software package management system. Today I will focus mainly for Python packages, but it's not only what the Pulp can do. You can in the same way sync the Debian, RPM packages, Ansible rows, even the container images. So in the end you can start with the Python packages and if you want you can extend this to any of these supported content. Yeah, what you can do with the Pulp, it's like syncing. You can upload just your packages, managing these packages, or just mirror or distributing more. So and why Pulp? For example, my favorite example is the second one, because sometimes there is the networks without internet connection and there is only one proxy. So you don't want to like download all the packages again and again. So Pulp can be there like local storage forever. Packages and you can use native clients for the contents you need. So that's coverage, even the local storage. And as I mentioned before, Pulp, there is possibility to single application manage various types of content. So there is some prerequisites, what we need, and that's just in the minute, and there is various ways how to install Pulp. I will show you one of the easiest, but there is more. You can install directly from Pi Pi, like from Python packages, or if you are on RPM distro, you can install from RPM. It's not really maintained by us, but if you know the Catalan project, they maintain the project how to install Pulp by RPM. Then we got our Pulp Installer and thing called the Pulp Lift, which helps you a lot. Pulp Installer is used for any various installation types. And Pulp Lift, it's yet to help you to set up the virtual machines that do all the setup for you. Like Pulp Lift, just prepare the virtual machines and run the Pulp Installer. And very lately, we introduced the single container, which you can try with Docker, but I don't use this way. But if you want to know more, you can go for PulpProject.org. And it's pretty easy, but it will install like all plugins, not only the Python like I want to show you today, but it will install all those supported plugins like that RPM, Ansible and so on. So that's why I choose the Pulp Installer way. So there is some requirements, as I said. So we need vagrants, then libvirt or virtualbox. I'm not on like RPM distro, so I'm using virtualbox. So in that case, you use the same. You need to export this vagrant default provider to not specify it in the command line. Then you just need the Ansible, Ansible Galaxy and Gitline. So that's pretty it. And I think that's pretty nice to interact, interaction so I can show you how to install the Pulp. Here it's like few commands, but I will show you in the command line. Okay, I think it's visible. Maybe I can make it bigger if you want any feedback on this. Okay, looks, that's fine. So first, just Git clone our installer. It's pretty fast. It's like few Ansible playboots. We use few submodules, so when you first time, clone our Pulp Installer repository, you need like update and in its few submodules. Okay, typo, so updates. Yeah, that's pretty it. And now, if you go to the vagrant, I will just show you that we support many boxes. Today demo will be I use the Fedora for the free box, but I just show you there is like various possibilities, what you can try Pulp. You can see from the beyond Fedora on CentOS. So we use the sandbox one, it's for the users that it's easier from the source code, but this is not the scope of today's workshop. Okay. Yeah, and I forget there is example config, we will be using that sandbox that the user, there is another option that you don't override this one but you create the local user config.yaml. We will use this one here. Basic options are set so you just need uncommentable Python. I will have pipe file here, but you can comment it out. But I would say this is fine. And now let's make our vagrant script to prepare everything for you. So as I said, we use the sandbox on Fedora for free. It's prepare the guest for you. But if you will, like later, we will want to try Pulp on like normal machine or your own virtual machine. It's fine that you want to use this vagrant, but just the Pulp install, which is possible even to install from Galaxy, Ansible Galaxy. So we don't have to even download our Git repository. Yeah, and now it's running the installer itself, which prepare database for you. Here I will just mention. As I said, there is possibility to install Pulp from PyPy, but I would recommend really to use the installer because it will set a lot of things for you. For example, the database, the Pulp services, which you will have to check or a little edit manually if you use just direct install from PyPy. But the installer using these packages, so it will be the same. It's just save you a few steps for you. Yeah, you can see like a lot of skippings, but that's fine because we support a lot of boxes as I showed you before. So there is like some tasks directly for some OSs. For example, there's some differences between the CentOS and Fedora and much more than CentOS and Debian, for example. It will take some time because there is few things we need to run the Pulp. Also, after this database, it will prepare for you the HTTP server. So if you will or want to install Pulp on your server when you already running some web services, then it's good to use that manual way from PyPy, for example. When you set all your proxies and settings of your approach on Nginx or your own. As I just mentioned here, default to our Pulp installer, we installed the Nginx. But there is option to choose the app edge. These are two are supported web servers. So get this installer prepared for you, sell sign certificate, but still there is the option if you got your own. You will just specify in this file that you are using your certificate or more option. If you want to know more about this installation, I would suggest you go for Pulp installer page documentation. It's not big and I think it's pretty nice described. Sorry. Yeah, true. If you got any question or any help with the installation, if anyone follow us, please write it in the chat. Thanks for your help. We are two of us here. So we can wait a bit and help you with the installation or anything you need to set up. You can see that it's packages from PyPy just steps more. Yeah, I think it will be near the end. That's a lot of tasks was already done. Sometimes if you are trying with us that restore or selling context sometimes took some time. We are installing like clear ones shouldn't shouldn't take so long. A few final steps. You see like installation takes like five minutes more depends on the machine. For sure, you can even edit little bit here the vagrant setup, for example, at the memory or more CPUs, if you are familiar with the vagrant. You can pretty much customize it. Yep, go on. Yeah, I was just going to say there's also a single container and a container image that you can use to run pulp that has several playing including I think the pipeline plugin. Yeah, it's there, but I wanted to show just the Python today. For sure you can go for our project. There is nice page about it. It's like three steps. So like three steps less than this one. And you will have everything. Yep. Now we got the both installed. So it didn't took so take some so well so let's find and we can run the box or go to the server. I just show you one trick because because we are the Django application, there is possibility to use like that. I wouldn't say it's really good for us, but it's Django basic administration, which is pretty good. So with this comment, like when you are assesaching to our sandbox machine, you can say to for that few parts that we can use browser on our host machine. Yep. Now when we are install the ball, let's connect to it. And I would just suggest few tools that we can use. And the first one is HTTP. IE, which is Python application for like HTTP client, but it's very nice formatted and pretty colorful. So you can see, like, much better. The answers from the server. And then there is the dot net RC for auto authentication, because of course require the login and passwords to operate on it. So we will, it will pass this one. So let's install the HTTP. And let's set up our net RC. We are on the local machine server. So let's say it's local host. And this is the basic already prepared login and password, which I recommend for sure check after you're testing it if you decide to go on. So admin and password, it's pretty what you want. The dot net RC in your home. And I think this is like pretty good prepared to show some work flows. Just one more thing. It's basic setups. So I will just use the HTTP client with F, which is like to follow the links. It shouldn't happen here but if you are using it over the proxy or using for example the Docker installation, you need to follow or it will fail on first reaction. And because I didn't specify any known certificates, there is self signed which installer doesn't automatically add to your system. So you have to specify for your clients that you don't want to check the SSL and you want to forward. Okay, you can see the stuff and so the part that we installed it. We got power core is there all the time power python and the file we just let it there. Few worker to workers. And one manager for that online content up that I will show it later. So that was the installation and just basic API call to check. If the pulp is installed. Okay, or not. So I think we can go for the some work flows. So, in the first one, I will show you how to sync from by by, but as I said, I won't sing the whole bear by by because my machine definitely don't have such storage. So I will sing few packages. So the steps we will need it will be for part to create repository that will be that are repository. We will create the remote I will stop a little bit there because there is a lot of options you can use with that. We sync it. Prepare the publication and then I will show you how to distribute it for more clients and just fast check up on but people and how to set it up. So here. So let's continue. Yeah. And as I said before, I would prepare a few comments just alias that I don't have to repeat all the time. And it's good to because the basic setup for a bunch or engine mix in this case. It's the default port is 24817. I think in default installation, it's even there is set up proxy for the 80 and 443, but I would use the default one to you can see. Okay, so as I said the first step will be the create repository. And just here I would like to mention that I am using the API, which we have, but lately we have really worked on the Pulp CLI, which will be like much more easier to use, and you don't want to need to really call the API. So this is the base base call for our API. As you can see, I am using the client dimension and the alias I prepared. So almost everything in part starting with all about API be free. So I set about to create the Python repository for me and call it my bye bye. It's pretty colorful. That's why the client for us will be in interesting the pub have that's newly created repository, which we use later on. And here I created a remote. So this is will be the server where I want to download. So in our case, it's by pi.org. So this is the basic call for it. I will name it by pie, but here I would like to say that if you use Python and Python bender snatch. It's possible to use the bender snatch config file. And it's just the different end point, which will be like remote Python, but it will be from bender snatch. And you will have to specify, instead of you are like the file, the path to config file of the bender snatch. I want to show it to you today, but definitely there is the option and mention it here. And I'll just add to that real quick. We also support several of the options the bender snatch config file supports so like filtering out pre releases and putting version filters and package filters. So you don't think all of pi pi just certain packages we support a lot of those features. And I, because when you use it like this, without just the name and URL, you know, we'll try definitely sing whole pi pi and that's not desirable option today. So there is the option you want from URL, not only for bender snatch. I want to specify what we want to include. So I choose just two packages, and it's by game and Django and Django, you can see that I specify it will be just Django bigger than 3.0. Because there is a lot of versions of Django, and you will see because the pi game is just the name, it will download all the accessible versions of pi game. What we got. So, or there is yet other way that's not the includes but we can sing almost everything, and just put excludes. We can sing like everything just few packages or the list of packages we don't want. Here I would say because we support policies like download policies. So you can choose from the basic options if you want to download all the packages right away. So when we are when we will be sinking, it will download all the packages on your local storage, then there is on demand, which it's download only the major data. And when the client asked for the package, it will download the package from pi pi and then it will serve to the client. I think there is the third one which is stream. I'm not pretty sure if the Python one really support it. So these two as I described are what we can choose. So I think I'm pretty sure there is the default one for Python is on demand. And the reason for that is because pi pi if you think all of pi pi is 6.8 terabytes. We don't want to, by default, have people filling up their entire hard drive and then some. Exactly. I mentioned it. We don't want to download all that. But if you forget about the includes includes and just make basic thing. At least it won't start download all that data. What is on pi pi and after 30 years there is a lot. Okay, you can see that there is the response. Here you can see that policy. Definitely here it's the remote address. So what we want to do now we got our repository, we got the remote, so we can sync it. So we choose the repository, the input sync and send it like which remote you want to sync inside. Yeah, is this task based system. So it will be done asynchronously that you can still work with Palp on order. So I will show you here. Just let's check this task. You can see it's completed. There was over 200 so it's content. And that's because there is a lot of versions of Django, even more than three and put a version to play game. So now we got it in the Palp. No, sorry. I just want to see my ears. Okay, so now we need because it's already synced, it's on demand so we got all the metadata here so we can continue. So we call the publication endpoint. We set the which repository version. Yeah, I didn't mention this one, because when we create the new repository, it's starting empty and palp for how to say for better user friendliness. This is the versioning of the repository. So our first thing it's the repository version number one. And later I will show you when I will change anything in the repository that this basic version still will last in the Palp and you can go back but it's legal later for the workflow. Here we choose that repository version we are already seen. You can see it in the credit resources when you think in the task that this is the repository. This is the version number one that one we want to use in the publication. So here, again the task. So let's check it. It's completed. That's fine. Again, you can see there is creative resources and it's publication. This pretty prepared for the distribution to your users, but it's not like open to use us yet. It's like your preparation. So now we need to distribute it. So we call the distribution endpoint, Python by by because we always remain. We call it name, base name, and we set which publication we want to distribute. So again, the task, you can see it's done. So our distribution is ready. Now, when you create this distribution, there is our content up, which I mentioned before, which was visible there. And that serves the contents to the users and outside the pile. Here you can see, as we said the main basic host name or our host name, there is the URL where the content is living. So it's pulp content, my bye bye. If you are really near to server, we use liquid different port, it's 24 816. We will show it very soon. I will just show you, let's create the bye bye config for our server. So it's basic global index URL. And I will specify our local host with the port 24 816 pop content and the name or the base path as I said, my bye bye. And that simple stuff here just for don't forget to add the trailing backslash. Sometimes it can cause issue sometimes not, but it's better for pi pi to let it like this. Let's just check it. It's fine. And we can try install, for example, by game. And you can see there is like looking for indexes. And it's already installed from our local repository. And I think that's pretty. That's the basic for the singing. And I see we are already 33 minutes gone. So is there any questions yet? If there is no question, I can show you yet one easy workflow and it's how to add your own package to your repository and how to update your distribution. So we will take what we already got here. And we will just add one package. Okay, first, we need to download some packages. I choose Python package from pi pi. And I think that's enough like the example so let's download it better. Or my recommendation is to download it with the tar dot gz, but you can be supportive on the VHL and more extensions but we are checking what you are uploading to the PULP. So if you don't fit any extension which is used with the PULP packages, we want the PULP denied to upload it. So there is the basic workflow. I will show you the little harder one like two steps but there is no possibility to do it in one step, but that's never mind. So I will update this package. I downloaded it. It's like to just get the file to the PULP. So yeah, we got it. The artifact, we call it artifact. Check sums for it and save it inside the media route or like our storage. Then we have to say PULP that how to work with this file. So we said it's Python package. So it's another like it's already content endpoint. It's Python and it's Python package. We just specify the relative path and file name. It's very, you know, to keep and you can find it later by these names and points that upload it artifact before. As usual, it's PULP have as before everything. It's over again the task. So let's check it. It was okay. It is so we got some repositories. So I would call the repository endpoint with modify and use add content units and put there our uploaded package, not the artifact but that content like Python package because we already worked with that. Okay, again, it's fast because it's better to do it like the task. For example, if you will be uploading like package which will have like 100 megabytes you don't want to wait until it will upload. So that's completed you see it's the repository versions to as I mentioned before. And here I will create a publication again, but I don't want I don't use the repository version as before, but I can specify just the repository, which automatically the latest one will be taken so now we go to the version to so second will be taken. Again, the task. So let's check it. So we got a publication and we don't have to, for example, now you can do the new distribution, but there is possibility we can update our existing one. So let's do it in that one. Just check for the power path and just I want to end here. We don't use the update but put method and you specify your distribution, you have to specify again the name base path so we can use the same one. Now we use the publication the newly new creator create one. So that publication from version two. It's completed. And you can check our content out. That our new package was added. There is Paul Python. And it, because this is the simple view, there will be just one that packages be uploaded. And we are pretty out of time so I can just say if you've got any question just ask here on the chat. Or there is a lot of channels if you are interested in it. There is few links for the documentation our main page it's called project.org. That's there is you here you will find all the demos documentation links github links and even the block and like this order ways how to contact us. It's the publicist live mail increased on their head or IRC on free notes. Like. Or we are also on the metrics. Here are few YouTube videos. There is more described with the workflows and more demos about how we can use it. It's not enough for you. I think that's pretty. So any question anything just invite us. I would say you are pretty friendly community so you will, we will answer all your questions. And this is our page. Here the installation is and we mentioned this bulb in one container. You see it's like 123 commands. Thank you.