My boss may have found the solution. The example isc dhcp config is wrong for factory AP-515s. It might work for older APs, and APs already in campus mode, but not for 515s in factory mode. You have to have two matching stanzas, one for ArubaInstantAP and one for ArubaAP. The factory image sends option 60, vendor-class-identifier "ArubaInstantAP". Once it's converted to Campus mode, it sends "ArubaAP". Regardless of which one it sends, the dhcp server must reply with option 60 "ArubaAP". It must never respond with ArubaInstantAP. Then you have to put the controller IP address, and only the controller IP address, in "ip-address" 4 octet form, in option 43.
The first time the AP boots. It will send a dhcp discover with option 60 set to ArubaInstantAP, and come up as an Instant AP. There will be a bunch of console messages, then it will appear ready. You can connect to it on port 443, and see a "Welcome to Instant" login page. It will not be registered with the controller.
After about 10 minutes or so it will say "Received SIGTERM" on the console, and reboot. It won't announce this conversion, or say anything during it. You just have to wait and hope.
When it comes back up the second time, it will send a DHCP discover with option 60 set to "ArubaAP". Then it will issue normal boot messages and also say "uap conversion successful". Then it will reboot again. This boot only takes about a minute.
The third time, it will identify with "ArubaAP", boot, say "Rebooting after setting cert_cap=1. Need to open a secure channel(IPSEC)", and reboot. Again, this only takes about a minute.
The fourth time, it comes up as a Campus AP, and registers with the controller.
option serverip code 43 = ip-address;
class "vendor-class" {
match option vendor-class-identifier;
}
shared-network shn163 {
subnet 10.2.163.192 netmask 255.255.255.192 {
option subnet-mask 255.255.255.192;
option routers 10.2.163.193;
option broadcast-address 10.2.163.255;
subclass "vendor-class" "ArubaInstantAP" {
option vendor-class-identifier "ArubaAP";
option serverip 10.2.163.132;
}
subclass "vendor-class" "ArubaAP" {
option vendor-class-identifier "ArubaAP";
option serverip 10.2.163.132;
}
range 10.2.163.194 10.2.163.241;
}
subnet 128.175.163.192 netmask 255.255.255.192 {
option subnet-mask 255.255.255.192;
option routers 128.175.163.193;
option broadcast-address 128.175.163.255;
}
}