katello 3.4.1 → 3.4.2

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 (25) hide show
  1. checksums.yaml +4 -4
  2. data/app/lib/actions/katello/host/destroy.rb +2 -0
  3. data/app/lib/actions/katello/host/register.rb +16 -14
  4. data/app/lib/actions/katello/repository/remove_content.rb +1 -1
  5. data/app/lib/katello/resources/candlepin.rb +2 -2
  6. data/app/models/katello/concerns/smart_proxy_extensions.rb +1 -1
  7. data/app/models/katello/glue/candlepin/pool.rb +1 -1
  8. data/app/models/katello/ping.rb +0 -2
  9. data/app/models/katello/repository.rb +1 -1
  10. data/app/models/katello/rhsm_fact_importer.rb +19 -29
  11. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-actions.html +3 -2
  12. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/content-hosts/content/views/content-host-packages-applicable.html +4 -3
  13. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/host-collections/details/host-collection-copy.controller.js +1 -1
  14. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/product-details.controller.js +26 -1
  15. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/product-repositories.controller.js +2 -3
  16. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/checksum.service.js +22 -0
  17. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js +8 -8
  18. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details.controller.js +3 -3
  19. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/views/repository-details.html +3 -2
  20. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/new/new-repository.controller.js +4 -2
  21. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/views/product-details.html +1 -1
  22. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/discovery-create.controller.js +1 -1
  23. data/engines/bastion_katello/app/assets/javascripts/bastion_katello/products/discovery/views/discovery-create.html +1 -1
  24. data/lib/katello/version.rb +1 -1
  25. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a69d7fd688dc60f6918570d9a46f180c5837b95b
4
- data.tar.gz: f59ba04326eeec8fbb1582ff99b6b118ae04de3d
3
+ metadata.gz: 87cafa0ce4cb5fa431eb76d8fd7f7eb2b2c23f85
4
+ data.tar.gz: c62487b569a5bffafeb677c9336db52ba0c17531
5
5
  SHA512:
6
- metadata.gz: 1ba9d1e9c4b60b6cbb207bfcf911c21b08fa705e661ce855104cf23d5bacaf843dc7a685cabc179f1f3cd8fbc80140147c551f499f097970de7e1f9a360b7822
7
- data.tar.gz: 299af24880144ecdc9b3fd6215fb26170e3f08c94aa17150721289ecd4807c5b724244342b7f7cb2865e5652f7d8d641d05df1b5f6d2a71de6b4d3f852f412fd
6
+ metadata.gz: d1561efea66f466fd4632eb6370b6c2d6658f743134e33b2e64efde612b217146465c63f3fae99c34856d477979610238bab6e7871bcc3237b890ee4d962c740
7
+ data.tar.gz: 3d7b4d701f24976c24aea87e2a437fd9fefc39ada515e694f0eb5758af5efd0cc6f274ac8f73b04f9c3f46a634f646bf78fa4d58c9f297e1f70426918b75ae3b
@@ -34,6 +34,8 @@ module Actions
34
34
 
35
35
  def unregister(host)
36
36
  if host.content_facet
37
+ host.content_facet.bound_repositories = []
38
+ host.content_facet.applicable_errata = []
37
39
  host.content_facet.uuid = nil
38
40
  host.content_facet.save!
39
41
  end
@@ -55,20 +55,22 @@ module Actions
55
55
  end
56
56
 
57
57
  def finalize
58
- host = ::Host.find(input[:host_id])
59
- host.content_facet.uuid = input[:uuid]
60
- host.subscription_facet.uuid = input[:uuid]
61
-
62
- user = ::User.find(input[:user_id])
63
- host.subscription_facet.user = user unless user.nil? || user.hidden?
64
-
65
- host.content_facet.save!
66
- host.subscription_facet.update_from_consumer_attributes(host.subscription_facet.candlepin_consumer.
67
- consumer_attributes.except(:installedProducts, :guestIds, :facts))
68
- host.subscription_facet.save!
69
- host.subscription_facet.update_subscription_status
70
- host.content_facet.update_errata_status
71
- host.refresh_global_status!
58
+ User.as_anonymous_admin do
59
+ host = ::Host.find(input[:host_id])
60
+ host.content_facet.uuid = input[:uuid]
61
+ host.subscription_facet.uuid = input[:uuid]
62
+
63
+ user = ::User.find(input[:user_id])
64
+ host.subscription_facet.user = user unless user.nil? || user.hidden?
65
+
66
+ host.content_facet.save!
67
+ host.subscription_facet.update_from_consumer_attributes(host.subscription_facet.candlepin_consumer.
68
+ consumer_attributes.except(:installedProducts, :guestIds, :facts))
69
+ host.subscription_facet.save!
70
+ host.subscription_facet.update_subscription_status
71
+ host.content_facet.update_errata_status
72
+ host.refresh_global_status!
73
+ end
72
74
  end
