MLB playoffs have ended but KBO just started in the first game brought some excitement. This is the postseason bracket over there and Pay attention because it's kind of very bizarre and interesting the number one seed who were the dinos this season they get an automatic buy until The world series to the until the final round, which is best of seven the number two seed gets a buy until The semi-final which they call the playoff and then the number three seed gets a buy To the you know if we were to change this It would be like the top seed gets a buy to the world series The two seed gets a buy to the CS the three seed gets a buy to the DS And then the wild card teams got to play So this game is the first game between the twins and the heroes now another layer a very interesting thing Besides the fact that the number one seed has a two-week buy until the world series They just have to win one series everyone else got to climb the ladder But anyway heroes in the twins the five in the four seed the twins are the four seed So this is a best of three series But the twins are granted one win meaning the twins just have to win one game if the heroes want to advance They have to win both games. They cannot lose the first game They have to sweep the two games that they play because they've already granted the twins a head start That's their advantage for finishing above them. I kind of like I like that a lot I think it's too confusing for American audiences and people wouldn't like it because everyone just hates new things But I think that's a great way to grant an advantage to not wild card teams anyway Let's move on so this is the first game between the two and another interesting rainclaw as you see We're in the bottom of the 13th inning if the game is tied after 15 innings it ends in a tie and The top seed the twins win okay, so Nice pitch there.  This is the first batter huge leg kick Justin Turner style Donaldson style throws that into left field the guy dies where he's chugging into second chugging into second But he gets there tying run. Bam. I don't know keep that guy at first.  He's like come on man You got to do a little bit better than that move me over Next batter comes up and he does just that he moves him over better yet He puts one in the right field. It should be the tying run coming around third. Oh, no Oh, no, what happened? He thought the first baseman might catch it So he ran back because if he got doubled up that would have been the end of the game And then he stuck by the time he gets around third First baseman's got it.  I really messed up Probably should have scored in that single they pinch run for what I'm guessing is the Korean version of Louis Soho because surprising speed ball in the dirt Strike another ball in the dirt.  He runs. They don't even like throw it. That's the go-ahead run guys The no one covered no uncovered second I am very interesting move there to throw balls in the dirt not cover second go ahead run now Let's take in the moment the score is three to two The count is three to two there are two outs one more pitch and the heroes have won the game And all they need to do is win one more and they advance Heroes fans are going nuts twins fans Little lucky blow okay, and then he just she just Dribbles one down the left side and that scores the tying run and there's no play at second What if on this pitch they they decided to keep the go-ahead runner on first base and keep the force Then I think maybe this play you can just throw the dude out at second base All the short stuff does fall down very interesting very confusing, but the game is now tied Oh, here's a fun fact. This was that hitters. It was his first hit since September 26 He was 0 for 26 and he gets the tying hit there Which you know calling it hits kind interesting, but it goes in the rule because it hits So now they're doing the double chop. Oh Ball outside ball low ball inside and low so they just like all right We'll walk him get the force out bases loaded so they bring up another guy now Remember the twins don't really have to score because they can win on a tight game, but it'd be it'd be nice to score Oh my god staring daggers at the pitcher To oh gonna get something in the zone here because they loaded the bases great grabbed by the catcher and that's probably I mean Honestly the catcher. He's like that's a win for him on that pitch. He's like that was badass And everyone knows it Yeah, everyone that saw that knows that that was badass to oh pitch you walk the bases loaded You have to put the ball in play you cannot walk in the winning run This dude's gonna be swinging and he does and boom sends it into right field And that's the game the twins win they move on to the next round its smiles its hugs It's jumping for joy. We're splashing.  Is that something? Is that something that I I shouldn't be commenting on what's that about okay? Anyway moving forward another fun fact about this hitter Min Jae Shin he pinch ran earlier in the game, and he only has 27 career hits to her name How I was staring daggers at the pitcher after the first pitch Gotta love the young cockiness and a trip around the bases. You'll probably remember forever So excited so fun so happy Just jumping hugging so that's the first round some water spray. That's the Korean first round Let's go You thought we were gonna escape it no escaping so now the twins they move up to play the doosan bears that may have happened already No, it's happening today as I record this May have already happened by the time you watch this the breakdowns are evergreen Anyway, now you're all caught up on the Korean series the KBO I like it. I like that baseball and the playoffs can can be so many different ways Keeps it unique. It's interesting


