<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bharath Nelapatla</title>
    <description>The latest articles on DEV Community by Bharath Nelapatla (@bharath_nelapatla_711e233).</description>
    <link>https://dev.to/bharath_nelapatla_711e233</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1519451%2Fb3502ef4-7072-4b41-93fd-dc3158a9aebd.png</url>
      <title>DEV Community: Bharath Nelapatla</title>
      <link>https://dev.to/bharath_nelapatla_711e233</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bharath_nelapatla_711e233"/>
    <language>en</language>
    <item>
      <title>OpenShift Virtualization Migration Advisor — Local-First, Powered by Gemma 4 26B MoE</title>
      <dc:creator>Bharath Nelapatla</dc:creator>
      <pubDate>Mon, 25 May 2026 07:07:29 +0000</pubDate>
      <link>https://dev.to/bharath_nelapatla_711e233/openshift-virtualization-migration-advisor-local-first-powered-by-gemma-4-26b-moe-1ohm</link>
      <guid>https://dev.to/bharath_nelapatla_711e233/openshift-virtualization-migration-advisor-local-first-powered-by-gemma-4-26b-moe-1ohm</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-gemma-2026-05-06"&gt;Gemma 4 Challenge: Build with Gemma 4&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;OpenShift Virtualization Migration Advisor&lt;/strong&gt; — a local-first assessment tool that ingests legacy hypervisor configurations (VMware &lt;code&gt;.vmx&lt;/code&gt;, libvirt domain XML, OVF, RHV/oVirt exports) and produces a structured migration report for moving workloads to &lt;strong&gt;Red Hat OpenShift Virtualization&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The problem it solves is specific and unglamorous: enterprises consolidating off vSphere and legacy KVM have a &lt;em&gt;discovery&lt;/em&gt; bottleneck. Their VM inventories live in config files that contain infrastructure secrets — storage paths, VLAN topology, encryption key references, FIPS posture, licence keys. Sending those to a hosted LLM is a non-starter for regulated workloads.&lt;/p&gt;

