{% extends "layout.html" %}
{% block head %}
    {{ super() }}

    <style type="text/css">

        @media (min-width: 768px) {
            .form-horizontal .control-label {
                text-align: left;
            }
        }
        
        label>span {
            color: deepskyblue;
        }

        .btn,
        .form-group>div>div,
        .form-control {
            border-radius: 0;
        }

        .table {
            font-size: 12px;
            border-width: 1px;
            line-height: 22px;
        }

        .table > tbody > tr > td {
            color: #424547;
        }

        .table-bordered > tbody > tr {
            padding-top: 10px;
            padding-bottom: 10px;
        }

        .table-bordered > thead > tr > th,
        .table-bordered > tbody > tr > th,
        .table-bordered > tfoot > tr > th,
        .table-bordered > thead > tr > td,
        .table-bordered > tbody > tr > td,
        .table-bordered > tfoot > tr > td {
            border-style: solid;
            border-width: 1px 0 0 0;
        }

        .guest-label {
            color: #999999;
        }

        .guest-desc {
            color: #333333;
        }

    </style>
{% endblock head %}
{% block body %}
<script>
    var resource_path = window.location.pathname;
    var resource_path_array = resource_path.split('/');
    var uuid = resource_path_array[resource_path_array.length - 1];

    var datetime_format_type = 'time';

    function format_time(timestamp, i) {
        if (datetime_format_type === 'time') {
            return new Date(timestamp).format('HH:MM');
        } else {
            return new Date(timestamp).format('mm-dd');
        }
    }

    function render_disk_throughput_chart(disk_uuid, granularity, dev_id, dev_name) {
        var url = '/api/performance/disk_io/last_hour/' + disk_uuid;
        if (granularity === 'hour') {
            url = '/api/performance/disk_io/last_hour/' + disk_uuid
        } else if (granularity === 'six_hours') {
            url = '/api/performance/disk_io/last_six_hours/' + disk_uuid
        } else if (granularity === 'day') {
            url = '/api/performance/disk_io/last_day/' + disk_uuid
        } else {
            url = '/api/performance/disk_io/last_seven_days/' + disk_uuid
        }

        $.ajax({
            url : url,
            type : 'GET',
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            error : function() {
                alter_danger('获取图表数据失败失败！');
            },
            success : function(data, textStatus, xhr) {

                if (data.data.length > 1) {
                    if ((data.data[data.data.length - 1]['timestamp'] - data.data[0]['timestamp']) >= 86400) {
                        datetime_format_type = 'date';
                    }
                }

                var option = {
                    color: ['#3BC0FF', '#FAB406'],
                    title: {
                        text: '磁盘吞吐量 - ' + dev_name
                    },
                    legend: {
                        data:['读(MBps)', '写(MBps)'],
                        bottom: 5
                    },
                    toolbox: {
                        feature: {
                            dataZoom: {
                                yAxisIndex: 'none'
                            },
                            magicType: {type: ['line', 'bar']},
                            saveAsImage: {
                                show: true,
                                pixelRatio: 4
                            }
                        }
                    },
                    tooltip: {
                        show: true,
                        trigger: 'axis',
                        formatter: (function (params, ticket, callback) {
                            var readSeriesName = params[0].seriesName;
                            var writeSeriesName = params[1].seriesName;
                            var read = params[0].data[1];
                            var write = params[1].data[1];
                            var readMarker = params[0].marker;
                            var writeMarker = params[1].marker;
                            var datetime = new Date(params[0].data[0]).format('yyyy-mm-dd HH:MM:ss');

                            if (read === null) {
                                read = '无数据';
                            }

                            if (write === null) {
                                write = '无数据';
                            }

                            return datetime + '<br />' + [readMarker, readSeriesName, read].join(' ') +
                                '<br />' + [writeMarker, writeSeriesName, write].join(' ')
                        })
                    },
                    xAxis: {
                        type: 'time',
                        axisTick: {
                            show: false
                        },
                        axisLine: {
                            lineStyle: {
                                opacity: 0.1,
                                color: '#3d4245'
                            }
                        },
                        splitLine: {
                            show: false
                        },
                        axisLabel: {
                            formatter: format_time
                        }
                    },
                    yAxis: {
                        min: 0,
                        max: 'dataMax',
                        minInterval: 2,
                        axisTick: {
                            show: false
                        },
                        axisLine: {
                            lineStyle: {
                                opacity: 0,
                                color: '#8c8f91'
                            }
                        },
                        splitLine: {
                            show: true,
                            lineStyle: {
                                width: 1,
                                opacity: 0.5
                            }
                        }
                    },
                    series: [{
                        name: '读(MBps)',
                        type: 'line',
                        showSymbol: false,
                        smooth: true,
                        lineStyle: {
                            normal: {
                                width: 1
                            }
                        },
                        data: (function () {
                            var d = [];
                            $.each(data.data, function(i, ele) {
                                d.push([
                                    ele['timestamp'] * 1000,
                                    ele['rd_bytes'] !== null ? Math.floor(ele['rd_bytes'] / 1024 / 1024 * 1000) / 1000 : null
                                ])
                            });
                            return d;
                        })()
                    },{
                        name: '写(MBps)',
                        type: 'line',
                        showSymbol: false,
                        smooth: true,
                        lineStyle: {
                            normal: {
                                width: 1
                            }
                        },
                        data: (function () {
                            var d = [];
                            $.each(data.data, function(i, ele) {
                                d.push([
                                    ele['timestamp'] * 1000,
                                    ele['wr_bytes'] !== null ? Math.floor(ele['wr_bytes'] / 1024 / 1024 * 1000) / 1000 : null
                                ])
                            });
                            return d;
                        })()
                    }]
                };

                var disk_chart = echarts.init(document.getElementById(dev_id));
                disk_chart.setOption(option);
            }
        });
    }

    function render_disk_iops_chart(disk_uuid, granularity, dev_id, dev_name) {
        var url = '/api/performance/disk_io/last_hour/' + disk_uuid;
        if (granularity === 'hour') {
            url = '/api/performance/disk_io/last_hour/' + disk_uuid
        } else if (granularity === 'six_hours') {
            url = '/api/performance/disk_io/last_six_hours/' + disk_uuid
        } else if (granularity === 'day') {
            url = '/api/performance/disk_io/last_day/' + disk_uuid
        } else {
            url = '/api/performance/disk_io/last_seven_days/' + disk_uuid
        }

        $.ajax({
            url : url,
            type : 'GET',
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            error : function() {
                alter_danger('获取图表数据失败失败！');
            },
            success : function(data, textStatus, xhr) {

                if (data.data.length > 1) {
                    if ((data.data[data.data.length - 1]['timestamp'] - data.data[0]['timestamp']) >= 86400) {
                        datetime_format_type = 'date';
                    }
                }

                var option = {
                    color: ['#3BC0FF', '#FAB406'],
                    title: {
                        text: '磁盘IOPS - ' + dev_name
                    },
                    legend: {
                        data:['读(IOPS)', '写(IOPS)'],
                        bottom: 5
                    },
                    toolbox: {
                        feature: {
                            dataZoom: {
                                yAxisIndex: 'none'
                            },
                            magicType: {type: ['line', 'bar']},
                            saveAsImage: {
                                show: true,
                                pixelRatio: 4
                            }
                        }
                    },
                    tooltip: {
                        show: true,
                        trigger: 'axis',
                        formatter: (function (params, ticket, callback) {
                            var readSeriesName = params[0].seriesName;
                            var writeSeriesName = params[1].seriesName;
                            var read = params[0].data[1];
                            var write = params[1].data[1];
                            var readMarker = params[0].marker;
                            var writeMarker = params[1].marker;
                            var datetime = new Date(params[0].data[0]).format('yyyy-mm-dd HH:MM:ss');

                            if (read === null) {
                                read = '无数据';
                            }

                            if (write === null) {
                                write = '无数据';
                            }

                            return datetime + '<br />' + [readMarker, readSeriesName, read].join(' ') +
                                '<br />' + [writeMarker, writeSeriesName, write].join(' ')
                        })
                    },
                    xAxis: {
                        type: 'time',
                        axisTick: {
                            show: false
                        },
                        axisLine: {
                            lineStyle: {
                                opacity: 0.1,
                                color: '#3d4245'
                            }
                        },
                        splitLine: {
                            show: false
                        },
                        axisLabel: {
                            formatter: format_time
                        }
                    },
                    yAxis: {
                        min: 0,
                        max: 'dataMax',
                        minInterval: 2,
                        axisTick: {
                            show: false
                        },
                        axisLine: {
                            lineStyle: {
                                opacity: 0,
                                color: '#8c8f91'
                            }
                        },
                        splitLine: {
                            show: true,
                            lineStyle: {
                                width: 1,
                                opacity: 0.5
                            }
                        }
                    },
                    series: [{
                        name: '读(IOPS)',
                        type: 'line',
                        showSymbol: false,
                        smooth: true,
                        lineStyle: {
                            normal: {
                                width: 1
                            }
                        },
                        data: (function () {
                            var d = [];
                            $.each(data.data, function(i, ele) {
                                d.push([
                                    ele['timestamp'] * 1000,
                                    ele['rd_req'] !== null ? ele['rd_req'] : null
                                ])
                            });
                            return d;
                        })()
                    },{
                        name: '写(IOPS)',
                        type: 'line',
                        showSymbol: false,
                        smooth: true,
                        lineStyle: {
                            normal: {
                                width: 1
                            }
                        },
                        data: (function () {
                            var d = [];
                            $.each(data.data, function(i, ele) {
                                d.push([
                                    ele['timestamp'] * 1000,
                                    ele['wr_req'] !== null ? ele['wr_req'] : null
                                ])
                            });
                            return d;
                        })()
                    }]
                };

                var disk_chart = echarts.init(document.getElementById(dev_id));
                disk_chart.setOption(option);
            }
        });
    }

    function render_disks_chart(uuid, granularity) {
        var dev_table = [];

        for (var i = 1; i <= 26; i++) {
            dev_table.push('vd' + String.fromCharCode(0x60+i));
        }

        var dev_name = dev_table[{{ disk_ret.data.sequence }}];
        var dev_id_throughput = 'disk_throughput_chart';
        var dev_id_iops = 'disk_iops_chart';

        render_disk_throughput_chart(uuid, granularity, dev_id_throughput, dev_name);
        render_disk_iops_chart(uuid, granularity, dev_id_iops, dev_name);
    }

    $(document).ready(function() {
        $('body').addClass('add-transition');
        $('.add-page-transition').on('click', function(){
            var transAttr = $(this).attr('data-transition');
            $('.add-transition').attr('class', 'add-transition');
            $('.add-transition').addClass(transAttr);
        });

        render_disks_chart(uuid, 'hour')
    });
    
    function refresh_render_with_specify_granularity(granularity) {
        render_disks_chart(uuid, granularity)
    }