So, hello everyone and welcome to our session. We are truly excited to present how we are moving from GitOps to Kubernetes resource model in our 5G core. So before we start the presentation or we dive into the telecommunications, the world of telecommunications and its intersection with the GitOps and the Kubernetes worlds, I would like to get a feel of the audience first. So could you please raise your hands if anyone's from the telco domain or work in the telco area? Okay, it's really nice to see we have a diverse audience today. So let's start with an analogy. Imagine that you're going on a cross-country road trip and you want to go from point A to B. And you have two options. The first is static paper map. The other one is an application like Apple Maps or Google Maps. So with the static map, you can see that it's quite static. The information or what's in there, it's quite fixed, right? And also it's unchanging and to the user end, it's quite overwhelming. On the other end, you have Apple Maps. It's quite dynamic. It also changes on the external conditions. So if there are any, due to the traffic conditions and such, it will also recommend you different routes and such. As it's more focused, it also gives you a simple way to navigate your path. And these two examples, it really mirrors what we are going through in our journey in the 5G core. So what we have now is GitHub's way of implementation and our configuration. It's quite static. It's very similar to this static paper map. And what we want to achieve in the end is dynamic configuration with the introduction of GitHub's and Kubernetes resource model. So with that, I would like to introduce myself. My name is Ashant Seneverathna. I am the product owner of the mobile cloud native automation team. My name is Joel Studler. I'm a DevOps engineer in the same team. You can find our contact info on the slides if you want to contact us. So we both work for Swisscom. Swisscom is one of the major or leading telco and IT providers in Switzerland. But only that, we're also moving from a telco company to more like a tech company. We call this the journey from telco to techco. So when we talk about 5G core, it's maybe important to distinguish what it means. So 5G consists of two components. The one component is the RAM, the radio access network, which basically makes sure that your cell phone can connect to the tower wirelessly. And then you're being redirected. The other part is the centralized part, which is the core, which basically handles user requests, user data management, authentication, and then actually forwarding the data to the right place. So we're focusing on the core part today. That's our journey, the automation of mobile network cores. So another question to all of you who already had a smartphone or a cell phone late 90s, early 2000s, please raise your hand. So that's not so many interesting, but chances are that when you already had a cell phone back then, it was based on 2G, which was the first mainstream technology used for mobile networkings. There was one G, but it was never reaching mainstream. So in the core part, it was built on custom hardware, like really vendor provided hardware and the configuration management was done using Excel spreadsheets. The next iteration didn't introduce much revolution on these two ends. It basically extended the configuration management with a few scripts. You could imagine like Python scripts or VBA within your Excel sheets, ugly stuff. We call this the physical network functions. The next iteration was introducing virtualization using x86 VMs, which basically paved the way to commodity hardware. The automation was extended with Ansible or like more sophisticated automation tools such as Ansible. This era of network function is called VNF. And where we are at now with 5G, we're basically moving from VMs to containers on Kubernetes, that's called cloud-native network functions, and we also leverage concepts like infrastructure as code and GitOps. And Arshaan is now going to talk about GitOps and what it looks like in practice. Thank you. So let's talk about GitOps. What is GitOps? So far, GitOps is not a tool. It's a way of working or a way of implementation. And the project called OpenGitOps, they have defined four principles, so I would like to go through them now. The first one is declarative. What does declarative mean? A system managed by GitOps must have its desired state expressed declaratively. The second principle is it's continuously reconciled. So the software agent is running on your system. It observes the actual system state and it tries to apply it to the desired state. The third is it's versioned and immutable. So your desired state is stored in a way that it enforces immutability, its version, and also it retains the complete version history. The last is pulled automatically. The software agents automatically pulled the desired state from the source.  But in practice, not all the tools are embracing all these four principles, so it's really necessary to look into what's been done in practice. So here I would like to go through four examples in practice. So the first two are quite similar. The first one is infrastructure as code using Terraform, applied manually. I think most of you have used Terraform configuration. The second is it's very similar to in our set up, which we will go through next, triggering Ansible playbooks using a Jenkins pipeline. So with these two examples, what you see is the configuration is done in a declarative way. It's versioned and versioned control, but it's not harnessing all the full GitOps power, right? So it's missing out the automation and the reconciliation aspects. The third example is GitLab CI pipeline acting on commits. So this also misses the reconciliation aspect of it. The last example is on Flux or Argo CD, so you may have used Flux and Argo CD. So in here what you see is it does the automation and also the continuous reconciliation. It's done in a declarative way and it's also versioned control. So Flux and Argo CD, it adheres to all four principles. Now with these four examples in mind, I would like to show you what's our current state of automation. This is a very high level overview of the automation that we've done in the 5G core, because we don't want to overwhelm with the network or the networking like the topics and such. But what you see here is it's the first phase of our pipeline or the stage of the pipeline. We use Flux as the CD tool and we use the continuous integration in GitLab and it's using VOTE as our secret management tool. So what you see in here is in a very high level, Flux deploys the 5G core and it's using this, according to the previous slide, it's adhering to all four principles. So that's not just that for the 5G core. So Joel will explain how we do the config management. So what you see here is the second phase of our pipeline. It uses Ansible playbooks and the Jenkins pipeline triggers these Ansible playbooks to do the configuration of the core. So in the first phase, we are deploying the 5G core.  The next phase is the quite important part for the network core. It uses the network configuration. Lastly we do some system integrations. It's more about the integration tools, monitoring tools and also the network management tools and such. So as I mentioned in the previous slide, we have quite different flavors of GitOps implementation. So we use a mix of Flux, Ansible and Jenkins. So what you see here is in our implementation, it's missing the reconciliation aspects on the Ansible and the Jenkins setup. And also we are doing it in an out-of-band Kubernetes wave. So we are not harnessing the full power of Kubernetes here. It's also taking a fire and forget approach for the network configuration part. Now next, let's also look into how GitOps manifests look like in our configuration. So this is one of the config files. Obviously you can't read it. There are too many lines. So let's zoom in a little bit. So what you see here is in our configuration or in our average GitOps manifest, it has quite many IP addresses, subnets, VLANs, secret references and such. And it's quite similar to this static map that we described at the start. And most importantly, it's also lacking the abstraction part of it. So with this, it's quite complex for us to scale in our 5G core to many sites. So with that, in our implementation, we have identified some key issues. So often there's no reconciliation aspects. It's more taking a fire and forget approach. It's out of band to Kubernetes. So we don't take the full leverage of the Kubernetes orchestration. And also it's missing the simplification of it. So for the network engineers, it's quite complex to scale our automation framework, what we have implemented. Having said that, we would also like to keep some of the good stuff that we found from the GitOps implementation we had. The source of truth, the review process that we've implemented, and also the declarative aspects. So with that, I would like to hand over to Joel. He will go through how we're going to improve our automation framework using Kubernetes resource model. Yeah. Thank you. So before we talk about how we can solve these issues, we need to talk about configuration in general. So let's assume you have a cloud native app. There is normally, there's a deployment. You have a config map and secrets. Then you expose it through a service, which can be consumed by the app consumer. So that's a very simple case. You have one single source of configuration, which is Kubernetes secrets and config maps. If we look at the bit more complex example, which could be a SQL database, you would still have all of that. But in addition, you now have a SQL command which basically needs to instantiate your database. In this case, create database myDB. So we have the first configuration source coming through the config maps and secrets, but we also have a second config source coming through the app interface. You could solve that using init containers, using operators, or Kubernetes Chrome jobs or jobs, but it's not cloud native by design. And similar to that, in a telco app, we have the exact same or almost the exact same issue. In this case, it's not SQL. It's not a SQL command, but it's a configuration interface that's the telco industry defined as a standard. This standard is called NetConf, and it's defined in an RFC. So here we have the exact same issue. We have the first config source, which is cloud native, and we have a second almost proprietary config source. The issue with that is we think it's not cloud native. It's not adhering to cloud native practice. And in the case of telco apps, we would really like to see a NetConf-free 5G core, but we are also quite sure that this is not going to disappear anytime soon, so we need to solve these issues and work around them. So when we go back to the picture, Ashland wrote, it's a bit simplified here. We have a Jenkins pipeline on top, which triggers an Ansible playbook, which then reads the config from Git, like the paper map, the very detailed configuration, and pushes down the configuration to the application. So that's all this NetConf procedure, which comes after the cloud native stuff. So the first issue is there's no reconciliation. Jenkins is usually in fire and forget mode, so it's a one-off task. Maybe there is a retry, but not so much as a reconciliation, which constantly tries to enforce the desired state, and the second issue is that it's out of bond with Kubernetes. So we cannot see the state of the pipeline within Kubernetes. The way we think we will solve that is by basically converting this manifest from Git into a Kubernetes resource, like a Kubernetes manifest, a CR, in this case of type config, which then can be synced using flux down to the cluster, so it will be an active CR in the cluster. And then we introduce a piece that we call config sync operator, which is a Kubernetes operator that is basically syncing the desired configuration down to the network function through this NetConf interface. So we solve reconciliation with that by introducing an operator that is basically constantly reconciling, and we solve the Kubernetes inbound problem, so we now have visibility from within the cluster across these resources, because everything is living as a custom resource. What we still didn't solve is abstraction, so we still have this static paper map in Git, which is something we need to solve later on. So the tool we currently think is going to solve this issue for us is called STC, it's schema-driven configuration. That's a fairly new tool that was published on GitHub a few weeks ago. It's basically implementing protocols like GNMI and NetConf, so telco industry standards. It's supporting physical, virtual, and cloud-native endpoint. It's vendor agnostic, so you don't need to care or worry if it works as long as your vendor adheres to standards. It's declarative, as in it's using Kubernetes resources, Kubernetes operators, and so on. And on the roadmap, there's schema validation and fixing of config drift. If you want to know more, please visit their website and, yeah, also give feedback and try it out yourself. So I would like to demo this tool very briefly now. Please keep in mind we don't show any of the flux stuff. It's really just on the Kubernetes cluster a very specific demo to this operator. So on this view on the bottom, you can see the operator locks, which is basically the controller that reconciles these resources. On the upper right, you can see the locks of my NetConf server. So I've just deployed a simple NetConf server. It's not a full-blown 5G core. I think that wouldn't run on my laptop, but it's just a simple example app. So if we get the targets, we can see there is already a target there. Target is like an endpoint, which needs to be referenced by my config, which represents my target in the upper right. So if I have a look at the config I will apply, I can see this target is referenced using a label selector. And then in the manifest in the spec of my config, there is this NetConf compatible configuration, which will push down to the CNF. So let me apply that now. And you can see immediately we have, so the reconciler is reconciling it, and on the locks of my NetConf server, we can see that we are getting messages of type edit config. So edit config is the type of message which edits a config. So I'm not going to bore you with NetConf internals, but that's all you need to know right now. And then you can see the XML representation of the config we've had in the spec earlier. So that's a very small demo on how this SDC tool works, which basically will solve this reconciliation topic for us. So remember, we solved reconciliation, and we're now Kubernetes inbounds, so everything is within the cluster. But we still don't have abstraction. So the way we think this will be solved in our case is that we introduce a new custom resource. In this case, in this example, it would be a DNN. DNN stands for data network name. It's a piece of the 5G core, basically, which contains only abstract information. So instead of having, for instance, an IP, IPv4 addresses, like we have on the left side, we now just have a flag that tells the system that we need an IP. So this resource can then be synced by flags down to the cluster, and in addition, we also sync other resources like an external secret, which will be able to fetch secrets from Vault, and a resource, in this case, of type IP address claim, which basically, similar to a PVC persistent volume claims, tells Kubernetes or the ecosystem to claim an IP address. So that's actually how we integrate into our IPAM system. And then we introduce a CNF config operator, which basically assembles these resources and will, based on custom business logic, will be able to render a final config that can't be consumed by the config sync operator I've shown earlier. So with that system, we now solve the reconciliation and its Kubernetes inbounds that was already there. But in addition, we now have abstraction using this CNF config operator. I would like to showcase you very briefly how this IPAM integration works. So we're not going to show you the whole setup, but just one piece of the puzzle. We're using Netbox for IP address management. That's an IPAM tool, and we need to integrate towards this tool. So if we list the CRD that contain Netbox in their name, we have IP addresses and prefixes. So that's just concepts, prefixes like a subnet. And then for each of these, we have the claim resources, similar to PVC and PV. So first, I need to apply the prefix. So there is a new prefix I would like to create. Let me show you on this Netbox UI that there is currently no prefix with that name or with that cider. So I will apply this. And if I refresh now, hopefully, it's a bit small. I can see there is a prefix now. There's no IP address yet assigned. So I will now assign the IP address, which it's a type of IP address claim. So I don't specify the exact IP. I just specify the parent prefix where to get an IP from. And we will then apply this resource. And hopefully, we will get an IP, which is the case. So we will get the .1 IP. And if I refresh in the UI, I will be able to see it was reserved. So that's just one small piece of the puzzle integrating IPs into Kubernetes using Kubernetes resources. So that said, I think we now have the prerequisites for showing you the entire ecosystem, how we envision this. And I will hand over to Ashan for this. Yeah, thanks. So we started with the current state, which is our static paper map example. And you can see here, this is our implementation now. It has these long lines of static configuration. And where we want to move towards this future state with this dynamic configuration, with more simplicity to the user or to the engineers. So as you all mentioned in the previous slide, it starts with the high level intent. So if you compare to the left-hand side, you have these long lines of configuration, which is quite hard to understand or very overwhelming. Here it's a high intent, which then translated by the configuration management into a resource level intent. So this is taken care by the Kubernetes layer. So you can see here the configuration operator. It does the rendering of the configuration by talking to the surrounding operators. And then using the config.sync, we apply the 5G code and the configuration. And here we have introduced the concept, which is within the Kubernetes layer. So what have we solved? In the end, three things. We solved the reconciliation by introducing operators. We have introduced the simplification to our complex configuration by introducing the dynamic config generation. And by introducing the Kubernetes resource model and extending the Kubernetes API, we managed to orchestrate everything in-band to the Kubernetes layer. Yeah, so the only thing left is to share with you our learnings on the journey of thinking beyond GitOps when it comes to Kubernetes workloads. And hopefully, there's something interesting for you as well. So what we learned is that we really should avoid using CI tools for CD. So they're usually fire and forget, which is not what we want on Kubernetes. We should avoid checking in low-level configuration into Git. Things like IP addresses, VLAN IDs, stuff like that. If possible, we should not have them in Git. We learned that tools that are out-of-band with Kubernetes, especially when it comes to automation, they really complicate the whole process and the whole ecosystem. And we would like to see a NetCon-free 5G core. Which will never happen. So what we instead aim to is to reuse cloud-native tools. So all the tools on the CNCF landscape, yeah, we can use them. They're there. They're usually cloud-native, as in they adhere to GitOps practice and to the cloud-native principles. If you don't find a tool that does the job reuse, so if you cannot reuse, then create your own Kubernetes operator and share it, obviously. Then we found that it's important to every now and then validate the GitOps principles in your system, because as Asran showed earlier, we found many places where not all of the GitOps principles were implemented while we were thinking they were implemented or we were thinking we were doing GitOps. Then we learned that it makes sense to introduce abstractions. So get the low-level config out of your Git repo and abstract it away using custom software or operators in our case. And last but not least, please contribute. Share your findings, share your projects. We're also working on open-sourcing this NetBox operator, so if that's something of interest, please approach us and also give feedback to existing projects. So the very last slide contains a few further material. We've talked about GitOps principles and this SDC config-sync tools. There was a talk half a year ago, which is basically the predecessor of what we are showing today at container days. And there is a white paper about accelerating cloud-native in Telco, co-written by Asran, which will be hopefully very interesting for you if you are in Telco. And with that, I thank you very much. Thanks for being here. Thanks for your interest. Yeah. It's time for questions if you have any. Yeah. I don't know maybe you can. You can maybe pass the mic. Hello. Hey. Hey. Thanks for a nice presentation. I just want to clarify maybe a matter of perspective, because in the beginning of presentation you said moving away from GitOps, but in the end you show that your final solution is adhering to all the principles of a GitOps approach. So in my view, you would like all in GitOps not moving away GitOps. That's very true. Yes. I think GitOps is still a very valid concept, but I think the bottom line for us was that we find that most often it's not properly implemented. So the de facto GitOps is not actually GitOps for us. Thank you. I don't think that gives us ... I mean, and also you need to do a lot of ... I mean, especially with the Telco, right? It's not true cloud native. So you need to introduce these operators and such using this Kubernetes resource model. So there's quite a many of things that you need to do in addition, right, to bring the whole lifecycle aspect there. Hi. I was wondering what did you mean in your avoid slide by checking low-level configurations with Git? I'm not sure if you are using GitOps, everything is managed in Git and if it's not Git-centric. So I'm not sure what you meant. Yes, so we feel that if you really have all the low-level configuration, like all the details that you need in your final deployment, if you check all of that into Git, management of it is going to be quite cumbersome because either you have a tool that manages the Git repo for you, but that's not the practice usually, or you will have huge merge requests with many lines which can be quite cumbersome for engineers to manage in the end. Yeah, like big manifests and our take in this is really to simplify it down to the relevant parameters and having as much as possible dynamically fetched from outside systems because usually GitOps is about integrating the app you want to deploy into your ecosystem, right? And there, GitOps is quite static in the end as in if let's say the IP changes or the network changes, you need to go through it manually usually. Yeah, I mean to add to that one, in our low-level configuration, how we prepare it now is it's based on Ansible inventory and the low-level design is in the end, it's an inventory where you have quite amount of IP addresses and these references and stuff, so it's quite dynamic but the configuration itself is static in the end. So yeah, so it's not scalable at all like what we have now. Thank you. So I would like to follow up on that because it was probably the most interesting slide in this presentation to be honest. So what you say is basically you suggest people to not store the state in Git to only store the configuration. Is that basically the same thing? So you have another place where you need to have all those low-level configurations being stored. In your case, are those CRDs or well, where actually are they in your case? The CRs they are stored in the Kubernetes API or you can also have your own extension of the CUBE API if LCD doesn't scale, that's possible. But my question is because you say that you are not recommending storing the low-level configuration like IP addresses or particular villains in the Git. So I assume you want to only have the high-level configuration, what you want to achieve but you still need some place to store the information about the actual IP addresses. Yes. Where the state is in your case? In that city, in the CUBE API. Okay, so it's basically there. But maybe to follow up on that, I mean, we're not 100% sure yet.  It can be useful to have them in a Git repo. So for instance, the approach Nefio has on that is basically Nefio's UI or a CLI interface that basically using KPT, right, is creating merge requests, rendering files, and then you always have the Git log for your actual configuration. So that's something that we imagine could also happen and we're not, we didn't take a final decision yet. Can you write that? Nefio. Okay. Yeah, it's on the second slide, third slide. Yeah, thank you for the presentation. I think you work with Ericsson mostly and I think most CNFs are still not really cloud native. How are you working with Ericsson to become, to have them make more cloud native ready CNFs for you? Yeah, I mean, we do collaborate with them a lot on this journey. And maybe when you say it's not true cloud native, it's like, I guess you're alluding to the configuration aspects of it. So one approach is to have this configuration as config maps or such. This is something that we are discussing. And at the same time, we also have this collaboration with the other operators to define what we really require from the CNFs. And so here we collaborated with Dorje Telecom, Orange and such. So that's the white paper about. So maybe it might be interesting for you to look into. Yeah. Thank you. Hello and thank you. So it seems like you're actually trying to solve how to get tickets out of the system. Or at least that's my take on it. You have a very complex configuration and you have a lot of input. Do you see that you will need to get input from something other than Git? Because now you're saving your states in Git through, or not saving your states, you're saving your requests in Git. But do you see that we will get input from other sources, like totally decoupled from Git or Kubernetes itself, but use Kubernetes to source these resources? Yeah, so I like thousands, millions of requests for IP addresses, for instance. Yeah, I think the key message for us is that Git is suitable for many things and also for GitOps. I mean, it's really a strong concept. But having everything in Git will make the system really static and cumbersome to manage. So everything that you know will be dynamic shouldn't be in Git, I assume. I mean, that's a general statement, but you need to figure it out yourself. But we think there are certain parts of a configuration that should be more dynamic than what Git offers. Yeah. Yeah, and also it's about passing this intent to the Kubernetes layer. Like letting it handle the orchestration of these dynamic components. One question. I see storing dynamic information in Git is like a snapshot of the actual state. What are you doing? What are you bringing life to the system?  Yeah, so the snapshot thing, I mean, according to GitOps, it should be the desired state and not the actual state, right, in Git, if you're here to GitOps practice. But that's what I meant earlier. Maybe it might be useful to have an intermediate step with like an additional GitOps layer, which is more automated. We don't know that yet, but I mean, yeah, rolling back resources that dynamically generates, that's going to be hard if you don't have this additional layer. That's true, yeah. So I don't know if you still have time, but two minutes. Okay, cool. Yeah, thank you. Yeah, in network configuration, you essentially have a lot of dependencies all the time, like day zero configuration, day one configuration, underlays, overlays, and so on. What do you do with these dependencies? Like if you change something in the underlay, would like a Kubernetes resource automatically do a rescheduling of the overlay as well, do post checks, and so on? I assume that should be part of the CRD eventually, like doing post checks if something happens, right? How is, or will this be built in and if, how? Yeah, I mean, maybe simply the dependency mapping, we want to bring into the Kubernetes layer. So say for an example, we have a network function deploying in one site, but on top from the telcos point of view, you could also have a georedundancy, like a configuration. So the idea is to bring this next layer as a CR, introduce as a CR as well. So there could be a geored, like a peering as a CR, and then you build the layers above. So then the next would be the 5G core as a CR. So it's more about handing over the dependency mapping to the Kubernetes layer. Okay, so if you have like a high available connection, then you would like have a CR of both of the legs and have like an overall status in the status or so as well. But maybe it's also important if you want, I mean, the ideal state would be to automate everything. But we're living in another reality where we have constraints, right? So you need to decide where you focus on, and then maybe some of these pieces don't need to be fully automated, and some of the pieces surely should be, right? So it's always a compromise as well, I guess. Yes? Yeah, thank you very much. We will stay here, so please, if you have further questions.


