in src/lambdas/custodian_api_handler/handlers/job_handler.py [0:0]
def post_k8s(self, event: K8sJobPostModel, _tap: TenantsAccessPayload):
platform = self._platform_service.get_nullable(
hash_key=event.platform_id)
if not platform or (
event.customer and platform.customer != event.customer):
return build_response(
code=HTTPStatus.NOT_FOUND,
content=f'Active platform: {event.platform_id} not found'
)
tenant = self._obtain_tenant(platform.tenant_name, _tap,
event.customer)
if not self._environment_service.allow_simultaneous_jobs_for_one_tenant():
lock = TenantSettingJobLock(tenant.name)
if job_id := lock.locked_for({platform.platform_id}):
return build_response(
code=HTTPStatus.FORBIDDEN,
content=f'Job {job_id} is already running '
f'for tenant {tenant.name}'
)
standard_rulesets, lic, licensed_rulesets = self._get_rulesets_for_scan(
tenant=tenant,
domain=RuleDomain.KUBERNETES,
license_key=event.license_key,
ruleset_names=set(event.iter_rulesets())
)
credentials_key = None # TODO K8S validate whether long-lived token exists, validate whether it belongs to a cluster?
if event.token:
_LOG.debug('Temp token was provided. Saving to ssm')
credentials_key = self._ssm.prepare_name(tenant.name)
self._ssm.create_secret(
secret_name=credentials_key,
secret_value=event.token,
ttl=1800 # should be enough for on-prem
)
ttl_days = self._environment_service.jobs_time_to_live_days()
ttl = None
if ttl_days:
ttl = timedelta(days=ttl_days)
job = self._job_service.create(
customer_name=tenant.customer_name,
tenant_name=tenant.name,
regions=[],
rulesets=self._serialize_rulesets(standard_rulesets, lic, licensed_rulesets),
ttl=ttl,
platform_id=platform.id,
affected_license=lic.license_key if lic else None
)
self._job_service.save(job)
envs = self._assemble_service.build_job_envs(
tenant=tenant,
job_id=job.id,
platform_id=platform.id,
credentials_key=credentials_key,
job_lifetime_minutes=event.timeout_minutes,
affected_licenses=lic.tenant_license_key(tenant.customer_name) if lic else None
)
bid = self._submit_job_to_batch(tenant=tenant, job=job, envs=envs)
self._job_service.update(job, bid)
TenantSettingJobLock(tenant.name).acquire(job.id,
{platform.platform_id})
return build_response(
code=HTTPStatus.CREATED,
content=self._job_service.dto(job)
)