</script>
<div class="container" style="padding-top: 100px; width: 90%; max-width: 100%;">
    <div class="panel">
        <div class="panel-body">
            <a href="javascript:history.go(-1)" class="btn btn-xs btn-default add-page-transition" data-transition="pt-page-moveFromLeft-init" style="margin-bottom: 4px; margin-left: 10px;">
                <span class="glyph-icon icon-separator" style="transform: rotateY(-180deg);">
                    <i class="glyph-icon icon-level-up"></i>
                </span>
                <span class="button-content">
                    返回
                </span>
            </a>
            <div class="row" style="margin-top: 10px;">
                <div class="col-xs-4">
                    <div style="background: #F5f6FA; border: 1px solid #e1e6eb; padding: 10px; font-size: 14px; width: 100%;">
                        <span>
                        磁盘信息
                        </span>
                    </div>
                    <table class="table table-bordered">
                        <tbody>
                        <tr>
                            <td>
                                <span class="guest-label">UUID:&nbsp;&nbsp;&nbsp;&nbsp;</span>
                                <span class="guest-desc">
                                {{ disk_ret.data.uuid }}
                                </span>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <span class="guest-label">名称:&nbsp;&nbsp;&nbsp;&nbsp;</span>
                                <span class="guest-desc">
                                {{ disk_ret.data.remark }}
                                </span>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <span class="guest-label">状态:&nbsp;&nbsp;&nbsp;&nbsp;</span>
                                <span class="guest-desc">
                                {{ format_disk_state(disk_ret.data.state)|safe }}
                                </span>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <span class="guest-label">磁盘性别:&nbsp;&nbsp;&nbsp;&nbsp;</span>
                                <span class="guest-desc">
                                    {% if disk_ret.data.sequence == 0 %}
                                        系统盘
                                    {% else %}
                                        数据盘
                                    {% endif %}
                                </span>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <span class="guest-label">磁盘容量:&nbsp;&nbsp;&nbsp;&nbsp;</span>
                                <span class="guest-desc">
                                {{ disk_ret.data.size }} GB
                                </span>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <span class="guest-label">所属 Guest:&nbsp;&nbsp;&nbsp;&nbsp;</span>
                                <span class="guest-desc">
                                    {% if disk_ret.data.sequence != -1 %}
                                        <a href="/guest/detail/{{ disk_ret.data.guest_uuid }}">{{ guest_ret.data.label }}/{{ guest_ret.data.remark }}</a>
                                    {% else %}
                                    {% endif %}
                                </span>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <span class="guest-label">设备号:&nbsp;&nbsp;&nbsp;&nbsp;</span>
                                <span class="guest-desc">
                                {{ format_sequence_to_device_name(disk_ret.data.sequence) }}
                                </span>
                            </td>
                        </tr>
                        <tr>
                            <td>
                                <span class="guest-label">创建时间:&nbsp;&nbsp;&nbsp;&nbsp;</span>
                                <span class="guest-desc">
                                {{ format_datetime_by_tus(disk_ret.data.create_time) }}
                                </span>
                            </td>
                        </tr>
                        </tbody>

                    </table>
                </div>
                <div class="col-xs-8">
                    <div class="row" style="margin-bottom: 20px;">
                        <div class="col-xs-8"></div>
                        <div class="col-xs-4">
                            <div class="btn-group btn-group-justified btn-group-xs">
                                <a class="btn btn-default" role="button" onclick="refresh_render_with_specify_granularity('hour');">1小时</a>
                                <a class="btn btn-default" role="button" onclick="refresh_render_with_specify_granularity('six_hours');">6小时</a>
                                <a class="btn btn-default" role="button" onclick="refresh_render_with_specify_granularity('day');">1天</a>
                                <a class="btn btn-default" role="button" onclick="refresh_render_with_specify_granularity('seven_days');">7天</a>
                            </div>
                        </div>
                    </div>
                    <div>
                        <div id="disk_throughput_chart" style="width: 800px;height:280px;"></div>
                        <div id="disk_iops_chart" style="width: 800px;height:280px;"></div>
                    </div>
                    <div id="disks_chart"></div>
                </div>
            </div>
        </div>
    </div>
</div>
{% endblock body %}
