I was talking with Todd, I think we both confused a few things here and possibly exposed a bug.
1. The directQuery() method takes a daemon type argument, not ad type, e.g. htcondor.DaemonTypes.Startd
2. htcondor.Collector().directQuery() will only return the ClassAd for slot1@<startd_host>:
>>> startd_ad = htcondor.Collector().directQuery(htcondor.DaemonTypes.Startd) # returns a single ClassAd
>>> startd_ad['TotalSlots'] # even though there are two slots
2L
>>> startd_ad['Name']
'slot1@xxxxxxxxxxxxxxxxxxxxx'
Here's the bug:
>>> startd_ad = htcondor.Collector().directQuery(htcondor.DaemonTypes.Startd, name='slot2@xxxxxxxxxxxxxxxxxxxxx')
>>> startd_ad['Name'] # should return slot2@xxxxxxxxxxxxxxxxxxxxxxxx uh oh!
'slot1@xxxxxxxxxxxxxxxxxxxxx'
3. There's one unique address to the Startd, which is passed when constructing the Collector() object, and you can use that object to query all the Startd ads:
>>> startd_addr = startd_ad['MyAddress'] # get the address in whatever manner you like
>>> startd = htcondor.Collector(startd_addr)
>>> startd_ads = startd.query(htcondor.AdTypes.Startd)
>>> len(startd_ads) # should get ads for both slots
2
>>> for ad in startd_ads: print ad['Name']
...
slot1@xxxxxxxxxxxxxxxxxxxxx
slot2@xxxxxxxxxxxxxxxxxxxxx
htcondor.Collector.directQuery *should* work just condor_status -direct, but clearly it doesn't at this point. We may look to open a ticket about this.
In the meantime, if you want to get info on more than just slot1, use the "fake" Collector object constructed with the Startd address.
Jason Patton