Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conversion inside containers (Virtuozzo) #87

Open
futureweb opened this issue Apr 27, 2023 · 11 comments
Open

Conversion inside containers (Virtuozzo) #87

futureweb opened this issue Apr 27, 2023 · 11 comments
Labels
enhancement New feature or request question Further information is requested

Comments

@futureweb
Copy link

Hello,
are there plans to support conversion inside containers? (Virtuozzo?)
As all our Plesk Servers are running within Virtuozzo Containers ... :-(
Thank you
Andreas
Futureweb GmbH

@SandakovMM
Copy link
Collaborator

Hello Andreas,
Thank you for reaching out. Yes, we are currently exploring ways to support conversion inside containers, including Virtuozzo. However, we are not yet sure if it is possible. We will keep you informed of any progress on this matter through this issue.
Best regards,
Mikhail

@SandakovMM SandakovMM added enhancement New feature or request question Further information is requested labels Apr 28, 2023
@futureweb
Copy link
Author

Hello @SandakovMM,

Thank you for your response. As far as I know, Virtuozzo has already developed processes to perform this migration (without Plesk) successfully. I believe it would be beneficial if this feature is implemented in a similar manner as Virtuozzo's migration process, which can be found at https://github.com/vzlinux/vzupgrade. (https://docs.virtuozzo.com/virtuozzo_linux_8_quick_start_guide/converting-from-centos/converting-from-centos7.html)

Thank you,
Andreas

@SandakovMM
Copy link
Collaborator

Hello @futureweb
Unfortunately, the news is not optimistic. We have investigated and it appears that there is no way to use Elevate (or any other Leapp-based tool) to convert the OS inside a container. This conclusion is based on two facts:

  1. The Leapp upgrade process is based on the Interim System, which upgrades certain packages. It can be described as a temporary OS that replaces CentOS 7 packages with AlmaLinux 8 packages. Leapp does not modify packages inside CentOS 7 itself but rather performs preparations and reboots into an initrd OS that performs the actual transformation.
  2. When we describe containers broadly, we can consider them as a form of isolation within your kernel. So it has no own bootloader, kernel or something where you could start temporary OS.

Therefore, there is no way to start the initrd inside a container. This is why the Leapp framework and as a result our current centos2alma tool cannot be used to convert the OS inside any container (e.g., Docker, Virtuozzo, etc).

Regarding vzupgrade, if I understand correctly, it is a tool to upgrade the bare-metal server that hosts virtual machines and containers. We have attempted to use it to convert a Virtuozzo container on our side without success. Additionally, there is the vzdeploy tool that can be used to convert CentOS 7 into VZLinux 7 inside a container. However, it simply reinstalls packages from the VZLinux repository within the container. As far as I can see, it cannot convert your CentOS 7 into VZLinux 8, for example. Therefore, it does not appear to be a solution to your problem.

We are also exploring other options for container owners:

  1. As far as I know, Virtuozzo allows you to convert a container into a virtual machine. And a Virtuozzo virtual machine can be converted using any leapp based instrument (including centos2alma), so this seems to be the simplest way to resolve the issue.
  2. You could use the Plesk migrator tool to migrate your Plesk from the CentOS 7 container to an AlmaLinux 8 container. Obviously you have to have this AlmaLinux 8 container somewhere.
  3. Try converting your container with vzdeploy into VZLinux 7 and inquire with the Virtuozzo developers if there is any way to convert VZLinux 7 to VZLinux 8 inside a container.

I hope this information will be helpful in addressing your situation. Additionally, we will reach out to the Virtuozzo developers to inquire about their perspective on the problem.

@SandakovMM
Copy link
Collaborator

Virtuozzo have a special script to convert CentOS 7 containers now. Unfortunately, it does not support Plesk. I believe we will be able to discuss it with virtuozzo developers some day and fix the problem.

@futureweb
Copy link
Author

@SandakovMM thank you very much for the update on this topic! :-)
With Plesk Support this would be a really great deal! :-)
Wish you a good start into the new year 24!

@LazariPetru
Copy link

LazariPetru commented Jan 15, 2024

Hi,

As an active user of Plesk, I believe it would greatly enhance if support for the conversion process within Virtuozzo containers could be extended. Given that a significant number of users predominantly opt for VPS servers over dedicated ones, this feature would be highly valuable.

I wholeheartedly support the inclusion of this functionality and appreciate your attention to this matter.
Thank you for your ongoing efforts!

Many thanks,
Petru

@jas8522
Copy link

jas8522 commented Jan 15, 2024

Just chiming in to say I'd also love to see the option to convert a CentOS 7 Virtuozzo container running Plesk to AlmaLinux 8.

