katello 3.4.2 → 3.4.4

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of katello might be problematic. Click here for more details.

Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/katello/api/rhsm/candlepin_proxies_controller.rb +1 -1
  3. data/app/controllers/katello/api/v2/api_controller.rb +10 -2
  4. data/app/controllers/katello/api/v2/capsule_content_controller.rb +1 -1
  5. data/app/controllers/katello/api/v2/docker_manifests_controller.rb +4 -0
  6. data/app/controllers/katello/api/v2/docker_tags_controller.rb +4 -5
  7. data/app/controllers/katello/api/v2/errata_controller.rb +3 -2
  8. data/app/controllers/katello/api/v2/host_packages_controller.rb +1 -1
  9. data/app/controllers/katello/api/v2/hosts_bulk_actions_controller.rb +2 -2
  10. data/app/controllers/katello/api/v2/repositories_controller.rb +1 -1
  11. data/app/controllers/katello/application_controller.rb +9 -501
  12. data/app/controllers/katello/concerns/api/v2/repository_content_controller.rb +8 -10
  13. data/app/helpers/katello/hosts_and_hostgroups_helper.rb +3 -3
  14. data/app/helpers/katello/layout_helper.rb +2 -0
  15. data/app/lib/actions/candlepin/consumer/update.rb +1 -0
  16. data/app/lib/actions/candlepin/import_pool_handler.rb +1 -1
  17. data/app/lib/actions/katello/capsule_content/remove_unneeded_repos.rb +1 -1
  18. data/app/lib/actions/katello/capsule_content/sync.rb +24 -14
  19. data/app/lib/actions/katello/content_view/capsule_generate_and_sync.rb +5 -4
  20. data/app/lib/actions/katello/content_view/errata_mail.rb +1 -1
  21. data/app/lib/actions/katello/content_view_puppet_environment/create.rb +3 -1
  22. data/app/lib/actions/katello/host/update.rb +18 -10
  23. data/app/lib/actions/katello/host/upload_package_profile.rb +4 -2
  24. data/app/lib/actions/katello/organization/manifest_refresh.rb +16 -9
  25. data/app/lib/actions/katello/repository/capsule_generate_and_sync.rb +5 -3
  26. data/app/lib/actions/katello/repository/errata_mail.rb +1 -1
  27. data/app/lib/actions/katello/repository/refresh_repository.rb +3 -3
  28. data/app/lib/actions/pulp/abstract_async_task_group.rb +18 -0
  29. data/app/lib/actions/pulp/consumer/sync_capsule.rb +2 -1
  30. data/app/lib/katello/resources/candlepin.rb +9 -6
  31. data/app/lib/katello/util/support.rb +1 -1
  32. data/app/models/katello/authorization/repository.rb +3 -3
  33. data/app/models/katello/concerns/operatingsystem_extensions.rb +2 -2
  34. data/app/models/katello/concerns/pulp_database_unit.rb +1 -1
  35. data/app/models/katello/docker_manifest.rb +5 -1
  36. data/app/models/katello/docker_meta_tag.rb +108 -0
  37. data/app/models/katello/docker_tag.rb +19 -1
  38. data/app/models/katello/erratum.rb +16 -6
  39. data/app/models/katello/glue/candlepin/candlepin_object.rb +12 -11
  40. data/app/models/katello/glue/candlepin/subscription.rb +3 -1
  41. data/app/models/katello/glue/provider.rb +4 -4
  42. data/app/models/katello/glue/pulp/repo.rb +25 -0
  43. data/app/models/katello/host/content_facet.rb +1 -1
  44. data/app/models/katello/host/subscription_facet.rb +1 -1
  45. data/app/models/katello/pool.rb +1 -1
  46. data/app/models/katello/repository.rb +8 -0
  47. data/app/models/katello/sync_plan.rb +2 -2
  48. data/app/models/setting/content.rb +1 -0
  49. data/app/overrides/add_about_page.rb +0 -7
  50. data/app/views/common/400.html +9 -0
  51. data/app/views/katello/api/v2/content_views/base.json.rabl +1 -1
  52. data/app/views/katello/api/v2/docker_tags/_base.json.rabl +11 -1
  53. data/app/views/katello/api/v2/repositories/base.json.rabl +1 -1
  54. data/config/routes/api/rhsm.rb +1 -0
  55. data/db/migrate/20170523182831_create_docker_meta_tag.rb +13 -0
  56. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-host-modal-helper.service.js +71 -0
  57. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.controller.js +13 -56
  58. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts.routes.js +1 -1
  59. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/content-host-details-info.controller.js +6 -4
  60. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/details/views/content-host-info.html +2 -2
  61. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/content-views.routes.js +9 -0
  62. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-views/details/views/content-view-copy.html +3 -1
  63. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/docker-tags/details/views/docker-tag-info.html +27 -16
  64. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/docker-tags/docker-tags.controller.js +12 -0
  65. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/docker-tags/views/docker-tags.html +4 -0
  66. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/details/erratum-content-hosts.controller.js +10 -4
  67. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/errata/errata.controller.js +1 -1
  68. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/host-collections/details/host-collection-details.controller.js +41 -6
  69. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/host-collections/details/views/host-collection-info.html +11 -5
  70. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-manage-docker-manifests.html +4 -0
  71. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery-create.controller.js +9 -11
  72. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/details/subscription-content-hosts.controller.js +4 -0
  73. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/details/views/subscription-content-hosts.html +1 -1
  74. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/manifest/manifest-import.controller.js +26 -20
  75. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/subscriptions/manifest/views/manifest-import.html +16 -12
  76. data/lib/katello/tasks/delete_orphaned_content.rake +8 -1
  77. data/lib/katello/tasks/repository.rake +20 -0
  78. data/lib/katello/version.rb +1 -1
  79. metadata +6 -6
  80. data/app/controllers/katello/errors_controller.rb +0 -23
  81. data/app/controllers/katello/failed_authentication_controller.rb +0 -51
  82. data/app/controllers/katello/sort_column_list.rb +0 -19
  83. data/app/views/overrides/about/_support_documentation.html.erb +0 -7