73
75
 
74
76
  def rescue_strategy
@@ -42,7 +42,7 @@ module Actions
42
42
 
43
43
  def create_sub_plans
44
44
  trigger(Actions::Katello::Repository::MetadataGenerate,
45
- ::Katello::Repository.find(input[:repository_id]))
45
+ ::Katello::Repository.find(input[:repository][:id]))
46
46
  end
47
47
 
48
48
  def resource_locks
@@ -538,8 +538,8 @@ module Katello
538
538
  self.delete(path(id), self.default_headers).code.to_i
539
539
  end
540
540
 
541
- def entitlements(pool_id)
542
- entitlement_json = self.get("#{path(pool_id)}/entitlements", self.default_headers).body
541
+ def entitlements(pool_id, included = [])
542
+ entitlement_json = self.get("#{path(pool_id)}/entitlements?#{included_list(included)}", self.default_headers).body
543
543
  JSON.parse(entitlement_json)
544
544
  end
545
545
 
@@ -52,7 +52,7 @@ module Katello
52
52
  scope :with_content, -> { with_features(PULP_FEATURE, PULP_NODE_FEATURE) }
53
53
 
54
54
  def self.default_capsule
55
- with_features(PULP_FEATURE).first
55
+ unscoped.with_features(PULP_FEATURE).first
56
56
  end
57
57
 
58
58
  def self.default_capsule!
@@ -135,7 +135,7 @@ module Katello
135
135
  end
136
136
 
137
137
  def hosts
138
- entitlements = Resources::Candlepin::Pool.entitlements(self.cp_id)
138
+ entitlements = Resources::Candlepin::Pool.entitlements(self.cp_id, ["consumer.uuid"])
139
139
  uuids = entitlements.map { |ent| ent["consumer"]["uuid"] }
140
140
  ::Host.where(:id => Katello::Host::SubscriptionFacet.where(:uuid => uuids).pluck(:host_id))
141
141
  end
@@ -12,11 +12,9 @@ module Katello
12
12
  #
13
13
  # Calls "status" services in all backend engines.
14
14
  #
15
- # This should be called with User.current set if you want to check pulp_auth
16
15
  def ping(services: SERVICES, capsule_id: nil)
17
16
  result = {}
18
17
  services.each { |service| result[service] = {} }
19
- result.delete(:pulp_auth) unless User.current
20
18
 
21
19
  ping_pulp_without_auth(result[:pulp], capsule_id) if result.include?(:pulp)
22
20
  ping_candlepin_without_auth(result[:candlepin]) if result.include?(:candlepin)
@@ -88,7 +88,7 @@ module Katello
88
88
 
89
89
  validates :product_id, :presence => true
90
90
  validates :pulp_id, :presence => true, :uniqueness => true, :if => proc { |r| r.name.present? }
