progress_popup_controller.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /**
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. App.HighAvailabilityProgressPopupController = Ember.Controller.extend({
  19. name: 'highAvailabilityProgressPopupController',
  20. /**
  21. * Id of current request
  22. * @type {Array}
  23. */
  24. requestIds: [],
  25. /**
  26. * Title for popup header
  27. * @type {String}
  28. */
  29. popupTitle: '',
  30. /**
  31. * Array with Hosts tasks data used in <code>App.HostPopup</code>
  32. * @type {Array}
  33. */
  34. services: [],
  35. /**
  36. * Timestamp used in <code>App.HostPopup</code>
  37. * @type {Number}
  38. */
  39. serviceTimestamp: null,
  40. /**
  41. * Progress controller. Used to get tasks data.
  42. * @type {App.HighAvailabilityProgressPageController}
  43. */
  44. progressController: null,
  45. /**
  46. * Requests data with tasks
  47. * @type {Array}
  48. */
  49. hostsData: [],
  50. /**
  51. * Get info for <code>requestIds</code> and initialize <code>App.HostPopup</code>
  52. * @param popupTitle {String}
  53. * @param requestIds {Array}
  54. * @param progressController {App.HighAvailabilityProgressPageController}
  55. */
  56. initPopup: function (popupTitle, requestIds, progressController) {
  57. this.set('progressController', progressController);
  58. this.set('popupTitle', popupTitle);
  59. this.set('requestIds', requestIds);
  60. this.set('hostsData', []);
  61. this.getHosts();
  62. },
  63. /**
  64. * Send AJAX request to get hosts tasks data
  65. */
  66. getHosts: function () {
  67. var requestIds = this.get('requestIds');
  68. requestIds.forEach(function (requestId) {
  69. App.ajax.send({
  70. name: 'admin.high_availability.polling',
  71. sender: this,
  72. data: {
  73. requestId: requestId
  74. },
  75. success: 'onGetHostsSuccess'
  76. })
  77. }, this);
  78. },
  79. /**
  80. * Callback for <code>getHosts</code> request
  81. * @param data
  82. */
  83. onGetHostsSuccess: function (data) {
  84. var hostsData = this.get('hostsData');
  85. hostsData.push(data);
  86. if (this.get('requestIds.length') === this.get('hostsData.length')) {
  87. var popupTitle = this.get('popupTitle');
  88. this.calculateHostsData(hostsData);
  89. App.HostPopup.initPopup(popupTitle, this);
  90. if (this.isRequestRunning(hostsData)) {
  91. this.addObserver('progressController.logs.length', this, 'getDataFromProgressController');
  92. }
  93. }
  94. },
  95. /**
  96. * Convert data to format used in <code>App.HostPopup</code>
  97. * @param data {Array}
  98. */
  99. calculateHostsData: function (data) {
  100. var hosts = [];
  101. var hostsMap = {};
  102. var popupTitle = this.get('popupTitle');
  103. data.forEach(function (request) {
  104. request.tasks.forEach(function (task) {
  105. var host = hosts.findProperty('name', task.Tasks.host_name);
  106. if (hostsMap[host]) {
  107. hostsMap[host].logTasks.push(task);
  108. } else {
  109. hostsMap[host] = {
  110. name: task.Tasks.host_name,
  111. publicName: task.Tasks.host_name,
  112. logTasks: [task]
  113. };
  114. }
  115. });
  116. });
  117. for (var host in hostsMap) {
  118. hosts.push(hostsMap[host]);
  119. }
  120. this.set('services', [
  121. {name: popupTitle, hosts: hosts}
  122. ]);
  123. this.set('serviceTimestamp', App.dateTime());
  124. if (!this.isRequestRunning(data)) {
  125. this.removeObserver('progressController.logs.length', this, 'getDataFromProgressController');
  126. }
  127. },
  128. /**
  129. * Get hosts tasks data from <code>progressController</code>
  130. */
  131. getDataFromProgressController: function () {
  132. var data = this.get('hostsData');
  133. var tasksData = this.get('progressController.logs');
  134. if (tasksData.length) {
  135. var tasks = [];
  136. tasksData.forEach(function (logs) {
  137. tasks.pushObjects(logs);
  138. }, this);
  139. data.forEach(function (request) {
  140. tasks = tasks.filterProperty('Tasks.request_id', request.Requests.id);
  141. request.tasks = tasks;
  142. });
  143. this.calculateHostsData(data);
  144. }
  145. },
  146. /**
  147. * Identify whether request is running by task counters
  148. * @param requests {Array}
  149. * @return {Boolean}
  150. */
  151. isRequestRunning: function (requests) {
  152. var result = false;
  153. requests.forEach(function (request) {
  154. if ((request.Requests.task_count -
  155. (request.Requests.aborted_task_count + request.Requests.completed_task_count + request.Requests.failed_task_count
  156. + request.Requests.timed_out_task_count - request.Requests.queued_task_count)) > 0) {
  157. result = true;
  158. }
  159. });
  160. return result;
  161. }
  162. });