@@ -82,7 +82,7 @@ angular.module('Bastion.errata').controller('ErrataController',
82
82
  });
83
83
 
84
84
  $scope.goToNextStep = function () {
85
- IncrementalUpdate.setBulkErrata(nutupane.getAllSelectedResults());
85
+ IncrementalUpdate.setBulkErrata(nutupane.getAllSelectedResults('errata_id'));
86
86
  $state.transitionTo('apply-errata.select-content-hosts');
87
87
  };
88
88
 
@@ -6,16 +6,17 @@
6
6
  * @requires $state
7
7
  * @requires $q
8
8
  * @requires translate
9
+ * @requires Host
10
+ * @requires ContentHostsModalHelper
9
11
  * @requires HostCollection
10
12
  * @requires ApiErrorHandler
11
- * @requires urlencodeFilter
12
13
  *
13
14
  * @description
14
15
  * Provides the functionality for the host collection details action pane.
15
16
  */
16
17
  angular.module('Bastion.host-collections').controller('HostCollectionDetailsController',
17
- ['$scope', '$state', '$q', 'translate', 'HostCollection', 'ApiErrorHandler', 'urlencodeFilter',
18
- function ($scope, $state, $q, translate, HostCollection, ApiErrorHandler, urlencodeFilter) {
18
+ ['$scope', '$state', '$q', 'translate', 'Host', 'ContentHostsModalHelper', 'HostCollection', 'ApiErrorHandler',
19
+ function ($scope, $state, $q, translate, Host, ContentHostsModalHelper, HostCollection, ApiErrorHandler) {
19
20
  $scope.successMessages = [];
20
21
  $scope.errorMessages = [];
21
22
 
@@ -36,15 +37,49 @@ angular.module('Bastion.host-collections').controller('HostCollectionDetailsCont
36
37
  ApiErrorHandler.handleGETRequestErrors(response, $scope);
37
38
  });
38
39
 
40
+ $scope.getHostIds = function() {
41
+ return $scope.selected;
42
+ };
43
+
44
+ $scope.host = Host.get({search: "host_collection_id = " + $scope.$stateParams.hostCollectionId}, function (response) {
45
+ $scope.selected = {
46
+ included: {
47
+ ids: _.map(response.results, 'id')
48
+ },
49
+ excluded: {
50
+ ids: []
51
+ }};
52
+ ContentHostsModalHelper.resolveFunc = $scope.getHostIds;}, function (response) {
53
+ $scope.panel.loading = false;
54
+ ApiErrorHandler.handleGETRequestErrors(response, $scope);
55
+ });
56
+
39
57
  $scope.refreshHostCollection = function () {
40
58
  $scope.hostCollection.$get().then(function (hostCollection) {
41
59
  $scope.$emit("updateContentHostCollection", hostCollection);
42
60
  });
43
61
  };
44
62
 
45
- $scope.getHostCollectionSearchUrl = function (hostCollectionName) {
46
- var search = 'host_collection="%s"'.replace('%s', hostCollectionName);
47
- return '?select_all=true&search=' + urlencodeFilter(search);
63
+ $scope.openPackagesModal = function () {
64
+ ContentHostsModalHelper.openPackagesModal();
65
+ };
66
+
67
+ $scope.openErrataModal = function () {
68
+ ContentHostsModalHelper.openErrataModal();
69
+ };
70
+
71
+ $scope.openHostCollectionsModal = function () {
72
+ ContentHostsModalHelper.openHostCollectionsModal();
73
+ };
74
+
75
+
76
+ $scope.openEnvironmentModal = function () {
77
+ ContentHostsModalHelper.openEnvironmentModal();
78
+ };
79
+
80
+
81
+ $scope.openSubscriptionsModal = function () {
82
+ ContentHostsModalHelper.openSubscriptionsModal();
48
83
  };
49
84
 
50
85
  $scope.save = function (hostCollection) {
@@ -69,28 +69,34 @@
69
69
 
70
70
  <ul class="list-unstyled">
71
71
  <li bst-feature-flag="remote_actions">
72
- <a translate ng-href="{{ $state.href('content-hosts.bulk-actions.packages') }}{{ getHostCollectionSearchUrl(hostCollection.name) }}">
72
+ <a translate ng-click ="openPackagesModal()">
73
73
  Package Installation, Removal, and Update
74
74
  </a>
75
75
  </li>
76
76
 
77
77
  <li bst-feature-flag="remote_actions">
78
- <a translate ng-href="{{ $state.href('content-hosts.bulk-actions.errata.list') }}{{ getHostCollectionSearchUrl(hostCollection.name) }}">
78
+ <a translate ng-click="openErrataModal()">
79
79
  Errata Installation
80
80
  </a>
81
81
  </li>
82
82
 
83
83
  <li>
84
- <a translate ng-href="{{ $state.href('content-hosts.bulk-actions.host-collections') }}{{ getHostCollectionSearchUrl(hostCollection.name) }}">
84
+ <a translate ng-click = "openHostCollectionsModal()">
85
85
  Host Collection Membership
86
86
  </a>
87
87
  </li>
88
88
 
89
89
  <li bst-feature-flag="lifecycle_environments">
90
- <a translate ng-href="{{ $state.href('content-hosts.bulk-actions.environment') }}{{ getHostCollectionSearchUrl(hostCollection.name) }}">
90
+ <a translate ng-click="openEnvironmentModal()">
91
91
  Change assigned Lifecycle Environment or Content View
92
92
  </a>
93
93
  </li>
94
+
95
+ <li bst-feature-flag="subscription_management">
96
+ <a translate ng-click="openSubscriptionsModal()">
97
+ Subscription Management
98
+ </a>
99
+ </li>
94
100
  </ul>
95
101
  </div>
96
- </section>
102
+ </section>
@@ -45,6 +45,7 @@
45
45
  <tr bst-table-head row-select>
46
46
  <th bst-table-column><span translate>Manifest Name</span></th>
47
47
  <th bst-table-column><span translate>Tags</span></th>
48
+ <th bst-table-column><span translate>Schema Version</span></th>
48
49
  <th bst-table-column><span translate>Digest</span></th>
49
50
  </tr>
50
51
  </thead>
@@ -61,6 +62,9 @@
61
62
  </a>
62
63
  </span>
63
64
  </td>
65
+ <td bst-table-cell>
66
+ {{ item.schema_version }}
67
+ </td>
64
68
  <td bst-table-cell>
65
69
  {{ item.digest }}
66
70
  </td>
@@ -17,8 +17,8 @@
17
17
  * repository discovery.
18
18
  */
19
19
  angular.module('Bastion.products').controller('DiscoveryCreateController',
20
- ['$scope', '$q', 'CurrentOrganization', 'Product', 'Repository', 'GPGKey', 'FormUtils', 'DiscoveryRepositories', 'translate',
21
- function ($scope, $q, CurrentOrganization, Product, Repository, GPGKey, FormUtils, DiscoveryRepositories, translate) {
20
+ ['$scope', '$q', 'CurrentOrganization', 'Product', 'Repository', 'GPGKey', 'FormUtils', 'DiscoveryRepositories', 'translate', 'ApiErrorHandler',
21
+ function ($scope, $q, CurrentOrganization, Product, Repository, GPGKey, FormUtils, DiscoveryRepositories, translate, ApiErrorHandler) {
22
22
 
23
23
  $scope.errorMessages = [];
24
24
  $scope.successMessages = [];
@@ -172,15 +172,13 @@ angular.module('Bastion.products').controller('DiscoveryCreateController',
172
172
  return fieldsEnabled;
173
173
  };
174
174
 
175
- $scope.gpgKeys = function () {
176
- var deferred = $q.defer();
177
-
178
- GPGKey.queryUnpaged(function (response) {
179
- deferred.resolve(response.results);
180
- });
181
-
182
- return deferred.promise;
183
- };
175
+ $scope.gpgKeys = [];
176
+ GPGKey.queryUnpaged(function (gpgKeys) {
177
+ $scope.gpgKeys = gpgKeys.results;
178
+ }, function (response) {
179
+ $scope.gpgKeys = [];
180
+ ApiErrorHandler.handleGETRequestErrors(response, $scope);
181
+ });
184
182
 
185
183
  $scope.$watch('table.rows', function (newList, oldList) {
186
184
  if (newList) {
@@ -31,6 +31,10 @@ angular.module('Bastion.subscriptions').controller('SubscriptionContentHostsCont
31
31
 
32
32
  $scope.memory = ContentHostsHelper.memory;
33
33
 
34
+ $scope.convertMemToGB = function (memoryValue) {
35
+ return (memoryValue / 1048576).toFixed(2);
36
+ };
37
+
34
38
  $scope.virtual = function (facts) {
35
39
  if (angular.isUndefined(facts.virt) || angular.isUndefined(facts.virt['is_guest'])) {
36
40
  return false;
@@ -54,7 +54,7 @@
54
54
  <td bst-table-cell>{{ contentHost.service_level }}</td>
55
55
  <td bst-table-cell>{{ contentHost.facts.cpu['cpu_socket(s)'] }}</td>
56
56
  <td bst-table-cell>{{ contentHost.facts.cpu['core(s)_per_socket'] }}</td>
57
- <td bst-table-cell>{{ contentHost.facts.dmi.memory['size'] }}</td>
57
+ <td bst-table-cell>{{ convertMemToGB(contentHost.facts.memory['memtotal']) }}</td>
58
58
  </tr>
59
59
  </tbody>
60
60
  </table>
@@ -43,6 +43,11 @@ angular.module('Bastion.subscriptions').controller('ManifestImportController',
43
43
  }
44
44
  }
45
45
 
46
+ function getInitialTask() {
47
+ return {pending: true};
48
+
49
+ }
50
+
46
51
  $scope.uploadErrorMessages = [];
47
52
  $scope.progress = {uploading: false};
48
53
  $scope.uploadURL = '/katello/api/v2/organizations/' + CurrentOrganization + '/subscriptions/upload';
@@ -58,11 +63,7 @@ angular.module('Bastion.subscriptions').controller('ManifestImportController',
58
63
  });
59
64
 
60
65
  $scope.isTaskPending = function () {
61
- var pending = false;
62
- if (($scope.task && $scope.task.pending) || ($scope.deleteTask && $scope.deleteTask.pending)) {
63
- pending = true;
64
- }
65
- return pending;
66
+ return $scope.task && $scope.task.pending;
66
67
  };
67
68
 
68
69
  $scope.unregisterSearch = function () {
@@ -92,7 +93,6 @@ angular.module('Bastion.subscriptions').controller('ManifestImportController',
92
93
  if ($scope.task.result === 'success') {
93
94
  $scope.refreshOrganizationInfo();
94
95
  GlobalNotification.setSuccessMessage(translate("Manifest successfully imported."));
95
- $scope.refreshTable();
96
96
  } else {
97
97
  $scope.handleTaskErrors(task, translate("Error importing manifest."));
98
98
  }
@@ -100,9 +100,11 @@ angular.module('Bastion.subscriptions').controller('ManifestImportController',
100
100
  };
101
101
 
102
102
  $scope.deleteManifest = function () {
103
+ $scope.task = getInitialTask();
104
+ $scope.taskStatusText = translate('Removing Manifest');
103
105
  Subscription.deleteManifest({}, function (returnData) {
104
- $scope.deleteTask = returnData;
105
- $scope.searchId = Task.registerSearch({'type': 'task', 'task_id': $scope.deleteTask.id}, $scope.deleteManifestTask);
106
+ $scope.task = returnData;
107
+ $scope.searchId = Task.registerSearch({'type': 'task', 'task_id': $scope.task.id}, $scope.deleteManifestTask);
106
108
  }, function (response) {
107
109
  $scope.saveError = true;
108
110
  $scope.errors = response.data.errors;
@@ -110,13 +112,12 @@ angular.module('Bastion.subscriptions').controller('ManifestImportController',
110
112
  };
111
113
 
112
114
  $scope.deleteManifestTask = function (task) {
113
- $scope.deleteTask = task;
114
- if (!$scope.deleteTask.pending) {
115
+ $scope.task = task;
116
+ if (!$scope.task.pending) {
115
117
  $scope.unregisterSearch();
116
- if ($scope.deleteTask.result === 'success') {
118
+ if ($scope.task.result === 'success') {
117
119
  $scope.saveSuccess = true;
118
120
  GlobalNotification.setSuccessMessage(translate("Manifest successfully deleted."));
119
- $scope.refreshTable();
120
121
  $scope.refreshOrganizationInfo();
121
122
  } else {
122
123
  $scope.handleTaskErrors(task, translate("Error deleting manifest."));
@@ -133,9 +134,11 @@ angular.module('Bastion.subscriptions').controller('ManifestImportController',
133
134
  };
134
135
 
135
136
  $scope.refreshManifest = function () {
137
+ $scope.task = getInitialTask();
138
+ $scope.taskStatusText = translate('Refreshing Manifest');
136
139
  Subscription.refreshManifest({}, function (returnData) {
137
- $scope.refreshTask = returnData;
138
- $scope.searchId = Task.registerSearch({'type': 'task', 'task_id': $scope.refreshTask.id}, $scope.refreshManifestTask);
140
+ $scope.task = returnData;
141
+ $scope.searchId = Task.registerSearch({'type': 'task', 'task_id': $scope.task.id}, $scope.refreshManifestTask);
139
142
  }, function (response) {
140
143
  $scope.saveError = true;
141
144
  $scope.errors = response.data.errors;
@@ -143,13 +146,12 @@ angular.module('Bastion.subscriptions').controller('ManifestImportController',
143
146
  };
144
147
 
145
148
  $scope.refreshManifestTask = function (task) {
146
- $scope.refreshTask = task;
147
- if (!$scope.refreshTask.pending) {
149
+ $scope.task = task;
150
+ if (!$scope.task.pending) {
148
151
  $scope.unregisterSearch();
149
- if ($scope.refreshTask.result === 'success') {
152
+ if ($scope.task.result === 'success') {
150
153
  $scope.saveSuccess = true;
151
154
  GlobalNotification.setSuccessMessage(translate("Manifest successfully refreshed."));
152
- $scope.refreshTable();
153
155
  $scope.refreshOrganizationInfo();
154
156
  } else {
155
157
  $scope.handleTaskErrors(task, translate("Error refreshing manifest."));
@@ -174,10 +176,11 @@ angular.module('Bastion.subscriptions').controller('ManifestImportController',
174
176
 
175
177
  deferred = Organization.update(whitelistedOrganizationObject, function () {
176
178
  GlobalNotification.setSuccessMessage(translate('Repository URL updated'));
177
- $scope.refreshTable();
178
179
  $scope.refreshOrganizationInfo();
179
180
  }, function (response) {
180
- GlobalNotification.setErrorMessage(translate("An error occurred saving the URL: ") + response.data.error.message);
181
+ angular.forEach(response.data.error['full_messages'], function (message) {
182
+ GlobalNotification.setErrorMessage(translate("An error occurred saving the URL: ") + message);
183
+ });
181
184
  });
182
185
 
183
186
  return deferred.$promise;
@@ -186,6 +189,9 @@ angular.module('Bastion.subscriptions').controller('ManifestImportController',
186
189
  $scope.uploadManifest = function (content) {
187
190
  var returnData;
188
191
  if (content) {
192
+ $scope.task = getInitialTask();
193
+ $scope.taskStatusText = translate('Uploading Manifest');
194
+
189
195
  try {
190
196
  returnData = angular.fromJson(angular.element(content).html());
191
197
  } catch (err) {
@@ -17,6 +17,17 @@
17
17
  <div class="details">
18
18
  <h4 translate>Subscription Manifest</h4>
19
19
 
20
+ <div ng-show="isTaskPending()">
21
+ <a ng-href="/foreman_tasks/tasks/{{ task.id }}">
22
+
23
+ <div ng-class="{ active: isTaskPending() }"
24
+ class="progress progress-striped">
25
+ <span uib-progressbar animate="false" value="task.progressbar.value" type="{{task.progressbar.type}}"></span>
26
+ </div>
27
+ </a>
28
+ {{ taskStatusText }}
29
+ </div>
30
+
20
31
  <div class="detail">
21
32
  <span class="info-label" translate>Upstream Subscription Management Application</span>
22
33
  <span class="info-value" ng-show="upstream.uuid != undefined">
@@ -30,18 +41,13 @@
30
41
  ng-hide="denied('delete_manifest')"
31
42
  ng-click="openModal()">
32
43
  <span bst-modal="deleteManifest()" template-url="subscriptions/manifest/views/manifest-delete-modal.html"></span>
33
- <i class="fa fa-spinner fa-spin" ng-show="deleteTask.pending"></i>
34
- <span ng-show="deleteTask.pending" translate>Deleting Manifest...</span>
35
- <span ng-hide="deleteTask.pending" translate>Delete Manifest</span>
44
+ <span translate>Delete Manifest</span>
36
45
  </button>
37
- <button type="button" class="btn btn-default" ng-disabled="upstream.idCert == undefined || upstream.idCert.cert == undefined"
46
+ <button type="button" class="btn btn-default" ng-disabled="isTaskPending() || upstream.idCert == undefined || upstream.idCert.cert == undefined"
38
47
  ng-click="refreshManifest()">
39
- <i class="fa fa-spinner fa-spin" ng-show="refreshTask.pending"></i>
40
- <span ng-show="refreshTask.pending" translate>Refreshing Manifest...</span>
41
- <span ng-hide="refreshTask.pending" translate>Refresh Manifest</span>
48
+ <span translate>Refresh Manifest</span>
42
49
  </button>
43
- <span ng-show="upstream.idCert == undefined || upstream.idCert.cert == undefined"
44
- translate>
50
+ <span ng-show="upstream.idCert == undefined || upstream.idCert.cert == undefined" translate>
45
51
  Refreshing manifest not supported by this manifest.
46
52
  </span>
47
53
  </div>
@@ -66,9 +72,7 @@
66
72
 
67
73
  <div class="form-group">
68
74
  <button type="button" class="btn btn-primary" ng-disabled="isTaskPending()" upload-submit>
69
- <i class="fa fa-spinner fa-spin" ng-show="task.pending"></i>
70
- <span ng-show="task.pending" translate>Uploading...</span>
71
- <span ng-hide="task.pending" translate>Upload</span>
75
+ <span translate>Upload</span>
72
76
  </button>
73
77
  </div>
74
78
 
@@ -1,7 +1,14 @@
1
1
  namespace :katello do
2
2
  task :delete_orphaned_content => ["environment"] do
3
3
  User.current = User.anonymous_admin
4
- Katello::Repository.delete_orphaned_content
4
+ SmartProxy.with_content.reverse.each do |proxy|
5
+ begin
6
+ ForemanTasks.async_task(Actions::Katello::CapsuleContent::RemoveOrphans,
7
+ :capsule_id => proxy.id)
8
+ rescue RuntimeError => e
9
+ Rails.logger.error "Smart proxy with ID #{proxy.id} may be down: #{e}"
10
+ end
11
+ end
5
12
  puts _("Orphaned content deletion started in background.")
6
13
  end
7
14
  end
@@ -3,6 +3,26 @@ namespace :katello do
3
3
  ForemanTasks.dynflow.config.remote = true
4
4
  end
5
5
 
6
+ desc "Check for repositories that have not been published since their last sync, and republish if they have."
7
+ task :publish_unpublished_repositories => ["environment", "disable_dynflow", "check_ping"] do
8
+ needing_publish = []
9
+ Organization.find_each do |org|
10
+ org.default_content_view.versions.first.repositories.where.not(:url => nil).find_each do |repo|
11
+ begin
12
+ if repo.needs_metadata_publish?
13
+ Rails.logger.error("Repository metadata for #{repo.name} (#{repo.id}) is out of date, regenerating.")
14
+ needing_publish << repo
15
+ end
16
+ rescue => e
17
+ puts "Failed to check repository #{repo.id}: #{e}"
18
+ end
19
+ end
20
+ end
21
+ if needing_publish.any?
22
+ ForemanTasks.async_task(::Actions::BulkAction, ::Actions::Katello::Repository::MetadataGenerate, needing_publish)
23
+ end
24
+ end
25
+
6
26
  desc "Regnerate metadata for all repositories. Specify CONTENT_VIEW=name and LIFECYCLE_ENVIRONMENT=name to narrow repositories."
7
27
  task :regenerate_repo_metadata => ["environment", "disable_dynflow", "check_ping"] do
8
28
  User.current = User.anonymous_api_admin
@@ -1,3 +1,3 @@
1
1
  module Katello
2
- VERSION = "3.4.2".freeze
2
+ VERSION = "3.4.4".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: katello
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.2
4
+ version: 3.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - N/A
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-23 00:00:00.000000000 Z
11
+ date: 2017-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -492,13 +492,10 @@ files:
492
492
  - app/controllers/katello/concerns/organizations_controller_extensions.rb
493
493
  - app/controllers/katello/concerns/smart_proxies_controller_extensions.rb
494
494
  - app/controllers/katello/errata_controller.rb
495
- - app/controllers/katello/errors_controller.rb
496
- - app/controllers/katello/failed_authentication_controller.rb
497
495
  - app/controllers/katello/http_errors.rb
498
496
  - app/controllers/katello/products_controller.rb
499
497
  - app/controllers/katello/providers_controller.rb
500
498
  - app/controllers/katello/remote_execution_controller.rb
501
- - app/controllers/katello/sort_column_list.rb
502
499
  - app/controllers/katello/sync_management_controller.rb
503
500
  - app/helpers/katello/application_helper.rb
504
501
  - app/helpers/katello/concerns/foreman_docker/container_steps_helper_extensions.rb
@@ -864,6 +861,7 @@ files:
864
861
  - app/models/katello/content_view_version_component.rb
865
862
  - app/models/katello/cp_consumer_user.rb
866
863
  - app/models/katello/docker_manifest.rb
864
+ - app/models/katello/docker_meta_tag.rb
867
865
  - app/models/katello/docker_tag.rb
868
866
  - app/models/katello/errata_status.rb
869
867
  - app/models/katello/erratum.rb
@@ -972,6 +970,7 @@ files:
972
970
  - app/services/katello/puppet_class_importer_extensions.rb
973
971
  - app/services/katello/repository_type.rb
974
972
  - app/services/katello/repository_type_manager.rb
973
+ - app/views/common/400.html
975
974
  - app/views/dashboard/_content_views_widget.html.erb
976
975
  - app/views/dashboard/_errata_widget.html.erb
977
976
  - app/views/dashboard/_host_collection_widget.html.erb
@@ -1178,7 +1177,6 @@ files:
1178
1177
  - app/views/katello/sync_management/_sync_plans.html.erb
1179
1178
  - app/views/katello/sync_management/index.html.erb
1180
1179
  - app/views/overrides/about/_installed_packages.html.erb
1181
- - app/views/overrides/about/_support_documentation.html.erb
1182
1180
  - app/views/overrides/about/_system_status.html.erb
1183
1181
  - app/views/overrides/activation_keys/_host_environment_select.html.erb
1184
1182
  - app/views/overrides/activation_keys/_host_media_type_select.html.erb
@@ -1388,6 +1386,7 @@ files:
1388
1386
  - db/migrate/20170220679403_remove_system_permissions.rb
1389
1387
  - db/migrate/20170222131211_change_pool_columns_to_dates.rb
1390
1388
  - db/migrate/20170321012632_fill_in_content_view_components.rb
1389
+ - db/migrate/20170523182831_create_docker_meta_tag.rb
1391
1390
  - db/seeds.d/101-locations.rb
1392
1391
  - db/seeds.d/102-organizations.rb
1393
1392
  - db/seeds.d/103-provisioning_templates.rb
@@ -1453,6 +1452,7 @@ files:
1453
1452
  - engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/errata-content-hosts.html
1454
1453
  - engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/bulk/views/errata-details.html
1455
1454
  - engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-host-events.controller.js
1455
+ - engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-host-modal-helper.service.js
1456
1456
  - engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-host-register.controller.js
1457
1457
  - engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-host-status.controller.js
1458
1458
  - engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content-hosts-helper.service.js