validates :command, :container_image, :output_path, :cwd, :presence => true
validate :validate_state_change
validate :validate_change
+ validate :validate_runtime_constraints
after_save :update_priority
before_create :set_requesting_container_uuid
# Create a new container (or find an existing one) to satisfy this
# request.
def resolve
- # TODO: resolve container_image to a content address.
c_mounts = mounts_for_container
c_runtime_constraints = runtime_constraints_for_container
+ c_container_image = container_image_for_container
c = act_as_system_user do
Container.create!(command: self.command,
- container_image: self.container_image,
cwd: self.cwd,
environment: self.environment,
- mounts: c_mounts,
output_path: self.output_path,
+ container_image: c_container_image,
+ mounts: c_mounts,
runtime_constraints: c_runtime_constraints)
end
self.container_uuid = c.uuid
select(:portable_data_hash).
first
if !c
- raise ActiveRecord::RecordNotFound.new "cannot mount collection #{uuid.inspect}: not found"
+ raise ArvadosModel::UnresolvableContainerError.new "cannot mount collection #{uuid.inspect}: not found"
end
if mount['portable_data_hash'].nil?
# PDH not supplied by client
return c_mounts
end
+ # Return a container_image PDH suitable for a Container.
+ def container_image_for_container
+ coll = Collection.for_latest_docker_image(container_image)
+ if !coll
+ raise ArvadosModel::UnresolvableContainerError.new "docker image #{container_image.inspect} not found"
+ end
+ return coll.portable_data_hash
+ end
+
def set_container
if (container_uuid_changed? and
not current_user.andand.is_admin and
end
end
+ def validate_runtime_constraints
+ case self.state
+ when Committed
+ ['vcpus', 'ram'].each do |k|
+ if not (runtime_constraints.include? k and
+ runtime_constraints[k].is_a? Integer and
+ runtime_constraints[k] > 0)
+ errors.add :runtime_constraints, "#{k} must be a positive integer"
+ end
+ end
+ end
+ end
+
def validate_change
permitted = [:owner_uuid]