in community/front-end/ofe/website/ghpcfe/views/jobs.py [0:0]
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.user = self.request.user
# Can't trust client side input for these... (bad user, no cookie)
# self.object.node_price = self.request.POST.get('node_price')
# self.object.job_cost = self.request.POST.get('job_cost')
cluster = self.object.cluster
instance_type = self.object.partition.machine_type
try:
node_price_float = cloud_info.get_instance_pricing(
"GCP",
cluster.cloud_credential.detail,
cluster.cloud_region,
cluster.cloud_zone,
instance_type,
)
self.object.node_price = Decimal(node_price_float)
logger.debug(
"Got api price %0.2f for %s in %s-%s",
self.object.node_price,
instance_type,
cluster.cloud_region,
cluster.cloud_zone,
)
except Exception as err: # pylint: disable=broad-except
form.add_error(
None,
f"Error: Pricing API unavailable - please retry later ({err})",
)
return self.form_invalid(form)
self.object.job_cost = (
self.object.node_price
* self.object.number_of_nodes
* self.object.wall_clock_time_limit
/ Decimal(60)
)
if self.object.user.quota_type == "d":
form.add_error(
None, "Error: Cannot submit job. User quota disabled"
)
return self.form_invalid(form)
if self.object.user.quota_type == "l":
quota_remaining = (
self.object.user.quota_amount - self.object.user.total_spend()
)
# Fudge to nearest cent to avoid "apparently equal" issues in user
# display
if self.object.job_cost > (quota_remaining - Decimal(0.005)):
form.add_error(
None,
"Error: Insufficient quota remaining (have "
f"${quota_remaining:0.2f}, job would require "
f"${self.object.job_cost:0.2f})",
)
return self.form_invalid(form)
self.object.save()
return HttpResponseRedirect(self.get_success_url())