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
Here's the bug:
>>> startd_ad = htcondor.Collector().directQuery(htcondor.DaemonTypes.Startd, name='slot2@xxxxxxxxxxxxxxxxxxxxx')
>>> startd_ad['Name'] # should return slot2@xxxxxxxxxxxxxxxxxxxxxxxx uh oh!
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
>>> for ad in startd_ads: print ad['Name']
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.