1

我正在尝试修补一个工头错误,在该错误中他们不会在构建后禁用网络启动,并在您想要重建主机时将其重新打开。看起来我只需要在“内置”方法中添加一些代码:

./app/controllers/unattended_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.rbmodify_vm_cdrom.rb的第 79 行借用灵感,我想出了一些类似的东西:

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似乎不想加载?

4

2 回答 2

1
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
于 2016-06-16T09:31:41.670 回答
0

我认为您的问题是由不正确的常量名称引起的。你试过这样的事情吗?

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 自动加载是一种动态创建模块,因为有 name 目录compute_resources

于 2016-06-15T23:32:24.487 回答