I totally understand the problems with using the existing tool - leapp essentially requires a bootloader within the container/VM, which OpenVZ/Virtuozzo does not have.

That means the only way to do this is by triggering the process from the host node to happen on the container, as that provides the same 'external' environment that booting into a temporary OS would. This is how the almaconvert8 project works.

And so rather than modifying the existing centos2alma project, it would make more sense for either:

  1. Plesk devs to fork the almaconvert8 code then integrate any of the custom Plesk-specific changes that they integrated into Elevate into almaconvert8, or
  2. Virtuozzo devs grab the Plesk-specific changes out of this repo and integrate it into their almaconvert8 project

I considered integrating the two myself, but I'm not as comfortable with Python as I likely need to be for an undertaking like this.

I've found Plesk devs to be more transparent about development plans these days than Virtuozzo devs have been, and so I think I would personally rather see (1) happen. Plus Plesk customers are also the only Virtuozzo/OpenVZ users to benefit from this, so that's another reason why it would make sense for Plesk devs take charge of this plan. At least they wouldn't have to start from scratch as the almaconvert8 project should cover everything needed except for the Plesk-specific stuff.

Got my fingers crossed!

@jas8522
Copy link

jas8522 commented Apr 17, 2024

Light amusement... when running almaconvert8 on an OpenVZ node, like almaconvert8 convert $CTID where the container has Plesk installed it says:

CTID: Conversion aborted: Software unsupported by AlmaLinux 8 detected: Plesk
Please contact the software vendor and request AlmaLinux 8 support

Hey Plesk devs: this is my request! ;)

Tried removing Plesk and plesk from the list of blocker packages and running it. Got to the transaction test phase where it replaces all the packages and errored out with what appears to be very basic version conflicts:

Error: Transaction check error:                                                                                                                                                                                                                                                                                      
file /usr/lib64/.libcrypto.so.1.1.1k.hmac from install of openssl-libs-1:1.1.1k-5.vl8.x86_64 conflicts with file from package openssl11-libs-1:1.1.1k-7.el7.x86_64                                                                                                                                                   
file /usr/lib64/.libssl.so.1.1.1k.hmac from install of openssl-libs-1:1.1.1k-5.vl8.x86_64 conflicts with file from package openssl11-libs-1:1.1.1k-7.el7.x86_64                                                                                                                                                      
file /usr/lib64/engines-1.1/capi.so from install of openssl-libs-1:1.1.1k-5.vl8.x86_64 conflicts with file from package openssl11-libs-1:1.1.1k-7.el7.x86_64                                                                                                                                                         
file /usr/lib64/engines-1.1/padlock.so from install of openssl-libs-1:1.1.1k-5.vl8.x86_64 conflicts with file from package openssl11-libs-1:1.1.1k-7.el7.x86_64                                                                                                                                                      
file /usr/lib64/libcrypto.so.1.1.1k from install of openssl-libs-1:1.1.1k-5.vl8.x86_64 conflicts with file from package openssl11-libs-1:1.1.1k-7.el7.x86_64                                                                                                                                                         
file /usr/lib64/libssl.so.1.1.1k from install of openssl-libs-1:1.1.1k-5.vl8.x86_64 conflicts with file from package openssl11-libs-1:1.1.1k-7.el7.x86_64                                                                                                                                                            
file /usr/lib/python3.6/site-packages/pip-9.0.3.dist-info/RECORD from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch                                                                                                                             
file /usr/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch                                                                                                          
file /usr/lib/python3.6/site-packages/pip/__pycache__/__init__.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch                                                                                                                
file /usr/lib/python3.6/site-packages/pip/__pycache__/__main__.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch                                                                                                          
file /usr/lib/python3.6/site-packages/pip/__pycache__/__main__.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch                                                                                                                
file /usr/lib/python3.6/site-packages/pip/__pycache__/basecommand.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch                                                                                                       
file /usr/lib/python3.6/site-packages/pip/__pycache__/basecommand.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch                                                                                                             
file /usr/lib/python3.6/site-packages/pip/__pycache__/baseparser.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch                                                                                                        
file /usr/lib/python3.6/site-packages/pip/__pycache__/baseparser.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch                                                                                                              
file /usr/lib/python3.6/site-packages/pip/__pycache__/cmdoptions.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch                                                                                                        
file /usr/lib/python3.6/site-packages/pip/__pycache__/cmdoptions.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch                                                                                                              
file /usr/lib/python3.6/site-packages/pip/__pycache__/download.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch                                                                                                          
file /usr/lib/python3.6/site-packages/pip/__pycache__/download.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch                                                                                                                
file /usr/lib/python3.6/site-packages/pip/__pycache__/exceptions.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch                                                                                                        
file /usr/lib/python3.6/site-packages/pip/__pycache__/exceptions.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch               

