def post(self, *args, **kwargs): if not self.request.user.get_profile().has_perm( Perm.edit_device_info_financial): raise HttpResponseForbidden( "You have no permission to edit catalog") if 'move' in self.request.POST: items = self.request.POST.getlist('items') if not items: messages.error(self.request, "Nothing to move.") return HttpResponseRedirect(self.request.path) target_id = self.request.POST.get('target', '') if target_id == 'none': target = None elif target_id == 'new': item = get_object_or_404(ComponentModel, id=items[0]) target = ComponentModelGroup(name=item.name, type=item.type) target.save() else: target = get_object_or_404(ComponentModelGroup, id=target_id) for item in items: model = get_object_or_404(ComponentModel, id=item) model.group = target model.save() self.update_cached(target) messages.success(self.request, "Items moved.") return HttpResponseRedirect(self.request.path) elif 'delete' in self.request.POST: try: self.group_id = int(self.kwargs.get('group', '')) except ValueError: messages.error(self.request, "No such group.") else: self.group = get_object_or_404(ComponentModelGroup, id=self.group_id) self.group.price = 0 self.group.save() self.update_cached(self.group) self.group.delete() messages.warning(self.request, "Group '%s' deleted." % self.group.name) return HttpResponseRedirect(self.request.path+'..') else: try: self.group_id = int(self.kwargs.get('group', '')) except ValueError: self.group_id = None self.group = None else: self.group = get_object_or_404(ComponentModelGroup, id=self.group_id) self.form = ComponentModelGroupForm(self.request.POST, instance=self.group) if self.form.is_valid(): self.form.save() self.update_cached(self.group) messages.success(self.request, "Changes saved.") return HttpResponseRedirect(self.request.path) else: messages.error(self.request, "Correct the errors.") return self.get(*args, **kwargs)
def setUp(self): # fake settings needed to run plugin, even with mocked library. settings.OPENSTACK_URL = '/' settings.OPENSTACK_USER = '******' settings.OPENSTACK_PASSWORD = '******' # model group for sample costs calculations. self.cmg = ComponentModelGroup() self.cmg.price = 100.0 self.cmg.per_size = 1 self.cmg.size_modifier = 1 self.cmg.save() self.mk = MarginKind() self.mk.margin = 200 self.mk.remarks = 'Margin kind 200%' self.mk.save()
def test_disk_share(self): storage_dev = Device.create( sn='device', model_type=DeviceType.storage, model_name='storage device', ) storage_dev.save() share_group = ComponentModelGroup( price=1, type=ComponentType.share, per_size=False, size_unit='', size_modifier=1, ) share_group.save() share_model = ComponentModel( speed=0, cores=0, size=7, type=ComponentType.share, group=share_group, family='', ) share_model.save() disk_share = DiskShare( device=storage_dev, model=share_model, share_id=1, label="share", size=7, snapshot_size=5, wwn='123456789012345678901234567890123', full=True, ) disk_share.save() share_mount = DiskShareMount( share=disk_share, device=storage_dev, size=17, ) share_mount.save() today = date.today() this_month = date(year=today.year, month=today.month, day=1) pricing_group = PricingGroup( name='group', date=this_month, ) pricing_group.save() pricing_group.devices.add(storage_dev) pricing_group.save() pricing_formula = PricingFormula( group=pricing_group, component_group=share_group, formula='3+size+11*variable', ) pricing_formula.save() pricing_variable = PricingVariable( name='variable', group=pricing_group, aggregate=PricingAggregate.sum, ) pricing_variable.save() pricing_value = PricingValue( device=storage_dev, variable=pricing_variable, value=13, ) pricing_value.save() variable_value = pricing_variable.get_value() self.assertEqual(variable_value, 13) formula_value = pricing_formula.get_value(size=7) self.assertEqual(formula_value, 3 + 7 + 11 * 13) share_price = disk_share.get_price() self.assertEqual(share_price, 3 + (7.0 + 5.0) / 1024 + 11 * 13) mount_price = share_mount.get_price() self.assertEqual(mount_price, 3 + 17.0 / 1024 + 11 * 13)
class OpenStackPluginTest(TestCase): """ OpenStack costs Test Case """ def setUp(self): # fake settings needed to run plugin, even with mocked library. settings.OPENSTACK_URL = '/' settings.OPENSTACK_USER = '******' settings.OPENSTACK_PASSWORD = '******' # model group for sample costs calculations. self.cmg = ComponentModelGroup() self.cmg.price = 100.0 self.cmg.per_size = 1 self.cmg.size_modifier = 1 self.cmg.save() self.mk = MarginKind() self.mk.margin = 200 self.mk.remarks = 'Margin kind 200%' self.mk.save() def test_plugin(self): """ Black box for openstack plugin """ with mock.patch('ralph.discovery.plugins.openstack.OpenStack') as OpenStack: OpenStack.side_effect = MockOpenStack openstack_runner() # testdata has 47 entries. self.assertEqual(47, HistoryCost.objects.count()) # if no group assigned, daily cost = 0 for all historycost self.assertEqual(0, sum([x.daily_cost for x in HistoryCost.objects.all()])) # if we assign them to the group ... for x in ComponentModel.objects.all(): x.group=self.cmg x.save() # and run again openstack runner openstack_runner() # data couns will be the same (data overwritten) self.assertEqual(47, HistoryCost.objects.count()) # costs will be calculated as below. self.assertEqual(31733606.18055556, sum([x.daily_cost for x in HistoryCost.objects.all()])) # now test with marginkind for x in Device.objects.filter(model__name='OpenStack Tenant'): x.margin_kind = self.mk x.save() openstack_runner() # margin kind = 200% = multiplies costs 3 times. self.assertEqual(31733606.18055556*3, sum([x.daily_cost for x in HistoryCost.objects.all()])) def test_make_tenant(self): """ Detailed test for make_tenant plugin sub-function """ tenant_params = dict( tenant_id='3ff63bf0e1384a1d87b6eaba8dad1196', total_volume_gb_usage=1, total_memory_mb_usage=1024, total_local_gb_usage=1, total_hours=1, total_vcpus_usage=1, tenant_fake=999, ) with mock.patch('ralph.discovery.plugins.openstack.OpenStack') as OpenStack: OpenStack.side_effect = MockOpenStack result = make_tenant(tenant_params) # no componentModel assigned to the group. Cost will be 0 self.assertEqual(result[1], 0) d=Device.objects.get(model__name='OpenStack Tenant') self.assertEqual(d.model.get_type_display(), 'cloud server') self.assertEqual(d.sn, 'openstack-3ff63bf0e1384a1d87b6eaba8dad1196') # only recognized component models auto-created. self.assertEqual(set([ u'OpenStack 10000 Memory GiB Hours', u'OpenStack 10000 CPU Hours', u'OpenStack 10000 Disk GiB Hours', u'OpenStack 10000 Volume GiB Hours']), set([x.name for x in ComponentModel.objects.all()])) # only recognized components auto-created. self.assertEqual(set([ u'OpenStack 10000 Memory GiB Hours', u'OpenStack 10000 CPU Hours', u'OpenStack 10000 Disk GiB Hours', u'OpenStack 10000 Volume GiB Hours']), set([x.model.name for x in GenericComponent.objects.all()])) # and every component is binded to open stack tenant device for x in GenericComponent.objects.all(): self.assertEqual(x.device.model.name, 'OpenStack Tenant') # if we assign 2 component model items into the specified group than... for i in ComponentModel.objects.all()[0:2]: i.group=self.cmg i.save() # then the costs of half components appears when reimporting tenant. \ # Rest of components are unassigned to the group, so not counted result = make_tenant(tenant_params) self.assertEqual(result[1], 200.0)
def post(self, *args, **kwargs): if not self.request.user.get_profile().has_perm( Perm.edit_device_info_financial): raise HttpResponseForbidden( "You have no permission to edit catalog") if 'move' in self.request.POST: items = self.request.POST.getlist('items') if not items: messages.error(self.request, "Nothing to move.") return HttpResponseRedirect(self.request.path) target_id = self.request.POST.get('target', '') if target_id == 'none': target = None elif target_id == 'new': item = get_object_or_404(ComponentModel, id=items[0]) target = ComponentModelGroup(name=item.name, type=item.type) target.save(user=self.request.user) else: target = get_object_or_404(ComponentModelGroup, id=target_id) for item in items: model = get_object_or_404(ComponentModel, id=item) model.group = target model.save(user=self.request.user) self.update_cached(target) messages.success(self.request, "Items moved.") return HttpResponseRedirect(self.request.path) elif 'delete' in self.request.POST: try: self.group_id = int(self.kwargs.get('group', '')) except ValueError: messages.error(self.request, "No such group.") else: self.group = get_object_or_404(ComponentModelGroup, id=self.group_id) self.group.price = 0 self.group.save(user=self.request.user) self.update_cached(self.group) self.group.delete() messages.warning(self.request, "Group '%s' deleted." % self.group.name) return HttpResponseRedirect(self.request.path+'..') else: try: self.group_id = int(self.kwargs.get('group', '')) except ValueError: self.group_id = None self.group = None else: self.group = get_object_or_404(ComponentModelGroup, id=self.group_id) self.form = ComponentModelGroupForm(self.request.POST, instance=self.group) if self.form.is_valid(): self.form.save(commit=False) self.form.instance.save(user=self.request.user) self.update_cached(self.group) messages.success(self.request, "Changes saved.") return HttpResponseRedirect(self.request.path) else: messages.error(self.request, "Correct the errors.") return self.get(*args, **kwargs)
class OpenStackPluginTest(TestCase): """ OpenStack costs Test Case """ def setUp(self): # fake settings needed to run plugin, even with mocked library. settings.OPENSTACK_URL = '/' settings.OPENSTACK_USER = '******' settings.OPENSTACK_PASSWORD = '******' # model group for sample costs calculations. self.cmg = ComponentModelGroup() self.cmg.price = 100.0 self.cmg.per_size = 1 self.cmg.size_modifier = 1 self.cmg.save() self.mk = MarginKind() self.mk.margin = 200 self.mk.remarks = 'Margin kind 200%' self.mk.save() def test_plugin(self): """ Black box for openstack plugin """ with mock.patch( 'ralph.discovery.plugins.openstack.OpenStack') as OpenStack: OpenStack.side_effect = MockOpenStack openstack_runner() # testdata has 47 entries. self.assertEqual(47, HistoryCost.objects.count()) # if no group assigned, daily cost = 0 for all historycost self.assertEqual( 0, sum([x.daily_cost for x in HistoryCost.objects.all()])) # if we assign them to the group ... for x in ComponentModel.objects.all(): x.group = self.cmg x.save() # and run again openstack runner openstack_runner() # data couns will be the same (data overwritten) self.assertEqual(47, HistoryCost.objects.count()) # costs will be calculated as below. self.assertEqual( 31733606.18055556, sum([x.daily_cost for x in HistoryCost.objects.all()])) # now test with marginkind for x in Device.objects.filter(model__name='OpenStack Tenant'): x.margin_kind = self.mk x.save() openstack_runner() # margin kind = 200% = multiplies costs 3 times. self.assertEqual( 31733606.18055556 * 3, sum([x.daily_cost for x in HistoryCost.objects.all()])) def test_make_tenant(self): """ Detailed test for make_tenant plugin sub-function """ tenant_params = dict( tenant_id='3ff63bf0e1384a1d87b6eaba8dad1196', total_volume_gb_usage=1, total_memory_mb_usage=1024, total_local_gb_usage=1, total_hours=1, total_vcpus_usage=1, tenant_fake=999, ) with mock.patch( 'ralph.discovery.plugins.openstack.OpenStack') as OpenStack: OpenStack.side_effect = MockOpenStack result = make_tenant(tenant_params) # no componentModel assigned to the group. Cost will be 0 self.assertEqual(result[1], 0) d = Device.objects.get(model__name='OpenStack Tenant') self.assertEqual(d.model.get_type_display(), 'cloud server') self.assertEqual(d.sn, 'openstack-3ff63bf0e1384a1d87b6eaba8dad1196') # only recognized component models auto-created. self.assertEqual( set([ u'OpenStack 10000 Memory GiB Hours', u'OpenStack 10000 CPU Hours', u'OpenStack 10000 Disk GiB Hours', u'OpenStack 10000 Volume GiB Hours' ]), set([x.name for x in ComponentModel.objects.all()])) # only recognized components auto-created. self.assertEqual( set([ u'OpenStack 10000 Memory GiB Hours', u'OpenStack 10000 CPU Hours', u'OpenStack 10000 Disk GiB Hours', u'OpenStack 10000 Volume GiB Hours' ]), set([x.model.name for x in GenericComponent.objects.all()])) # and every component is binded to open stack tenant device for x in GenericComponent.objects.all(): self.assertEqual(x.device.model.name, 'OpenStack Tenant') # if we assign 2 component model items into the specified group than... for i in ComponentModel.objects.all()[0:2]: i.group = self.cmg i.save() # then the costs of half components appears when reimporting tenant. \ # Rest of components are unassigned to the group, so not counted result = make_tenant(tenant_params) self.assertEqual(result[1], 200.0)