in api-server/tesazure/backends/batch/__init__.py [0:0]
def _worker_provision_start(id):
"""Provision requested batch cloud resources"""
def _updateProvisionStatus(provision_request, status):
"""Local helper to serialize the status into the provision_request and save"""
schema = batchbackendmodels.ProvisionStatusSchema()
provision_request.status_json = schema.dump(status).data
provision_request.save()
current_app.logger.info(f'Worker provisioning batch resources from request id {id}.')
# Get and validate request from the database
provision_tracker = tesmodels.ProvisionTracker.get_by_id(id)
schema = batchbackendmodels.ProvisionRequestSchema()
provision_request = schema.load(provision_tracker.request_json)
if len(provision_request.errors) > 0:
raise ValidationError(provision_request.errors)
provision_request = provision_request.data
if not provision_tracker or not provision_request:
# FIXME: Is there a special not found exception?
raise Exception('Provision request could not be found')
# Set initial status
provision_status = batchbackendmodels.ProvisionStatus()
provision_status.status = batchbackendmodels.Status.INPROGRESS
_updateProvisionStatus(provision_tracker, provision_status)
credentials = azcredentials.ServicePrincipalCredentials(
client_id=provision_request.service_principal.client_id,
secret=provision_request.service_principal.secret,
tenant=provision_request.service_principal.tenant
)
# FIXME - move this stuff out of backend or into common
from tesazure.extensions import compute_backend
try:
current_app.logger.debug(f"Creating or updating resource group {provision_request.resource_group} in {provision_request.location}...")
compute_backend.backend._create_resource_group(credentials, provision_request.subscription_id, provision_request.resource_group, provision_request.location)
current_app.logger.debug(f"Creating storage account {provision_request.storage_account_name} with SKU {provision_request.storage_sku} in {provision_request.location}...")
storage_id, provision_status.storage_account_name, provision_status.storage_account_key = \
compute_backend.backend._create_storage_account(credentials, provision_request.subscription_id, provision_request.resource_group,
provision_request.storage_account_name, provision_request.storage_sku, provision_request.location)
current_app.logger.debug(f"Creating batch account {provision_request.batch_account_name} in {provision_request.location}...")
provision_status.batch_account_name, provision_status.batch_account_url, provision_status.batch_account_key = \
compute_backend.backend._create_batch_account(credentials, provision_request.subscription_id, provision_request.resource_group,
provision_request.batch_account_name, provision_request.location, storage_id)
compute_backend.backend._try_add_keyvault_config(provision_status)
provision_status.status = batchbackendmodels.Status.CREATED
except Exception as err:
current_app.logger.error("Error during batch provisioning process", err)
provision_status.status = batchbackendmodels.Status.ERROR
provision_status.error_message = f'Error during batch provisioning process. Error: {err}'
return
finally:
_updateProvisionStatus(provision_tracker, provision_status)