Having said all that, the fault interface, like instance actions, are not a very solid interface, meaning they don't really get audited, so I wouldn't be surprised if non-500 faults could be exposed to non-admin users depending on the exception that gets raised and logged. In this case it's a libvirtError that results in some generic NovaException so that's why it's a 500 code. For example, any nova exception class that extends nova.exception.Invalid would have a code of 400 and those could potentially leak out I suppose.
Having said all that, the fault interface, like instance actions, are not a very solid interface, meaning they don't really get audited, so I wouldn't be surprised if non-500 faults could be exposed to non-admin users depending on the exception that gets raised and logged. In this case it's a libvirtError that results in some generic NovaException so that's why it's a 500 code. For example, any nova exception class that extends nova.exception. Invalid would have a code of 400 and those could potentially leak out I suppose.