Okay. Hello everyone. Let's start. So, I'm Piotr Kosznicki, the Director of Engineering at CK-Source, so the company behind CK-Editor. And I have zero experience as a Drupal developer and wrote my last PHP line in probably 2011. But I have 12 years of experience as a CK-Editor developer. I worked on CK-R4, CK-05, and with the Drupal team integrating CK-R4 and CK-R5 into Drupal, basically. And I'll talk today about stuff that I know something about, so basically transforming your Drupal installations into more collaborative, uh, continental experience. And a bit of history first. So, uh, CK-R4 became the default editor for Drupal 8. Then in Drupal 9, CK-R5 was added as the option. And in Drupal 10, CK-R4, CK-R5 became the default editor. And CK-R4 is an option. You can install it still as a country module. However, CK-R4 came, uh, will come to the end of its life together with Drupal 9, actually. This will happen at the end of 2023. Uh, and if you are stuck with CK-R4 if you need it for any reasons, you can, uh, you may be interested in the extended support model, but this is, of course, a premium, premium thing. Um, so, yeah, what's actually the big deal about CK-R4 and CK-R5 for some, some more context. So basically these are completely separate projects, completely separate products. Uh, and they share mainly the name and the team behind, uh, and nothing else. We started CK-R5 into, in 2015. Uh, and it took us like eight years to get to a reasonable feature parity with CK-R4, so it was a huge, huge investment. And, uh, for you, probably the biggest and the most important difference will be how both editors handle the data that you feed into them. So for CK-R4, if you feed HTML and a sort of HTML, uh, blow-up into it, and, uh, it's being converted into a similar dump structure. There are very little differences there, the HTML back, and it will be very similar, uh, if you really push hard and try to feed in very complex HTML, it will still be, uh, it can still preserve most of it. With CK-R5, it's a bit harder because we have this custom data model in the middle, so not anymore a dump that's very similar to HTML, but a custom data model, which was designed with, uh, rich text in mind. And, uh, if you think about everything that you can do with HTML, uh, like web apps, uh, very dynamic pages, and, um, then this rich text flavor of HTML will be a subset, a small subset of it. And this is, if you are using CK-R4 or CK-R5 to do that, then you're on the safe side. However, if you're trying to feed in, like, entire pages, then it's going to be complex and risky. Um, and unfortunately if you were using CK-R4, then you will need to migrate to CK-R5 and there's no other, uh, way to say it. This is a content migration, and we did everything we could, the Drupal team as well, to make this migration as smooth as possible for you, but it's still a migration. And the only thing I can say here is that we will not repeat rewriting CK-R4. Uh, this was a huge, huge investment, but there were also important reasons why we did that. And, um, the most important reason was actually collaboration. So we wanted to invest into enabling users to collaborate in CK-R5 to enable multiple people working on a piece of content. And if we talk about collaboration, uh, then we can divide it into, like, three steps. So first there is this creative process where, uh, for instance, content authors write the content, then there is reviewing, so, uh, someone may leave comments, someone may leave suggestions, and then the content once it's done is being published. Uh, however, of course, the process is not that simple. So after someone left you, uh, left you a review, you may need to get back to writing your content, and the same may happen even if the content is already published, uh, because it may be outdated or misleading, and someone may notice that. Uh, and of course, in larger organizations that are main stakeholders, there can be multiple people involved in the process, and it's really, really messy. Uh, so, and the problem that we've observed with the tools that are out there, and this is not specific to Drupal, is that there are, that those tools, CMSs, and other systems don't enable the collaborative process to happen in those systems. So we observed many companies moving that part into Google Docs, Word, Notion now, or any other system that do a better job here. Um, and unfortunately, if you can do actually that outside Drupal, then you will need to copy the content back to Drupal. And this is where things become hard, because this is actually another content migration, and if you do it every time you, you, uh, have to publish the content, then something's wrong, uh, and it's, and it's becoming tricky. So there must be a better way. And actually I wanted to do a live demo now, and let's see if internet is back on my phone. If not, we'll have a screencast. And it's not back, so we'll have a screencast. Um, can you see that? Sorry, give me a second. Yeah. Uh, so here you can see two, two browsers, because I'm locked as two different users into Drupal. And let's add some content, uh, some article in the right browser. So, yeah, we are testing RTC, and you can see how many attempts I have to do to actually record anything. Let's save that piece. And yeah, we needed to save it to have the URL so we can actually open the same piece of content in another browser. And once it loads, you can actually see the avatars of two users, because two users are editing the same piece of content. Uh, so let's say now that one of those users will just paste some content, or you can actually create it in Instigator to start the work. And you can see that the content is being repeated on the, in the second browser. We can save some revision for it.  And let's now turn on the track changes mode, so we'll be suggesting changes, not making them in the content yet. So let's say I don't like this quote, and as you can see, the selection of the user in this browser is actually reflected and rendered here. Uh, so I press Backspace, and the content is marked as a suggestion to remove. Uh, then let's add some comment, and let's switch to that user. Let's say this user is now doing some other work. Of course they can do the work at the same time, but it's hard to actually show it live. Uh, so let's say I accepted the suggestion, and I'll reply to, to this comment. And once I'm done, let's open the revision history, and here we'll be able to see very granular changes than in the content also attributed to the specific users that did those changes. Uh, so we can see that they did everything that happened one by one. We can also compare specific revisions, and, uh, if you, I cannot show this right now about, actually, but if you, uh, highlight the change, you will see what part, which part of change was done by which user. Uh, so sorry it wasn't live demo, but the demo gods are not with me apparently. Let's get back to the slideshow. And I need some water. So yeah, no demo. Uh, back to some, uh, theory. Uh, so the collaboration can be split into two types. So there's this synchronous collaboration that's real time, that's non-blocking when multiple people can work at the same time on a single piece of content, but collaboration can also happen in an asynchronous way when it's still blocking, but you can still, like, leave comments, then the other person can respond to these comments, then some other person can apply changes. So this is, those two modes make some sense. And the typical collaboration features will make sense in both of those modes, except this presence list. So these avatars, of course, that, uh, make little sense in asynchronous collaboration. Um, and let's try to do something productive again, and, uh, this is probably a moment where I have to pause. These are premium features. These are stuff that we add to Cicator, stuff that's thanks to which we can actually, uh, maintain Cicator over many, many years. Uh, so to test those things, you will have to start the 30-day free trial. Uh, no credit card required. Um, and yeah, let's see that now. So there's the premium features, um, module page. There are installation guides here, and I really recommend if you try it at home, doing actually, uh, it through this installation guide, because I'm going to skip some, uh, less important things. Um, but yeah, some highlights. So we'll install the package via Composer. Uh, then you will see the new modules available in your admin panel, so you can filter for premium. You can install those pieces that you need. Uh, then you will have some new configuration options, and the important part will be, uh, the general settings of the premium features, where you have to, uh, copy the keys and everything from, uh, Cicator 5 dashboard. And again, use the guide because, uh, it's not that simple. Um, but it's quick. Anyway, and one thing I wanted to highlight here is this little option at the end. Uh, if you check it, then the, because there's very little space for Cicator in the admin panel, and we need more space to accommodate the sidebar and everything, so recommend checking it. Uh, anyway, once you do that, you will see four new buttons that you can add to your toolbar. This is, uh, comments, comments, archive, track changes, revision, history, and there are some additional configuration options for, for that. Uh, yeah. And if you did that, then you'll already be able to have multiple people working on the same piece of content, uh, no additional steps required. Um, so yeah, getting back to some theory, how does it all work? Um, so for the asynchronous uh, blocking collaboration, the situation is simple. Uh, all content will be stored in your Drupal installation. We need just some additional entity types to store metadata, such as comments, revision history, and suggestions. Um, but the problem with this mode are those awful conflict messages. And, uh, there's, in this case, there's, it's, it's hard to resolve those conflicts because we have more metadata. Uh, and we couldn't figure out yet the way to, uh, make it work seamlessly in Drupal. Uh, so I find the synchronous collaborations of the real-time collaboration far superior here. Um, and in this case, the content that the HTML blob is still stored in Drupal. However, the metadata, uh, like comments, revision history, uh, and, uh, suggestions are stored either on Secretus Cloud or a self-hosted installation of it. And the process how the data is being handled works like this. When a first user starts editing a node, then the content is being sent from Drupal to a collaboration server and collaboration session is being started there. Then the user applies some changes to the content and these changes are immediately sent to the server. So the server, the cloud server always keeps the latest version of the content. It's always up to date there. Uh, when next users join, the content is being loaded to them not from Drupal, but from the collaboration server. So they always get the very latest version of the content with all the changes even though they haven't been saved to Drupal yet. Then when a user clicks save, the content is actually saved to Drupal and whenever everyone is done and, and, uh, there were, there are no active users on the collaboration session for 24 hours, the HTML content is being deleted from the cloud, but the metadata is kept because it has to be used for other sessions. Um, and in this case you may still see those errors. We haven't figured out yet the way to actually completely get rid of them, but the workaround is super simple. So when you see that error, you have to refresh the page and when you refresh the page, the content is loaded to you not from Drupal, but from the cloud. So you get the very latest version of that content and then you can safely click save and no changes will be lost. Uh, so yeah, what else? Uh, for the collaboration features I haven't mentioned permissions yet, so you can have, uh, specific group of users being only able to, uh, comment on the content or apply suggestions, uh, whereas other users can do for instance everything, you can also have notifications via email on comments and suggestions for your content and mentions, uh, of your name in the comments themselves. There are also a couple of other interesting features out there. Um, two that I would highlight are the import from Word because it's a service that lets you just upload a Word file and if you had a Word-centric workflow where the collaboration part of the work would happen in Word and people would use it to comment on the content, create suggestions, then you can import all that into, into Drupal with the, with the comments and suggestions. And the very, uh, recent edition AIS assistant, uh, that we released just two weeks ago, or a week ago, and it will be available, uh, in the, uh, premium module as soon as Drupal updates to CQator for CQator 5 version 40. And that's it. I wanted to have more time for questions, so thank you. And if you have any questions, then ask. So at some point Oh, sorry. So how would CQator work, uh, to edit DocEx files, uh, let's say probably you have DocEx files somewhere and just start, you want to start editing them. So, um, you can do two things. You can copy the content from Word or you can import. Import will preserve more content. Uh, but like copying is a free feature. It's by default in CQator 5. Uh, importing is a premium service. Uh, but it allows, when we have the file and we can process the file, we can, uh, preserve more formatting and also more, uh, and we can preserve those suggestions and comments. And at this point, you actually have to work, let's say in Drupal or any other CQator installation. And if you need to, uh, then we, uh, have export to Word as well. Uh, but for the time being, you will be logged into, in Drupal for instance. So if you would send us to the people who want them, like, uh, an office kind of basically, would they be unedited or something? So there's no full parity between Word and CQator, CQator. We never wanted to make it like a Word replacement. But uh, in many, many cases, we have many, many organizations using CQator for document editing. Uh, the level of features that we have is sufficient. So it really depends on what you actually need. If you have like very rich template that's structured Word files, then you may need, you may miss some features. But, uh, many will work with, there's also a pagination feature which will, uh, if you have everything configured correctly it will render, uh, page breaks, uh, automatically and, uh, a couple other things. Yeah. Okay, so the question okay, uh, so the question was what happens if you start using the premium modules and then you, then you stop what happens. So the HTML, like the root of the content is always stored in Drupal. We don't take that, uh, outside. So if you stop, uh, using premium features, you will still have the content. You will not get, uh, the comments and revision history but the content will be, will be there. Uh, so the question was, uh, that I showed, uh, editing a node directly in admin panel and if I got it right, what, is it possible also to have collaboration like in an inline mode, uh, and the third one I didn't, okay, so when the, the, the thing happens in a popup. So I don't, I'm not 100% sure about the answer because I, I don't know Drupal, uh, that well but, uh, I definitely saw the collaboration features used like in a, a comment part for instance, so they can appear there in an inline editing mode. I don't think, uh, they will, uh, load but if there's, like we, I probably haven't heard that feature requested but if, if we hear then maybe it's, it may be it's actually easy. So the first question was how, whether there's an autosave, uh, so when let's say people are collaborating on the content and they forget to click the save button, right? Um, so we, as a CK editor outside Drupal we have an autosave plugin. I don't know if it can be installed into Drupal, uh, but probably yes. But, uh, an important thing here would be that if, let's say, two guys are collaborating working on a piece of content and both, I don't know if it drops because internet connection ends, uh, the content will be still stored, all the changes, even though they haven't been sent to Drupal, they will be stored on the, uh, cloud server for 24 hours. So when they join again, they can still get the very, very latest version and save back to Drupal. And I don't see reasons for not implementing autosave once those, uh, once we figure out how to get rid of those, uh, conflict messages because probably if two users had autosave enabled, they would just be getting them on and on again. And I will find you after my talking. Okay, figure, uh, so we are running out of time, uh, but I can stay here for however how long do you want, so I'll be in front of the room and we also have a booth at the end. Uh, there are some useful links and I will post them on my Twitter. Uh, thank you very much.


