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'])
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
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
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