 Good morning. Good afternoon. Good evening. Wherever you're handling from welcome to another episode of red hat enterprise Linux presents today We're talking about application streams. I'm joined by two wonderful red headers the one and only Scott McBryan Don't great Chris. Thank you and Brian Gallier, right? I say they're right gala her gala her. Sorry Yeah, I was bound to get it wrong regardless. I think It's just welcome. How are you today, Brian? Oh, thank you. So hello everybody Doing well and hope everybody else is awesome Awesome. So Scott, where are we taking the show today, buddy? Well, I wanted to remind everyone that Brian is the experience product manager for the red hat developer experience on rel and Brian welcome back Thank you last time we're talking about developer skew or developer Program for red hat descriptions. Yeah, yeah But this time we're going to be talking about application streams, which is another developer related product experience with rel so To get started off. Why don't we just talk about what application streams are? Sure, sure. So application streams Are really a concept that we introduced in rel 8 It's the way we deliver new versions of things in in rel and by things. I mean runtime languages like python Pearl ruby It's the way we deliver databases different versions of postgres mysql maria db It's the way we deliver different versions of web servers like apache httpd and nginx And the way we deliver New versions of some of our compilers in rel now we have gcc Which we've had essentially forever as the system compiler But we also Offer l lvm with a client front end. We offer rust and we offer go Go compilers go being the compiler we use for building all our container tools Whether it be You know podman ecd. It's the way you build kubernetes For example, so through application streams. We provide different versions of of all the things I mentioned Our users can then select the right tools for their developers So depending on whether you have a legacy application And we're actually just just talking about legacy applications those that that last for for a long time Certainly rel with its its 10 plus year lifecycle. You can have an application that you That you support for that that full lifecycle and Or you know the ability to have shorter lifecycle applications as well and constantly update So so you have a lot of choices your developers can pick what's best for your application Whether it's long term short term And and choose what you need And this is to address I think the reputation that redhead enterprise Linux has of You get something and that's what you get for 10 years Hmm We still do that and and that's good for for some users, but we also provide newer versions of things So you can have essentially the latest stable version and when I say latest stable I generally mean the latest long-term support or lts upstream release of things So you know rel is an enterprise class operating system. So we do want to make sure everything's been Tested and and fully secure before we we deploy it So that's why we we tend to offer the long-term stable releases But as soon as they're available upstream we package them up and we put them into rel as an application stream And in rel 7 we we did something similar, but we called it something different How is application streams different from Software collections, which is what we did in rel 7 Right. So, yeah, so software collections was the way we delivered new things in rel 7 Software collections we we overwhelmed that term a bit. It's the Description we have of the packaging concept of software collection is how we package things It's also the name of the Of the channel redhead software collections is the channel where where we deliver the The new content So in in rel 7 we we kind of use that term for different things In rel 8 because we continue to offer software collections as a packaging And we've introduced a new packaging type that we call modules We've actually used the term application streams to be independent of the packaging type So when we say application streams, we mean the concept of delivering different versions of different things in rel As opposed to packaging packaging may be a traditional rpm It might be a module or it might be a software collection So that's the the big difference software collection is a packaging concept application streams are a You know the ability to provide different versions of things that might be packaged in different ways Well, I think that brings up another I think common question which is modules, so Not every application stream is packaged as a module But modules are often packaged as application streams Right. So modules are are uh, uh, the new way to to package things within rel Software collections were a really good way to package things. Um, they had a disadvantage though in that they were separately namespaced In the, you know, the op directory path. So if you were just installing A runtime language and writing your own application that was perfectly fine But if you were deploying third-party applications and using different tools You know picking a little of this and a little of that you had to provide the various aliases to Properly Configure your application to find the software collections where they reside. That's a little bit complicated, but It was In order to allow us to bundle things in a in a nice unit in in rel seven and six We we namespace things separately, which means not every tool could find things without without an alias Uh, that was a problem. We wanted to fix in rel eight. So we invented the concept of modules And like software collections modules deal with the unique dependencies for a particular version of something You know the version of python and all the dependencies it needs but they uh But modules put Everything in the traditional location. So the user bin python instead of opt user bin python like Software collections did So it worked really well out of the box with with third-party applications and tooling The downside to modules is you can't deploy multiple versions of the same Stream or the same type in other words, you can't deploy two versions of php on the same system Without a conflict where you could with software collections But nowadays, you know in rel in rel eight We natively support containers And uh, that's a much more efficient way to to package multiple versions of things on a particular system So that's kind of the the difference between modules I think modules in general are easier to use than software collections But you give up that that ability to run two versions on the same host without containerizing Yeah, I've often uh, described it as The the highlander for software right there can be only one They can have you give your choice, but there can only be one Right, right good way to do um, and then you mentioned, um Containerization so before before show today we're talking about if I had um Like two node j s applications, but one required node j s 12 and the other one required node j s 14 Instead of trying to install both node j s's I should create a container with 12 And a container with 14 And then use those two containers to run my app simultaneously. Yeah, exactly. Uh, node is a good example. Um, we have Uh node 10 12 14 and and very soon now 16 Uh available both as modules to install directly on rel and as pre-built containers in our redhead container catalog So it's it's really easy if you had an application Um that you wanted to use with node j s 12 Just download or pull that that particular container Build your app on top of that on top of that layered container image and run it and then do the same with 14 You know pull that container build your app on top and and and run that one as well So it's it's quite easy to do we do all that packaging for you in our container catalog I had completely forgotten about ubi and the runtime package containers for ubi. Yeah. Yeah, it's a good thing you mentioned ubi ubi is the Uh The way we deliver Rel in a container base image. It's essentially rel packages But ubi is the universal base image and it's much more flexible in terms of distribution terms Than rel is so um, you can You can deploy your ubi based container anywhere and only if you're installing it on a Um A licensed rel host whether it be rel or open shift. Do you need to to worry about? Um subscriptions, uh, you can run it. Yeah There's lots of places with without going through the whole rel entitlement effort Well, and we also Build it you said that we built the actual image, but it turns out we Rebuilt those every six weeks roughly unless um, unless there's something pressing like maybe a Critical security vulnerability that would kick off a built sooner probably than six week mark That's right every six weeks. We do what we call a batch release Which is a update of security and bug fixes and when we do that we rebuild all the containers if a cve Vulnerability, um happens, you know in between those six week boundaries and it's Critical, uh, we will asynchronously rebuild that container and make it available immediately So yeah, at least every six weeks sometimes quicker Oh So one of my other questions that I get a lot is about like How do I know what packages or application streams? I know that short has in the chat posted in Our life cycle page. Yeah, exactly Yeah, we we recommend that everybody visit that that life cycle underpaid that life cycle Page to understand what we make available And for how long we support each version each application stream I notice that some versions are supported for longer than other versions How do you guys make those decisions? What we do is we generally look at the life cycle of the upstream long-term support version And we make it at least that long Now some things you mentioned node earlier node releases a new version once a year Um Limited upstream support. So we have like a two-year life cycle for for note A database like my sequel Um, we have a five-year support life cycle and Some of the the databases In in rel we support for the full life So it's a minimum of five years It can be the full life of rel And that's all in that Life cycle page. So we recommend that you take a look at that And depending on the life of your application and whether you update it frequently or or infrequently pick the pick the The right tools for the the length of your application Okay So earlier we were talking about Software collections and how You can there are still a few packages that are done in the same way that software collections was so I know that python is one of those but also the Gcc tool set is one of those Gcc tool set. Yeah, and the reason for that is that developers Who use a compiler like like gcc? normally have Multiple projects that they work on they're working on their their latest project which is Hopefully using a you know the latest version of the compiler And then someone comes and says hey, you know, we found this bug Or you know, we have this want to make this feature change to this this old application that's been in production for a few years So on their same system, they they want to be able to install the the tool set necessary to to make those updates So we find that You know the gcc tool set Is one where where we need to support multiple versions on the same machine So we we default back to to software collections for that for that case And for something like um like python, right? So I know that we included python 2 7 for some of the automation stuff But the most of the applications on rel 8 run on python 3 So we allow them both to be installed simultaneously. How do we determine which one gets used when somebody uses user in python? Um, so there's there's a couple different ways The native python or what we call the system python in rel 8 is python 3 6 So if you if you just invoke python, that's that's what you get And that's what all the system tooling is built on You can install version 2 7 for python 2 compatibility. It's actually installed as a module on rel 8 and You would invoke that by specifying python 2 So python Generally refers to to the system version and then python 2 or python 3 for the newer version Now if that doesn't work for you because of some application Um compatibility issues on developers.redhat.com. We have a lot of content related to python And it we have descriptions of how all this works And if you have a particular application that's looking for something In a particular way We have instructions on how to Do the aliasing that that you need to invoke the right version of python for your for your application And that's actually that's a really good point. I think I would encourage anyone who Has python scripts or a python built application or whatever to to go to developers.redhat.com Just do a search on python and look at all the materials we have on python because it could be very very helpful and You know for Well, I guess at the turn of last year when python 2 upstream went officially unsupported Every day questions would come in. It's like, oh, no, what do I do? You know, I have this python app and that python app. Do I convert it to python 3? Do I try to install python 2? How do I get over his help? So we wrote lots of articles You know depending on on what you want to do, you know, if it's a python 2 app And it's only going to be around for another year install python 2 don't worry about it You know if it's going to be something long term that that you need to maintain Well, you probably ought to think about Porting it to python 3 and and we have You know helpful guides and including hints and things on on what to do and what to look out for So, you know python Continues to be if not the top, you know, certainly one of the top five subjects on developers.redhat.com that that people people look for and I don't think that's going to change I was about to say, yeah, like where where do you think that's going to move? Would it move? Yeah, that's you're probably right. It probably won't change We're going back for all short Everything's just rejects, yeah So I think we should probably maybe talk a little bit about rel 9 and yeah, like where's this all going? So rel 9 is available now for some of our Hardware partners that they're already testing on on the early builds will make the beta available in a couple months Scott, you probably know the exact date. I can't remember off top of my head, but it's it's coming soon And and we'd like we'd like people to start testing on rel 9 If you're familiar with application streams and modules when you get to rel 9 things will work pretty much the same One of the things we're doing that's a little bit different Is that we will have the native long-term support versions of things installed as traditional rpms But when you add new versions or update to new versions, we will still use modules for those so Certainly as you move from rel 8 to to rel 9 Still using modules still work pretty much the same way. We'd like to think that we continually make them easier to use I hope everybody Finds that's the case But we're we're continuing to try to improve the usability of rel in general And certainly modules in particular so If I did know a day For rel 9 beta, you would never know But we're on this kind of published release cycle now. So we should be expecting rel 9 in the the early part or the like a spring For our northern hemisphere folks Next year right And are you planning anything interesting for 8 4 the beta for 8 4 just went out Last week Yeah We are we have a number of application stream Updates. I think the big one is python 3 9 which is available In 8 4 uh, and there's there several new database databases available. I think python I want to say python Postgres 13 Is available I'd have to look at the list. Yeah, same way. I know redis 6 is in there Redis 6 is in there correct. Yeah, and then I can never remember whether it was my sequel or morad db. I think it was my sequel had a an update in that list Yeah, I can I can look really we're all running to look at her. I know, right You you caught me scott. It's morad db 10.5. There you go. 10.5. Okay Yeah, postgres 13 morad db 10 5 php No, actually not php python 3 9 as I said and redis 6 Yeah, those those are the big new versions Of application streams in in 8 4 and we've been releasing It's not like every version we get a new python or php, but Every year pretty much In one of the two releases that we do every year We've been getting newer versions of a whole bunch of different things right most upstream projects are are now settling in on annual releases Of of new minor versions And and then when they do we try to take that and put it into rel into the In the next version And since the annual upstream and we do six month releases you're going to skip one, you know tracking every upstream right And uh in 8 3 we did like a a newer version of git um I I don't remember whether they're on annual release or not, but I I know it's like one Minor release from the most current when we released it so it's like For a lot of people was like, yeah, I've got Get 217 and there's like that one guy. It's like I need to get 118 so Yeah Yeah, we we we try to stay fairly close on I can't but It's not something where most people want to be on the absolutely latest release. So Making sure it's stable first makes makes a lot of sense You know, we have we have the very fast moving packages No js and nginx are the two best examples That that move very quickly add a lot of new features upstream So we tend to get those out out fast Others, you know, we're a little slower and databases we try to we try to stay pretty close with although Most people are not enthusiastic about updating a version of their database unless they have to it's a lot of work it is in fact the Lab that we'll go through here at the end. That's the exemplar module to go through and When I first wrote it, there was a whole pile of people that are like you can't just update your database. It's like, okay Yes, you're right. You know, you need to Export a copy of it and then you do your upgrade and then you import it back again Like there's other system administrative things that you would do for that besides just Flipping around the rpms on the system, right? Yeah Yeah, we had that problem just upgrade in place Right, right that problem in the early days of open ship because it was so easy to you know We're just you know, installing a new container to upgrade your database Yeah, I want the latest version and like oh, what what what just happened right because they didn't go through the proper Upgrade the process of their of their data. Your scheme is corrupted now. What? What happened? No idea So yeah databases that and that's one reason why even upstream they're very long life cycles. Yeah It's not something people like to do yeah, well unlike If you look at things like web applications the application layer evolves pretty quickly in a lot of places But the data that's being stored You might add more data to that over time, but you don't Generally be like oh, I can throw away all this data I don't need that anymore about the historical usage of my application like So I get it Awesome, so is there any other Let's call it Recommended practices that we should use when using application streams So the important one is to be very careful Um When you go from one version to another We're we're trying very hard Application by application to make sure we cover the upgrade process But we have a well documented process for upgrading modules in rel 8, uh, you know, please follow it Um And uh, you know to to upgrade you you would typically enable the The the newer version or install the new version enable the new version and then start start using it But be be very careful. It's not as simple as a as just a a young update Um So, um, please follow the module rules We've made modules very sticky too so that people don't accidentally update And you mentioned the problems with databases But there can be problems with incompatibility and config files and in phd and napachy and things like that as well. So Please please follow the rules and uh, and make sure you account for those cases And we've tried to I say by making them sticky You you have to deliberately upgrade a module just by updating a version of rel or updating your your system You don't get a new version of of a module You have to explicitly ask for it And that's because there are incompatibilities. So so please follow the rules when you do your updates And I don't remember if it was 8.1 or 8.2 But in one of those we made it so you actually had to move the enabled flag to the module version that you wanted to install So you couldn't just reference the Version tag anymore and have that do the do the activity you actually had to Move the enabled flag to the version that you were interested in right right And there's there's multiple ways to accomplish that probably the most The most straightforward is to use the module enable command But you can also do it in the yub install command with a covalent and version number So if you if you're scripting it and and you want to use a common script That that might be the easier way to do it. But if you're doing it through the cli I would recommend using the the module enable and making sure you you follow the process So, uh, if we want we can switch over to like actually hands-on keyboard working with them um Let me share my screen There we go. So it's provisioning my box. Yeah So here we work specifically with modules so We were talking about postgres earlier and that's the the module that That I wrote this lab to work with and you can see that in this 8.3 system We're shipping postgres 96 postgres 10, which is like just the default and postgres 12 And when 8.4 becomes available and we upgrade these Systems to 8 4 then you'll also see postgres 13 in this list So if you want to install, you don't have any modules installed for postgres and you want to install a specific one you can which we'll install and then If you didn't say which one you wanted you would get the default Which in this System is postgres 10. So if you wanted a different one like 12 or 96 you'd have to use this Tag Version information to tell it which one you explicitly want And because no modules are installed after it goes ahead and completes this It will mark that version of postgres as the enabled version on the machine Okay, right. So Right there. He's been marked as the enabled version um, so Brian was talking earlier about how the the application stream is sticky So if I did something like young update like this It's maybe I have the wrong Thing there nothing to do that. That's weird Well, it complains that I typoed something All right, so I'm using the right words. It's just like not able to find it because it's not enabled So what I need to do is remove 96 Is this some of the the safety measures we're seeing Brian or is this something a little different? No, this is one of the the safety measures. So you this is the situation when we were talking about before or if you just Updated the database without doing the proper data migration things could go horribly wrong Right and and just like we were saying before you wouldn't want to just remove your database Right packages you would want to make sure you exported the data so that when you upgraded the The rpms you get that to re-import it back and you'll pick up any changes from that import that matched the new version The database should be installed, right? So here in this example, we're just doing the package Transactions We're not doing all the system administrative bits that you'd want to do in order to make sure that you Didn't have any problems with the data that you had stored in said database with something like node it's less Less problematic because there's less stuff hanging around in the On the system around it. All right And we include all the tooling in rel to do the database migrations as well So it's it's all there All right, so I'm going to do a young module install, but notice this time. I'm not telling it a version What I'd like to see is that it tries to do 10 96 So let's say no to that and actually look at why that might be the case So earlier I said it's the default. So if you don't tell it it it'll assume this but You know, yes when it's enabled that's the version we're going to keep returning to so that you don't accidentally Upgrade or remove an upgrade exactly that makes sense. Okay, we're going to Disable Postgres 96 just show you what that looks like. We can look at the list of postgres modules What are the x's? Those are disabled ones Okay, so I'm going to let's say I want to go to not 10 to 12 So we can enable a specific one Right, so now he's the enabled one And because it's enabled I don't have to specify the version anymore. It knows which one to do because I enabled the one that I wanted which was postgres 12 Right, you can see right here I'm getting postgres 12 Right, this is what we were talking about before where if you're doing it through the cli as god is it's it's better to Enable the particular version explicitly Whereas if you're scripting it and you're going to run the same script repeatedly You can use the the colon version number the way he did the first time That makes it easier to script And brian one other question. I think I know the answer but The profiles that are specified for postgres it defaults to the server profile But what does the profile mean? So the profile is the set of packages that get installed when a when a profile is selected So if you just wanted the client packages, there's a client profile for postgres that includes the Connectors for the various languages for postgres Server is another profile To actually install the server itself. So not all systems want to have the server some you just may want to install the clients So that's typically what we do is client and server for databases other things like identity management and such have much more complicated profiles, but The profile is a set of packages for a specific use case that that makes it easier to To do the install just the way you want it And just uh, we've been specifying the postgres multiple Each time which is why when I do my list I only see the postgres ones But if I take off that additional parameter It'll then essentially be a wild card to show me all the Modules that they've produced in the versions, right? So like there's several different versions of ruby offered through Once again, there's several different versions of ruby offered through application streams You know, we were talking about python earlier and there's two seven and three six, which is this the standard one and then three eight is also distributed to new versions of php a couple different versions of pearl. I know Short told you going back to pearl I mean I worked for newsletter company and their entire CMS was written in pearl and while it was Interesting and unique and you know efficient for pearl It was still very hard to like debug or troubleshoot anything right like the typical pearl problems still you know, even with a Multi-year program was like why is this like this? Oh, it's because of this other thing over here somewhere, right? Yeah I wrote a piece of code in a weekend When I first started red hat to solve a very specific problem and ended up being in production for 17 years Um, that can happen sometimes. Yeah. Yeah. Well, I wrote in pearl because that's what I knew and I didn't do like file.io and stuff Yeah, and then 17 years later I found out it was still production because somebody was like hey I saw that you originally wrote this. I need to do something slightly different. Can you make it do this? Because we can't figure it out. It's like wow. Okay. Cool Yes, so Node is as Brian was talking about engine x right a couple different versions that are And on and on and then we said that there were Some packages that are application streams, but that aren't managed as modules. So I think Brian said apache was one of those Apache actually in rel 8 is a module. Oh, it is okay But yeah, like we talked about gcc Uh, so That is an application stream gcc tool set is an application stream, although it's not package as a module My camera will we call it Tool set. Okay, gcc tool set That's really not getting me what I want. See this way need pearl short I'ma go with no dog No More regex is Never mind My uh, my regex feel is just garbage today You need to grip for the version number and Oh, but I was hoping for was Oh, but it's got to be the version number two. So that's what's not much anything. Yeah Splat dot splat No, I don't think it just ends on uh Like what I was hoping to get rid of was like all That yeah, but yeah the additional again those and everything else. You know, yeah, I mean who doesn't love for trim I mean I'm sure there's some stuff still running on for trans somewhere Oh, there's a lot of things still running on for trim I mean, I don't have to uh, we have some very very hard about that one big customers that are running for trim All right, I think that might do it Oh So I want you to be a dot not a There we go. Well, there it is Oh Although now I don't have 10. Oh because 10 is two. Yeah, it's like that No zero to nine. Let's get in you. Well, so I still need a zero through nine for um For 10 But I need at least one zero through nine. Maybe more than one zero three right Yeah, and I'm just not my shell Rejects foo is poor. Yeah No slash before the Plus sign. Yeah, they we already covered that. Okay. I already did that. Yeah, but it didn't work. Yeah, it didn't work Uh, here we can do this boy. We need like really terrible Okay That's interesting one if it works No It's a whole lot of cpu power you just wasted Nothing Oh, it's because of all the quoting on the shower. I hate it. I mean Why can't you just grep for dash 10 dot x 86 I mean You want me to do multiple greps? No, just one grep just grep for dash 10 It's like cutting the grep short can't do it. Come on. We'll do it Oh Anyway, so we watch me fail with that but uh, but yeah, so I think that's a good point. It wasn't extended regex Should you use e-grap for grep dash e That it that's I would maybe that second one you did So you want to do it like that? Yeah Well, but question the problem is the question mark is a There you go. There you go Thank you, uh, sorry Uh, rapscallion reeves coming through in the clutch. Thank you very much I do this professionally Right, right with the audience Uh, cool. Well, I know that we were at the top of the hour. So, uh Brian, thanks so much for coming to talk to us about application streams This is another you know, relativism that I think we continue to get a lot of questions around and I think You're welcome. Happy to do it I learned some new stuff today. So Thank you Yeah, really appreciate you coming on and that is all for the channel today. I am actually uh turning everything off here And then running to go get my second vaccine shot. So, uh, stay safe out there and get vaccinated if you can please Say everybody Bye