Everybody forced here ripping Black football Six bucks half case number 22. Give me a second here. The names are still loading up. This is picker team We got Brandon S with Washington Brett W. Eagles CJ has the Chargers Derek K Cardinals and Ravens drew R with Houston The Rams and the Niners Dustin B. Bucks John W. Packers Joseph M has the Giants Justin C with the Steelers Justin G. Dolphins Keith B has the Lions and the Browns Kristen P. Saints Lance G with the Cowboys Matthew S. Titans Moe M Chiefs Nate S Broncos Patrick M. Bengals and Jets Peter A. Colts Robert R. Bears Robert R. U. Bears Robert R. O. Raiders Rory C. Panthers Russell P. Seahawks Sam has the Pats Todd C. Vikings and Bills Tyler K. The Falcons and Vaughn has the Jags. Good luck everybody Let's do it You've also got serial number style flawless as we're coming up soon gold standards after this and then it's on the flawless Let's get it. Let's go. Let's get it. Let's go Right It feels heavy for some reason Definitely a thicker pack resizable signature That's out of ten rookie Michael Mayer for the Raiders number to ten Evan Hall rookie for the Colts Seahawks rookie patch number to number to ten Jackson Smith and Jigba This card Seattle The Vikings TJ Hawkinson quad jersey auto and the capstones of 99 Vikings dude for a full case They're crushing it Hawkinson there and Rashi Rice sizable signatures 7 of 50 rookie patch auto chiefs Gorgeous Rashi Rice. He's been pretty solid this year. I think they said they're gonna try to Get him more a part of the offense now, too. I should brought this guy in earlier He's gonna came up base little and give up two runs, I think it was like a grounder though So he's actually pitched fine. He has he has zero and runs What is going on here, dude? This is 75. It's James Conner Conner So on all for the Cardinals Kenny pick it on the prolific sp. Steelers Hello Lowell dang. Hello elusis Yeah, there's some monster passion this stuff Got Kincaid and Mayor dual patch card Bill's Raiders to 50 probably a random at the end check a majority now Buffalo Todd see and the Raiders Robert are random at the end Jiminy pick it. Oh, yeah, you hear what Anthony calls Kenny pick it Jiminy pick it. He's gonna say it, dude Barry Sanders spotlights signatures to a 15 Detroit. Oh My god, that's sick to spotlights in the case Adrienne Peterson in the first half of this case Barry Sanders in the second half of this case group pulling spotlights in or pulling spotlights in black Give me a product a full spotlight signature out of it for you.  You know, no, dude, there's no way That's what he said DK Mac at the 75 CX is he didn't want you to roast him so much Three runs now Maybe they should not brought that guy in earlier Sam how that has been a night full of heaters. That's for sure Rock Purdy starlight materials out of 150 Niners Patriots K. Shambute rookie out of the 199 and Taijai spear sizable signatures Ricky Jersey out of the 99 Titans Now if this guy's up Yeah, now you're right back around to the heart of the lineup they're looking at if he Left early because he's left late He was waiting for the dude to throw the ball I don't know he was got caught sleeping almost if he would have got thrown out of like dude You did that to yourself. Oh, man We got Trevor to 75 Jags and a white knight SP Debo Samuel 49ers I'm gonna just mess around Chris. There was someone in the shop that didn't know Steve Irwin was They're a baby so Dalton Cade Ricky Jersey to 99 for the bills Evan Hall rookie autograph for the Colts Falcons B. John Robinson sizable signatures Ricky Jersey auto out of 99 grade hit Falcons Mag that should do a parking lot races every Every Thursday You got to get in on one Got a rookie to 35 Julia's Brents for the Colts we should do jousting We should get the carts that they put the packages in and stuff they push people around on those Ask Kyle ask Kyle him and Richard at once Torian Thompson Robinson Ricky for the for the Browns Yeah, don't even know who Paul wall was I don't know anybody is to be fair though So that's Don you can't you can't use that as a barometer. Yeah, Jameer gives Ricky Jersey to 150 for the lion Sorry about somebody that's never seen back to the future Oh Got him Back something Donnie Cole commit sizable signatures vet auto here the patch auto bears Jaguars Ricky patch auto to 99 tank Bigsby. Yeah, anything with the acid on it. It's like Jumps up to 180 doesn't look it Plus that like acetate edge Last one here, buddy. This is a really good case actually a lot of a lot of that auto The vet autos are sick in this got Kyler out of 25 for the Cardinals They said he's for sure playing this year. They just don't have a timetable on it yet, which I don't that doesn't add up to me I'm sure he will like he tore his ACL like a while ago rookie Jane Reed Packers They're like, yeah, we want to get into play so we can see if he's improved though Before we head to the draft Jordan Addison Ricky patch to 25 Vikings. It's Donnie. Man. What are you gonna do? Yeah, dude? There's there's probably so much more the hasn't seen I don't even want to know see Higgins quad Jersey auto to 50 for the bangles That's her 2022 black on the capstones. What if Donnie's ever seen Jurassic Park? Rishi rice Ricky dual patch auto chiefs to 99 of the Rishi rice Twice as nice Salt stuff there. Give me a second. Then we'll recap Will we will rock you? Let's see Still just the Falcons the Jets and the Titans in a flawless Okay, relics here. You've got Jordan Addison Give me your Gibbs Dalton Kincaid A purdy. Oh, we got a random that one That's where the jigba Autos of Rishi rice T Higgins tank Bigsby Colchamette John Robinson Look at that one bagged for your falcons got Evan Hull Tyjay Spears K. Sean butte Chase Brown Rishi rice Capstones was TJ Hawkinson and then the spotlight signatures was Barry Sanders the 15 dude That is so nice Give me a second. We'll random the dual patch Those last time the bills and Raiders are good at the same time. Look We will go six times five and one again. That's a dual relic mayor and Kincaid six times one two three four five and six let's go into the Raiders That does it. Thanks. Get everybody moving on a gold standard