I did some test on port-update operation. I found that once a port is updated with a ip address not in any allocation pool then you can not change the port's ip address any more because the old ip address can not be recycled. Even worse, you can create new port because create port operation will trigge ip recycle operation. take the following step to reproduce.
1. create a new network
# neutron net-create test1
2. create a new subnet for that network
# neutron subnet-create 6d7a4316-4649-495f-bcd7-16fcd4c4df1d 192.168.1.0/24 --allocation-pool start=192.168.1.10,end=192.168.1.50
3. create a new port
# neutron port-create 6d7a4316-4649-495f-bcd7-16fcd4c4df1d
4. update ip address
# neutron port-update 7f0a65fb-060e-4c3e-a1ac-7d1535f5e42a --fixed-ips list=true type=dict ip_address=192.168.1.100
# neutron port-update 7f0a65fb-060e-4c3e-a1ac-7d1535f5e42a --fixed-ips list=true type=dict ip_address=192.168.1.200
5. wait for CONF.dhcp_lease_duration seconds (default value 120)
# neutron port-update 7f0a65fb-060e-4c3e-a1ac-7d1535f5e42a --fixed-ips list=true type=dict ip_address=192.168.1.100
Invalid input for operation: No allocation pool found for ip address:192.168.1.100.
6. create new port
# neutron port-create 6d7a4316-4649-495f-bcd7-16fcd4c4df1d
Invalid input for operation: No allocation pool found for ip address:192.168.1.100.
I have verified this bug. It is critical because in nova we support the customized IP beyond the pool. This bug will cause big problem.