Suppose you have a deployed node and you want to change one of its images in instance_info - kernel, ramdisk, image_source; or you may want to change the driver from pxe_ipmitool to agent_ipmitool and because of that you have to change deploy_kernel and deploy_ramdisk in driver_info.
After changing it in node's instance_info or driver_info in conductor log it can be seen that new images are downloaded to image cache, but files in /opt/stack/data/ironic/tftpboot/<node-uuid>/ or /var/lib/ironic/images/<node-uuid> are still hard linked to old values.
Suppose you have a deployed node and you want to change one of its images in instance_info - kernel, ramdisk, image_source; or you may want to change the driver from pxe_ipmitool to agent_ipmitool and because of that you have to change deploy_kernel and deploy_ramdisk in driver_info.
After changing it in node's instance_info or driver_info in conductor log it can be seen that new images are downloaded to image cache, but files in /opt/stack/ data/ironic/ tftpboot/ <node-uuid> / or /var/lib/ ironic/ images/ <node-uuid> are still hard linked to old values.
It happens because of this part of code: https:/ /github. com/openstack/ ironic/ blob/master/ ironic/ drivers/ modules/ image_cache. py#L153- L160 , where OSErrors are just ignored if they happen when hard link is created. OSError appears if you try to do e.g. os.link('aaa', 'bbb') and file 'bbb' already exists.