def _worker_provision_start()

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)