我正在尝试修补一个foreman错误,在这个错误中,他们不会在构建后禁用网络引导,并在您想要重建主机时重新打开它。看起来我只需要在中的"构建"方法中添加一些代码
/app/controllers/unattend_controller.rb
def built
logger.info "#{controller_name}: #{@host.name} is Built!"
update_ip if Setting[:update_ip_from_built_request]
head(@host.built ? :created : :conflict)
end
以及中的"setBuild"方法
/app/models/host/managed.rb
def setBuild
self.build = true
self.save
errors.empty?
end
借用foreman_bootdisk.rb的第79行和modify_vm_cdrom.rb的灵感,我想出了一些类似于的东西
def setBuild
load '/usr/share/foreman/app/models/compute_resources/foreman/model/vmware.rb'
if ComputeResources::Foreman::Model::Vmware.available?
vm_reconfig_hardware('instance_uuid' => params[:token], 'hardware_spec' => {'bootOptions'=>['network', 'disk']})
end
self.build = true
self.save
errors.empty?
end
问题是我得到了错误,
很抱歉,出现问题。在自动加载常量ComputeResources::Foreman::Model::Vmware 时检测到循环依赖关系
我已经对此进行了一些阅读,并听说问题可能与rail的自动加载有关,但我曾尝试使用load和require来解决此问题(我试图避免使用我听说不推荐使用的自动加载功能),但尽管两者都尝试过,我仍然会出现此错误,我不确定原因。我在做什么不同于foreman_bootdisk.rb的编码器,以得到这个错误,他们不是?vmware.rb似乎不想加载什么?
def setBuild
vm_reconfig_hardware(
'instance_uuid' => params[:token],
'hardware_spec' => {'bootOptions'=>['network', 'disk']}
) if Fog::Compute.providers.include?(:vsphere)
self.build = true
self.save
errors.empty?
end
我认为您的问题是由不正确的常量名称引起的。你试过这样的东西吗?
def setBuild
if Foreman::Model::Vmware.available?
vm_reconfig_hardware('instance_uuid' => params[:token], 'hardware_spec' => {'bootOptions'=>['network', 'disk']})
end
self.build = true
self.save
errors.empty?
end
在Foreman源代码中没有常量ComputeResources(末尾有s),但当您尝试在rails控制台中使用它时,它会起作用。这是因为rails自动加载是一种动态创建模块,因为有一个名为compute_resources
的目录。