Exemplo n.º 1
0
def synchronize_slurm_package(sender, instance, created=False, **kwargs):
    plan = instance.plan

    if not created and not set(
            instance.tracker.changed()) & {'amount', 'price'}:
        return

    if plan.offering.type != PLUGIN_NAME:
        return

    if not isinstance(plan.offering.scope, structure_models.ServiceSettings):
        logger.warning(
            'Skipping plan synchronization because offering scope is not service settings. '
            'Plan ID: %s',
            plan.id,
        )
        return

    if plan.offering.scope.type != SlurmConfig.service_name:
        logger.warning(
            'Skipping plan synchronization because service settings type is not SLURM. '
            'Plan ID: %s',
            plan.id,
        )
        return

    expected_types = set(manager.get_component_types(PLUGIN_NAME))
    actual_types = set(
        plan.components.values_list('component__type', flat=True))
    if expected_types != actual_types:
        return

    prices = {
        component.component.type: component.price
        for component in plan.components.all()
    }

    if created:
        with transaction.atomic():
            slurm_package, _ = slurm_invoices_models.SlurmPackage.objects.get_or_create(
                service_settings=plan.offering.scope,
                defaults=dict(
                    name=plan.name,
                    product_code=plan.product_code,
                    article_code=plan.article_code,
                    cpu_price=prices.get('cpu'),
                    gpu_price=prices.get('gpu'),
                    ram_price=prices.get('ram'),
                ),
            )
            plan.scope = slurm_package
            plan.save()
    elif plan.scope:
        plan.scope.cpu_price = prices.get('cpu')
        plan.scope.gpu_price = prices.get('gpu')
        plan.scope.ram_price = prices.get('ram')
        plan.scope.save(update_fields=['cpu_price', 'gpu_price', 'ram_price'])
Exemplo n.º 2
0
    def get_post_data(self):
        if not self.order_item.limits:
            raise serializers.ValidationError('Quota are not defined.')

        payload = super(CreateAllocationProcessor, self).get_post_data()

        for component_type in manager.get_component_types(PLUGIN_NAME):
            try:
                limit = self.order_item.limits[component_type]
            except KeyError:
                raise serializers.ValidationError(
                    '%s component quota is not defined' % component_type)
            else:
                payload[component_type + '_limit'] = limit
        return payload
Exemplo n.º 3
0
def get_post_data(order_item):
    try:
        service_settings = order_item.offering.scope
    except ObjectDoesNotExist:
        service_settings = None

    if not isinstance(service_settings, structure_models.ServiceSettings):
        raise serializers.ValidationError(
            'Offering has invalid scope. Service settings is expected.')

    if service_settings.type != SlurmConfig.service_name:
        raise serializers.ValidationError('Offering has invalid scope type.')

    project = order_item.order.project

    try:
        spl = slurm_models.SlurmServiceProjectLink.objects.get(
            project=project,
            service__settings=service_settings,
            service__customer=project.customer,
        )
    except slurm_models.SlurmServiceProjectLink.DoesNotExist:
        raise serializers.ValidationError(
            'Project does not have access to the SLURM service.')

    spl_url = reverse('slurm-spl-detail', kwargs={'pk': spl.pk})
    payload = dict(
        name=order_item.offering.name,
        service_project_link=spl_url,
    )

    if not order_item.limits:
        raise serializers.ValidationError('Quota are not defined.')

    for component_type in manager.get_component_types(PLUGIN_NAME):
        try:
            limit = order_item.limits[component_type]
        except KeyError:
            raise serializers.ValidationError(
                '%s component quota is not defined' % component_type)
        else:
            payload[component_type + '_limit'] = limit
    return payload
Exemplo n.º 4
0
    def get_post_data(self):
        if not self.order_item.limits:
            raise serializers.ValidationError('Quota are not defined.')

        spl_url = processors.get_spl_url(slurm_models.SlurmServiceProjectLink,
                                         self.order_item)
        payload = dict(
            name=self.order_item.offering.name,
            service_project_link=spl_url,
        )

        for component_type in manager.get_component_types(PLUGIN_NAME):
            try:
                limit = self.order_item.limits[component_type]
            except KeyError:
                raise serializers.ValidationError(
                    '%s component quota is not defined' % component_type)
            else:
                payload[component_type + '_limit'] = limit
        return payload