예제 #1
0
from django.views.decorators.cache import never_cache

from share.manager.region_provier import RegionProviderManager
from www.decorator import perm_required
from www.models import ServiceGroupRelation, ServiceEvent
from www.monitorservice.monitorhook import MonitorHook
from www.service_http import RegionServiceApi
from www.tenantservice.baseservice import CodeRepositoriesService
from www.utils.crypt import make_uuid
from www.views import AuthedView
from www.views.mixin import LeftSideBarMixin

logger = logging.getLogger('default')

monitorhook = MonitorHook()
rpmManager = RegionProviderManager()
codeRepositoriesService = CodeRepositoriesService()


class BasicInfoEditView(LeftSideBarMixin, AuthedView):
    @never_cache
    @perm_required("manage_service")
    def post(self, request, *args, **kwargs):
        service_name = request.POST.get("service_name", None)
        group_id = request.POST.get("group_id", None)
        git_url = request.POST.get("git_url", None)
        logger.debug(
            "update service info: new service name {0},group_id {1},git_url {2}"
            .format(service_name, group_id, git_url))
        result = {}
        service_id = self.service.service_id
class RegionResourceSettleView(ShareBaseView):
    region_provider_manager = RegionProviderManager()

    def get(self, request, *args, **kwargs):
        querymonth = request.GET.get("date", None)
        if querymonth:
            month_date = dt.strptime(querymonth, "%Y-%m")
        else:
            now = dt.now()
            month_date = dt(now.year, now.month, 1, 0, 0,
                            0) - clzdt.timedelta(days=1)
        querymonth = month_date.strftime("%Y-%m")

        start_date = dt(month_date.year, month_date.month, 1, 0, 0, 0)
        last_day = calendar.monthrange(month_date.year, month_date.month)[1]
        end_date = dt(month_date.year, month_date.month, last_day, 0, 0,
                      0) + clzdt.timedelta(days=1)
        logger.info("query from {} to {}".format(start_date, end_date))

        provider = self.provider.provider_name
        provider_settle_list = list(
            RegionResourceProviderSettle.objects.filter(provider=provider,
                                                        date=querymonth))

        region_settle_list = []
        for provider_settle in provider_settle_list:
            total_memory = provider_settle.used_memory + provider_settle.package_memory
            total_net = provider_settle.used_net + provider_settle.package_net
            total_disk = provider_settle.used_disk + provider_settle.package_disk

            total_resource_fee = self.cal_region_resource_fee(
                provider_settle.region, total_memory, total_disk, total_net)
            total_package_fee = self.cal_region_pacakge_fee(
                provider_settle.region, start_date, end_date)

            total_fee = total_resource_fee + total_package_fee

            partner_rate = Decimal(0.5)
            settle_fee = total_fee * partner_rate

            region_settle = dict()
            region_settle["region"] = provider_settle.region
            region_settle["total_memory"] = total_memory / 1024
            region_settle["total_net"] = total_net / 1024
            region_settle["total_disk"] = total_disk / 1024
            region_settle["total_resource_fee"] = total_resource_fee.quantize(
                Decimal('0.00'))
            region_settle["total_package_fee"] = total_package_fee.quantize(
                Decimal('0.00'))
            region_settle["total_fee"] = total_fee.quantize(Decimal('0.00'))
            region_settle["partner_rate"] = partner_rate
            region_settle["settle_fee"] = settle_fee.quantize(Decimal('0.00'))
            region_settle_list.append(region_settle)

        context = self.get_context()
        context.update({
            "region_settle_list": region_settle_list,
            "query_month": querymonth,
        })
        return TemplateResponse(request, "share/region_resource_settle.html",
                                context)

    def cal_region_resource_fee(self, region_name, memroy, disk, net):
        total_fee = Decimal(0)
        try:
            region_sales_price = self.region_provider_manager.get_work_region_by_name(
                region_name)
            memory_fee = region_sales_price.memory_price * Decimal.from_float(
                memroy / 1024.0)
            disk_fee = region_sales_price.disk_price * Decimal.from_float(
                disk / 1024.0)
            net_fee = region_sales_price.net_price * Decimal.from_float(
                net / 1024.0)

            total_fee = memory_fee + disk_fee + net_fee
        except Exception as e:
            logger.exception("", e)

        return total_fee

    def cal_region_pacakge_fee(self, region_name, static_start_date,
                               static_end_date):
        conn = MySQLConn()
        pay_model_data = conn.fetch_all("""
                    select  tenant_id, buy_start_time, buy_end_time, buy_money
                    from    tenant_region_pay_model
                    where   region_name = '{}'
                """.format(region_name))

        real_cost_money = 0.00
        for tenant_id, buy_start_time, buy_end_time, buy_money in pay_model_data:
            buy_start_date = buy_start_time
            buy_end_date = buy_end_time

            logger.info("{}: [{} - {}], cost:{}".format(
                tenant_id, buy_start_date, buy_end_date, buy_money))

            if buy_start_date >= static_end_date or buy_end_date <= static_start_date:
                continue

            single_price = float(
                str(buy_money)) / (buy_end_date - buy_start_date).days
            consume_days = 0
            if buy_end_date <= static_start_date or buy_start_date >= static_end_date:
                continue

            # 购买周期完全包含统计周期
            if buy_start_date <= static_start_date and buy_end_date >= static_end_date:
                consume_days = (static_end_date - static_start_date).days
            # 购买周期完全在统计周期之内, 则以天计算
            elif buy_start_date > static_start_date and buy_end_date < static_end_date:
                consume_days = (buy_end_date - buy_start_date).days
            elif buy_start_date <= static_start_date and buy_end_date < static_end_date:
                consume_days = (buy_end_date - static_start_date).days
            elif buy_start_date > static_start_date and buy_end_date >= static_end_date:
                consume_days = (static_end_date - buy_start_date).days
            package_cost = single_price * consume_days

            real_cost_money += package_cost
            logger.info("{} * {} = {}, total = {}".format(
                single_price, consume_days, package_cost, real_cost_money))

        return Decimal.from_float(real_cost_money)