91
- validates :checksum_type, :inclusion => {:in => CHECKSUM_TYPES, :allow_blank => true}
91
+ validates :checksum_type, :inclusion => {:in => CHECKSUM_TYPES}, :allow_blank => true
92
92
  validates :docker_upstream_name, :allow_blank => true, :if => :docker?, :length => { :maximum => 255 }, :format => {
93
93
  :with => /\A([a-z0-9]+[a-z0-9\-\_\.]*)+(\/[a-z0-9]+[a-z0-9\-\_\.]*)?\z/,
94
94
  :message => _("must be a valid docker name")
@@ -1,12 +1,27 @@
1
1
  module Katello
2
- class RhsmFactImporter < ::FactImporter
2
+ class RhsmFactImporter < ::StructuredFactImporter
3
3
  def fact_name_class
4
4
  Katello::RhsmFactName
5
5
  end
6
6
 
7
- def initialize(host, facts = {})
8
- super
9
- @facts = change_separator(@facts)
7
+ def normalize(facts)
8
+ facts = super
9
+ facts = change_separator(facts)
10
+ add_compose_facts(facts)
11
+ end
12
+
13
+ def add_compose_facts(facts)
14
+ additional_keys = []
15
+ facts.keys.each do |fact_name|
16
+ parts = fact_name.split(RhsmFactName::SEPARATOR)
17
+ additional_keys += parts[0..-2].reduce([]) { |memo, part| memo << [memo.last, part].compact.join(RhsmFactName::SEPARATOR) }
18
+ end
19
+
20
+ # add the facts hierarchy to facts hash
21
+ additional_keys.uniq.each do |key|
22
+ facts[key] = nil
23
+ end
24
+ facts
10
25
  end
11
26
 
12
27
  def change_separator(facts)
@@ -16,30 +31,5 @@ module Katello
16
31
  end
17
32
  to_ret
18
33
  end
19
-
20
- def add_new_facts
21
- @facts.keys.each { |key| add_fact_name(key) }
22
- super
23
- end
24
-
25
- def add_fact_name(name, is_parent = false)
26
- begin
27
- parent_name = find_parent(name)
28
- parent_fact_name = add_fact_name(parent_name, true) if parent_name
29
- fact_name = RhsmFactName.where(:name => name).first_or_create! do |new_fact|
30
- new_fact.parent = parent_fact_name
31
- new_fact.compose = is_parent
32
- end
33
- rescue ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid
34
- retry
35
- end
36
- FactValue.create(:fact_name => fact_name, :value => nil, :host => @host) if is_parent
37
- fact_name
38
- end
39
-
40
- def find_parent(name)
41
- split = name.split(Katello::RhsmFactName::SEPARATOR)
42
- split[0..split.length - 2].join(Katello::RhsmFactName::SEPARATOR) if split.length > 1
43
- end
44
34
  end
45
35
  end
@@ -32,7 +32,8 @@
32
32
  ng-model="packageAction.term"/>
33
33
 
34
34
  <span uib-dropdown class="input-group-btn">
35
- <button class="btn btn-default" type="button"
35
+ <button class="btn btn-primary" type="button"
36
+ ng-click="performPackageAction(packageAction.actionType, packageAction.term)"
36
37
  ng-hide="denied('edit_hosts', host)"
37
38
  ng-disabled="working || packageAction.term === undefined || packageAction.term.length === 0"
38
39
  translate>
@@ -54,7 +55,7 @@
54
55
  </div>
55
56
 
56
57
  <div class="form-group">
57
- <button class="btn btn-primary" type="button"
58
+ <button class="btn btn-default" type="button"
58
59
  translate
59
60
  ng-disabled="working"
60
61
  ng-click="updateAll()">
@@ -12,12 +12,13 @@
12
12
  Your search returned zero Packages.
13
13
  </span>
14
14
 
15
- <div data-block="actions" bst-feature-flag="remote_actions">
15
+ <div data-block="list-actions" bst-feature-flag="remote_actions">
16
16
  <div ng-hide="denied('edit_hosts', host)" class="nutupane-actions fr">
17
17
  <form ng-submit="performDefaultUpdateAction()" role="form">
18
18
 
19
19
  <span uib-dropdown class="btn-group">
20
- <button class="btn btn-default" type="button"
20
+ <button class="btn btn-primary" type="button"
21
+ ng-click="performDefaultUpdateAction()"
21
22
  ng-hide="denied('edit_hosts', host)"
22
23
  ng-disabled="working || table.numSelected === 0"
23
24
  translate>
@@ -36,7 +37,7 @@
36
37
  </ul>
37
38
  </span>
38
39
 
39
- <button class="btn btn-primary"
40
+ <button class="btn btn-default"
40
41
  type="button"
41
42
  translate
42
43
  ng-disabled="working"
@@ -16,7 +16,7 @@
16
16
  HostCollection.copy({id: $scope.$stateParams.hostCollectionId, 'host_collection': {name: newName}}, function (response) {
17
17
  $scope.transitionTo('host-collection.info', {hostCollectionId: response.id});
18
18
  }, function (response) {
19
- $scope.errorMessages.push(response.data.displayMessage);
19
+ $scope.$parent.errorMessages.push(response.data.displayMessage);
20
20
  });
21
21
  };
