{"id":20025,"date":"2016-08-23T01:53:14","date_gmt":"2016-08-23T05:53:14","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/visualstudioalm\/?p=20025"},"modified":"2019-02-14T17:33:42","modified_gmt":"2019-02-15T01:33:42","slug":"testing-privateintranet-applications-using-cloud-based-load-testing","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/devops\/testing-privateintranet-applications-using-cloud-based-load-testing\/","title":{"rendered":"Testing private\/intranet applications using Cloud-based load testing"},"content":{"rendered":"<p><a href=\"https:\/\/www.visualstudio.com\/features\/vso-cloud-load-testing-vs\">Cloud-based Load Testing Service<\/a> can be used for performance and scale testing of an application by generating load from Azure. This type of load generation can only hit\/generate load on an internet\/publically accessible application. But we have seen many times customer needs to load test their application which is not publically accessible. Reasons could be many, some of them are listed below:<\/p>\n<ol>\n<li><span style=\"font-size: large\"><strong>Testing an internal application only &#8211;<\/strong> <\/span>In many large scale organizations there are applications\/web sites that have to cater the need of whole organization. It becomes crucial to test it with peak load to eradicate any performance\/stress related bugs.<\/li>\n<li><strong><span style=\"font-size: large\">Testing the application internally before releasing it over internet &#8211;<\/span> <\/strong>Before actually going into public for a big gung-ho launch, organizations love to make sure that there is no performance glitch or the worst site will not crash in high user load.<\/li>\n<\/ol>\n<p>To provide support for above scenarios we are working on a feature using which users can load test their internal\/ABF (application behind firewall) applications. Before talking about the solution, let us walk you through the following flow chart to figure out the best tailored solution as per your requirements. You can then read about a particular solution (1-6) and try it out.<\/p>\n<h4><a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/6\/2019\/05\/clip_image0018.png\"><img decoding=\"async\" width=\"498\" height=\"659\" title=\"clip_image001\" class=\"aligncenter\" style=\"float: none;padding-top: 0px;padding-left: 0px;margin-left: auto;padding-right: 0px;margin-right: auto;border-width: 0px\" alt=\"clip_image001\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2016\/08\/clip_image001_thumb7.png\" border=\"0\" \/><\/a><span style=\"font-weight: bold\"><\/span><\/h4>\n<ol>\n<li><span style=\"font-weight: bold\">Use default path, CLT will auto provision agents.\u00a0 <\/span><span style=\"font-weight: normal\">This is the default scenario for load testing using CLT where the application has a publicly available end point. The load testing service will automatically provision load agents (in Azure) to simulate the user load. Refer <a href=\"https:\/\/www.visualstudio.com\/en-us\/features\/vso-cloud-load-testing-vs.aspx\">this page<\/a> for more details on CLT usage.<\/span><\/li>\n<li><span style=\"font-weight: bold\">Use ARM template to deploy your own load agents.\u00a0 <\/span>#1 solution provisions the agents in CLT service boundaries and user won&#8217;t be able to have control over it. If you wish to have control (access) over the load generation agents for any customization needs, you can deploy them yourself using <a href=\"https:\/\/azure.microsoft.com\/en-us\/documentation\/articles\/resource-group-authoring-templates\/\">ARM template<\/a> in your Azure subscription. These machines will get registered with CLT can generate load. More details on this will follow in the same blog.<\/li>\n<li><span style=\"font-weight: bold\">Use ARM template to deploy load agents in a VNet.\u00a0\u00a0\u00a0 <\/span>If the application under test (AuT) is inside a <a href=\"https:\/\/azure.microsoft.com\/en-us\/documentation\/articles\/virtual-networks-overview\/\">Azure VNet<\/a> or if there is an <a href=\"https:\/\/azure.microsoft.com\/en-us\/services\/expressroute\/\">ExpressRoute<\/a> between application&#8217;s private network and Azure, you can use a pre-defined ARM template deploy IaaS VMs in Azure in a specific VNet to act as load agents. The machines will be provisioned in your Azure subscription and registered against your VSTS account. The VNet where you create these machines should have a line of sight to the application, so that the load generators are able to reach the app. More details on this can be seen in the further segments of this blog.<\/li>\n<li><span style=\"font-weight: bold\">Use ARM template to deploy load agents with static IPs.\u00a0 <\/span>If you don\u2019t have ExpressRoute connectivity and want to test apps hosted on-premises, you can use an ARM template to deploy IaaS VMs in Azure to act as load agents. Choose to create these VMs with static IPs that you can allow traffic from in the firewall, so that the necessary load can be generated. The machines will be provisioned in your Azure subscription and registered against your VSTS account. More details on this will follow in the same blog.<strong> <\/strong><\/li>\n<li><span style=\"font-weight: bold\">Use cloud load agents on your infrastructure.\u00a0 W<\/span>e have also come up with a simple powershell script that can help you to configure physical or virtual machine(s) of your choice as load agents. These machine(s) will be registered against your VSTS account for load generation. You can read more on this by following a separate blog, <a href=\"https:\/\/blogs.msdn.microsoft.com\/visualstudioalm\/2016\/08\/22\/use-cloud-load-agents-on-your-infrastructure\/\">&#8216;Use cloud load agents on your infrastructure&#8217;<\/a>.<strong>\u00a0<\/strong><\/li>\n<li><span style=\"font-weight: bold\">Use Test Controller\/Test Agents for on-premises testing on your infrastructure.\u00a0 <\/span>If you want to do test apps on-premises, but have constraints such as not being able to store results on the cloud for some reason (say, regulatory compliance) you can use the Test Controller \/ Test Agents based solution for load testing. This requires you to use your own infrastructure for load generation and results will be stored on SQL Server. <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms243155.aspx\">https:\/\/msdn.microsoft.com\/en-us\/library\/ms243155.aspx<\/a><\/li>\n<\/ol>\n<hr \/>\n<p>Now we&#8217;ll deep dive into solution #2\u00a0, #3 and\u00a0#4\u00a0in this blog.<\/p>\n<p>This section talks about how you can provision load agent(s) using Azure IaaS VMs in details. User must have an Azure subscription where the IaaS VMs and related resources will be provisioned. This is primarily useful in following two use cases:<\/p>\n<ol>\n<li>You want to test a private application which is not accessible through CLT\/internet.<\/li>\n<li><strong>Bring your own Subscription (BYOS)<\/strong> &#8211; You have your own Azure subscription and want to leverage it for load testing. You can also use the Azure free credits, if you have.<\/li>\n<\/ol>\n<p>Azure gives an edge here as users can spread their load testing across different geo-locations which we have seen many customers are interesting in these days.<\/p>\n<h2><span style=\"font-weight: bold\">Use ARM template to deploy load agents in a VNet<\/span><\/h2>\n<p>Following is the simple topology where load agents are present under user&#8217;s VNet and henceforth they will have a line of sight to the application. We have published one ARM template in github to help user to provision machines easily and quickly.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/6\/2019\/05\/clip_image0026.png\"><img decoding=\"async\" width=\"695\" height=\"315\" title=\"clip_image002\" class=\"aligncenter\" style=\"float: none;padding-top: 0px;padding-left: 0px;margin-left: auto;padding-right: 0px;margin-right: auto;border-width: 0px\" alt=\"clip_image002\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2016\/08\/clip_image002_thumb6.png\" border=\"0\" \/><\/a><\/p>\n<p>For this to work user must have an existing VNet as depicted in above diagram. VNet identification requires its resource group name as well. If you wish to use an existing subnet, you should have this info as well.<\/p>\n<p>To deploy such rig we have published one ARM template. You can click on the following link to automatically load the ARM template in Azure management portal.<\/p>\n<p><a href=\"https:\/\/portal.azure.com\/#create\/Microsoft.Template\/uri\/https%3a%2f%2fraw.githubusercontent.com%2fAzure%2fazure-quickstart-templates%2fmaster%2f201-vsts-cloudloadtest-rig-existing-vnet%2fazuredeploy.json\">Provision load agents in an existing rig<\/a><\/p>\n<p>Once you click on it, it will load the template in Azure portal and you&#8217;ll see following view. User can fill in the parameters and choose the subscription\/resource group\/location as per the requirement.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/6\/2019\/05\/clip_image0034.png\"><img decoding=\"async\" width=\"546\" height=\"693\" title=\"clip_image003\" class=\"aligncenter\" style=\"float: none;padding-top: 0px;padding-left: 0px;margin-left: auto;padding-right: 0px;margin-right: auto;border-width: 0px\" alt=\"clip_image003\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2016\/08\/clip_image003_thumb4.png\" border=\"0\" \/><\/a><\/p>\n<p>If you wish to dig deep into the template and modify as per your needs, you can check it out from following github repo:<\/p>\n<p><a href=\"https:\/\/github.com\/Azure\/azure-quickstart-templates\/tree\/master\/201-vsts-cloudloadtest-rig-existing-vnet\">https:\/\/github.com\/Azure\/azure-quickstart-templates\/tree\/master\/201-vsts-cloudloadtest-rig-existing-vnet<\/a><\/p>\n<h2>Use ARM template to deploy load agents with static IPs<\/h2>\n<p>We have published another ARM template where user doesn\u2019t need to have an existing VNet. This can be used for following two purposes:<\/p>\n<ol>\n<ol>\n<li>If you don\u2019t have ExpressRoute in Azure but want to do load testing using his own subscription, you can use this ARM template which just deploys a rig with its own VNet. If you need to test an private application, you can deploy the rig with static IPs (provided as an option), punch the firewall for these IP(s) to make a route for load agents.<\/li>\n<li>If you want to have control over load generation agents (as CLT auto-provisioned agents can&#8217;t be accessed by the user). You can choose to have static\/dynamic IPs for these VMs.<\/li>\n<\/ol>\n<\/ol>\n<p>To leverage this, just click on following link to load the ARM template in Azure management portal.<\/p>\n<p><a href=\"https:\/\/portal.azure.com\/#create\/Microsoft.Template\/uri\/https%3a%2f%2fraw.githubusercontent.com%2fAzure%2fazure-quickstart-templates%2fmaster%2f101-vsts-cloudloadtest-rig%2fazuredeploy.json\">Provision load agents in a new Vnet<\/a><\/p>\n<p>Github repo link for this ARM template is as follows:<\/p>\n<p><a href=\"https:\/\/github.com\/Azure\/azure-quickstart-templates\/tree\/master\/101-vsts-cloudloadtest-rig\">https:\/\/github.com\/Azure\/azure-quickstart-templates\/tree\/master\/101-vsts-cloudloadtest-rig<\/a><\/p>\n<p>Once you deploy the VMs, it may take 10-15 mins to have machines configured with CLT and ready for load test. The load test runs done on these agents will not be charged VUMs by the CLT service but user will incur the cost of Azure resources consumed under his subscription.<\/p>\n<p><span>All the VMs of a resource group get registered under an agent group<\/span> whose name is same as the resource group name. In order to queue the run on a particular set of agents, you must mention the agent group name while queuing the run. If you have deployed your agent(s)\/resource group(s) before Dec. 14, 2016, all of the old agents are available under an agent group named as &#8216;default&#8217;. We recommend to configure those agents again using the latest script.<\/p>\n<p>So if you want to have your agents separated based on some configuration (e.g., location, VNet, capacity) you should keep such agents in separate resource groups. This will give you an advantage of having isolated runs and easier management of machines\/agents.<\/p>\n<p>In ARM template we have set the machine size to &#8216;Standard_D4_V2&#8217;. This size machine(s) comes up with 8 CPU cores and 28 GB of memory. User can change this value at his end by editing the template. Refer <a href=\"https:\/\/azure.microsoft.com\/en-in\/documentation\/articles\/virtual-machines-windows-sizes\/\">this<\/a> to know more about the azure machine sizes and capabilities.<\/p>\n<h3><span style=\"font-weight: bold\">How to queue a run using load agents<\/span><\/h3>\n<h3>Using VSTS portal<\/h3>\n<p>Now you can queue load test runs on self-provisioned agents through VSTS portal. As shown in below UI, you have a choice to select the type of agents in the settings tab.<\/p>\n<p><img decoding=\"async\" width=\"685\" height=\"617\" class=\"aligncenter size-full wp-image-26605\" alt=\"vsts\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2016\/08\/VSTS.png\" \/><\/p>\n<h3>Using Visual Studio Enterprise IDE<\/h3>\n<p>We are working on making it as first class experience in our product. Till then user can queue a run on these machines by having the following context parameter in Visual Studio Load Test file.<\/p>\n<blockquote><p>Context parameter name \u2013 UseStaticLoadAgents<\/p>\n<p>Context parameter value &#8211; true<\/p>\n<p>Context parameter name \u2013 StaticAgentsGroupName<\/p>\n<p>Context parameter value &#8211; &lt;name of the agent group&gt;<\/p><\/blockquote>\n<p><img decoding=\"async\" width=\"305\" height=\"276\" class=\"size-full wp-image-26615 alignnone\" alt=\"contextparam\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2016\/08\/contextparam.png\" \/><\/p>\n<p>User can set the number of machines to be used for a load test run through Agent core count property present in Run Settings. In user&#8217;s own load agents scenario every core is treated as a single machine. As shown in below image, 5 machines will be used for the run.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/6\/2019\/05\/clip_image0058.png\"><img decoding=\"async\" width=\"346\" height=\"90\" title=\"clip_image005\" style=\"padding-top: 0px;padding-left: 0px;padding-right: 0px;border-width: 0px\" alt=\"clip_image005\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2016\/08\/clip_image005_thumb6.png\" border=\"0\" \/><\/a><\/p>\n<p>The runs done on user&#8217;s own load agents machines are not charged. User should be able to confirm this by looking into the status messages of the run.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/6\/2019\/05\/clip_image00611.jpg\"><img decoding=\"async\" width=\"1109\" height=\"253\" title=\"clip_image006\" class=\"aligncenter\" style=\"padding-top: 0px;padding-left: 0px;padding-right: 0px;border-width: 0px\" alt=\"clip_image006\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2016\/08\/clip_image006_thumb10.jpg\" border=\"0\" \/><\/a><\/p>\n<p>Before you do that, we would recommend you to go through the FAQs as well.<\/p>\n<h2>Managing self-provisioned agents<\/h2>\n<p>To manage these self-provisioned agents users can download a powershell script from the following link:<\/p>\n<p><a href=\"https:\/\/elsprodch2su1.blob.core.windows.net\/ets-containerfor-loadagentresources\/bootstrap\/ManageVSTSCloudLoadAgent.ps1\">Download powershell script to list down the registered machines<\/a><\/p>\n<p>After downloading it, please make sure you unblock the file.<\/p>\n<p><img decoding=\"async\" width=\"364\" height=\"512\" class=\"size-full wp-image-26625 alignnone\" alt=\"properties\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2016\/08\/properties.png\" \/><\/p>\n<p>Following are the mandatory parameters:<\/p>\n<ol>\n<li><b>TeamServicesAccountName:<\/b> It is the name of the VSTS account with which you want to get configured machines. Use just need to pass the account name here e.g., please put &#8216;xyz&#8217; if your VSTS account url is <a href=\"https:\/\/xyz.visualstudio.com\/\">https:\/\/xyz.visualstudio.com<\/a><\/li>\n<li><b>PATToken :<\/b> It is required for authentication. One has to first get the PAT token for the VSTS account. Follow <a href=\"https:\/\/www.visualstudio.com\/en-us\/docs\/setup-admin\/team-services\/use-personal-access-tokens-to-authenticate\">this<\/a> post to get it. The scope should be selected as \u2018Load Test (read and write)\u2019<\/li>\n<\/ol>\n<p>Following are the possible operations and their necessary switch along with the example:<\/p>\n<p><b>Get agent groups-<\/b> It&#8217;ll list down all the registered agent groups with the VSTS account. Example is as follows:<\/p>\n<p>.ManageVSTSCloudLoadAgent.ps1 -TeamServicesAccountName <a href=\"https:\/\/xyz.visualstudio.com\/\">https:\/\/xyz.visualstudio.com<\/a> -PATToken olxpldk2xcdfp5bt2ruemetwrmv7xyzk23l4cnnewi3rbaq -GetAgentGroups<\/p>\n<p><b>Get agents-<\/b> It&#8217;ll list down all the agents and their latest status of a particular agent group name. Example is as follows:<\/p>\n<p>.ManageVSTSCloudLoadAgent.ps1 -TeamServicesAccountName <a href=\"https:\/\/xyz.visualstudio.com\/\">https:\/\/xyz.visualstudio.com<\/a> -PATToken olxpldk2xcdfp5bt2ruemetwrmv7xyzk23l4cnnewi3rbaq -AgentGroupName test -GetAgents<\/p>\n<p><b>Delete an agent-<\/b> It&#8217;ll delete the agent reference from service. The agent must be in the offline state before a user can delete it. Agent group name is mandatory. Refer the following for example:<\/p>\n<p>.ManageVSTSCloudLoadAgent.ps1 -TeamServicesAccountName <a href=\"https:\/\/xyz.visualstudio.com\/\">https:\/\/xyz.visualstudio.com<\/a> -PATToken olxpldk2xcdfp5bt2ruemetwrmv7xyzk23l4cnnewi3rbaq -DeleteAgent -AgentGroupName test -AgentName dpk-param<\/p>\n<p>You can find more details by doing get-help on the ManageVSTSCloudLoadAgent.ps1.<\/p>\n<h3><span style=\"font-weight: bold\">Frequently asked question \u2013 <\/span><\/h3>\n<ol>\n<li><strong>How do the load agents communicate with CLT?\u00a0\u00a0 <\/strong>The load agents will communicate with CLT using HTTPs protocol. Since these machines\/VMs are inside user&#8217;s private network (Azure\/on-prem), they can reach the Application under Test (AuT) easily. The results are published back to the CLT service so that the analysis can happen in similar manner as done for other type of load test runs in CLT.<\/li>\n<li><strong>How I am being charged for this?\u00a0\u00a0 <\/strong>At present this feature is in preview mode and you will not incur load testing VUM charges for the runs where you deploy load agents on your premises or in your Azure subscription. However, you will be charged the applicable Azure VM costs.<\/li>\n<li><strong>Can I use these machines for some other purpose?\u00a0\u00a0 <\/strong>These machines can be used other your other tasks as well but it is recommended to not have anything running while a load test run is in progress.<\/li>\n<li><strong>Can I shut down the machines where I have configured load test agent?\u00a0\u00a0 <\/strong>Yes, the machines can be shut down when not in use. The load agent service will automatically start to receive commands from CLT, once the machine is up. If you are using Azure ARM template to deploy these agents, you can start\/stop the VMs based on your need. You can also do this using a powershell script. Refer following link to more on this.<a href=\"https:\/\/gallery.technet.microsoft.com\/scriptcenter\/Stop-All-VMs-in-Specified-40c8531e\">https:\/\/gallery.technet.microsoft.com\/scriptcenter\/Stop-All-VMs-in-Specified-40c8531e<\/a>You are also recommended to delete the Azure resource group once you are done with load testing. You should be able to re-create it anytime later if you need to.<a href=\"https:\/\/azure.microsoft.com\/en-in\/documentation\/articles\/resource-group-portal\/\">https:\/\/azure.microsoft.com\/en-in\/documentation\/articles\/resource-group-portal\/<\/a><\/li>\n<li><strong>I have proxy settings on my machines, will this work?\u00a0\u00a0 <\/strong>We support only default proxy scenario i.e., when the proxy settings are controlled through IE and it uses the current user&#8217;s credentials to connect to proxy server. In other cases, please reach out to us.<\/li>\n<li><strong>From where I can collect the logs to debug some issue?<\/strong><span>\nThe powershell script logs are stored in the logs folder which will be present in the same folder where the powershell script exists. These logs are displayed in the powershell window as well.\u00a0 <\/span>Run execution logs reside in %windir%tempCloudLoadTest logs folder.<\/li>\n<li><strong>How can I know the outgoing URLs so that I can whitelist them in my firewall settings if I need to.<\/strong> We have added one REST API for this. You first need to get the target AgentGroup Id using REST API &#8220;<strong>https:\/\/&lt;VSTS account name&gt;.vsclt.visualstudio.com\/_apis\/clt\/agentgroups<\/strong>&#8220;. Once you get the Agent Group Id, it can be used to get the list of outgoing URLs.\u00a0The syntax of the API is <strong>&#8220;https:\/\/&lt;<em>VSTS account name<\/em>&gt;.vsclt.visualstudio.com\/_apis\/clt\/agentgroups?agentGroupId=&lt;<em>Agent Group Id<\/em>&gt;&amp;outgoingRequestUrls=true&#8221;<\/strong>.\u00a0 The output of this will be a list of string where first two inputs are the Azure Blob\/Table service URLs. Another outgoing URL is your Visual Studio account URL. Apart from these three URLs you also need to whitelist this URL &#8220;https:\/\/&lt;VSTS account name&gt;.vsclt.visualstudio.com.<\/li>\n<\/ol>\n<p>With all this, you should be able to go ahead and try out the load testing. Do reach out to us on <a href=\"mailto:vsoloadtest@microsoft.com\">vsoloadtest@microsoft.com<\/a>, if you have any query.<\/p>\n<p>Happy Load Testing!\u00a0<img decoding=\"async\" class=\"wlEmoticon wlEmoticon-smile\" alt=\"Smile\" src=\"https:\/\/devblogs.microsoft.com\/devops\/wp-content\/uploads\/sites\/6\/2016\/08\/wlEmoticon-smile5.png\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cloud-based Load Testing Service can be used for performance and scale testing of an application by generating load from Azure. This type of load generation can only hit\/generate load on an internet\/publically accessible application. But we have seen many times customer needs to load test their application which is not publically accessible. Reasons could be [&hellip;]<\/p>\n","protected":false},"author":162,"featured_media":45953,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[224,1,252],"tags":[],"class_list":["post-20025","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure","category-devops","category-testing"],"acf":[],"blog_post_summary":"<p>Cloud-based Load Testing Service can be used for performance and scale testing of an application by generating load from Azure. This type of load generation can only hit\/generate load on an internet\/publically accessible application. But we have seen many times customer needs to load test their application which is not publically accessible. Reasons could be [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/posts\/20025","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/users\/162"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/comments?post=20025"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/posts\/20025\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/media\/45953"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/media?parent=20025"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/categories?post=20025"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/devops\/wp-json\/wp\/v2\/tags?post=20025"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}