&lt;p&gt;So I built the assessment to run entirely on the host machine. Paste a config or upload an inventory → get a six-section migration report covering inventory mapping, OpenShift Virt primitive equivalents (&lt;code&gt;VirtualMachine&lt;/code&gt;, &lt;code&gt;DataVolume&lt;/code&gt;, &lt;code&gt;NetworkAttachmentDefinition&lt;/code&gt;, &lt;code&gt;StorageClass&lt;/code&gt;), compatibility risk flags, MTV-vs-&lt;code&gt;virt-v2v&lt;/code&gt; tooling recommendation, effort sizing, and security posture preservation. Nothing leaves the box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;The tool generated this report from a single VMware &lt;code&gt;.vmx&lt;/code&gt; file, fully on-device using Gemma 4 26B MoE via Ollama. Screenshots below; full generated output included so judges can see the actual model output, not a curated highlight.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh5oqehq5r2vgi81qnh1e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh5oqehq5r2vgi81qnh1e.png" alt="Gradio UI with VMware sample loaded" width="800" height="451"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Local Gradio UI. Pick a sample → click Generate → report streams in from local Gemma 4.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl4ht9f56ynhlmb16td94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl4ht9f56ynhlmb16td94.png" alt="Generated migration report" width="799" height="457"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Six-section migration report streamed from Gemma 4 26B MoE running locally. No cloud API calls.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Full Report (generated locally)
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;From &lt;code&gt;samples/vmware-web-tier.vmx&lt;/code&gt; — 311.7s on a 16 GB-VRAM laptop with 85% CPU offload&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&amp;gt; &lt;strong&gt;Source detected:&lt;/strong&gt; &lt;code&gt;VMware vSphere (.vmx)&lt;/code&gt;&lt;br&gt;
&amp;gt; &lt;strong&gt;Model:&lt;/strong&gt; &lt;code&gt;gemma4:26b&lt;/code&gt;&lt;br&gt;
&amp;gt; &lt;strong&gt;Generated locally in:&lt;/strong&gt; 311.7s on a consumer laptop GPU + CPU offload&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Inventory Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Disk(s)&lt;/th&gt;
&lt;th&gt;Network(s)&lt;/th&gt;
&lt;th&gt;Guest OS&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;web-tier-01&lt;/td&gt;
&lt;td&gt;4 (2 sockets × 2 cores)&lt;/td&gt;
&lt;td&gt;8192 MiB&lt;/td&gt;
&lt;td&gt;web-tier-01.vmdk&lt;/td&gt;
&lt;td&gt;VLAN-100-DMZ&lt;/td&gt;
&lt;td&gt;rhel9-64&lt;/td&gt;
&lt;td&gt;Production Nginx/PHP-FPM; requires UEFI Secure Boot; vSphere encrypted.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  2. OpenShift Virtualization Equivalents
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;OpenShift Virtualization Primitive&lt;/th&gt;
&lt;th&gt;Configuration Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compute&lt;/td&gt;
&lt;td&gt;&lt;code&gt;VirtualMachine&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;spec.template.spec.domain.cpu&lt;/code&gt;: 2 sockets, 2 cores; &lt;code&gt;spec.template.spec.domain.resources.requests.memory: 8Gi&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firmware&lt;/td&gt;
&lt;td&gt;&lt;code&gt;VirtualMachine&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;spec.template.spec.domain.firmware: efi&lt;/code&gt; (Secure Boot enabled)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DataVolume&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;storageClassName: [not specified in source]&lt;/code&gt;; requires conversion from &lt;code&gt;pvscsi&lt;/code&gt; to &lt;code&gt;virtio-scsi&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NetworkAttachmentDefinition&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Target VLAN-100-DMZ via Multus CNI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  3. Compatibility &amp;amp; Risk Flags
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Critical — SCSI Controller Mismatch:&lt;/strong&gt; Source uses &lt;code&gt;pvscsi&lt;/code&gt;. OpenShift Virt requires &lt;code&gt;virtio-scsi&lt;/code&gt;. Driver injection or kernel reconfiguration may be necessary if the RHEL 9 initramfs lacks virtio drivers (unlikely for RHEL 9).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critical — Encryption / KMS Breakage:&lt;/strong&gt; Source uses vSphere-specific KMS (&lt;code&gt;vsphere-kms-key-001&lt;/code&gt;). This encryption cannot be migrated. Data must be decrypted during migration or re-encrypted using OpenShift-native methods (encrypted PVCs).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High — Network Driver Mismatch:&lt;/strong&gt; &lt;code&gt;vmxnet3&lt;/code&gt; must be replaced with &lt;code&gt;virtio&lt;/code&gt; for optimal performance and compatibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High — UEFI Secure Boot:&lt;/strong&gt; OpenShift Virt supports UEFI; the migration pipeline must ensure the &lt;code&gt;VirtualMachine&lt;/code&gt; object is correctly configured with &lt;code&gt;firmware: efi&lt;/code&gt; and a bootloader compatible with the new virtual hardware.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium — CD-ROM dependency:&lt;/strong&gt; The &lt;code&gt;rhel-9.4.iso&lt;/code&gt; is attached. Must be manually re-attached via a &lt;code&gt;ConfigMap&lt;/code&gt; or &lt;code&gt;DataVolume&lt;/code&gt; if required for post-migration configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  4. Migration Path
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;web-tier-01:&lt;/strong&gt; MTV (Migration Toolkit for Virtualization).&lt;br&gt;
&lt;em&gt;Justification:&lt;/em&gt; MTV is the recommended path for vSphere-to-OpenShift migrations — it automates the conversion of VMDK to &lt;code&gt;DataVolume&lt;/code&gt; and handles the mapping of vSphere networks to &lt;code&gt;NetworkAttachmentDefinition&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Effort &amp;amp; TCO Notes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Effort (web-tier-01):&lt;/strong&gt; S
&lt;em&gt;Justification:&lt;/em&gt; Single, modern Linux guest (RHEL 9) with standard hardware requirements and no complex PCI passthrough.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TCO / Licensing:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Requires OpenShift Container Platform (OCP) subscription&lt;/li&gt;
&lt;li&gt;RHEL guest licensing applies (standard RHEL / RHEL for Virtual Datacenters)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consolidation:&lt;/strong&gt; If other web-tier nodes exist in the source, migrate them in a single MTV plan to reduce migration window and operational overhead.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  6. Security &amp;amp; Compliance
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source Security Feature&lt;/th&gt;
&lt;th&gt;OpenShift Virtualization Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;vSphere Encryption (KMS)&lt;/td&gt;
&lt;td&gt;Encrypted PVCs (via StorageClass / CSI) or &lt;code&gt;dm-crypt&lt;/code&gt; within the Guest OS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VLAN-100-DMZ Isolation&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;NetworkAttachmentDefinition&lt;/code&gt; + &lt;code&gt;NetworkPolicy&lt;/code&gt; for micro-segmentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UEFI Secure Boot&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;VirtualMachine&lt;/code&gt; spec &lt;code&gt;firmware: efi&lt;/code&gt; with Secure Boot enabled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production Workload Isolation&lt;/td&gt;
&lt;td&gt;Namespace-level isolation in OpenShift&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/Bharathtrainer/openshift-migration-advisor" rel="noopener noreferrer"&gt;https://github.com/Bharathtrainer/openshift-migration-advisor&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Gemma 4
&lt;/h2&gt;

