foreman_resource_quota 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/foreman_resource_quota/api/v2/resource_quotas_controller.rb +9 -1
- data/app/helpers/foreman_resource_quota/resource_quota_helper.rb +2 -6
- data/app/models/concerns/foreman_resource_quota/host_managed_extensions.rb +2 -0
- data/app/models/concerns/foreman_resource_quota/user_extensions.rb +2 -2
- data/app/models/concerns/foreman_resource_quota/usergroup_extensions.rb +2 -2
- data/app/models/foreman_resource_quota/resource_quota.rb +88 -19
- data/app/models/foreman_resource_quota/resource_quota_missing_host.rb +10 -0
- data/app/models/foreman_resource_quota/resource_quota_user.rb +2 -2
- data/app/models/foreman_resource_quota/resource_quota_usergroup.rb +2 -2
- data/app/views/foreman_resource_quota/api/v2/resource_quotas/base.json.rabl +1 -1
- data/app/views/foreman_resource_quota/api/v2/resource_quotas/missing_hosts.json.rabl +7 -0
- data/config/routes.rb +1 -0
- data/db/migrate/20230306120001_create_resource_quotas.rb +13 -0
- data/lib/foreman_resource_quota/exceptions.rb +1 -0
- data/lib/foreman_resource_quota/register.rb +3 -2
- data/lib/foreman_resource_quota/version.rb +1 -1
- data/package.json +2 -2
- data/webpack/api_helper.js +1 -3
- data/webpack/api_helper.test.js +6 -6
- data/webpack/components/ResourceQuotaForm/components/Properties/TextInputField.js +8 -7
- data/webpack/components/ResourceQuotaForm/components/Properties/index.js +8 -7
- data/webpack/components/ResourceQuotaForm/components/Resource/index.js +8 -7
- data/webpack/components/ResourceQuotaForm/components/Submit.js +8 -7
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ed49765e7cc2e0b0c0059798b8b7055e695d31d7f5c01fad2345f560d6e7c17
|
4
|
+
data.tar.gz: 4b45e90aaea503b7b36f33939e60006a352718d81c7e40ccf0a2c21268556e25
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c937a1edd93a174d873c60ef741f96950d1360e0f4886cd6e72ac472ca52839cb1e692d2f2b2148087dda1af60a68e25c87d865b195363dba418caa520c4721
|
7
|
+
data.tar.gz: 35c8bac94244083c54ba64620341b87e4801b1a190fd40b29c6e350b836e79e1dde15760ce995ed86c2d44db4e53a51497c8c0179a308868d9d34ecf5380c983
|
@@ -14,7 +14,7 @@ module ForemanResourceQuota
|
|
14
14
|
end
|
15
15
|
|
16
16
|
before_action :find_resource, only: %i[show update destroy]
|
17
|
-
before_action :custom_find_resource, only: %i[utilization hosts users usergroups]
|
17
|
+
before_action :custom_find_resource, only: %i[utilization missing_hosts hosts users usergroups]
|
18
18
|
|
19
19
|
api :GET, '/resource_quotas', N_('List all resource quotas')
|
20
20
|
param_group :search_and_pagination, ::Api::V2::BaseController
|
@@ -35,6 +35,14 @@ module ForemanResourceQuota
|
|
35
35
|
process_response @resource_quota
|
36
36
|
end
|
37
37
|
|
38
|
+
api :GET, '/resource_quotas/:id/missing_hosts',
|
39
|
+
N_('Show resources could not be determined when calculating utilization')
|
40
|
+
param :id, :identifier, required: true
|
41
|
+
def missing_hosts
|
42
|
+
@resource_quota.determine_utilization
|
43
|
+
process_response @resource_quota
|
44
|
+
end
|
45
|
+
|
38
46
|
api :GET, '/resource_quotas/:id/hosts', N_('Show hosts of a resource quota')
|
39
47
|
param :id, :identifier, required: true
|
40
48
|
def hosts
|
@@ -74,12 +74,8 @@ module ForemanResourceQuota
|
|
74
74
|
# { <host name>: [<list of to be determined resources>] }
|
75
75
|
# for example:
|
76
76
|
# {
|
77
|
-
# "host_a":
|
78
|
-
#
|
79
|
-
# },
|
80
|
-
# "host_b": {
|
81
|
-
# [ :cpu_cores, :disk_gb ]
|
82
|
-
# },
|
77
|
+
# "host_a": [ :cpu_cores, :disk_gb ],
|
78
|
+
# "host_b": [ :cpu_cores, :disk_gb ],
|
83
79
|
# Parameters:
|
84
80
|
# - hosts: Array of host objects.
|
85
81
|
# - resources: Array of resources (as symbol, e.g. [:cpu_cores, :disk_gb]).
|
@@ -10,6 +10,8 @@ module ForemanResourceQuota
|
|
10
10
|
validate :check_resource_quota_capacity
|
11
11
|
|
12
12
|
belongs_to :resource_quota, class_name: '::ForemanResourceQuota::ResourceQuota'
|
13
|
+
has_one :resource_quota_missing_resources, class_name: '::ForemanResourceQuota::ResourceQuotaMissingHost',
|
14
|
+
inverse_of: :missing_host, foreign_key: :missing_host_id, dependent: :destroy
|
13
15
|
scoped_search relation: :resource_quota, on: :name, complete_value: true, rename: :resource_quota
|
14
16
|
end
|
15
17
|
|
@@ -4,9 +4,9 @@ module ForemanResourceQuota
|
|
4
4
|
module UserExtensions
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
included do
|
7
|
-
has_many :
|
7
|
+
has_many :resource_quotas_users, class_name: 'ForemanResourceQuota::ResourceQuotaUser', dependent: :destroy,
|
8
8
|
inverse_of: :user
|
9
|
-
has_many :resource_quotas, class_name: 'ForemanResourceQuota::ResourceQuota', through: :
|
9
|
+
has_many :resource_quotas, class_name: 'ForemanResourceQuota::ResourceQuota', through: :resource_quotas_users
|
10
10
|
attribute :resource_quota_is_optional, :boolean, default: false
|
11
11
|
|
12
12
|
scoped_search relation: :resource_quotas, on: :name, complete_value: true, rename: :resource_quota
|
@@ -4,9 +4,9 @@ module ForemanResourceQuota
|
|
4
4
|
module UsergroupExtensions
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
included do
|
7
|
-
has_many :
|
7
|
+
has_many :resource_quotas_usergroups, class_name: 'ForemanResourceQuota::ResourceQuotaUsergroup',
|
8
8
|
dependent: :destroy, inverse_of: :usergroup
|
9
|
-
has_many :resource_quotas, class_name: 'ForemanResourceQuota::ResourceQuota', through: :
|
9
|
+
has_many :resource_quotas, class_name: 'ForemanResourceQuota::ResourceQuota', through: :resource_quotas_usergroups
|
10
10
|
|
11
11
|
scoped_search relation: :resource_quotas, on: :name, complete_value: true, rename: :resource_quota
|
12
12
|
end
|
@@ -3,6 +3,7 @@
|
|
3
3
|
module ForemanResourceQuota
|
4
4
|
class ResourceQuota < ApplicationRecord
|
5
5
|
include ResourceQuotaHelper
|
6
|
+
include Exceptions
|
6
7
|
include Authorizable
|
7
8
|
include Parameterizable::ByIdName
|
8
9
|
extend FriendlyId
|
@@ -11,21 +12,20 @@ module ForemanResourceQuota
|
|
11
12
|
|
12
13
|
self.table_name = 'resource_quotas'
|
13
14
|
|
14
|
-
has_many :
|
15
|
-
has_many :
|
16
|
-
|
15
|
+
has_many :resource_quotas_users, class_name: 'ResourceQuotaUser', inverse_of: :resource_quota, dependent: :destroy
|
16
|
+
has_many :resource_quotas_usergroups, class_name: 'ResourceQuotaUsergroup', inverse_of: :resource_quota,
|
17
|
+
dependent: :destroy
|
18
|
+
has_many :resource_quotas_missing_hosts, class_name: 'ResourceQuotaMissingHost', inverse_of: :resource_quota,
|
17
19
|
dependent: :destroy
|
18
|
-
has_many :usergroups, class_name: '::Usergroup', through: :resource_quota_usergroups
|
19
20
|
has_many :hosts, class_name: '::Host::Managed', dependent: :nullify
|
21
|
+
has_many :users, class_name: '::User', through: :resource_quotas_users
|
22
|
+
has_many :usergroups, class_name: '::Usergroup', through: :resource_quotas_usergroups
|
20
23
|
|
21
24
|
validates :name, presence: true, uniqueness: true
|
22
25
|
|
23
26
|
scoped_search on: :name, complete_value: true
|
24
27
|
scoped_search on: :id, complete_enabled: false, only_explicit: true, validator: ScopedSearch::Validators::INTEGER
|
25
28
|
|
26
|
-
attribute :utilization, :jsonb, default: {}
|
27
|
-
attribute :missing_hosts, :jsonb, default: {}
|
28
|
-
|
29
29
|
def number_of_hosts
|
30
30
|
hosts.size
|
31
31
|
end
|
@@ -38,13 +38,68 @@ module ForemanResourceQuota
|
|
38
38
|
usergroups.size
|
39
39
|
end
|
40
40
|
|
41
|
+
def number_of_missing_hosts
|
42
|
+
missing_hosts.size
|
43
|
+
end
|
44
|
+
|
45
|
+
# Returns a Hash with host name as key and a list of missing resources as value
|
46
|
+
# { <host name>: [<list of missing resources>] }
|
47
|
+
# for example:
|
48
|
+
# {
|
49
|
+
# "host_a": [ :cpu_cores, :disk_gb ],
|
50
|
+
# "host_b": [ :memory_mb ],
|
51
|
+
# }
|
52
|
+
def missing_hosts
|
53
|
+
# Initialize default value as an empty array
|
54
|
+
missing_hosts_list = Hash.new { |hash, key| hash[key] = [] }
|
55
|
+
resource_quotas_missing_hosts.each do |missing_host_rel|
|
56
|
+
host_name = missing_host_rel.missing_host.name
|
57
|
+
missing_hosts_list[host_name] << :cpu_cores if missing_host_rel.no_cpu_cores
|
58
|
+
missing_hosts_list[host_name] << :memory_mb if missing_host_rel.no_memory_mb
|
59
|
+
missing_hosts_list[host_name] << :disk_gb if missing_host_rel.no_disk_gb
|
60
|
+
end
|
61
|
+
missing_hosts_list
|
62
|
+
end
|
63
|
+
|
64
|
+
# Set the hosts that are listed in resource_quotas_missing_hosts
|
65
|
+
# Parameters:
|
66
|
+
# - val: Hash of host names and list of missing resources
|
67
|
+
# { <host name>: [<list of missing resources>] }
|
68
|
+
# for example:
|
69
|
+
# {
|
70
|
+
# "host_a": [ :cpu_cores, :disk_gb ],
|
71
|
+
# "host_b": [ :memory_mb ],
|
72
|
+
# }
|
73
|
+
def missing_hosts=(val)
|
74
|
+
# Delete all entries and write new ones
|
75
|
+
resource_quotas_missing_hosts.delete_all
|
76
|
+
val.each do |host_name, missing_resources|
|
77
|
+
add_missing_host(host_name, missing_resources)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def utilization
|
82
|
+
{
|
83
|
+
cpu_cores: utilization_cpu_cores,
|
84
|
+
memory_mb: utilization_memory_mb,
|
85
|
+
disk_gb: utilization_disk_gb,
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
def utilization=(val)
|
90
|
+
update_single_utilization(:cpu_cores, val)
|
91
|
+
update_single_utilization(:memory_mb, val)
|
92
|
+
update_single_utilization(:disk_gb, val)
|
93
|
+
end
|
94
|
+
|
41
95
|
def determine_utilization(additional_hosts = [])
|
42
96
|
quota_hosts = (hosts | (additional_hosts))
|
43
|
-
|
44
|
-
|
45
|
-
|
97
|
+
quota_utilization, missing_hosts_resources = call_utilization_helper(quota_hosts)
|
98
|
+
update(utilization: quota_utilization)
|
99
|
+
update(missing_hosts: missing_hosts_resources)
|
100
|
+
Rails.logger.warn create_hosts_resources_warning(missing_hosts_resources) unless missing_hosts.empty?
|
46
101
|
rescue StandardError => e
|
47
|
-
|
102
|
+
Rails.logger.error("An error occured while determining resources for quota '#{name}': #{e}")
|
48
103
|
raise e
|
49
104
|
end
|
50
105
|
|
@@ -67,17 +122,31 @@ module ForemanResourceQuota
|
|
67
122
|
utilization_from_resource_origins(active_resources, quota_hosts)
|
68
123
|
end
|
69
124
|
|
70
|
-
def
|
71
|
-
warn_text = "Could not determines resources for #{
|
72
|
-
|
73
|
-
|
74
|
-
warn_text << " '#{missing_host.name}': '#{missing_resources}'\n" unless missing_host.nil?
|
125
|
+
def create_hosts_resources_warning(missing_hosts_resources)
|
126
|
+
warn_text = +"Could not determines resources for #{missing_hosts_resources.size} hosts:"
|
127
|
+
missing_hosts_resources.each do |host_name, missing_resources|
|
128
|
+
warn_text << " '#{host_name}': '#{missing_resources}'\n" unless missing_resources.empty?
|
75
129
|
end
|
76
|
-
Rails.logger.warn warn_text
|
77
130
|
end
|
78
131
|
|
79
|
-
def
|
80
|
-
|
132
|
+
def update_single_utilization(attribute, val)
|
133
|
+
return unless val.key?(attribute.to_sym) || val.key?(attribute.to_s)
|
134
|
+
update("utilization_#{attribute}": val[attribute.to_sym] || val[attribute.to_s])
|
135
|
+
end
|
136
|
+
|
137
|
+
def add_missing_host(host_name, missing_resources)
|
138
|
+
return if missing_resources.empty?
|
139
|
+
|
140
|
+
host = Host::Managed.find_by(name: host_name)
|
141
|
+
raise HostNotFoundException if host.nil?
|
142
|
+
|
143
|
+
resource_quotas_missing_hosts << ResourceQuotaMissingHost.new(
|
144
|
+
missing_host: host,
|
145
|
+
resource_quota: self,
|
146
|
+
no_cpu_cores: missing_resources.include?(:cpu_cores),
|
147
|
+
no_memory_mb: missing_resources.include?(:memory_mb),
|
148
|
+
no_disk_gb: missing_resources.include?(:disk_gb)
|
149
|
+
)
|
81
150
|
end
|
82
151
|
end
|
83
152
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ForemanResourceQuota
|
4
|
+
class ResourceQuotaMissingHost < ApplicationRecord
|
5
|
+
self.table_name = 'resource_quotas_missing_hosts'
|
6
|
+
|
7
|
+
belongs_to :resource_quota, inverse_of: :resource_quotas_missing_hosts
|
8
|
+
belongs_to :missing_host, class_name: '::Host::Managed', inverse_of: :resource_quota_missing_resources
|
9
|
+
end
|
10
|
+
end
|
@@ -4,7 +4,7 @@ module ForemanResourceQuota
|
|
4
4
|
class ResourceQuotaUser < ApplicationRecord
|
5
5
|
self.table_name = 'resource_quotas_users'
|
6
6
|
|
7
|
-
belongs_to :resource_quota, inverse_of: :
|
8
|
-
belongs_to :user, class_name: '::User', inverse_of: :
|
7
|
+
belongs_to :resource_quota, inverse_of: :resource_quotas_users
|
8
|
+
belongs_to :user, class_name: '::User', inverse_of: :resource_quotas_users
|
9
9
|
end
|
10
10
|
end
|
@@ -4,7 +4,7 @@ module ForemanResourceQuota
|
|
4
4
|
class ResourceQuotaUsergroup < ApplicationRecord
|
5
5
|
self.table_name = 'resource_quotas_usergroups'
|
6
6
|
|
7
|
-
belongs_to :resource_quota, inverse_of: :
|
8
|
-
belongs_to :usergroup, class_name: '::Usergroup', inverse_of: :
|
7
|
+
belongs_to :resource_quota, inverse_of: :resource_quotas_usergroups
|
8
|
+
belongs_to :usergroup, class_name: '::Usergroup', inverse_of: :resource_quotas_usergroups
|
9
9
|
end
|
10
10
|
end
|
data/config/routes.rb
CHANGED
@@ -9,6 +9,9 @@ class CreateResourceQuotas < ActiveRecord::Migration[6.1]
|
|
9
9
|
t.integer :cpu_cores, default: nil
|
10
10
|
t.integer :memory_mb, default: nil
|
11
11
|
t.integer :disk_gb, default: nil
|
12
|
+
t.integer :utilization_cpu_cores, default: nil
|
13
|
+
t.integer :utilization_memory_mb, default: nil
|
14
|
+
t.integer :utilization_disk_gb, default: nil
|
12
15
|
|
13
16
|
t.timestamps
|
14
17
|
end
|
@@ -24,6 +27,16 @@ class CreateResourceQuotas < ActiveRecord::Migration[6.1]
|
|
24
27
|
t.belongs_to :user
|
25
28
|
t.timestamps
|
26
29
|
end
|
30
|
+
|
31
|
+
create_table :resource_quotas_missing_hosts do |t|
|
32
|
+
t.references :resource_quota, null: false, foreign_key: { to_table: :resource_quotas }
|
33
|
+
t.references :missing_host, null: false, unique: true, foreign_key: { to_table: :hosts }
|
34
|
+
t.boolean :no_cpu_cores, default: false
|
35
|
+
t.boolean :no_memory_mb, default: false
|
36
|
+
t.boolean :no_disk_gb, default: false
|
37
|
+
t.timestamps
|
38
|
+
end
|
39
|
+
|
27
40
|
add_reference :hosts, :resource_quota, foreign_key: { to_table: :resource_quotas }
|
28
41
|
add_column :users, :resource_quota_is_optional, :boolean, default: false
|
29
42
|
end
|
@@ -7,5 +7,6 @@ module ForemanResourceQuota
|
|
7
7
|
class ResourceLimitException < ResourceQuotaException; end
|
8
8
|
class HostResourcesException < ResourceQuotaException; end
|
9
9
|
class ResourceQuotaUtilizationException < ResourceQuotaException; end
|
10
|
+
class HostNotFoundException < ResourceQuotaException; end
|
10
11
|
end
|
11
12
|
end
|
@@ -11,9 +11,10 @@ Foreman::Plugin.register :foreman_resource_quota do
|
|
11
11
|
security_block :foreman_resource_quota do
|
12
12
|
permission 'view_foreman_resource_quota/resource_quotas',
|
13
13
|
{ 'foreman_resource_quota/resource_quotas': %i[index welcome auto_complete_search],
|
14
|
-
'foreman_resource_quota/api/v2/resource_quotas': %i[index show utilization hosts users usergroups
|
14
|
+
'foreman_resource_quota/api/v2/resource_quotas': %i[index show utilization missing_hosts hosts users usergroups
|
15
15
|
auto_complete_search],
|
16
|
-
'foreman_resource_quota/api/v2/resource_quotas/:resource_quota_id/': %i[utilization hosts users
|
16
|
+
'foreman_resource_quota/api/v2/resource_quotas/:resource_quota_id/': %i[utilization missing_hosts hosts users
|
17
|
+
usergroups] },
|
17
18
|
resource_type: 'ForemanResourceQuota::ResourceQuota'
|
18
19
|
permission 'create_foreman_resource_quota/resource_quotas',
|
19
20
|
{ 'foreman_resource_quota/resource_quotas': %i[new create],
|
data/package.json
CHANGED
@@ -28,7 +28,7 @@
|
|
28
28
|
"@babel/core": "^7.24.3",
|
29
29
|
"@sheerun/mutationobserver-shim": "^0.3.3",
|
30
30
|
"@testing-library/react": "^10.4.9",
|
31
|
-
"@theforeman/builder": "^
|
31
|
+
"@theforeman/builder": "^12.0.1",
|
32
32
|
"@theforeman/eslint-plugin-foreman": "13.0.0",
|
33
33
|
"@theforeman/find-foreman": "^13.0.0",
|
34
34
|
"@theforeman/stories": "^12.2.3",
|
@@ -38,7 +38,7 @@
|
|
38
38
|
"eslint": "^6.7.2",
|
39
39
|
"prettier": "^1.19.1",
|
40
40
|
"react-redux-test-utils": "^0.2.0",
|
41
|
-
"stylelint": "^16.
|
41
|
+
"stylelint": "^16.4.0",
|
42
42
|
"stylelint-config-standard": "^36.0.0"
|
43
43
|
}
|
44
44
|
}
|
data/webpack/api_helper.js
CHANGED
@@ -68,19 +68,17 @@ const apiUpdateResourceQuota = (
|
|
68
68
|
|
69
69
|
/**
|
70
70
|
* Handles the callback response from an asynchronous operation, displaying a toast message accordingly.
|
71
|
-
* @param {function} dispatcher - The dispatcher function to dispatch actions.
|
72
71
|
* @param {boolean} isSuccess - Indicates whether the operation was successful or not.
|
73
72
|
* @param {object} response - The response object returned from the operation.
|
74
73
|
* @param {string} successMessage - The success message to display in case of success.
|
75
74
|
* @param {string} errorMessage - The error message to display in case of failure.
|
76
75
|
*/
|
77
76
|
const dispatchAPICallbackToast = (
|
78
|
-
dispatch,
|
79
77
|
isSuccess,
|
80
78
|
response,
|
81
79
|
successMessage,
|
82
80
|
errorMessage
|
83
|
-
) => {
|
81
|
+
) => dispatch => {
|
84
82
|
if (isSuccess) {
|
85
83
|
dispatch(
|
86
84
|
addToast({
|
data/webpack/api_helper.test.js
CHANGED
@@ -21,13 +21,13 @@ describe('dispatchAPICallbackToast', () => {
|
|
21
21
|
const successMessage = 'Success message';
|
22
22
|
const errorMessage = 'Error message';
|
23
23
|
|
24
|
-
dispatchAPICallbackToast(
|
25
|
-
dispatch,
|
24
|
+
const dispatcher = dispatchAPICallbackToast(
|
26
25
|
isSuccess,
|
27
26
|
response,
|
28
27
|
successMessage,
|
29
28
|
errorMessage
|
30
29
|
);
|
30
|
+
dispatcher(dispatch);
|
31
31
|
|
32
32
|
expect(dispatch).toHaveBeenCalledTimes(1);
|
33
33
|
expect(dispatch).toHaveBeenCalledWith({
|
@@ -50,13 +50,13 @@ describe('dispatchAPICallbackToast', () => {
|
|
50
50
|
const successMessage = 'Success message';
|
51
51
|
const errorMessage = 'Error message';
|
52
52
|
|
53
|
-
dispatchAPICallbackToast(
|
54
|
-
dispatch,
|
53
|
+
const dispatcher = dispatchAPICallbackToast(
|
55
54
|
isSuccess,
|
56
55
|
response,
|
57
56
|
successMessage,
|
58
57
|
errorMessage
|
59
58
|
);
|
59
|
+
dispatcher(dispatch);
|
60
60
|
|
61
61
|
expect(dispatch).toHaveBeenCalledTimes(1);
|
62
62
|
expect(dispatch).toHaveBeenCalledWith({
|
@@ -79,13 +79,13 @@ describe('dispatchAPICallbackToast', () => {
|
|
79
79
|
const successMessage = 'Success message';
|
80
80
|
const errorMessage = 'Error message';
|
81
81
|
|
82
|
-
dispatchAPICallbackToast(
|
83
|
-
dispatch,
|
82
|
+
const dispatcher = dispatchAPICallbackToast(
|
84
83
|
isSuccess,
|
85
84
|
response,
|
86
85
|
successMessage,
|
87
86
|
errorMessage
|
88
87
|
);
|
88
|
+
dispatcher(dispatch);
|
89
89
|
|
90
90
|
expect(dispatch).toHaveBeenCalledTimes(1);
|
91
91
|
expect(dispatch).toHaveBeenCalledWith({
|
@@ -6,7 +6,7 @@ import { translate as __ } from 'foremanReact/common/I18n';
|
|
6
6
|
|
7
7
|
import ActionableDetail from '../../../../lib/ActionableDetail';
|
8
8
|
import StaticDetail from './StaticDetail';
|
9
|
-
import dispatchAPICallbackToast from '../../../../api_helper';
|
9
|
+
import { dispatchAPICallbackToast } from '../../../../api_helper';
|
10
10
|
|
11
11
|
const TextInputField = ({
|
12
12
|
initialValue,
|
@@ -36,12 +36,13 @@ const TextInputField = ({
|
|
36
36
|
|
37
37
|
const callback = (success, response) => {
|
38
38
|
setIsLoading(false);
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
39
|
+
dispatch(
|
40
|
+
dispatchAPICallbackToast(
|
41
|
+
success,
|
42
|
+
response,
|
43
|
+
`Sucessfully applied ${label}.`,
|
44
|
+
`An error occurred appyling ${label}.`
|
45
|
+
)
|
45
46
|
);
|
46
47
|
};
|
47
48
|
|
@@ -22,7 +22,7 @@ import ClusterIcon from '@patternfly/react-icons/dist/esm/icons/cluster-icon';
|
|
22
22
|
import SyncAltIcon from '@patternfly/react-icons/dist/esm/icons/sync-alt-icon';
|
23
23
|
|
24
24
|
import { translate as __ } from 'foremanReact/common/I18n';
|
25
|
-
import dispatchAPICallbackToast from '../../../../api_helper';
|
25
|
+
import { dispatchAPICallbackToast } from '../../../../api_helper';
|
26
26
|
|
27
27
|
import './Properties.scss';
|
28
28
|
import StatusPropertiesLabel from './StatusPropertiesLabel';
|
@@ -58,12 +58,13 @@ const Properties = ({
|
|
58
58
|
|
59
59
|
const callbackFetch = (success, response) => {
|
60
60
|
setIsFetchLoading(false);
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
61
|
+
dispatch(
|
62
|
+
dispatchAPICallbackToast(
|
63
|
+
success,
|
64
|
+
response,
|
65
|
+
`Sucessfully fetched latest data.`,
|
66
|
+
`An error occurred fetching quota information.`
|
67
|
+
)
|
67
68
|
);
|
68
69
|
};
|
69
70
|
|
@@ -25,7 +25,7 @@ import UnitInputField from './UnitInputField';
|
|
25
25
|
import UtilizationProgress from './UtilizationProgress';
|
26
26
|
|
27
27
|
import { resourceAttributesByIdentifier } from '../../ResourceQuotaFormConstants';
|
28
|
-
import dispatchAPICallbackToast from '../../../../api_helper';
|
28
|
+
import { dispatchAPICallbackToast } from '../../../../api_helper';
|
29
29
|
|
30
30
|
// TODO: Visualize maximum resource (tooltip?)
|
31
31
|
// TODO: Add error message if given quota limit exceeds present quota utilization (consumed resources)
|
@@ -70,12 +70,13 @@ const Resource = ({
|
|
70
70
|
setInputValue(response.data[resourceIdentifier]);
|
71
71
|
setIsEnabled(response.data[resourceIdentifier] !== null);
|
72
72
|
}
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
73
|
+
dispatch(
|
74
|
+
dispatchAPICallbackToast(
|
75
|
+
success,
|
76
|
+
response,
|
77
|
+
`Sucessfully applied ${resourceTitle}.`,
|
78
|
+
`An error occurred appyling ${resourceTitle}.`
|
79
|
+
)
|
79
80
|
);
|
80
81
|
};
|
81
82
|
|
@@ -5,7 +5,7 @@ import { Button, Flex, FlexItem } from '@patternfly/react-core';
|
|
5
5
|
|
6
6
|
import { translate as __ } from 'foremanReact/common/I18n';
|
7
7
|
|
8
|
-
import dispatchAPICallbackToast from '../../../api_helper';
|
8
|
+
import { dispatchAPICallbackToast } from '../../../api_helper';
|
9
9
|
|
10
10
|
import {
|
11
11
|
RESOURCE_IDENTIFIER_ID,
|
@@ -27,12 +27,13 @@ const Submit = ({ isValid, onCreate, onSubmit }) => {
|
|
27
27
|
|
28
28
|
const onCreateCallback = (success, response) => {
|
29
29
|
setIsSubmitLoading(false);
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
30
|
+
dispatch(
|
31
|
+
dispatchAPICallbackToast(
|
32
|
+
success,
|
33
|
+
response,
|
34
|
+
`Sucessfully created new Resource Quota`,
|
35
|
+
`An error occurred while creating new Resource Quota.`
|
36
|
+
)
|
36
37
|
);
|
37
38
|
if (onSubmit) onSubmit(success);
|
38
39
|
};
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_resource_quota
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bastian Schmidt
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-04-
|
11
|
+
date: 2024-04-30 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Foreman Plug-in to manage resource usage among users.
|
14
14
|
email:
|
@@ -30,6 +30,7 @@ files:
|
|
30
30
|
- app/models/concerns/foreman_resource_quota/user_extensions.rb
|
31
31
|
- app/models/concerns/foreman_resource_quota/usergroup_extensions.rb
|
32
32
|
- app/models/foreman_resource_quota/resource_quota.rb
|
33
|
+
- app/models/foreman_resource_quota/resource_quota_missing_host.rb
|
33
34
|
- app/models/foreman_resource_quota/resource_quota_user.rb
|
34
35
|
- app/models/foreman_resource_quota/resource_quota_usergroup.rb
|
35
36
|
- app/services/foreman_resource_quota/resource_origin.rb
|
@@ -43,6 +44,7 @@ files:
|
|
43
44
|
- app/views/foreman_resource_quota/api/v2/resource_quotas/hosts.json.rabl
|
44
45
|
- app/views/foreman_resource_quota/api/v2/resource_quotas/index.json.rabl
|
45
46
|
- app/views/foreman_resource_quota/api/v2/resource_quotas/main.json.rabl
|
47
|
+
- app/views/foreman_resource_quota/api/v2/resource_quotas/missing_hosts.json.rabl
|
46
48
|
- app/views/foreman_resource_quota/api/v2/resource_quotas/show.json.rabl
|
47
49
|
- app/views/foreman_resource_quota/api/v2/resource_quotas/update.json.rabl
|
48
50
|
- app/views/foreman_resource_quota/api/v2/resource_quotas/usergroups.json.rabl
|
@@ -127,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
129
|
- !ruby/object:Gem::Version
|
128
130
|
version: '0'
|
129
131
|
requirements: []
|
130
|
-
rubygems_version: 3.3.
|
132
|
+
rubygems_version: 3.3.27
|
131
133
|
signing_key:
|
132
134
|
specification_version: 4
|
133
135
|
summary: Foreman Plug-in for resource quota
|