[...]

file /usr/lib/python3.6/site-packages/pip/req/__pycache__/req_set.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/req/__pycache__/req_set.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/req/__pycache__/req_uninstall.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/req/__pycache__/req_uninstall.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/__init__.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/__init__.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/appdirs.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/appdirs.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/build.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/build.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/deprecation.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/deprecation.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/encoding.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/encoding.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/filesystem.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/filesystem.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/glibc.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/glibc.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/hashes.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/hashes.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/logging.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/logging.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/outdated.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/outdated.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/packaging.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/packaging.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/setuptools_build.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/setuptools_build.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/ui.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/utils/__pycache__/ui.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/vcs/__pycache__/__init__.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/vcs/__pycache__/__init__.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/vcs/__pycache__/bazaar.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/vcs/__pycache__/bazaar.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/vcs/__pycache__/git.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/vcs/__pycache__/git.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/vcs/__pycache__/mercurial.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/vcs/__pycache__/mercurial.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/vcs/__pycache__/subversion.cpython-36.opt-1.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/vcs/__pycache__/subversion.cpython-36.pyc from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch
file /usr/lib/python3.6/site-packages/pip/vcs/git.py from install of platform-python-pip-9.0.3-22.vl8.noarch conflicts with file from package python3-pip-9.0.3-8.el7.noarch

Error Summary
-------------

Error: /usr/share/vzyum/bin/yum failed, exitcode=1
Failed to upgrade container from 7 to 8 family

@jas8522
Copy link

jas8522 commented Apr 19, 2024

I've gotten around the above conflicts by removing those packages before beginning (similar to what centos2alma does, from what I can see in the code), however no matter what packages I remove ahead of time, it always gets to a point where it wants to remove basically all plesk-* packages, then fails due to some dependency or another. That's hardly a surprise given just how many packages Plesk installs.

The elevate-cpanel tool provides an option under the heading "Using an alternative tool to upgrade your distro" that's described like this:

Using the --no-leapp option gives you a way to do the actual distro upgrade in your own way. This, for instance, can be used to allow Virtuozzo systems to upgrade cPanel systems, which are not supported by Leapp.

And sure enough in the almaconvert8 utility from Virtuozzo, they utilize that function to prepare the system before completing the OS packages changes:

subprocess.run(['/sbin/vzctl', 'exec', ct, "/scripts/elevate-cpanel","--no-leapp", "--non-interactive", "--start"])

It sure would be nice if we could have a --no-leapp option in the centos2alma utility. It's already got stages like --finish, so why not a --prepare option, so we could:

  1. Run centos2alma --prepare within the container to do the same things that it does before running elevate/leapp
  2. Run almaconvert8 on the parent node to handle the same parts as leapp would do, then
  3. Run centos2alma --finish within the container to complete the process

That way Plesk devs wouldn't be responsible for ensuring this all works; just that the ability is there for others to help make it work.

@jas8522
Copy link

jas8522 commented Apr 27, 2024

I was able to make this all work using Virtuozzo's almaconvert8 utility by saving the list of Plesk components, removing Plesk packages, running almaconvert8, then reinstalling the packages, restoring original config files, and then running a Plesk repair.

This has been scripted and published here: https://github.com/websavers/centos2alma_openvz

Please note:

  1. I've tested this on a basic test container numerous times, as well as one live container, with success in both cases. The test container has been converted (and failed to convert) many times and then reverted to snapshot before then testing conversion again.
  2. It has separate stages that you can trigger individually in case of any errors, and which should be fairly safe to run separately and repeatedly
  3. I have most certainly not covered all possible Plesk extensions and packages, so I can't be certain it will work in all cases
  4. It's been under heavy development for the past couple weeks and may have errors at various points in time as I try to correct for one thing and potentially break another in the process.

Because of this, I strongly recommend that you only use this IF:

  • You're very comfortable troubleshooting issues with Plesk as well as yum/dnf package conflicts
  • You feel comfortable manually repairing any issues that arise and then (hopefully) you'll submit a pull request to help prevent the issue from occurring on future runs for everyone

I look forward to the community engagement on it. Feel free to submit issues and pull requests, but I can't guarantee that I'll have the time to devote to directly addressing issues unless they directly affect our own usage.

Enjoy!

@SandakovMM
Copy link
Collaborator

Great work, thank you!
In regards to virtuozzo containers support in centos2alma, we currently do not have enough resources to support conversion inside virtuozzo containers. So your tool will be very helpful for anyone looking to switch their container to a new distro.
I hope to be able to add the --no-leapp option by the end of this summer.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request question Further information is requested
Projects
None yet
Development

No branches or pull requests

4 participants