&lt;p&gt;I chose &lt;strong&gt;Gemma 4 26B MoE&lt;/strong&gt; (&lt;code&gt;gemma4:26b&lt;/code&gt;) after starting on 31B Dense and discovering it was the wrong tool for this workload.&lt;/p&gt;

&lt;p&gt;The honest path: I picked 31B Dense first because the highest-quality reasoning seemed like the obvious choice for infrastructure assessment. Two problems surfaced on real-world inputs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ollama Flash Attention prefill stall on Dense&lt;/strong&gt; (&lt;a href="https://github.com/ollama/ollama/issues/15350" rel="noopener noreferrer"&gt;ollama#15350&lt;/a&gt;) hangs the 31B variant on prompts beyond ~3–4K tokens. A multi-VM datacenter inventory blows past that on the first VM. The bug is specific to Dense's hybrid sliding+global attention; MoE handles the same prompts cleanly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Active-parameter efficiency.&lt;/strong&gt; 26B MoE activates ~4B parameters per token versus 31B for Dense. On a consumer laptop GPU, that's the difference between a model that works (with some CPU offload) and one that doesn't fit at all.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What I kept from picking MoE over Dense:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;256K context window&lt;/strong&gt; — enough to ingest an entire small-datacenter inventory in one shot&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stable long-prompt prefill&lt;/strong&gt; on Ollama's current build&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native reasoning mode&lt;/strong&gt; via the &lt;code&gt;&amp;lt;|think|&amp;gt;&lt;/code&gt; system-prompt token&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workable throughput on consumer hardware&lt;/strong&gt; — generation runs even when 85% of layers spill to CPU&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Honest performance note:&lt;/strong&gt; the report above generated in 311.7 seconds on a 16 GB-VRAM laptop GPU with 85% CPU offload (&lt;code&gt;ollama ps&lt;/code&gt; confirms the split). On a workstation with 24+ GB VRAM the same generation should land in 30–60 seconds. This is exactly the kind of detail you want a tool to expose, not hide — local AI's pitch is data sovereignty, and the tradeoff is hardware-dependent latency. Field engineers running this for offline assessment will accept 5 minutes for a report they can't legally send to a cloud API.&lt;/p&gt;

&lt;p&gt;When MoE is &lt;em&gt;not&lt;/em&gt; the right pick: short, single-turn, hard math/code reasoning where Dense's per-token capacity matters more than throughput. For long, structured, enterprise-document reasoning over large configs, &lt;strong&gt;MoE wins&lt;/strong&gt;. That's the call this build makes, and the rationale is documented in the README with the GitHub issue link, not vibes.&lt;/p&gt;

&lt;p&gt;One Gemma 4-specific detail worth flagging: I follow the recommended sampling (&lt;code&gt;temperature=1.0, top_p=0.95, top_k=64&lt;/code&gt;) and set &lt;code&gt;OLLAMA_FLASH_ATTENTION=1&lt;/code&gt; + &lt;code&gt;OLLAMA_KV_CACHE_TYPE=q4_0&lt;/code&gt; to keep the KV cache compact enough for a 16K context window. Those four config values are the difference between this running at usable speed and not running at all.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built entirely on a laptop. No cloud API key was used at any point in the construction of this submission. The report you see above was generated by Gemma 4 running on the same machine.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
