{"id":39053,"date":"2025-06-24T14:42:55","date_gmt":"2025-06-24T12:42:55","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=39053"},"modified":"2025-06-24T15:02:28","modified_gmt":"2025-06-24T13:02:28","slug":"how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/","title":{"rendered":"How to Contribute to the YaK Project: Adding a New Infrastructure Provider (e.g., OpenShift Virtualization)"},"content":{"rendered":"\n<p>YaK is a platform-agnostic framework designed to streamline and automate the deployment of infrastructure and&nbsp;middleware&nbsp;components&nbsp;(database, K8S,etc..) across various environments. With its open-source core, YaK enables developers, DevOps teams, and IT professionals to manage infrastructure provisioning and component deployment efficiently, without being tied to a specific vendor. Whether you&#8217;re working with AWS, Azure, Oracle Cloud Infrastructure (OCI), or on-premises servers, YaK provides a consistent and flexible solution for your deployment needs. To have more informations, visit <a href=\"https:\/\/yak4all.io\/\">https:\/\/yak4all.io\/<\/a><\/p>\n\n\n\n<p>In this guide, we&#8217;ll walk you through the process of contributing to the YaK project by adding support for a new infrastructure provider, using OpenShift Virtualization as an example. We&#8217;ll cover the steps to fork the necessary repositories, implement the required changes, and integrate your contributions into the main project.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"900\" height=\"600\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-30.png\" alt=\"\" class=\"wp-image-39138\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-30.png 900w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-30-300x200.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-30-768x512.png 768w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-overview-of-the-yak-project-architecture\">Overview of the YaK Project Architecture<\/h2>\n\n\n\n<p>YaK is organized into multiple GitLab repositories, each responsible for a specific part of the system, here the ones we will participate:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a class=\"\" href=\"https:\/\/gitlab.com\/yak4all\/yakenv\"><code>yakenv<\/code><\/a>: Environment container image with all the packages and dependencies<\/li>\n\n\n\n<li><a class=\"\" href=\"https:\/\/gitlab.com\/yak4all\/yak_core\"><code>yak_core<\/code><\/a>: Is using yakenv as based image, core logic<\/li>\n\n\n\n<li><a class=\"\" href=\"https:\/\/gitlab.com\/yak4all\/yak_backend\/yak_runner\"><code>yak_runner<\/code><\/a>: Is using yak_core as based image, backend logic for automation jobs<\/li>\n\n\n\n<li><a class=\"\" href=\"https:\/\/gitlab.com\/yak4all\/yak_frontend\/yak_ui\"><code>yak_ui<\/code><\/a>: Web-based frontend<\/li>\n<\/ul>\n\n\n\n<p>These components work together to provide a modular, extensible framework for managing your different infrastructures and attached components.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-1-fork-the-repositories\">Step 1: Fork the Repositories<\/h2>\n\n\n\n<p>Before starting development, fork each of the required repositories into your own GitLab account:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to each project page:\n<ul class=\"wp-block-list\">\n<li><a class=\"\" href=\"https:\/\/gitlab.com\/yak4all\/yakenv\">yakenv<\/a><\/li>\n\n\n\n<li><a class=\"\" href=\"https:\/\/gitlab.com\/yak4all\/yak_core\">yak_core<\/a><\/li>\n\n\n\n<li><a class=\"\" href=\"https:\/\/gitlab.com\/yak4all\/yak_backend\/yak_runner\">yak_runner<\/a><\/li>\n\n\n\n<li><a class=\"\" href=\"https:\/\/gitlab.com\/yak4all\/yak_frontend\/yak_ui\">yak_ui<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Click the <strong>Fork<\/strong> button at the top right of the page.<\/li>\n\n\n\n<li>Choose your namespace (e.g., your GitLab username or organization).<\/li>\n\n\n\n<li>Repeat for all repositories.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-2-set-up-your-local-environment\">Step 2: Set Up Your Local Environment<\/h2>\n\n\n\n<p>Clone the forked repositories to your local machine:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ngit clone https:\/\/gitlab.com\/&lt;your-namespace&gt;\/yakenv.git\ngit clone https:\/\/gitlab.com\/&lt;your-namespace&gt;\/yak_core.git\ngit clone https:\/\/gitlab.com\/&lt;your-namespace&gt;\/yak_backend\/yak_runner.git\ngit clone https:\/\/gitlab.com\/&lt;your-namespace&gt;\/yak_frontend\/yak_ui.git\n<\/pre><\/div>\n\n\n<p>Then install dependencies (Docker or Podman) and ensure each project builds correctly. Refer to the <code>README.md<\/code> files for project-specific setup instructions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-3-implement-the-new-infrastructure-provider\">Step 3: Implement the New Infrastructure Provider<\/h2>\n\n\n\n<p>To add OpenShift Virtualization as a new provider, you will need to make coordinated changes across the different components:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-yakenv\">yakenv<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Dockerfile<\/code>: Add to this file the commands to install Ansible collections and\/or CLI packages that you will need to interract with your new provider.<br>Here&#8217;s the lines we added for Openshift Virtualization:<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n# Install Kubevirt collection (OpenShift Virtualization)\nRUN ansible-galaxy collection install kubevirt.core==2.1.0 --collections-path \/etc\/ansible\/collections --force\n\n# Install virtctl CLI (Kubevirt)\nRUN curl -lL https:\/\/github.com\/kubevirt\/kubevirt\/releases\/download\/v1.5.1\/virtctl-v1.5.1-linux-amd64 -o \/usr\/bin\/virtctl &amp;amp;&amp;amp; chmod +x \/usr\/bin\/virtctl\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><code>requirements.txt<\/code>: The python pip packages to install.<br>Here&#8217;s the line we added for Openshift Virtualization:<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nkubernetes==22.6.0\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-yak-core\">yak_core<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>collections\/ansible_collections\/yak\/core\/roles<\/code>: This is the directory were you will find all the tasks to manage the infrastructures and the servers storage.<br>In this directory you will find the <code>infrastructures<\/code> which is a template for a new infrastructures, you can copy it and rename it as the name of your infrastructure (replace white spaces by underscores <code>_<\/code>) here <code>openshift_virtualization<\/code><\/li>\n\n\n\n<li><code>collections\/ansible_collections\/yak\/core\/roles\/openshift_virtualization\/defaults\/main.yml<\/code>: Define the variables defaults values:<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\n---\nstate: present\nopenshift_namespace: default\ncustom_labels: {}\ninstance_type: u1.medium\nkubeconfig_path: ~\/yak\/kubeconfig\npreference_name: &quot;&quot;\n\nrhel_activation_key: &quot;{{ lookup(&#039;env&#039;,&#039;RHEL_ACTIVATION_KEY&#039;) }}&quot;\nrhel_org_id: &quot;{{ lookup(&#039;env&#039;,&#039;RHEL_ORG_ID&#039;) }}&quot;\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><code>collections\/ansible_collections\/yak\/core\/roles\/openshift_virtualization\/tasks<\/code>: the tasks files for your infrastructure. There is the minimum files:<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>main.yml<\/code>: the default task file, it will redirect to the tasks depending of the state. Here is the content:<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\n---\n- include_tasks: check_credential.yml\n- include_tasks: &quot;{{ state }}.yml&quot;\n\n<\/pre><\/div>\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><code>check_credentials.yml<\/code>: Step to valid that the provided credentials are valid<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\n---\n- block:\n  - name: List all VMs - Verifying credentials are valid\n    delegate_to: localhost\n    kubevirt.core.kubevirt_vm_info:\n      namespace: &quot;{{ openshift_namespace }}&quot;\n    retries: 3\n    delay: 5\n  rescue:\n  - fail:\n      msg: &#039;Please ensure your OpenShift credentials are valid.&#039;\n\n<\/pre><\/div>\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><code>present.yml<\/code>: Steps to create the server&#8217;s VM on your infrastructure. If there is some differences to create a linux or windows server, you can include sub-tasks files (here we developed <code>create_linux.yml<\/code> and <code>create_windows.yml<\/code>)<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\n# Copyright: (c) 2025, dbi services, distributed without any warranty under the terms of the GNU General Public License v3\n- ansible.builtin.include_tasks: \n    file: get_vm_state.yml\n\n- delegate_to: localhost\n  set_fact:\n    number_of_vms: &quot;{{ r_get_vm_state.resources | length }}&quot;\n\n- block:\n  - include_tasks: &quot;create_{{ os_type }}.yml&quot;\n  - include_tasks: post_config.yml\n  when: number_of_vms | int == 0\n\n- when: number_of_vms | int &gt; 0\n  block:\n    - fail:\n        msg: &quot;Cannot Deploy as the VirtualMachine already exists.&quot;\n<\/pre><\/div>\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><code>started.yml<\/code>: Steps to start the server&#8217;s VM<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\n---\n- name: Power On\n  delegate_to: localhost\n  ansible.builtin.shell: &quot;virtctl --kubeconfig {{ openshift_virtualization_kubeconfig }} --namespace {{ openshift_namespace }} start {{ machine_name }}&quot;\n  register: r_openshift_virtualization_vm_started\n\n- include_tasks: &quot;post_config.yml&quot;\n\n<\/pre><\/div>\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li><code>stopped.yml<\/code>: Steps to power off your server<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\n---\n- name: Power Off\n  delegate_to: localhost\n  ansible.builtin.shell: &quot;virtctl --kubeconfig {{ openshift_virtualization_kubeconfig }} --namespace {{ openshift_namespace }} stop {{ machine_name }}&quot;\n  register: r_openshift_virtualization_vm_stopped\n\n<\/pre><\/div>\n\n\n<ol start=\"6\" class=\"wp-block-list\">\n<li><code>absent.yml<\/code>: Steps to destroy the server<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: yaml; title: ; notranslate\" title=\"\">\n---\n- name: Delete the VirtualMachine\n  delegate_to: localhost\n  kubevirt.core.kubevirt_vm:\n    namespace: &quot;{{ openshift_namespace }}&quot;\n    state: absent\n    name: &quot;{{ machine_name }}&quot;\n  register: r_openshift_virtualization_vm_absent\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-yak-runner\">yak_runner<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>sql\/upgrade\/2.2.0\/02-infrastructures.sql<\/code>: Add in the infrastructures jsonb specification schema, the new provider with its specific parameters<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nUPDATE jsonb_specifications\nSET schema = \n&#039;{\n  &quot;variableName&quot;: &quot;variables&quot;,\n  &quot;dataType&quot;: &quot;object&quot;,\n  &quot;niceName&quot;: &quot;Variables&quot;,\n  &quot;isSelectable&quot;: true,\n  &quot;selectorType&quot;: &quot;providerName&quot;,\n  &quot;selectorOption&quot;: &#x5B;\n    &quot;aws&quot;,\n    &quot;azure&quot;,\n    &quot;oci&quot;,\n    &quot;openshift_virtualization&quot;\n  ],\n  &quot;aws&quot;: &#x5B;\n    ...\n  ],\n  &quot;azure&quot;: &#x5B;\n    ...\n  ],\n  &quot;oci&quot;: &#x5B;\n    ...\n  ],\n  &quot;openshift_virtualization&quot;: &#x5B;\n    {\n      &quot;dataType&quot;: &quot;string&quot;,\n      &quot;defaultValue&quot;: &quot;default&quot;,\n      &quot;isOneOffSetting&quot;: false,\n      &quot;maxLength&quot;: 100,\n      &quot;mandatory&quot;: true,\n      &quot;variableName&quot;: &quot;network_name&quot;,\n      &quot;usage&quot;: &quot;Network name to connect&quot;,\n      &quot;regex&quot;: null,\n      &quot;niceName&quot;: &quot;Network Name&quot;,\n      &quot;minLength&quot;: 1\n    },\n    {\n      &quot;dataType&quot;: &quot;string&quot;,\n      &quot;defaultValue&quot;: &quot;default&quot;,\n      &quot;isOneOffSetting&quot;: false,\n      &quot;maxLength&quot;: 100,\n      &quot;mandatory&quot;: true,\n      &quot;variableName&quot;: &quot;domain_device_interface_name&quot;,\n      &quot;usage&quot;: &quot;Domain device interface name&quot;,\n      &quot;regex&quot;: null,\n      &quot;niceName&quot;: &quot;Domain Device Interface Name&quot;,\n      &quot;minLength&quot;: 1\n    },\n    { &quot;variableName&quot;: &quot;custom_labels&quot;, &quot;niceName&quot;: &quot;Infrastructure labels&quot;, &quot;dataType&quot;: &quot;dictionary&quot;, &quot;mandatory&quot;: false }\n  ]\n}\n&#039;::jsonb\nWHERE name = &#039;infrastructureVariables&#039;;\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><code>sql\/upgrade\/2.2.0\/05-server_secret_type_parameters.sql<\/code>: Add in the according tables the new provider and if needed, new secret type with its parameters:<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\ninsert into providers values\n(5,\t&#039;openshift_virtualization&#039;, true, &#039;{}&#039;, &#039;OpenShift Virtualization&#039;);\n\ninsert into secret_types values\n(7,\t&#039;kubeconfig&#039;,true,true,false,5);\n\n-- Data: secret_type_parameters\ninsert into secret_type_parameters (secret_type_id, variable_name, nice_name, data_type_id, mandatory, options, min_length, max_length) values\n-- Kubeconfig\n(7, &#039;K8S_AUTH_KUBECONFIG&#039;, &#039;OpenShift Kubeconfig&#039;, 1, true, null, 1, 5120);\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><code>sql\/upgrade\/2.2.0\/06-provider_images.sql<\/code>: Add new images for your new provider and allow admin to manage them:<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\ninsert into provider_images (name, provider_id, operating_system_type_id, ansible_user, variables, user_id) values\n-- OpenShift Virtualization linux\n(&#039;datasource_centos-stream9&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;centos-stream9&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),\n(&#039;datasource_centos-stream10&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;centos-stream10&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),\n(&#039;datasource_fedora&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;fedora&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),\n(&#039;datasource_rhel8&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;rhel8&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),\n(&#039;datasource_rhel9&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;rhel9&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),\n(&#039;datasource_ubuntu24-04&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;ubuntu24-04&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),\n(&#039;datasource_win2k22&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;win2k22&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),\n(&#039;datasource_win2k25&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;win2k25&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),\n(&#039;datasource_win10&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;win10&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1),\n(&#039;datasource_win11&#039;, 5, 1, &#039;admin&#039;, &#039;{&quot;dataSource&quot;: {&quot;name&quot;: &quot;win11&quot;, &quot;namespace&quot;: &quot;openshift-virtualization-os-images&quot;}}&#039;, 1);\n\ninsert into projects_provider_images (project_id, image_id, user_id) \n    select 1, id, 1 from provider_images where provider_id=5;\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><code>sql\/upgrade\/2.2.0\/07-servers.sql<\/code>: Adding server parameters for the new provider :<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nUPDATE jsonb_specifications\nSET schema = \n&#039;{\n  &quot;variableName&quot;: &quot;variables&quot;,\n  &quot;niceName&quot;: &quot;Variables&quot;,\n  &quot;dataType&quot;: &quot;object&quot;,\n  &quot;isSelectable&quot;: true,\n  &quot;selectorType&quot;: &quot;providerName&quot;,\n  &quot;selectorOption&quot;: &#x5B;&quot;aws&quot;, &quot;azure&quot;, &quot;oci&quot;, &quot;openshift_virtualization&quot;, &quot;on_premises&quot;],\n  &quot;aws&quot;: &#x5B;\n    ...\n  ],\n  &quot;azure&quot;: &#x5B;\n    ...\n  ],\n  &quot;oci&quot;: &#x5B;\n    ...\n  ],\n   &quot;on_premises&quot;: &#x5B;\n    ...\n  ],\n  &quot;openshift_virtualization&quot;: &#x5B;\n    {\n      &quot;variableName&quot;: &quot;providerImageId&quot;,\n      &quot;niceName&quot;: &quot;Provider Image ID&quot;,\n      &quot;dataType&quot;: &quot;integer&quot;,\n      &quot;hidden&quot;: true,\n      &quot;mandatory&quot;: false,\n      &quot;isOneOffSetting&quot;: false\n    },\n    {\n      &quot;dataType&quot;: &quot;string&quot;,\n      &quot;defaultValue&quot;: null,\n      &quot;isOneOffSetting&quot;: true,\n      &quot;maxLength&quot;: 100,\n      &quot;mandatory&quot;: true,\n      &quot;variableName&quot;: &quot;providerImageName&quot;,\n      &quot;usage&quot;: &quot;See documentation&quot;,\n      &quot;regex&quot;: null,\n      &quot;options&quot;: &quot;values.vProviderImages&quot;,\n      &quot;niceName&quot;: &quot;Provider Image Name&quot;,\n      &quot;minLength&quot;: 1\n    },\n    {\n      &quot;variableName&quot;: &quot;providerShapeId&quot;,\n      &quot;niceName&quot;: &quot;Provider Shape ID&quot;,\n      &quot;dataType&quot;: &quot;integer&quot;,\n      &quot;hidden&quot;: true,\n      &quot;mandatory&quot;: false,\n      &quot;isOneOffSetting&quot;: false\n    },\n    {\n      &quot;dataType&quot;: &quot;string&quot;,\n      &quot;defaultValue&quot;: null,\n      &quot;isOneOffSetting&quot;: true,\n      &quot;maxLength&quot;: 100,\n      &quot;mandatory&quot;: true,\n      &quot;variableName&quot;: &quot;providerShapeName&quot;,\n      &quot;usage&quot;: &quot;See documentation&quot;,\n      &quot;regex&quot;: null,\n      &quot;options&quot;: &quot;values.vProviderShapes&quot;,\n      &quot;niceName&quot;: &quot;Provider Shape Name&quot;,\n      &quot;minLength&quot;: 1\n    },\n    { \n      &quot;variableName&quot;: &quot;openshift_namespace&quot;,\n      &quot;niceName&quot;: &quot;Namespace&quot;,\n      &quot;defaultValue&quot;: &quot;default&quot;,\n      &quot;dataType&quot;: &quot;string&quot;,\n      &quot;mandatory&quot;: true\n    },\n    { \n      &quot;variableName&quot;: &quot;preference_name&quot;,\n      &quot;niceName&quot;: &quot;Preference Name&quot;,\n      &quot;defaultValue&quot;: &quot;&quot;,\n      &quot;dataType&quot;: &quot;string&quot;,\n      &quot;mandatory&quot;: true\n    },\n    { &quot;variableName&quot;: &quot;custom_labels&quot;, &quot;niceName&quot;: &quot;Server labels&quot;, &quot;dataType&quot;: &quot;dictionary&quot;, &quot;mandatory&quot;: false }\n\n  ]\n}&#039; :: jsonb\nWHERE name = &#039;serverVariables&#039;;\n\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><code>sql\/upgrade\/2.2.0\/11-components-storage-jsonb.sql<\/code>: Adding component disks parameters for the provider:<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nUPDATE jsonb_specifications\nSET schema = \n    &#039;{\n      &quot;dataType&quot;: &quot;object&quot;,\n      &quot;on_premises&quot;: &#x5B;],\n      &quot;isSelectable&quot;: true,\n      &quot;selectorType&quot;: &quot;providerName&quot;,\n      &quot;variableName&quot;: &quot;storageVariables&quot;,\n      &quot;selectorOption&quot;: &#x5B;\n        &quot;aws&quot;,\n        &quot;azure&quot;,\n        &quot;oci&quot;,\n        &quot;on_premises&quot;,\n        &quot;openshift_virtualization&quot;\n      ],\n      &quot;aws&quot;: &#x5B;\n        ...\n       ],\n      &quot;azure&quot;: &#x5B;\n        ...\n      ],\n      &quot;oci&quot;: &#x5B;\n        ...\n      ],\n      &quot;on_premises&quot;: &#x5B;\n       ...\n      ],\n      &quot;openshift_virtualization&quot;: &#x5B;\n        {\n          &quot;dataType&quot;: &quot;array&quot;,\n          &quot;isSelectable&quot;: true,\n          &quot;selectorType&quot;: &quot;osType&quot;,\n          &quot;variableName&quot;: &quot;filesystems&quot;,\n          &quot;niceName&quot;: &quot;File systems&quot;,\n          &quot;selectorOption&quot;: &#x5B;\n            &quot;Linux&quot;,\n            &quot;Windows&quot;\n          ],\n          &quot;Linux&quot;: &#x5B;\n            {\n                &quot;variableName&quot;: &quot;mount_point&quot;,\n                &quot;niceName&quot;: &quot;Mount point, e.g. \/app&quot;,\n                &quot;dataType&quot;: &quot;string&quot;,\n                &quot;defaultValue&quot;: null,\n                &quot;isOneOffSetting&quot;: true,\n                &quot;maxLength&quot;: 100,\n                &quot;mandatory&quot;: true,\n                &quot;minLength&quot;: 1\n            },\n            {\n                &quot;variableName&quot;: &quot;filesystem_type&quot;,\n                &quot;niceName&quot;: &quot;Filesystem type&quot;,\n                &quot;dataType&quot;: &quot;string&quot;,\n                &quot;mandatory&quot;: true,\n                &quot;isOneOffSetting&quot;: false,\n                &quot;defaultValue&quot;: &quot;xfs&quot;\n            },\n            {\n                &quot;variableName&quot;: &quot;size_gb&quot;,\n                &quot;niceName&quot;: &quot;Mount point size in GB&quot;,\n                &quot;dataType&quot;: &quot;integer&quot;,\n                &quot;mandatory&quot;: true,\n                &quot;isOneOffSetting&quot;: false,\n                &quot;defaultValue&quot;: 20\n            },\n            {\n              &quot;dataType&quot;: &quot;integer&quot;,\n              &quot;isOneOffSetting&quot;: true,\n              &quot;mandatory&quot;: true,\n              &quot;variableName&quot;: &quot;max_size_gb&quot;,\n              &quot;niceName&quot;: &quot;Disk size&quot;,\n              &quot;min&quot;: 1,\n              &quot;defaultValue&quot;: -1,\n              &quot;usage&quot;: &quot;Defines the size of the virtual disk at cloud provider end. 5% overhead is automatically added to each disk for metadata storage.&quot;\n            },\n            {\n              &quot;dataType&quot;: &quot;string&quot;,\n              &quot;niceName&quot;: &quot;Storage Class Name&quot;,\n              &quot;mandatory&quot;: false,\n              &quot;maxLength&quot;: 100,\n              &quot;minLength&quot;: 0,\n              &quot;defaultValue&quot;: &quot;&quot;,\n              &quot;variableName&quot;: &quot;volume_storageClassName&quot;,\n              &quot;isOneOffSetting&quot;: true\n            }\n          ],\n          &quot;Windows&quot;: &#x5B;\n            {\n                &quot;variableName&quot;: &quot;drive_letter&quot;,\n                &quot;niceName&quot;: &quot;Drive letter, e.g. F&quot;,\n                &quot;dataType&quot;: &quot;string&quot;,\n                &quot;defaultValue&quot;: null,\n                &quot;isOneOffSetting&quot;: true,\n                &quot;maxLength&quot;: 100,\n                &quot;mandatory&quot;: true,\n                &quot;minLength&quot;: 1\n            },\n            {\n                &quot;variableName&quot;: &quot;partition_label&quot;,\n                &quot;niceName&quot;: &quot;Partition label&quot;,\n                &quot;dataType&quot;: &quot;string&quot;,\n                &quot;mandatory&quot;: true,\n                &quot;isOneOffSetting&quot;: false,\n                &quot;defaultValue&quot;: &quot;data&quot;\n            },\n            {\n                &quot;variableName&quot;: &quot;size_gb&quot;,\n                &quot;niceName&quot;: &quot;Mount point size in GB&quot;,\n                &quot;dataType&quot;: &quot;integer&quot;,\n                &quot;mandatory&quot;: true,\n                &quot;isOneOffSetting&quot;: false,\n                &quot;defaultValue&quot;: 20\n            },\n            {\n              &quot;dataType&quot;: &quot;string&quot;,\n              &quot;niceName&quot;: &quot;Storage Class Name&quot;,\n              &quot;mandatory&quot;: false,\n              &quot;maxLength&quot;: 100,\n              &quot;minLength&quot;: 0,\n              &quot;defaultValue&quot;: &quot;&quot;,\n              &quot;variableName&quot;: &quot;volume_storageClassName&quot;,\n              &quot;isOneOffSetting&quot;: true\n            }\n          ]\n        }\n      ]\n    }&#039; :: jsonb\n  WHERE name = &#039;componentStorageVariables&#039;;\n\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><code>sql\/upgrade\/2.2.0\/12-provider_disks_parameters_root_jsonb.sql<\/code>: Adding server disks parameters for the provider:<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nUPDATE jsonb_specifications\nSET schema = \n    &#039;{\n      &quot;dataType&quot;: &quot;object&quot;,\n      &quot;on_premises&quot;: &#x5B;],\n      &quot;isSelectable&quot;: true,\n      &quot;selectorType&quot;: &quot;providerName&quot;,\n      &quot;variableName&quot;: &quot;storageVariables&quot;,\n      &quot;selectorOption&quot;: &#x5B;\n        &quot;aws&quot;,\n        &quot;azure&quot;,\n        &quot;oci&quot;,\n        &quot;on_premises&quot;,\n        &quot;openshift_virtualization&quot;\n      ],\n      &quot;aws&quot;: &#x5B;\n        ...\n       ],\n      &quot;azure&quot;: &#x5B;\n        ...\n      ],\n      &quot;oci&quot;: &#x5B;\n        ...\n      ],\n      &quot;on_premises&quot;: &#x5B;\n       ...\n      ],\n      \n  &quot;openshift_virtualization&quot;: &#x5B;\n    {\n      &quot;Linux&quot;: &#x5B;\n        {\n          &quot;dataType&quot;: &quot;integer&quot;,\n          &quot;niceName&quot;: &quot;Size in GB&quot;,\n          &quot;mandatory&quot;: true,\n          &quot;defaultValue&quot;: 30,\n          &quot;variableName&quot;: &quot;volume_size&quot;,\n          &quot;isOneOffSetting&quot;: true\n        },\n        {\n          &quot;dataType&quot;: &quot;string&quot;,\n          &quot;niceName&quot;: &quot;Storage Class Name&quot;,\n          &quot;mandatory&quot;: false,\n          &quot;maxLength&quot;: 100,\n          &quot;minLength&quot;: 0,\n          &quot;defaultValue&quot;: &quot;&quot;,\n          &quot;variableName&quot;: &quot;volume_storageClassName&quot;,\n          &quot;isOneOffSetting&quot;: true\n        },\n        {\n          &quot;options&quot;: &#x5B;\n            &quot;Block&quot;,\n            &quot;Filesystem&quot;\n          ],\n          &quot;dataType&quot;: &quot;string&quot;,\n          &quot;niceName&quot;: &quot;Disk type&quot;,\n          &quot;mandatory&quot;: true,\n          &quot;maxLength&quot;: 100,\n          &quot;minLength&quot;: 1,\n          &quot;defaultValue&quot;: &quot;Filesystem&quot;,\n          &quot;variableName&quot;: &quot;volume_mode&quot;,\n          &quot;isOneOffSetting&quot;: true\n        }\n      ],\n      &quot;Windows&quot;: &#x5B;\n        {\n          &quot;dataType&quot;: &quot;integer&quot;,\n          &quot;niceName&quot;: &quot;Size in GB&quot;,\n          &quot;mandatory&quot;: true,\n          &quot;defaultValue&quot;: 30,\n          &quot;variableName&quot;: &quot;volume_size&quot;,\n          &quot;isOneOffSetting&quot;: true\n        },\n        {\n          &quot;dataType&quot;: &quot;string&quot;,\n          &quot;niceName&quot;: &quot;Storage Class Name&quot;,\n          &quot;mandatory&quot;: false,\n          &quot;maxLength&quot;: 100,\n          &quot;minLength&quot;: 0,\n          &quot;defaultValue&quot;: &quot;&quot;,\n          &quot;variableName&quot;: &quot;volume_storageClassName&quot;,\n          &quot;isOneOffSetting&quot;: true\n        },\n        {\n          &quot;options&quot;: &#x5B;\n            &quot;Block&quot;,\n            &quot;Filesystem&quot;\n          ],\n          &quot;dataType&quot;: &quot;string&quot;,\n          &quot;niceName&quot;: &quot;Disk type&quot;,\n          &quot;mandatory&quot;: true,\n          &quot;maxLength&quot;: 100,\n          &quot;minLength&quot;: 1,\n          &quot;defaultValue&quot;: &quot;Filesystem&quot;,\n          &quot;variableName&quot;: &quot;volume_mode&quot;,\n          &quot;isOneOffSetting&quot;: true\n        }\n      ],\n      &quot;dataType&quot;: &quot;object&quot;,\n      &quot;isSelectable&quot;: true,\n      &quot;selectorType&quot;: &quot;providerImageOsType&quot;,\n      &quot;variableName&quot;: &quot;openshift_virtualization_root_disk_parameters&quot;,\n      &quot;selectorOption&quot;: &#x5B;\n        &quot;Linux&quot;,\n        &quot;Windows&quot;\n      ]\n    },\n    {\n      &quot;variableName&quot;: &quot;providerImageOsType&quot;,\n      &quot;niceName&quot;: &quot;Operating System&quot;,\n      &quot;dataType&quot;: &quot;string&quot;,\n      &quot;mandatory&quot;: true,\n      &quot;isOneOffSetting&quot;: true,\n      &quot;options&quot;: &#x5B;&quot;Linux&quot;, &quot;Windows&quot;],\n      &quot;readonly&quot;: true\n    }\n  ]\n    }&#039; :: jsonb\n  WHERE name = &#039;componentStorageVariables&#039;;\n\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><code>sql\/upgrade\/2.2.0\/13-provider-shapes.sql<\/code>: Adding shapes for the provider:<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\ninsert into provider_shapes (name, provider_id, variables, user_id) values\n(&#039;openshift-virtualization-u1_medium-shape&#039;,   5, &#039;{&quot;instance_type&quot;: &quot;u1.medium&quot;}&#039;, 1),\n(&#039;openshift-virtualization-u1_large-shape&#039;,   5, &#039;{&quot;instance_type&quot;: &quot;u1.large&quot;}&#039;, 1),\n(&#039;openshift-virtualization-u1_xlarge-shape&#039;,   5, &#039;{&quot;instance_type&quot;: &quot;u1.xlarge&quot;}&#039;, 1);\n\ninsert into projects_provider_shapes (project_id, shape_id, user_id) \n    select 1, id, 1 from provider_shapes where provider_id=5;\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-yak-ui\">yak_ui<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>yak-ui\/src\/assets\/providers\/virt-icon.png<\/code>: Adding the new provider logo in provider logos:<\/li>\n\n\n\n<li><code>yak-ui\/src\/utils\/imageList.ts<\/code>: Adding the new logo path in the <code>ProviderLogos<\/code> dict:<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nimport OnPremiseLogo from &quot;@\/assets\/providers\/2860404-200-min.png&quot;;\nimport LinuxLogo from &quot;@\/assets\/linux.png&quot;;\nimport WindowsLogo from &quot;@\/assets\/windows.png&quot;;\nimport OpenShiftVirtualizationLogo from &quot;@\/assets\/providers\/virt-icon.png&quot;;\n\nexport const ProviderLogos: HashTable&lt;any&gt; = {\n  aws: AwsLogo,\n  oci: OciLogo,\n  &#039;on_premises&#039;: OnPremiseLogo,\n  azure: AzureLogo,\n  &#039;openshift_virtualization&#039;: OpenShiftVirtualizationLogo,\n};\n\n...\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><code>yak-ui\/src\/components\/YakTabContainer.vue<\/code>: Adding in <code>containerClass.specialTabs<\/code> and <code>cardClass.specialTabs<\/code> lists the new provider :<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\n...\nconst containerClass = computed(() =&gt; {\n  const specialTabs = &#x5B;&quot;aws&quot;, &quot;oci&quot;, &quot;azure&quot;, &quot;on_premises&quot;, &quot;openshift_virtualization&quot;];\n  return specialTabs.includes(tab.value)\n    ? &quot;container-grid-custom&quot;\n    : &quot;container-custom&quot;;\n});\n\nconst cardClass = computed(() =&gt; {\n  const specialTabs = &#x5B;&quot;aws&quot;, &quot;oci&quot;, &quot;azure&quot;, &quot;on_premises&quot;, &quot;openshift_virtualization&quot;];\n  return specialTabs.includes(tab.value) ? &quot;card-grid-custom&quot; : &quot;card-custom&quot;;\n});\n...\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><code>yak-ui\/src\/components\/customs\/StorageEditor.vue<\/code>: Adding in <code><code>providerTypeField<\/code>.<code>options<\/code><\/code> list the new provider :<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\n...\nconst providerTypeField: Field = {\n  variableName: &quot;providerName&quot;,\n  niceName: &quot;providerName&quot;,\n  dataType: &quot;string&quot;,\n  mandatory: true,\n  isOneOffSetting: true,\n  options: &#x5B;&quot;aws&quot;, &quot;azure&quot;, &quot;oci&quot;, &quot;on_premises&quot;, &quot;openshift_virtualization&quot;],\n};\n...\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><code>yak-ui\/src\/data_structures\/vComponents.ts<\/code>: Adding in <code>children.options<\/code> list parameter for <code><code><code><code>allGroups.push<\/code><\/code><\/code><\/code> call the new provider :<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\n...\n                    allGroups.push({\n                      variableName: group.name,\n                      niceName: &quot;group &quot; + group.name,\n                      mandatory: true,\n                      dataType: &quot;object&quot;,\n                      isOneOffSetting: false,\n                      children: &#x5B;{\n                        variableName: &quot;providerName&quot;,\n                        niceName: &quot;Provider&quot;,\n                        dataType: &quot;string&quot;,\n                        mandatory: true,\n                        isOneOffSetting: true,\n                        options: &#x5B;&quot;aws&quot;, &quot;azure&quot;, &quot;oci&quot;, &quot;on_premises&quot;, &quot;openshift_virtualization&quot;],\n...\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li><code>yak-ui\/src\/data_structures\/vSecrets.ts<\/code>: Adding in <code><code>vSecretTypeName<\/code><\/code> list the new secret type :<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\n...\n              vSecretTypeName: &#x5B;\n                &quot;aws credentials&quot;,\n                &quot;azure credentials&quot;,\n                &quot;oci credentials&quot;,\n                &quot;kubeconfig&quot;,\n                &quot;ssh key&quot;,\n                &quot;winrm&quot;,\n              ],\n...\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-4-test-your-changes\">Step 4: Test Your Changes<\/h2>\n\n\n\n<p>Each component has its own set of unit and integration tests. Be sure to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Run tests locally with each change.<br>All sub-projects of the YaK have a Dockerfile on root directory. Build them in this order to respect the dependencies:\n<ol class=\"wp-block-list\">\n<li>yakenv<\/li>\n\n\n\n<li>yak_core<\/li>\n\n\n\n<li>yak_runner<\/li>\n\n\n\n<li>yak_postgres<\/li>\n\n\n\n<li>yak_graphile<\/li>\n\n\n\n<li>yak_ui<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n\n\n\n<p>Once images are built, run them on Docker\/Podman on your computer, or on a Container orchestrator (Kubernetes\/Openshift\/&#8230;)<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Validate that your provider appears correctly in the UI and can be selected.<\/li>\n<\/ul>\n\n\n\n<p>New infrastructure declaration:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"547\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-8-1024x547.png\" alt=\"\" class=\"wp-image-39113\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-8-1024x547.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-8-300x160.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-8-768x410.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-8.png 1377w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>New infrastructure declared:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"403\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-9-1024x403.png\" alt=\"\" class=\"wp-image-39114\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-9-1024x403.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-9-300x118.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-9-768x302.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-9.png 1379w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>New secret declaration:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"733\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-10-1024x733.png\" alt=\"\" class=\"wp-image-39115\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-10-1024x733.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-10-300x215.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-10-768x550.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-10.png 1377w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Provider images appeared well:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"740\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-11-1024x740.png\" alt=\"\" class=\"wp-image-39116\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-11-1024x740.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-11-300x217.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-11-768x555.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-11.png 1360w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Provider shapes appeared well:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"548\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-12-1024x548.png\" alt=\"\" class=\"wp-image-39117\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-12-1024x548.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-12-300x161.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-12-768x411.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-12.png 1378w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>New server declaration:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"958\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-13-1024x958.png\" alt=\"\" class=\"wp-image-39118\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-13-1024x958.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-13-300x281.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-13-768x718.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-13.png 1376w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"517\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-14-1024x517.png\" alt=\"\" class=\"wp-image-39119\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-14-1024x517.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-14-300x151.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-14-768x388.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-14.png 1379w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"325\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-15-1024x325.png\" alt=\"\" class=\"wp-image-39120\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-15-1024x325.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-15-300x95.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-15-768x244.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-15.png 1378w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Test full cluster lifecycle operations (deploy, stop, start, destroy, delete) for OpenShift Virtualization.<\/li>\n<\/ul>\n\n\n\n<p>Deploy server:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"293\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-16-1024x293.png\" alt=\"\" class=\"wp-image-39121\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-16-1024x293.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-16-300x86.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-16-768x219.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-16.png 1379w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"303\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-18-1024x303.png\" alt=\"\" class=\"wp-image-39123\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-18-1024x303.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-18-300x89.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-18-768x227.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-18.png 1378w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"627\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-19-1024x627.png\" alt=\"\" class=\"wp-image-39124\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-19-1024x627.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-19-300x184.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-19-768x470.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-19.png 1361w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"306\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-20-1024x306.png\" alt=\"\" class=\"wp-image-39125\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-20-1024x306.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-20-300x90.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-20-768x230.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-20.png 1377w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Result in Openshift:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"625\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-27-1024x625.png\" alt=\"\" class=\"wp-image-39132\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-27-1024x625.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-27-300x183.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-27-768x469.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-27-1536x938.png 1536w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-27.png 1553w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Stop server:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"614\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-21-1024x614.png\" alt=\"\" class=\"wp-image-39126\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-21-1024x614.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-21-300x180.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-21-768x460.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-21.png 1380w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"312\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-22-1024x312.png\" alt=\"\" class=\"wp-image-39127\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-22-1024x312.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-22-300x91.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-22-768x234.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-22.png 1378w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Start server:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"616\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-24-1024x616.png\" alt=\"\" class=\"wp-image-39129\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-24-1024x616.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-24-300x181.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-24-768x462.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-24.png 1379w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"306\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-20-1024x306.png\" alt=\"\" class=\"wp-image-39125\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-20-1024x306.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-20-300x90.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-20-768x230.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-20.png 1377w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Destroy server:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"618\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-25-1024x618.png\" alt=\"\" class=\"wp-image-39130\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-25-1024x618.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-25-300x181.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-25-768x463.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-25.png 1379w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"302\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-26-1024x302.png\" alt=\"\" class=\"wp-image-39131\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-26-1024x302.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-26-300x88.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-26-768x226.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-26.png 1377w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-5-contribute-your-changes\">Step 5: Contribute Your Changes<\/h2>\n\n\n\n<p>Once development is complete and tested:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Push your changes to your fork.<\/li>\n\n\n\n<li>Create a Merge Request (MR) from your fork to the main project repository for each affected sub-project:<\/li>\n\n\n\n<li>In your MR description, include:\n<ul class=\"wp-block-list\">\n<li>A summary of the changes<\/li>\n\n\n\n<li>A test plan and screenshots if applicable<\/li>\n\n\n\n<li>Any known limitations or issues<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"790\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-29-1024x790.png\" alt=\"\" class=\"wp-image-39134\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-29-1024x790.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-29-300x231.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-29-768x593.png 768w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-29.png 1248w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Follow the <a href=\"https:\/\/gitlab.com\/yak4all\/yak_core\/-\/blob\/main\/docs\/contribution.md?ref_type=heads\">contribution guidelines of the YaK project<\/a> for naming conventions, commit messages, and code standards.<\/p>\n\n\n\n<p>You can take my merge requests as an exemple:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>yakenv: <a href=\"https:\/\/gitlab.com\/yak4all\/yakenv\/-\/merge_requests\/12\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/gitlab.com\/yak4all\/yakenv\/-\/merge_requests\/12<\/a><\/li>\n\n\n\n<li>yak_core: <a href=\"https:\/\/gitlab.com\/yak4all\/yak_core\/-\/merge_requests\/20\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/gitlab.com\/yak4all\/yak_core\/-\/merge_requests\/20<\/a><\/li>\n\n\n\n<li>yak_runner: <a href=\"http:\/\/gitlab.com\/yak4all\/yak_backend\/yak_runner\/-\/merge_requests\/42\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/gitlab.com\/yak4all\/yak_backend\/yak_runner\/-\/merge_requests\/42<\/a><\/li>\n\n\n\n<li>yak_ui: <a href=\"https:\/\/gitlab.com\/yak4all\/yak_frontend\/yak_ui\/-\/merge_requests\/42\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/gitlab.com\/yak4all\/yak_frontend\/yak_ui\/-\/merge_requests\/42<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-6-collaborate-with-the-community\">Step 6: Collaborate with the Community<\/h2>\n\n\n\n<p>After submitting your MR:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Respond to any feedback or questions from project maintainers.<\/li>\n\n\n\n<li>Be open to revising your code based on review suggestions.<\/li>\n\n\n\n<li>Once approved, your changes will be merged into the main project!<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-conclusion\">Conclusion<\/h2>\n\n\n\n<p>Adding a new infrastructure provider to YaK, such as OpenShift Virtualization, is a powerful way to contribute to the project and support broader use cases. With a clear architecture and modular codebase, YaK makes it straightforward for developers to extend its capabilities.<\/p>\n\n\n\n<p>YaK can also be integrated with various Red Hat products to enhance your automation workflows &#8211; check out our guide on <a href=\"https:\/\/www.dbi-services.com\/blog\/integrate-yak-into-red-hat-ansible-automation-platform\/\">Integrating YaK into Red Hat Ansible Automation Platform<\/a> to learn more.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>YaK is a platform-agnostic framework designed to streamline and automate the deployment of infrastructure and&nbsp;middleware&nbsp;components&nbsp;(database, K8S,etc..) across various environments. With its open-source core, YaK enables developers, DevOps teams, and IT professionals to manage infrastructure provisioning and component deployment efficiently, without being tied to a specific vendor. Whether you&#8217;re working with AWS, Azure, Oracle Cloud Infrastructure [&hellip;]<\/p>\n","protected":false},"author":107,"featured_media":39138,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[368,2721],"tags":[2976,2036,3030,1344,3630,2717],"type_dbi":[3049,3239],"class_list":["post-39053","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-performance","category-yak","tag-developer","tag-developer-experience","tag-development","tag-openshift","tag-openshift-virtualization","tag-yak-2","type-development","type-yak"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How to Contribute to the YaK Project: Adding a New Infrastructure Provider (e.g., OpenShift Virtualization) - dbi Blog<\/title>\n<meta name=\"description\" content=\"Learn how to contribute to the YaK open source project by adding a new infrastructure provider like OpenShift Virtualization.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Contribute to the YaK Project: Adding a New Infrastructure Provider (e.g., OpenShift Virtualization)\" \/>\n<meta property=\"og:description\" content=\"Learn how to contribute to the YaK open source project by adding a new infrastructure provider like OpenShift Virtualization.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-24T12:42:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-24T13:02:28+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-30.png\" \/>\n\t<meta property=\"og:image:width\" content=\"900\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Donovan Winter\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Donovan Winter\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/\"},\"author\":{\"name\":\"Donovan Winter\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/e0f67a930d31485dd7adef9081496560\"},\"headline\":\"How to Contribute to the YaK Project: Adding a New Infrastructure Provider (e.g., OpenShift Virtualization)\",\"datePublished\":\"2025-06-24T12:42:55+00:00\",\"dateModified\":\"2025-06-24T13:02:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/\"},\"wordCount\":1037,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-30.png\",\"keywords\":[\"developer\",\"Developer Experience\",\"development\",\"OpenShift\",\"openshift virtualization\",\"yak\"],\"articleSection\":[\"Development &amp; Performance\",\"YaK\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/\",\"name\":\"How to Contribute to the YaK Project: Adding a New Infrastructure Provider (e.g., OpenShift Virtualization) - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-30.png\",\"datePublished\":\"2025-06-24T12:42:55+00:00\",\"dateModified\":\"2025-06-24T13:02:28+00:00\",\"author\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/e0f67a930d31485dd7adef9081496560\"},\"description\":\"Learn how to contribute to the YaK open source project by adding a new infrastructure provider like OpenShift Virtualization.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#primaryimage\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-30.png\",\"contentUrl\":\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-30.png\",\"width\":900,\"height\":600},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.dbi-services.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Contribute to the YaK Project: Adding a New Infrastructure Provider (e.g., OpenShift Virtualization)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#website\",\"url\":\"https:\/\/www.dbi-services.com\/blog\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/e0f67a930d31485dd7adef9081496560\",\"name\":\"Donovan Winter\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/84afe8f5c9c68d608f6a5308ec644228931454d5360cfc771256d3cb602b6614?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/84afe8f5c9c68d608f6a5308ec644228931454d5360cfc771256d3cb602b6614?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/84afe8f5c9c68d608f6a5308ec644228931454d5360cfc771256d3cb602b6614?s=96&d=mm&r=g\",\"caption\":\"Donovan Winter\"},\"url\":\"https:\/\/www.dbi-services.com\/blog\/author\/donovanwinter\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to Contribute to the YaK Project: Adding a New Infrastructure Provider (e.g., OpenShift Virtualization) - dbi Blog","description":"Learn how to contribute to the YaK open source project by adding a new infrastructure provider like OpenShift Virtualization.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/","og_locale":"en_US","og_type":"article","og_title":"How to Contribute to the YaK Project: Adding a New Infrastructure Provider (e.g., OpenShift Virtualization)","og_description":"Learn how to contribute to the YaK open source project by adding a new infrastructure provider like OpenShift Virtualization.","og_url":"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/","og_site_name":"dbi Blog","article_published_time":"2025-06-24T12:42:55+00:00","article_modified_time":"2025-06-24T13:02:28+00:00","og_image":[{"width":900,"height":600,"url":"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-30.png","type":"image\/png"}],"author":"Donovan Winter","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Donovan Winter","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/"},"author":{"name":"Donovan Winter","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/e0f67a930d31485dd7adef9081496560"},"headline":"How to Contribute to the YaK Project: Adding a New Infrastructure Provider (e.g., OpenShift Virtualization)","datePublished":"2025-06-24T12:42:55+00:00","dateModified":"2025-06-24T13:02:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/"},"wordCount":1037,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-30.png","keywords":["developer","Developer Experience","development","OpenShift","openshift virtualization","yak"],"articleSection":["Development &amp; Performance","YaK"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/","url":"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/","name":"How to Contribute to the YaK Project: Adding a New Infrastructure Provider (e.g., OpenShift Virtualization) - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-30.png","datePublished":"2025-06-24T12:42:55+00:00","dateModified":"2025-06-24T13:02:28+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/e0f67a930d31485dd7adef9081496560"},"description":"Learn how to contribute to the YaK open source project by adding a new infrastructure provider like OpenShift Virtualization.","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-30.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2025\/06\/image-30.png","width":900,"height":600},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/how-to-contribute-to-the-yak-project-adding-a-new-infrastructure-provider-e-g-openshift-virtualization\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Contribute to the YaK Project: Adding a New Infrastructure Provider (e.g., OpenShift Virtualization)"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/e0f67a930d31485dd7adef9081496560","name":"Donovan Winter","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/84afe8f5c9c68d608f6a5308ec644228931454d5360cfc771256d3cb602b6614?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/84afe8f5c9c68d608f6a5308ec644228931454d5360cfc771256d3cb602b6614?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/84afe8f5c9c68d608f6a5308ec644228931454d5360cfc771256d3cb602b6614?s=96&d=mm&r=g","caption":"Donovan Winter"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/donovanwinter\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/39053","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/107"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=39053"}],"version-history":[{"count":11,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/39053\/revisions"}],"predecessor-version":[{"id":39294,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/39053\/revisions\/39294"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/39138"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=39053"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=39053"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=39053"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=39053"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}