22
22
  }
@@ -4,14 +4,17 @@
4
4
  *
5
5
  * @requires $scope
6
6
  * @requires $state
7
+ * @requires $uibModal
8
+ * @requires translate
7
9
  * @requires Product
10
+ * @requires GlobalNotification
8
11
  * @requires ApiErrorHandler
9
12
  *
10
13
  * @description
11
14
  * Provides the functionality for the product details action pane.
12
15
  */
13
16
  angular.module('Bastion.products').controller('ProductDetailsController',
14
- ['$scope', '$state', 'Product', 'ApiErrorHandler', function ($scope, $state, Product, ApiErrorHandler) {
17
+ ['$scope', '$state', '$uibModal', 'translate', 'Product', 'GlobalNotification', 'ApiErrorHandler', function ($scope, $state, $uibModal, translate, Product, GlobalNotification, ApiErrorHandler) {
15
18
  $scope.successMessages = [];
16
19
  $scope.errorMessages = [];
17
20
  $scope.page = {
@@ -65,5 +68,27 @@ angular.module('Bastion.products').controller('ProductDetailsController',
65
68
 
66
69
  return readOnlyReason;
67
70
  };
71
+
72
+ $scope.updateProduct = function () {
73
+ function success() {
74
+ GlobalNotification.setSuccessMessage(translate('Sync Plan created and assigned to product.'));
75
+ }
76
+
77
+ function error(response) {
78
+ ApiErrorHandler.handlePUTRequestErrors(response, $scope);
79
+ }
80
+
81
+ $scope.product.$update(success, error);
82
+ };
83
+
84
+ $scope.openSyncPlanModal = function () {
85
+ $uibModal.open({
86
+ templateUrl: 'products/new/views/new-sync-plan-modal.html',
87
+ controller: 'NewSyncPlanModalController'
88
+ }).result.then(function ($value) {
89
+ $scope.product['sync_plan_id'] = $value.id;
90
+ $scope.updateProduct();
91
+ });
92
+ };
68
93
  }]
69
94
  );
@@ -16,8 +16,8 @@
16
16
  * Provides the functionality for manipulating repositories attached to a product.
17
17
  */
18
18
  angular.module('Bastion.products').controller('ProductRepositoriesController',
19
- ['$scope', '$state', '$location', 'ApiErrorHandler', 'Product', 'Repository', 'RepositoryBulkAction', 'CurrentOrganization', 'Nutupane', 'translate',
20
- function ($scope, $state, $location, ApiErrorHandler, Product, Repository, RepositoryBulkAction, CurrentOrganization, Nutupane, translate) {
19
+ ['$scope', '$state', '$location', 'ApiErrorHandler', 'Product', 'Repository', 'RepositoryBulkAction', 'CurrentOrganization', 'Nutupane',
20
+ function ($scope, $state, $location, ApiErrorHandler, Product, Repository, RepositoryBulkAction, CurrentOrganization, Nutupane) {
21
21
  var repositoriesNutupane = new Nutupane(Repository, {
22
22
  'product_id': $scope.$stateParams.productId,
23
23
  'search': $location.search().search || "",
@@ -53,7 +53,6 @@ angular.module('Bastion.products').controller('ProductRepositoriesController',
53
53
 
54
54
  $scope.removingTasks = [];
55
55
 
56
- $scope.checksums = [{name: translate('Default'), id: null}, {id: 'sha256', name: 'sha256'}, {id: 'sha1', name: 'sha1'}];
57
56
  $scope.table = repositoriesNutupane.table;
58
57
 
59
58
  $scope.syncSelectedRepositories = function () {
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @ngdoc service
3
+ * @name Bastion.repository.service:checksum
4
+ *
5
+ * @requires translate
6
+ *
7
+ * @description
8
+ * Provides a checksum for repositories
9
+ */
10
+ angular.module('Bastion.repositories').service('Checksum',
11
+ ['translate', function (translate) {
12
+
13
+ this.checksums = [{name: translate('Default'), id: null}, {id: 'sha256', name: 'sha256'}, {id: 'sha1', name: 'sha1'}];
14
+
15
+ this.checksumType = function (checksum) {
16
+ if (checksum === null) {
17
+ checksum = translate('Default');
18
+ }
19
+ return checksum;
20
+ };
21
+ }]
22
+ );
@@ -7,6 +7,7 @@
7
7
  * @requires translate
8
8
  * @requires GPGKey
9
9
  * @requires CurrentOrganization
10
+ * @requires Checksum
10
11
  * @requires DownloadPolicy
11
12
  * @requires OstreeUpstreamSyncPolicy
12
13
  *
@@ -14,8 +15,8 @@
14
15
  * Provides the functionality for the repository details info page.
15
16
  */
16
17
  angular.module('Bastion.repositories').controller('RepositoryDetailsInfoController',
17
- ['$scope', '$q', 'translate', 'GPGKey', 'CurrentOrganization', 'DownloadPolicy', 'OstreeUpstreamSyncPolicy',
18
- function ($scope, $q, translate, GPGKey, CurrentOrganization, DownloadPolicy, OstreeUpstreamSyncPolicy) {
18
+ ['$scope', '$q', 'translate', 'GPGKey', 'CurrentOrganization', 'Checksum', 'DownloadPolicy', 'OstreeUpstreamSyncPolicy',
19
+ function ($scope, $q, translate, GPGKey, CurrentOrganization, Checksum, DownloadPolicy, OstreeUpstreamSyncPolicy) {
19
20
  $scope.successMessages = [];
20
21
  $scope.errorMessages = [];
21
22
  $scope.uploadSuccessMessages = [];
@@ -94,15 +95,14 @@ angular.module('Bastion.repositories').controller('RepositoryDetailsInfoControll
94
95
  $scope.progress.uploading = false;
95
96
  };
96
97
 
97
- $scope.checksumTypeDisplay = function (checksum) {
98
- if (checksum === null) {
99
- checksum = translate('Default');
100
- }
101
- return checksum;
102
- };
98
+ $scope.checksums = Checksum.checksums;
103
99
  $scope.downloadPolicies = DownloadPolicy.downloadPolicies;
104
100
  $scope.ostreeUpstreamSyncPolicies = OstreeUpstreamSyncPolicy.syncPolicies;
105
101
 
102
+ $scope.checksumTypeDisplay = function (checksum) {
103
+ return Checksum.checksumType(checksum);
104
+ };
105
+
106
106
  $scope.downloadPolicyDisplay = function (downloadPolicy) {
107
107
  return DownloadPolicy.downloadPolicyName(downloadPolicy);
108
108
  };
@@ -98,12 +98,12 @@
98
98
  var readOnlyReason = null;
99
99
 
100
100
  if (repo.$resolved && product.$resolved) {
101
- if ($scope.denied('destroy_products', product)) {
102
- readOnlyReason = 'permissions';
103
- } else if (repo.promoted) {
101
+ if (repo.promoted) {
104
102
  readOnlyReason = 'published';
105
103
  } else if (repo['product_type'] === "redhat") {
106
104
  readOnlyReason = 'redhat';
105
+ } else if ($scope.denied('deletable', repo)) {
106
+ readOnlyReason = 'permissions';
107
107
  }
108
108
  }
109
109
  return readOnlyReason;
@@ -46,12 +46,13 @@
46
46
  </span>
47
47
  </li>
48
48
 
49
- <li class="divider" bst-feature-flag="custom_products" ng-hide="denied('delete_repositories')"></li>
49
+ <li class="divider" bst-feature-flag="custom_products"></li>
50
50
  <li role="menuitem" ng-show="canRemove(repository, product)">
51
51
  <a ng-click="openModal()" translate>
52
52
  Remove Repository
53
53
  </a>
54
-
54
+ </li>
55
+ <li>
55
56
  <span class="disabled" ng-hide="canRemove(repository, product)">
56
57
  <span translate>Cannot Remove</span>
57
58
 
@@ -11,6 +11,7 @@
11
11
  * @requires GlobalNotification
12
12
  * @requires ApiErrorHandler
13
13
  * @requires BastionConfig
14
+ * @requires Checksum
14
15
  * @requires DownloadPolicy
15
16
  * @requires OstreeUpstreamSyncPolicy
16
17
  *
@@ -18,8 +19,8 @@
18
19
  * Controls the creation of an empty Repository object for use by sub-controllers.
19
20
  */
20
21
  angular.module('Bastion.repositories').controller('NewRepositoryController',
21
- ['$scope', 'Repository', 'Product', 'GPGKey', 'FormUtils', 'translate', 'GlobalNotification', 'ApiErrorHandler', 'BastionConfig', 'DownloadPolicy', 'OstreeUpstreamSyncPolicy',
22
- function ($scope, Repository, Product, GPGKey, FormUtils, translate, GlobalNotification, ApiErrorHandler, BastionConfig, DownloadPolicy, OstreeUpstreamSyncPolicy) {
22
+ ['$scope', 'Repository', 'Product', 'GPGKey', 'FormUtils', 'translate', 'GlobalNotification', 'ApiErrorHandler', 'BastionConfig', 'Checksum', 'DownloadPolicy', 'OstreeUpstreamSyncPolicy',
23
+ function ($scope, Repository, Product, GPGKey, FormUtils, translate, GlobalNotification, ApiErrorHandler, BastionConfig, Checksum, DownloadPolicy, OstreeUpstreamSyncPolicy) {
23
24
 
24
25
  function success() {
25
26
  GlobalNotification.setSuccessMessage(translate('Repository %s successfully created.').replace('%s', $scope.repository.name));
@@ -74,6 +75,7 @@ angular.module('Bastion.repositories').controller('NewRepositoryController',
74
75
  $scope.repositoryTypes = data;
75
76
  });
76
77
 
78
+ $scope.checksums = Checksum.checksums;
77
79
  $scope.downloadPolicies = DownloadPolicy.downloadPolicies;
78
80
  $scope.ostreeUpstreamSyncPolicies = OstreeUpstreamSyncPolicy.syncPolicies;
79
81
 
@@ -15,7 +15,7 @@
15
15
  </li>
16
16
 
17
17
  <li role="menuitem" ng-hide="denied('create_sync_plans')">
18
- <a ui-sref="openProductModal()">
18
+ <a ng-click="openSyncPlanModal()">
19
19
  <span translate>New Sync Plan</span>
20
20
  </a>
21
21
  </li>
@@ -37,7 +37,7 @@ angular.module('Bastion.products').controller('DiscoveryCreateController',
37
37
  name: repo.name,
38
38
  label: repo.label,
39
39
  'content_type': repo.contentType,
40
- url: repo.url,
40
+ url: repo.url + repo.path,
41
41
  'product_id': $scope.createRepoChoices.existingProductId,
42
42
  unprotected: $scope.createRepoChoices.unprotected,
43
43
  'verify_ssl': $scope.createRepoChoices.verifySsl,
@@ -164,7 +164,7 @@
164
164
  <span ng-show="creating() || repo.created">{{ repo.label }}</span>
165
165
  </td>
166
166
  <td bst-table-cell ng-show="discovery.contentType === 'yum'">
167
- {{ repo.url }}
167
+ {{ repo.url + repo.path }}
168
168
  </td>
169
169
  </tr>
170
170
  </tbody>
@@ -1,3 +1,3 @@
1
1
  module Katello
2
- VERSION = "3.4.1".freeze
2
+ VERSION = "3.4.2".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.1
4
+ version: 3.4.2
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-13 00:00:00.000000000 Z
11
+ date: 2017-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -1762,6 +1762,7 @@ files:
1762
1762
  - engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/product-details-info.controller.js
1763
1763
  - engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/product-details.controller.js
1764
1764
  - engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/product-repositories.controller.js
1765
+ - engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/checksum.service.js
1765
1766
  - engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-advanced-sync.controller.js
1766
1767
  - engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.controller.js
1767
1768
  - engines/bastion_katello/app/assets/javascripts/bastion_katello/products/details/repositories/details/repository-details-info.filter.js