Пример #1
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()
         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)
Пример #2
0
 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()
Пример #3
0
 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()
Пример #4
0
 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)
Пример #5
0
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)
Пример #6
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)
Пример #7
0
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)
Пример #8
0
 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)