{"id":733,"date":"2024-12-30T00:53:27","date_gmt":"2024-12-30T05:53:27","guid":{"rendered":"https:\/\/carminebufano.com\/?p=733"},"modified":"2024-12-30T00:53:29","modified_gmt":"2024-12-30T05:53:29","slug":"automating-vmware-network-changes-how-i-turned-hours-of-clicking-into-a-5-minute-powercli-script","status":"publish","type":"post","link":"https:\/\/carminebufano.com\/index.php\/2024\/12\/30\/automating-vmware-network-changes-how-i-turned-hours-of-clicking-into-a-5-minute-powercli-script\/","title":{"rendered":"Automating VMware Network Changes: How I Turned Hours of Clicking into a 5-Minute PowerCLI Script"},"content":{"rendered":"\n<p>Have you ever stared down the barrel of endless repetitive clicks in VMware vSphere, knowing you&#8217;re in for hours of mindless work? Recently, I faced a scenario where I needed to update hundreds of virtual NICs across just as many virtual machines. Manual changes would have been soul-crushing, so I turned to VMware PowerCLI and transformed this monotonous task into a 5-minute automated script. Here&#8217;s how I did it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">The Problem: Manual Network Changes Are Soul-Crushing<\/h3>\n\n\n\n<p>Picture this: You have dozens, maybe hundreds, of VMs, each with multiple network adapters needing reassignment to a new distributed port group. The manual process looks something like this:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open each VM&#8217;s settings.<\/li>\n\n\n\n<li>Click through every network adapter.<\/li>\n\n\n\n<li>Select the new network.<\/li>\n\n\n\n<li>Wait for the change to apply.<\/li>\n\n\n\n<li>Repeat until your will to live fades.<\/li>\n<\/ol>\n\n\n\n<p>The task was not just time-consuming but error-prone. I knew there had to be a better way.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Enter PowerCLI: Your New Best Friend<\/h3>\n\n\n\n<p>PowerCLI is VMware&#8217;s powerful scripting toolkit that supercharges PowerShell to manage your VMware environment programmatically. Here\u2019s how to get started:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Installing PowerCLI<\/h4>\n\n\n\n<p>Open PowerShell as Administrator and run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Install-Module -Name VMware.PowerCLI -Scope CurrentUser\n<\/code><\/pre>\n\n\n\n<p>Accept the prompts, and voil\u00e0! You&#8217;re ready to automate.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">The Journey to Automation Nirvana<\/h3>\n\n\n\n<p>My path to automating network changes wasn\u2019t without its hiccups. Let me walk you through the evolution of my approach.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">First Attempt: The Naive Approach<\/h4>\n\n\n\n<p>Initially, I wrote a script to update only &#8220;unassigned&#8221; network adapters. Logical, right? Wrong. What PowerCLI considered \u201cunassigned\u201d didn\u2019t always match what I saw in the vSphere UI.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Second Try: The Brute Force Method<\/h4>\n\n\n\n<p>I decided to reassign all the adapters, regardless of their current state. While functional, this approach overwhelmed vCenter, leading to failed operations.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Final Solution: The Smart Approach<\/h4>\n\n\n\n<p>The breakthrough came with a more intelligent script that:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Validates host state before making changes.<\/li>\n\n\n\n<li>Introduces delays between operations to keep vCenter happy.<\/li>\n\n\n\n<li>Includes robust error handling and logging.<\/li>\n\n\n\n<li>Verifies changes to ensure accuracy.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">The Magic Script That Does It All<\/h3>\n\n\n\n<p>Here\u2019s the polished script that saved the day:<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code>&lt;#\n.SYNOPSIS\n    This script connects to vCenter, finds all VMs matching specific criteria, \n    and assigns unassigned virtual NICs to a specified Distributed Port Group.\n\n.DESCRIPTION\n    1. Connects to vCenter Server.\n    2. Searches for VMs in \"Datacenter Immaculate Constellation\" -> \"DELL-R720-CLUSTER\" -> Host \"192.168.88.5\".\n    3. Filters only VMs that are powered off.\n    4. Assigns all empty NICs to \"TRUNK-space-holder-Arista-DPort-Group\".\n    5. Prints progress and errors to the console.\n\n.NOTES\n    Tested with PowerCLI 12+ on vCenter 8.\n#>\n\n# ---&#91; 1. Setup and Connect to vCenter ]---\nWrite-Host \"Starting script...\"\n\n# Enable PowerCLI logging\n$logPath = Join-Path $PSScriptRoot \"powercli_log.txt\"\nWrite-Host \"Enabling PowerCLI logging to: $logPath\"\nSet-PowerCLIConfiguration -Scope User -LogLevel Warning -InvalidCertificateAction Ignore -Confirm:$false | Out-Null\nStart-Transcript -Path $logPath -Force\n\nWrite-Host \"Connecting to vCenter...\"\n\ntry {\n    # Update with your vCenter server name and credentials\n    Connect-VIServer -Server \"vcenterserver.dc1.local\" -User \"YOUR_USERNAME\" -Password \"YOUR_PASSWORD\"\n    Write-Host \"Successfully connected to vCenter.\"\n}\ncatch {\n    Write-Host \"ERROR: Failed to connect to vCenter. Error details:\"\n    Write-Host $_\n    return\n}\n\n# ---&#91; 2. Locate the Datacenter, Cluster, and Host ]---\nWrite-Host \"Locating Datacenter, Cluster, and Host...\"\n\ntry {\n    $datacenterName = \"Datacenter Carlton II\"\n    $clusterName    = \"DELL-R720-CLUSTER\"\n    $hostName       = \"192.168.88.5\"\n\n    # Get the Datacenter object\n    $dc = Get-Datacenter -Name $datacenterName -ErrorAction Stop\n    \n    # Get the Cluster object in that Datacenter\n    $cluster = Get-Cluster -Name $clusterName -Location $dc -ErrorAction Stop\n\n    # Get the Host object in that Cluster\n    $vmHost = Get-VMHost -Name $hostName -Location $cluster -ErrorAction Stop\n\n    Write-Host \"Datacenter found: $($dc.Name)\"\n    Write-Host \"Cluster found: $($cluster.Name)\"\n    Write-Host \"Target Host found: $($vmHost.Name)\"\n    \n    # Double check we're working with the correct host\n    if ($vmHost.Name -ne $hostName) {\n        Write-Host \"ERROR: Retrieved host does not match target host name\" -ForegroundColor Red\n        Disconnect-VIServer -Confirm:$false\n        return\n    }\n\n    Write-Host \"`nWARNING: This script will only process VMs on host $hostName\" -ForegroundColor Yellow\n    Write-Host \"Other hosts in the cluster will not be affected`n\"\n\n    # Get all hosts in cluster for reference\n    $allHosts = Get-VMHost -Location $cluster\n    Write-Host \"Hosts in cluster $($cluster.Name):\"\n    foreach ($h in $allHosts) {\n        if ($h.Name -eq $hostName) {\n            Write-Host \" * $($h.Name) (TARGET HOST)\" -ForegroundColor Yellow\n        } else {\n            Write-Host \" - $($h.Name) (will not be modified)\"\n        }\n    }\n    Write-Host \"\"\n\n    # Check host state\n    Write-Host \"`nChecking host state...\"\n    Write-Host \"Host State: $($vmHost.State)\"\n    Write-Host \"Host Connection State: $($vmHost.ConnectionState)\"\n    Write-Host \"Host Power State: $($vmHost.PowerState)\"\n    \n    if ($vmHost.State -ne \"Connected\" -or $vmHost.ConnectionState -ne \"Connected\") {\n        throw \"Host is not in a valid state for network operations. Current state: $($vmHost.State), Connection state: $($vmHost.ConnectionState)\"\n    }\n}\ncatch {\n    Write-Host \"ERROR: Unable to locate Datacenter, Cluster, or Host. Error details:\"\n    Write-Host $_\n    Disconnect-VIServer -Confirm:$false\n    return\n}\n\n# ---&#91; 3. Find All Matching VMs ]---\nWrite-Host \"Searching for powered-off VMs...\"\n\ntry {\n    $vmList = Get-VM -Location $vmHost |\n        Where-Object { $_.PowerState -eq \"PoweredOff\" }\n\n    if (!$vmList) {\n        Write-Host \"No powered-off VMs found on host '$hostName'.\"\n        return\n    }\n    else {\n        Write-Host \"Found the following powered-off VMs on host '$hostName':\"\n        $vmList | ForEach-Object { Write-Host \" - $($_.Name)\" }\n\n        # ---&#91; 4. Assign Each Unassigned NIC to the Specified DPort Group ]---\n        $dportGroup = Get-VDPortgroup -Name \"TRUNK-space-holder-Arista-DPort-Group\" -ErrorAction Stop\n        if (!$dportGroup) {\n            Write-Host \"ERROR: Could not find distributed port group 'TRUNK-space-holder-Arista-DPort-Group'\" -ForegroundColor Red\n            return\n        }\n\n        Write-Host \"`nFound distributed port group: $($dportGroup.Name)\" -ForegroundColor Green\n        Write-Host \"Port group key: $($dportGroup.Key)`n\" -ForegroundColor Green\n\n        foreach ($vm in $vmList) {\n            Write-Host \"`nProcessing VM: $($vm.Name)\" -ForegroundColor Yellow\n            \n            # Get all network adapters for the VM\n            $nics = Get-NetworkAdapter -VM $vm\n            Write-Host \"  Found $($nics.Count) network adapter(s)\"\n\n            foreach ($nic in $nics) {\n                Write-Host \"`n  Processing NIC: $($nic.Name)\"\n                Write-Host \"    Current Network: &#91;$($nic.NetworkName)]\"\n                \n                try {\n                    # Check host state again before each operation\n                    $hostState = Get-VMHost -Name $hostName\n                    if ($hostState.State -ne \"Connected\" -or $hostState.ConnectionState -ne \"Connected\") {\n                        throw \"Host is not in a valid state for network operations. Current state: $($hostState.State), Connection state: $($hostState.ConnectionState)\"\n                    }\n                    \n                    # First remove the network assignment\n                    Write-Host \"    Removing current network assignment...\" -ForegroundColor Yellow\n                    $nic | Set-NetworkAdapter -NetworkName \"\" -Confirm:$false -ErrorAction Stop\n                    Start-Sleep -Seconds 2  # Wait 2 seconds between operations\n                    \n                    # Then assign the new network\n                    Write-Host \"    Assigning to '$($dportGroup.Name)'...\" -ForegroundColor Yellow\n                    $nic | Set-NetworkAdapter -Portgroup $dportGroup -Confirm:$false -ErrorAction Stop\n                    Start-Sleep -Seconds 2  # Wait 2 seconds after assignment\n                    \n                    # Verify the change\n                    $updatedNic = Get-NetworkAdapter -VM $vm | Where-Object { $_.Id -eq $nic.Id }\n                    Write-Host \"    New Network Assignment: &#91;$($updatedNic.NetworkName)]\" -ForegroundColor Green\n                }\n                catch {\n                    Write-Host \"    ERROR: Failed to update network. Error details:\" -ForegroundColor Red\n                    Write-Host \"    $_\" -ForegroundColor Red\n                    Write-Host \"    Host State at time of error: $($hostState.State)\"\n                    Write-Host \"    Host Connection State at time of error: $($hostState.ConnectionState)\"\n                    continue  # Continue with next NIC instead of stopping\n                }\n            }\n            \n            # Wait 5 seconds between VMs to avoid overwhelming vCenter\n            Write-Host \"`n  Waiting 5 seconds before processing next VM...\" -ForegroundColor Blue\n            Start-Sleep -Seconds 5\n        }\n    }\n}\ncatch {\n    Write-Host \"ERROR: An issue occurred while searching for or updating VMs. Error details:\"\n    Write-Host $_ -ForegroundColor Red\n}\n\n# ---&#91; 5. Cleanup \/ Disconnect from vCenter ]---\ntry {\n    Write-Host \"`nDisconnecting from vCenter...\"\n    Disconnect-VIServer -Confirm:$false\n    Write-Host \"Script completed.\"\n}\ncatch {\n    Write-Host \"ERROR: Could not disconnect from vCenter properly. Error details:\"\n    Write-Host $_ -ForegroundColor Red\n}\nfinally {\n    # Stop logging\n    Stop-Transcript\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">How It Works<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">1. Initial Setup and Safety<\/h4>\n\n\n\n<p>The script enables logging and ignores certificate warnings for seamless execution.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. Smart Host State Validation<\/h4>\n\n\n\n<p>It checks that the host is ready for changes, avoiding issues with disconnected or powered-off hosts.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">3. Careful Network Changes<\/h4>\n\n\n\n<p>Network adapters are reassigned with delays to prevent overwhelming vCenter.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4. Robust Verification<\/h4>\n\n\n\n<p>Each change is verified to ensure it was applied successfully.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Results: Time Saved, Sanity Preserved<\/h3>\n\n\n\n<p>Here\u2019s the math:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>50 VMs with 3 NICs each = 150 changes<\/strong><\/li>\n\n\n\n<li>Manual time: ~2\u20133 hours<\/li>\n\n\n\n<li>Script time: ~5 minutes<\/li>\n\n\n\n<li>Errors: Zero<\/li>\n\n\n\n<li>Bonus: I actually enjoyed a coffee break while the script ran.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Pro Tips From the Trenches<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Always validate host state<\/strong> \u2013 Ensure the host is connected and ready.<\/li>\n\n\n\n<li><strong>Introduce delays<\/strong> \u2013 Prevent vCenter from throwing errors due to rapid requests.<\/li>\n\n\n\n<li><strong>Log everything<\/strong> \u2013 You\u2019ll thank yourself later.<\/li>\n\n\n\n<li><strong>Verify changes<\/strong> \u2013 Mistakes happen, but not on your watch.<\/li>\n\n\n\n<li><strong>Graceful error handling<\/strong> \u2013 Scripts should recover from unexpected issues.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Ready to Try It Yourself?<\/h3>\n\n\n\n<p>Here\u2019s how to get started:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Install PowerCLI and connect to your vCenter.<\/li>\n\n\n\n<li>Copy the script and update the connection details.<\/li>\n\n\n\n<li>Run it.<\/li>\n\n\n\n<li>Enjoy your newfound free time.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p>PowerCLI isn\u2019t just a tool\u2014it\u2019s a superpower for VMware administrators. Automating repetitive tasks not only saves time but also reduces errors, giving you more bandwidth for meaningful work.<\/p>\n\n\n\n<p>Have you automated any VMware tasks with PowerCLI? Share your stories in the comments\u2014I\u2019d love to hear how you\u2019re making VMware work smarter, not harder!<\/p>\n\n\n\n<p>Happy scripting! \ud83d\ude80<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Have you ever stared down the barrel of endless repetitive clicks in VMware vSphere, knowing you&#8217;re in for hours of mindless work? Recently, I faced a scenario where I needed to update hundreds of virtual NICs across just as many virtual machines. Manual changes would have been soul-crushing, so I turned to VMware PowerCLI and&hellip; <a class=\"read-more\" href=\"https:\/\/carminebufano.com\/index.php\/2024\/12\/30\/automating-vmware-network-changes-how-i-turned-hours-of-clicking-into-a-5-minute-powercli-script\/\">Read More<\/a><\/p>\n","protected":false},"author":2,"featured_media":737,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"Copy and paste and you will access vmwares golden API. Automate what others did not think was possible","jetpack_seo_html_title":"Easiest free access to vSphere API. vcenter api automation","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[164,15],"tags":[],"class_list":["post-733","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programming","category-walkthroughs"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/carminebufano.com\/wp-content\/uploads\/2024\/12\/3DvSphere-1.jpg?fit=1024%2C1024&ssl=1","jetpack-related-posts":[{"id":339,"url":"https:\/\/carminebufano.com\/index.php\/2020\/09\/10\/how-to-reset-vmware-vrni-vrealize-network-insight-web-ui-login-adminlocal\/","url_meta":{"origin":733,"position":0},"title":"How to reset VMware VRNI (vrealize network insight) web ui login admin@local","author":"Carmine Bufano","date":"September 10, 2020","format":false,"excerpt":"","rel":"","context":"In &quot;vmware&quot;","block_context":{"text":"vmware","link":"https:\/\/carminebufano.com\/index.php\/category\/vmware\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":619,"url":"https:\/\/carminebufano.com\/index.php\/2023\/11\/16\/vmware-esxi-8-0-doesnt-recognize-network-card-when-run-nested-in-kvm-here-is-the-solution\/","url_meta":{"origin":733,"position":1},"title":"VMWARE ESXi 8.0  doesn\u2019t recognize network card when run nested in KVM. Here is the solution","author":"Carmine Bufano","date":"November 16, 2023","format":false,"excerpt":"In QEMU version 4.1.0 Options add: -net nic, model-e1000e","rel":"","context":"In &quot;Walkthroughs&quot;","block_context":{"text":"Walkthroughs","link":"https:\/\/carminebufano.com\/index.php\/category\/walkthroughs\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":265,"url":"https:\/\/carminebufano.com\/index.php\/2017\/10\/20\/vmware-nsx\/","url_meta":{"origin":733,"position":2},"title":"VMware NSX","author":"Carmine Bufano","date":"October 20, 2017","format":false,"excerpt":"","rel":"","context":"In &quot;Walkthroughs&quot;","block_context":{"text":"Walkthroughs","link":"https:\/\/carminebufano.com\/index.php\/category\/walkthroughs\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":592,"url":"https:\/\/carminebufano.com\/index.php\/2022\/12\/17\/how-to-manually-remove-vmware-nsx-t-components-from-an-esxi-host\/","url_meta":{"origin":733,"position":3},"title":"How to Manually Remove VMware NSX-T Components from an ESXi Host","author":"Carmine Bufano","date":"December 17, 2022","format":false,"excerpt":"A lab is very dynamic by nature. In stark contrast, data center infrastructure is engineered to be as static as possible once it is configured. So naturally when you have a data center lab you it's only a matter of time before you come across weird anomalies just from the\u2026","rel":"","context":"In &quot;Walkthroughs&quot;","block_context":{"text":"Walkthroughs","link":"https:\/\/carminebufano.com\/index.php\/category\/walkthroughs\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":486,"url":"https:\/\/carminebufano.com\/index.php\/2021\/06\/29\/vcenter-ha-error-causes-a-failure-to-update-vcsa-this-is-how-to-fix-the-issue\/","url_meta":{"origin":733,"position":4},"title":"vCenter HA Error Causes a Failure to Update VCSA. This is how to fix the issue.","author":"Carmine Bufano","date":"June 29, 2021","format":false,"excerpt":"Attempt to resolve the connectivity problem. If you can restore connectivity, isolated nodes rejoin the cluster automatically and the Active node starts serving client requests. If you cannot resolve the connectivity problem, you have to log in to Active node's console directly. Power off and delete the Passive node and\u2026","rel":"","context":"In &quot;vmware&quot;","block_context":{"text":"vmware","link":"https:\/\/carminebufano.com\/index.php\/category\/vmware\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":552,"url":"https:\/\/carminebufano.com\/index.php\/2022\/06\/20\/allow-vmware-workstation-and-hyper-v-to-run-on-the-same-windows-10-workstation\/","url_meta":{"origin":733,"position":5},"title":"Allow VMware Workstation and Hyper-V to run on the same Windows 10 workstation","author":"Carmine Bufano","date":"June 20, 2022","format":false,"excerpt":"So I upgraded my lab workstation recently and it is running Windows 10 Professional. I installed VMware Workstation 16 PRO and it works fine. It is great for a lab, especially when you need to install a entire vSphere environment. This is because VMware Workstation is great at nested virtualization.\u2026","rel":"","context":"In &quot;Walkthroughs&quot;","block_context":{"text":"Walkthroughs","link":"https:\/\/carminebufano.com\/index.php\/category\/walkthroughs\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_shortlink":"https:\/\/wp.me\/p70MUT-bP","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/carminebufano.com\/index.php\/wp-json\/wp\/v2\/posts\/733","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/carminebufano.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/carminebufano.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/carminebufano.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/carminebufano.com\/index.php\/wp-json\/wp\/v2\/comments?post=733"}],"version-history":[{"count":4,"href":"https:\/\/carminebufano.com\/index.php\/wp-json\/wp\/v2\/posts\/733\/revisions"}],"predecessor-version":[{"id":739,"href":"https:\/\/carminebufano.com\/index.php\/wp-json\/wp\/v2\/posts\/733\/revisions\/739"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/carminebufano.com\/index.php\/wp-json\/wp\/v2\/media\/737"}],"wp:attachment":[{"href":"https:\/\/carminebufano.com\/index.php\/wp-json\/wp\/v2\/media?parent=733"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/carminebufano.com\/index.php\/wp-json\/wp\/v2\/categories?post=733"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/carminebufano.com\/index.php\/wp-json\/wp\/v2\/tags?post=733"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}