Skip to content

Commit

Permalink
Container project dashboard view
Browse files Browse the repository at this point in the history
  • Loading branch information
Ari Zellner committed Aug 24, 2017
1 parent 5829a01 commit 67da578
Show file tree
Hide file tree
Showing 13 changed files with 873 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
/* global miqHttpInject */

ManageIQ.angular.app.controller('containerProjectDashboardController', ['$scope', 'dashboardUtilsFactory', 'chartsMixin', '$http', '$interval', '$window', 'miqService',
function($scope, dashboardUtilsFactory, chartsMixin, $http, $interval, $window, miqService) {
document.getElementById("center_div").className += " miq-body";

// Obj-status cards init
$scope.objectStatus = {
services: dashboardUtilsFactory.createServicesStatus(),
images: dashboardUtilsFactory.createImagesStatus(),
containers: dashboardUtilsFactory.createContainersStatus(),
};

$scope.loadingDone = false;

$scope.cpuUsageConfig = chartsMixin.chartConfig.cpuUsageConfig;
$scope.cpuUsageConfig.layout = 'compact';
$scope.cpuUsageConfig.title = 'CPU Utilization';

$scope.memoryUsageConfig = chartsMixin.chartConfig.memoryUsageConfig;
$scope.memoryUsageConfig.layout = 'compact';
$scope.memoryUsageConfig.title = 'Memory Utilization';

$scope.refresh = function() {
// get the pathname and remove trailing / if exist
var pathname = $window.location.pathname.replace(/\/$/, '');

if (pathname.match(/show$/)) {
$scope.id = '';
} else {
// search for pattern ^/<controler>/<id>$ in the pathname
$scope.id = '/' + (/^\/[^\/]+\/show\/(\d+)/.exec(pathname)[1]);
}

var url = '/container_dashboard/project_data' + $scope.id;
$http.get(url)
.then(getContainerDashboardData)
.catch(miqService.handleFailure);
};
$scope.refresh();
var promise = $interval($scope.refresh, 1000 * 60 * 3);

$scope.$on('$destroy', function() {
$interval.cancel(promise);
});

function getContainerDashboardData(response) {
'use strict';

var data = response.data.data;
dashboardUtilsFactory.updateStatus($scope.objectStatus.services, data.status.services);
dashboardUtilsFactory.updateStatus($scope.objectStatus.images, data.status.images);
dashboardUtilsFactory.updateStatus($scope.objectStatus.containers, data.status.containers);

if (data.project_utilization.interval_name === "daily") {
$scope.cpuUsageConfig.tooltipFn = chartsMixin.dailyTimeTooltip;
$scope.memoryUsageConfig.tooltipFn = chartsMixin.dailyTimeTooltip;
}

if (data.project_utilization.interval_name === "hourly") {
$scope.cpuUsageConfig.tooltipFn = chartsMixin.hourlyTimeTooltip;
$scope.memoryUsageConfig.tooltipFn = chartsMixin.hourlyTimeTooltip;
$scope.cpuUsageConfig.timeFrame = __('Last 24 hours');
$scope.memoryUsageConfig.timeFrame = __('Last 24 hours');
}

if (data.project_utilization.xy_data.cpu != null) {
data.project_utilization.xy_data.cpu.xData = data.project_utilization.xy_data.cpu.xData.map(function(date) {
return dashboardUtilsFactory.parseDate(date);
});
data.project_utilization.xy_data.mem.xData = data.project_utilization.xy_data.mem.xData.map(function(date) {
return dashboardUtilsFactory.parseDate(date);
});
}

$scope.cpuUsageData = chartsMixin.processUtilizationData(data.project_utilization.xy_data.cpu,
'dates',
$scope.cpuUsageConfig.units);

$scope.memoryUsageData = chartsMixin.processUtilizationData(data.project_utilization.xy_data.mem,
'dates',
$scope.memoryUsageConfig.units);

// Network metrics
if (data.network_metrics.interval_name === "daily") {
$scope.networkUtilizationConfig = chartsMixin.chartConfig.dailyNetworkUsageConfig;
} else if (data.network_metrics.interval_name === "hourly") {
$scope.networkUtilizationConfig = chartsMixin.chartConfig.hourlyNetworkUsageConfig;
}

$scope.networkUtilizationConfig.layout = 'compact';
$scope.networkUtilizationConfig.title = 'Network Utilization';

if (data.network_metrics.xy_data != null) {
data.network_metrics.xy_data.xData = data.network_metrics.xy_data.xData.map(function(date) {
return dashboardUtilsFactory.parseDate(date);
});
}

$scope.networkUtilization = chartsMixin.processUtilizationData(data.network_metrics.xy_data,
'dates',
$scope.networkUtilizationConfig.units);

// Quotas
$scope.quotas = [];
$scope.barChartLayoutInline = { 'type': 'inline' };
angular.forEach(data.quota, function(item) {
$scope.quotas.push({
'title': item.resource,
'units': item.units,
'data': {
'used': item.quota_observed,
'total': item.quota_enforced,
'dataAvailable': true,
},
});
});

if ($scope.quotas.length === 0) {
$scope.quotas.push({
'title': '',
'data': {
'used': 0,
'total': 0,
'dataAvailable': false,
}
});
}

// Pod entity trend
if (data.pod_metrics.interval_name === "daily") {
$scope.podEntityTrendConfig = chartsMixin.chartConfig.dailyPodUsageConfig;
} else {
$scope.podEntityTrendConfig = chartsMixin.chartConfig.hourlyPodUsageConfig;
}

if (data.pod_metrics.xy_data != null) {
data.pod_metrics.xy_data.xData = data.pod_metrics.xy_data.xData.map(function(date) {
return dashboardUtilsFactory.parseDate(date);
});
}

$scope.podEntityTrend = chartsMixin.processPodUtilizationData(data.pod_metrics.xy_data,
'dates',
$scope.podEntityTrendConfig.createdLabel,
$scope.podEntityTrendConfig.deletedLabel);

// Pods table
$scope.pods = data.pods;

$scope.loadingDone = true;
}
}]);
8 changes: 8 additions & 0 deletions app/controllers/container_dashboard_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ def data_live
render :json => collect_live_data(params[:id], params[:query])
end

