03-08-2023 07:39 AM
Hello,
I'm looking for a way to export the names of learned endpoints in a particular EPG. I'm aware of the CLI commands you can run in the APIC that will give list out all the of the learned endpoints of a particular EPG (show epg [EPG name] detail), but it doesn't actually provide the name of the machine. In the APIC GUI, I can see the names of the endpoints by looking going to Operational ---> Client End-Points in the EPG. The names of the virtual machines I'm looking for appear in the End Point column, but I dont see a way to export this. Is this possible?
03-08-2023 12:23 PM
Hi @johnny.moody ,
is
admin@apic1:~> moquery -c fvCEp -x rsp-subtree=children | grep contName
the kind of thing you are looking for?
To include the MAC address of each VM, be a little more expansive with the grep
admin@apic1:~> moquery -c fvCEp -x rsp-subtree=children | egrep "contName|name "
Note I'm using egrep
not grep
and the space in "contName|name "
will prevent the nameAlias
field showing too.
I'm sure there are more elegant solutions, and @Sergiu Daniluk will probably come up with one! (=challenge for Sergiu)
03-09-2023 05:12 AM
Rather than trying to export this from the CLI, just hit the API with a similar call as the UI uses (hint: Use API Inspector). Using these remote powers with a tool like Postman you could send something like:
GET:
https://[APIC_IP]/api/node/mo/uni/tn-[TENANT_NAME]/ap-[AP_NAME]/epg-[EPG_NAME].json?query-target=children&target-subtree-class=fvCEp&rsp-subtree=children&rsp-subtree-class=fvIp
This would give you a json response which you could parse for info of interest such as the "mac", "name", "fvIP", "addr" etc.
If I get time to fiddle with Postman filters more to clean up the API repsonse, I'll update this thread.
Robert
03-09-2023 12:48 PM - edited 05-25-2024 02:57 PM
Hi @johnny.moody ,
I guess I was trying to give a more general answer in my first attempt, but @Robert Burns is correct in that if you care to go to the trouble of adding the [TENANT_NAME], the [AP_NAME], and the [EPG_NAME] to the query you can refine the output better.
IN THEORY, you should be able to use the same construction with moquery to get the same result - i.e. if my [TENANT_NAME] is Tenant17, my [AP_NAME] is 2Tier_AP, and my [EPG_NAME] is DBServers_EPG, then I SHOULD be able to do this:
admin@apic1:~> moquery -d uni/tn-Tenant17/ap-2Tier_AP/epg-DBServers_EPG -x "query-target=children target-subtree-class=fvCEp rsp-subtree=children rsp-subtree-class=fvIp"
to get functionally the same result as the Postman approach.
But alas, moquery (last updated in 2014) has a bug that Cisco has never bothered to fix, as I discovered when I posted this question back in 2020. It only display ONE of the endpoints when executed
So, IF you want to stick with the CLI, you can use icurl instead to do the same thing - but the output from icurl is without spaces, so you need to also know about jq as well.
So back to my example (where, by the way my Tenant17 has two endpoints, one of which is a VM and has a name, the other is a bare metal host so doesn't show a name) this is what I see if I use icurl with the parameters suggested by @Robert Burns
admin@apic1:~> icurl -s "http://localhost/api/node/mo/uni/tn-Tenant17/ap-2Tier_AP/epg-DBServers_EPG.json?\
query-target=children&target-subtree-class=fvCEp&rsp-subtree=children&rsp-subtree-class=fvIp"
{"totalCount":"2","imdata":[{"fvCEp":{"attributes":{"annotation":"","baseEpgDn":"","bdDn":"uni/tn-Tenant17/BD-App_BD","childAction":"deleteNonPresent","contName":"","dn":"uni/tn-Tenant17/ap-2Tier_AP/epg-DBServers_EPG/cep-00:50:56:B8:04:1B","encap":"vlan-1175","esgUsegDn":"","extMngdBy":"","fabricPathDn":"topology/pod-1/paths-1203/pathep-[eth1/18]","hostingServer":"","id":"0","idepdn":"","lcC":"learned","lcOwn":"local","mac":"00:50:56:B8:04:1B","mcastAddr":"not-applicable","modTs":"2023-03-07T11:22:10.185+11:00","monPolDn":"uni/tn-common/monepg-default","name":"00:50:56:B8:04:1B","nameAlias":"","reportingControllerName":"","status":"","uid":"0","userdom":"all","uuid":"","vmmSrc":"","vrfDn":"uni/tn-Tenant17/ctx-Production_VRF"},"children":[{"fvIp":{"attributes":{"addr":"10.117.11.25","annotation":"","baseEpgDn":"","bdDn":"uni/tn-Tenant17/BD-App_BD","childAction":"deleteNonPresent","createTs":"2023-03-07T11:22:10.380+11:00","debugMACMessage":"","esgUsegDn":"","extMngdBy":"","fabricPathDn":"topology/pod-1/paths-1203/pathep-[eth1/18]","flags":"","lcOwn":"local","modTs":"2023-03-07T11:22:10.185+11:00","monPolDn":"uni/tn-common/monepg-default","rn":"ip-[10.117.11.25]","status":"","uid":"0","userdom":"all","vrfDn":"uni/tn-Tenant17/ctx-Production_VRF"}}}]}},{"fvCEp":{"attributes":{"annotation":"","baseEpgDn":"","bdDn":"uni/tn-Tenant17/BD-App_BD","childAction":"deleteNonPresent","contName":"dbserver1.t17.dns","dn":"uni/tn-Tenant17/ap-2Tier_AP/epg-DBServers_EPG/cep-00:50:56:AC:81:A5","encap":"vlan-1371","esgUsegDn":"","extMngdBy":"","fabricPathDn":"topology/pod-1/paths-1201/extpaths-191/pathep-[eth1/27]","hostingServer":"esxi171.fab1.hl.dns","id":"0","idepdn":"","lcC":"learned,vmm","lcOwn":"local","mac":"00:50:56:AC:81:A5","mcastAddr":"not-applicable","modTs":"2023-03-06T14:30:49.742+11:00","monPolDn":"uni/tn-common/monepg-default","name":"00:50:56:AC:81:A5","nameAlias":"","reportingControllerName":"vca17.fab1.hl.dns","status":"","uid":"0","userdom":"all","uuid":"","vmmSrc":"dvs","vrfDn":"uni/tn-Tenant17/ctx-Production_VRF"},"children":[{"fvIp":{"attributes":{"addr":"10.117.11.21","annotation":"","baseEpgDn":"","bdDn":"uni/tn-Tenant17/BD-App_BD","childAction":"deleteNonPresent","createTs":"2023-03-06T14:30:49.937+11:00","debugMACMessage":"","esgUsegDn":"","extMngdBy":"","fabricPathDn":"topology/pod-1/paths-1201/extpaths-191/pathep-[eth1/27]","flags":"","lcOwn":"local","modTs":"2023-03-06T14:30:49.742+11:00","monPolDn":"uni/tn-common/monepg-default","rn":"ip-[10.117.11.21]","status":"","uid":"0","userdom":"all","vrfDn":"uni/tn-Tenant17/ctx-Production_VRF"}}}]}}]}
Pretty ugly right? This is where jq comes in. If I simply feed that output into jq, it will make it much prettier. But still very long - so long in fact I'll post the output at the end of this post as an appendix.
The point I'm trying to make is that using icurl with jq, you can manipulate the output better than using egrep with moquery. So to get JUST the names of those endpoints - I change the jq filter to jq '.imdata[].fvCEp.attributes.contName'
admin@apic1:~> icurl -s "http://localhost/api/node/mo/uni/tn-Tenant17/ap-2Tier_AP/epg-DBServers_EPG.json?\
query-target=children&target-subtree-class=fvCEp&rsp-subtree=children&rsp-subtree-class=fvIp" |
jq '.imdata[].fvCEp.attributes.contName' "" "dbserver1.t17.dns"
And bingo there are my two EP names!
Output of the icurl command simply filtered through jq
admin@apic1:~> icurl -s "http://localhost/api/node/mo/uni/tn-Tenant17/ap-2Tier_AP/epg-DBServers_EPG.json?\
query-target=children&target-subtree-class=fvCEp&rsp-subtree=children&rsp-subtree-class=fvIp" |
jq { "totalCount": "2", "imdata": [ { "fvCEp": { "attributes": { "annotation": "", "baseEpgDn": "", "bdDn": "uni/tn-Tenant17/BD-App_BD", "childAction": "deleteNonPresent", "contName": "", "dn": "uni/tn-Tenant17/ap-2Tier_AP/epg-DBServers_EPG/cep-00:50:56:B8:04:1B", "encap": "vlan-1175", "esgUsegDn": "", "extMngdBy": "", "fabricPathDn": "topology/pod-1/paths-1203/pathep-[eth1/18]", "hostingServer": "", "id": "0", "idepdn": "", "lcC": "learned", "lcOwn": "local", "mac": "00:50:56:B8:04:1B", "mcastAddr": "not-applicable", "modTs": "2023-03-07T11:22:10.185+11:00", "monPolDn": "uni/tn-common/monepg-default", "name": "00:50:56:B8:04:1B", "nameAlias": "", "reportingControllerName": "", "status": "", "uid": "0", "userdom": "all", "uuid": "", "vmmSrc": "", "vrfDn": "uni/tn-Tenant17/ctx-Production_VRF" }, "children": [ { "fvIp": { "attributes": { "addr": "10.117.11.25", "annotation": "", "baseEpgDn": "", "bdDn": "uni/tn-Tenant17/BD-App_BD", "childAction": "deleteNonPresent", "createTs": "2023-03-07T11:22:10.380+11:00", "debugMACMessage": "", "esgUsegDn": "", "extMngdBy": "", "fabricPathDn": "topology/pod-1/paths-1203/pathep-[eth1/18]", "flags": "", "lcOwn": "local", "modTs": "2023-03-07T11:22:10.185+11:00", "monPolDn": "uni/tn-common/monepg-default", "rn": "ip-[10.117.11.25]", "status": "", "uid": "0", "userdom": "all", "vrfDn": "uni/tn-Tenant17/ctx-Production_VRF" } } } ] } }, { "fvCEp": { "attributes": { "annotation": "", "baseEpgDn": "", "bdDn": "uni/tn-Tenant17/BD-App_BD", "childAction": "deleteNonPresent", "contName": "dbserver1.t17.dns", "dn": "uni/tn-Tenant17/ap-2Tier_AP/epg-DBServers_EPG/cep-00:50:56:AC:81:A5", "encap": "vlan-1371", "esgUsegDn": "", "extMngdBy": "", "fabricPathDn": "topology/pod-1/paths-1201/extpaths-191/pathep-[eth1/27]", "hostingServer": "esxi171.fab1.hl.dns", "id": "0", "idepdn": "", "lcC": "learned,vmm", "lcOwn": "local", "mac": "00:50:56:AC:81:A5", "mcastAddr": "not-applicable", "modTs": "2023-03-06T14:30:49.742+11:00", "monPolDn": "uni/tn-common/monepg-default", "name": "00:50:56:AC:81:A5", "nameAlias": "", "reportingControllerName": "vca17.fab1.hl.dns", "status": "", "uid": "0", "userdom": "all", "uuid": "", "vmmSrc": "dvs", "vrfDn": "uni/tn-Tenant17/ctx-Production_VRF" }, "children": [ { "fvIp": { "attributes": { "addr": "10.117.11.21", "annotation": "", "baseEpgDn": "", "bdDn": "uni/tn-Tenant17/BD-App_BD", "childAction": "deleteNonPresent", "createTs": "2023-03-06T14:30:49.937+11:00", "debugMACMessage": "", "esgUsegDn": "", "extMngdBy": "", "fabricPathDn": "topology/pod-1/paths-1201/extpaths-191/pathep-[eth1/27]", "flags": "", "lcOwn": "local", "modTs": "2023-03-06T14:30:49.742+11:00", "monPolDn": "uni/tn-common/monepg-default", "rn": "ip-[10.117.11.21]", "status": "", "uid": "0", "userdom": "all", "vrfDn": "uni/tn-Tenant17/ctx-Production_VRF" } } } ] } } ] }
03-10-2023 06:51 AM
Thank you providing this. I ran both versions of your icurl script, but the output value for 'contName' for each VM appears to be blank. When I run the script piped with jq, it works, but all it gives me is a pair double quotations:
I went back to the GUI, right-clicked on the endpoint name, and opened it in the Object Store Browser. Confirming what I saw in the bash shell, the 'contName' field for all of these VM's are blank. It's odd because the name does appear in the End Point column under Operational ---> Client End-Points, but it seems to be pulling the information from somewhere else.
Could this be happening because this EPG is tied to a VMware VMM Domain?
03-10-2023 12:36 PM
Just a quick reply - it MIGHT be the \
character in the command line - the \
character is followed by <ENTER>
when typing the command - it's a linux bash thing that allows you to spread you command over two lines.
Re the VMM thing - contName ONLY gets filled if you have a VMM!
03-10-2023 01:03 PM
I actually thought that might be the case and tried removing it earlier today. Still the same output.
03-10-2023 01:43 PM
OK. What's really weird with the screendumps you posted is that the contName field is blank when you open the fvCEp object in the Object Store Browser (aka visore). The VM in my lab looks like this in the browser:
The other thing I noticed in your screendumps was that there was no Endpoint Name column.
Perhaps we are looking for different things!
FYI - it is Saturday here - won't be back at this for about 20+ hrs
03-10-2023 02:18 PM
Interesting. I don't have that Endpoint Name option when selecting columns. These are the options I have:
The version we're running is 4.2(7q). I'm not sure if yours is newer or older, but that's what I get.
03-10-2023 03:59 PM
03-11-2023 10:07 PM - edited 05-25-2024 02:53 PM
Hi @johnny.moody ,
Back at my desk enjoying a geeky Sunday morning looking at your problem.
First thing first - your last screen dump looks like you right-clicked, rather than actually clicking on the heading
So hopefully, you can sort that problem out.
As for why:
When I run the script piped with jq, it works, but all it gives me is a pair double quotations:
I'm sure that has to be something to do with the way the command was entered - OR the EPG doesn't have VM managed by a VMM Domain. In cay case, I'll give you a slightly more foolproof way of entering the command later
But back to actually giving you what you want -
I can see the names of the endpoints by looking going to Operational ---> Client End-Points in the EPG. The names of the virtual machines I'm looking for appear in the End Point column, but I dont see a way to export this. Is this possible?
And it is possible!
And thanks for throwing me down this rabbit-hole!
But to be honest, it's a rabbit-hole I've been staring at for some time, and never been quite game to jump in, although I've dipped my toe a couple of times with the odd moquery blog and video.
I've been wanting to explore jq for a while, and that is where this is going. I want to find a way to solve this one using icurl piped into jq
So welcome to my rabbit hole!
Let's begin with the command I used last time - only (as I promised) I'm going to set some variables so you'll be able to copy and paste it more easily.
admin@apic1:~> TN=tn-Tenant17 #Replace tn-Tenant17 with whatever your Tenant is - don't leave out the "tn-" bit
admin@apic1:~> AP=ap-2Tier_AP #Replace ap-2Tier_AP with your Application Profile name - and rember the "ap-" at the start
admin@apic1:~> EPG=epg-DBServers_EPG #And again for the EPG name - replace epg-DBServers_EPG
# The following you can copy and paste as is if you've done the above correctly
admin@apic1:~> URI="http://localhost/api/node/mo/uni/$TN/$AP/$EPG.json" #Just to make it easier to interpret the
# long command later - as is the next line
admin@apic1:~> QUERY="query-target=children&target-subtree-class=fvCEp&rsp-subtree=children&rsp-subtree-class=fvIp"
#Refinement #0 - The following SHOULD produce exactly what my previous post gave you:
admin@apic1:~> icurl -s "$URI?$QUERY"
{"totalCount":"2","imdata":[{"fvCEp":{"attributes":{"annotation":"","baseEpgDn":"","bdDn":"uni/tn-Tenant17/BD-App_BD","childAction":"deleteNonPresent","contName":"","dn":"uni/tn-Tenant17/ap-2Tier_AP/epg-DBServers_EPG/cep-00:50:56:B8:04:1B","encap":"vlan-1175","esgUsegDn":"","extMngdBy":"","fabricPathDn":"topology/pod-1/paths-1203/pathep-[eth1/18]","hostingServer":"","id":"0","idepdn":"","lcC":"learned","lcOwn":"local","mac":"00:50:56:B8:04:1B","mcastAddr":"not-applicable","modTs":"2023-03-07T11:22:10.185+11:00","monPolDn":"uni/tn-common/monepg-default","name":"00:50:56:B8:04:1B","nameAlias":"","reportingControllerName":"","status":"","uid":"0","userdom":"all","uuid":"","vmmSrc":"","vrfDn":"uni/tn-Tenant17/ctx-Production_VRF"},"children":[{"fvIp":{"attributes":{"addr":"10.117.11.25","annotation":"","baseEpgDn":"","bdDn":"uni/tn-Tenant17/BD-App_BD","childAction":"deleteNonPresent","createTs":"2023-03-07T11:22:10.380+11:00","debugMACMessage":"","esgUsegDn":"","extMngdBy":"","fabricPathDn":"topology/pod-1/paths-1203/pathep-[eth1/18]","flags":"","lcOwn":"local","modTs":"2023-03-07T11:22:10.185+11:00","monPolDn":"uni/tn-common/monepg-default","rn":"ip-[10.117.11.25]","status":"","uid":"0","userdom":"all","vrfDn":"uni/tn-Tenant17/ctx-Production_VRF"}}}]}},{"fvCEp":{"attributes":{"annotation":"","baseEpgDn":"","bdDn":"uni/tn-Tenant17/BD-App_BD","childAction":"deleteNonPresent","contName":"dbserver1.t17.dns","dn":"uni/tn-Tenant17/ap-2Tier_AP/epg-DBServers_EPG/cep-00:50:56:AC:81:A5","encap":"vlan-1371","esgUsegDn":"","extMngdBy":"","fabricPathDn":"topology/pod-1/paths-1201/extpaths-191/pathep-[eth1/27]","hostingServer":"esxi171.fab1.hl.dns","id":"0","idepdn":"","lcC":"learned,vmm","lcOwn":"local","mac":"00:50:56:AC:81:A5","mcastAddr":"not-applicable","modTs":"2023-03-06T14:30:49.742+11:00","monPolDn":"uni/tn-common/monepg-default","name":"00:50:56:AC:81:A5","nameAlias":"","reportingControllerName":"vca17.fab1.hl.dns","status":"","uid":"0","userdom":"all","uuid":"","vmmSrc":"dvs","vrfDn":"uni/tn-Tenant17/ctx-Production_VRF"},"children":[{"fvIp":{"attributes":{"addr":"10.117.11.21","annotation":"","baseEpgDn":"","bdDn":"uni/tn-Tenant17/BD-App_BD","childAction":"deleteNonPresent","createTs":"2023-03-06T14:30:49.937+11:00","debugMACMessage":"","esgUsegDn":"","extMngdBy":"","fabricPathDn":"topology/pod-1/paths-1201/extpaths-191/pathep-[eth1/27]","flags":"","lcOwn":"local","modTs":"2023-03-06T14:30:49.742+11:00","monPolDn":"uni/tn-common/monepg-default","rn":"ip-[10.117.11.21]","status":"","uid":"0","userdom":"all","vrfDn":"uni/tn-Tenant17/ctx-Production_VRF"}}}]}}]}
# which gives me the same output as before
#Refinement #1 - I really want to focus on the jq - so just like last time (using the bash variables now)
admin@apic1:~> icurl -s "$URI?$QUERY" | jq '.imdata[].fvCEp.attributes.contName' "" "dbserver1.t17.dns"
OK. So this is where my bunny chase really begins. I wasn't happy with the above output because
Let's do some more refinements
I can refine the query to just show those elements that have a VM manager (i.e controlled by vCenter - so must be VMs) by adding the following filter:
query-target-filter=ne(fvCEp.reportingControllerName, "")
It's a bit tricky getting the filter in the right place, but here we go. You'll have to update the QUERY variable so it reads:
#Refinement #2 - Step 1 - edit the QUERY variable
admin@apic1:~> QUERY='query-target=children&target-subtree-class=fvCEp&query-target-filter=ne(fvCEp.reportingControllerName, "")&rsp-subtree=children&rsp-subtree-class=fvIp'
# Step 2 run the same query - since I have ONLY ONE VM in this EPG, I expect to see only one answer
admin@apic1:~> icurl -s "$URI?$QUERY" | jq '.imdata[].fvCEp.attributes.contName'
"dbserver1.t17.dns"
Great. That's fixed issue #1 above 1. It showed the names of endpoints that weren't VMs, or managed by a VMM manager
But how do I squeeze a bit more out of jq to give me some extra information?
Let's start by adding a label to the output. To do this, I'm going to make jq format the output in JSON format! Check this out
#Refinement #3 - have jq create a new array
admin@apic1:~> icurl -s "$URI?$QUERY" | jq '[.imdata[] | {VM_Name: .fvCEp.attributes.contName}]' [ { "VM_Name": "dbserver1.t17.dns" } ]
Magnificent - I've now got labels - BUT I had to define the label myself. But I can live with that. Two down, one to go
For the last item on my wishlist - getting more than just the VM name, is just a matter of adding the values I want to pick from the array output of the icurl command and adding them to the array I created for VM_Name above.
#Refinement #3 -Let's extract the VM's IP address, and the name of the vCenter that manages the VMM admin@apic1:~> icurl -s "$URI?$QUERY" | jq '[.imdata[] |
{VM_Name: .fvCEp.attributes.contName,
IP: .fvCEp.children[].fvIp.attributes.addr,
vCenter: .fvCEp.attributes.reportingControllerName}]' [ { "VM_Name": "dbserver1.t17.dns", "IP": "10.117.11.21", "vCenter": "vca17.fab1.hl.dns" } ]
To wrap up then, I've decided to power on a 2nd VM in the same EPG/Portgroup, just to make the output a bit more meaty. This final example is exactly the same as the previous one, but shows one more server:
#Refinement #4 - power on another VM to add interest to the output.
admin@apic1:~> icurl -s "$URI?$QUERY" | jq '[.imdata[] |
{VM_Name: .fvCEp.attributes.contName,
IP: .fvCEp.children[].fvIp.attributes.addr,
vCenter: .fvCEp.attributes.reportingControllerName}]'
[ { "VM_Name": "dbserver1.t17.dns", "IP": "10.117.11.21", "vCenter": "vca17.fab1.hl.dns" }, { "VM_Name": "dbserver2.t17.dns", "IP": "10.117.11.22", "vCenter": "vca17.fab1.hl.dns" } ]
There are ways you can turn this output into .csv - but that's a topic for another lazy Sunday.
03-16-2023 05:21 AM
Sorry for the delay in replying, it's been quite a week.
So first, thank you for all of your help thus far. You've definitively helped me gain a better understanding of how all of this works on the back-end of ACI. As far as the columns go, I didnt actually right-click in my above images; those are really all of the options I have when left-clicking on the down arrow in any of those columns. I'm wondering if that's something that was introduced in a later version, or that our setup is somehow fundamentally different from yours. Because of that, I'm not sure if I'm going to be able to pull the information with your method.
When I run the moquery with no filters, it gives me all of the output, but in none of that output is the name of any of our VM's. Seems like they fixed/added that somewhere between 4.2 and 5.2.
Same thing for the icurl script. The "contName" field for every endpoint is blank, and the actual name of the VMs aren't present anywhere else in any of the output.
Back to the columns. I also have the 4.2(7I) APIC simulator running on a server I have at home, and I see the exact same options in the columns in that GUI as I do in our production network. Because, you cant actually connect any hosts to the simulator (If you know if a way, please please share lol), I cant say if the "contName" field populates the VM name of an attached VM.
All in all, it seems buggy to me. I'm going to open a TAC case to see what they can tell me.
03-16-2023 06:06 PM - edited 05-25-2024 02:54 PM
Hi @johnny.moody ,
Ah - I forgot that v4 gives the Endpoint Name value under the Name column - so on v4.2(7r) you see only these column options
But - as you observed, even in 4.2(7r) the fvCEp class objects have an attribute of contName
Unfortunately the v4.2(7r) system I have access to does NOT have any VMM Domains and is a production system, so I can't play with it.
Maybe we should be taking a different approach. Does this give you anything like what you want?
apic1# moquery -c compVm | grep -w name
or if you like the icurl approach
admin@apic1:~> icurl -s 'http://localhost/api/class/compVm.json?' | jq .imdata[]
or even fancier:
admin@apic1:~> icurl -s 'http://localhost/api/class/compVm.json?' | jq '[.imdata[] | {VM_Name: .compVm.attributes.name}]'
04-12-2023 06:02 AM
Let me apologize again for the huge delay. TAC finally got back to me and advised what we already knew; that in version 4.2 the 'contName' field simply isn't populated. So doing it the way you initially showed me isn't going to work on the version we're running, which is a little bit of a bummer.
The 'moquery -c compVm | grep -w name' does work for pulling the VM names, but right now I can only seem to find a way to have it pull all of them and not just the names of VM's from a certain EPG. Looking at the unfiltered output, it seems to be pulling that info from VMware. I dont see any of the Tennant, App Profile, or EPG information; so perhaps it's not possible?
04-12-2023 10:20 PM - edited 05-25-2024 02:55 PM
Hi @johnny.moody ,
Bummer! The contName
field is useless in v4.2.
So. Back to the drawing board. Again, I don't have any VMs on my 4.2 system, so I can't test, but carrying on from before, how about trying this - replacing the Tenant, AP and EPG names with yours
admin@apic1:~> icurl -s 'http://localhost/api/node/mo/uni/tn-YourTenant/ap-YourAppProfile/epg-YourEPG.json?query-target=children&target-subtree-class=fvCEp&rsp-subtree=full&rsp-subtree-class=fvIp,fvRsToVm,fvRsVm,fvRsHyper,fvRsCEpToPathEp,fvPrimaryEncap' | jq .imdata[]
and see if you can find the VM names in amongst that. If you can, be sure to come back and let me know which field reveals the VM name.
And if that doesn't work, try this variation (which I gleaned from the API inspector in v4.2 - the version above is from 5.2(7f))
admin@apic1:~> icurl -s 'http://localhost/api/node/mo/uni/tn-YourTenant/ap-YourAppProfile/epg-YourEPG.json?query-target=children&target-subtree-class=fvCEp&rsp-subtree=children&rsp-subtree-class=fvRsToVm,fvRsVm,fvRsHyper,fvRsCEpToPathEp,fvIp,fvPrimaryEncap' | jq .imdata[]
I think the only difference between the two is that one specifies rsp-subtree=full and the other rsp-subtree=children
Discover and save your favorite ideas. Come back to expert answers, step-by-step guides, recent topics, and more.
New here? Get started with these tips. How to use Community New member guide