def project_data
render :json => {:data => collect_project_data(params[:id]) }
end

def title
_("Container Dashboard")
end
Expand All @@ -49,5 +53,9 @@ def collect_live_data(provider_id, query)
HawkularProxyService.new(provider_id, self).data(query)
end

def collect_project_data(project_id)
ContainerProjectDashboardService.new(project_id, self).all_data
end

menu_section :cnt
end
1 change: 1 addition & 0 deletions app/controllers/container_project_controller.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
class ContainerProjectController < ApplicationController
include ContainersCommonMixin
include Mixins::DashboardViewMixin

before_action :check_privileges
before_action :get_session_data
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/mixins/dashboard_view_mixin.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def show_dashboard
@lastaction = "show_dashboard"
drop_breadcrumb(:name => @record.name + _(" (Dashboard)"), :url => show_link(@record))
@sb[:summary_mode] = 'dashboard' unless @sb[:summary_mode] == 'dashboard'
add_flash(_("Warning: This provider is paused, no data is currently collected from it."), :warning) unless @record.enabled?
add_flash(_("Warning: This provider is paused, no data is currently collected from it."), :warning) if @record.kind_of?(ExtManagementSystem) && !@record.try(:enabled)
render :action => "show_dashboard"
end
end
Expand Down
11 changes: 10 additions & 1 deletion app/helpers/application_helper/toolbar/container_project_view.rb
Original file line number Diff line number Diff line change
@@ -1,12 +1,21 @@
class ApplicationHelper::Toolbar::ContainerProjectView < ApplicationHelper::Toolbar::Basic
button_group('container_project', [
twostate(
:view_dashboard,
'fa fa-tachometer fa-1xplus',
N_('Dashboard View'),
nil,
:url => "/show",
:url_parms => "?display=dashboard",
:klass => ApplicationHelper::Button::ViewDashboard
),
twostate(
:view_summary,
'fa fa-th-list',
N_('Summary View'),
nil,
:url => "/show",
:url_parms => ""
:url_parms => "?display=main"
),
twostate(
:view_topology,
Expand Down
Loading

0 comments on commit 67da578

Please sign in to comment.