Skip to content

Commit bea27dd

Browse files
authored
Merge pull request #312 from agrare/use_api_chunking
API Chunking Support
2 parents 69ace96 + 2b2a7e4 commit bea27dd

File tree

9 files changed

+5461
-2981
lines changed

9 files changed

+5461
-2981
lines changed

app/models/manageiq/providers/kubernetes/container_manager/refresher_mixin.rb

+11-1
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,18 @@ def parse_targeted_inventory(ems, target, inventory)
6363

6464
def fetch_entities(client, entities)
6565
entities.each_with_object({}) do |entity, h|
66+
continue = nil
67+
h[entity[:name].singularize] ||= []
68+
6669
begin
67-
h[entity[:name].singularize] = client.send("get_#{entity[:name]}")
70+
loop do
71+
entities = client.send("get_#{entity[:name]}", :limit => refresher_options.chunk_size, :continue => continue)
72+
73+
h[entity[:name].singularize].concat(entities)
74+
break if entities.last?
75+
76+
continue = entities.continue
77+
end
6878
rescue KubeException => e
6979
raise e if entity[:default].nil?
7080
$log.warn("Unexpected Exception during refresh: #{e}")

config/settings.yml

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
:kubernetes:
6060
:refresh_interval: 15.minutes
6161
:streaming_refresh: false
62+
:chunk_size: 1_000
6263
:inventory_object_refresh: true
6364
:inventory_collections:
6465
:saver_strategy: batch

manageiq-providers-kubernetes.gemspec

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
1515

1616
s.add_runtime_dependency("hawkular-client", "~> 4.1")
1717
s.add_runtime_dependency("image-inspector-client", "~> 2.0")
18-
s.add_runtime_dependency("kubeclient", "~> 4.0")
18+
s.add_runtime_dependency("kubeclient", "~> 4.1", ">= 4.1.1")
1919
s.add_runtime_dependency("prometheus-alert-buffer-client", "~> 0.2.0")
2020
s.add_runtime_dependency("prometheus-api-client", "~> 0.6")
2121
s.add_runtime_dependency("more_core_extensions", "~> 3.6")

spec/models/manageiq/providers/kubernetes/container_manager/refresh_mixin_spec.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
describe ManageIQ::Providers::Kubernetes::ContainerManager::RefresherMixin do
44
let(:client) { double("client") }
5-
let(:dummy) { (Class.new { include ManageIQ::Providers::Kubernetes::ContainerManager::RefresherMixin }).new }
5+
let(:ems) { FactoryBot.create(:ems_kubernetes) }
6+
let(:dummy) { ManageIQ::Providers::Kubernetes::ContainerManager::Refresher.new([ems]) }
67

78
context 'when an exception is thrown' do
89
before { allow(client).to receive(:get_pods) { raise KubeException.new(0, 'oh-no', nil) } }

spec/models/manageiq/providers/kubernetes/container_manager/refresher_spec.rb

+11-6
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@
2828
end
2929

3030
def full_refresh_test(expected_extra_tags: [])
31-
VCR.use_cassette(described_class.name.underscore) do # , :record => :new_episodes) do
31+
# VCR by default matches on :method and the whole :uri
32+
# In this case we are sending :limit in the :query section but we
33+
# want to simulate an older kube API that doesn't respond to that
34+
# param. This can be done by having VCR ignore the :query component
35+
# of the URI and return the legacy style responses.
36+
VCR.use_cassette(described_class.name.underscore, :match_requests_on => [:method, :host, :path]) do # , :record => :new_episodes) do
3237
EmsRefresh.refresh(@ems)
3338
end
3439
@ems.reload
@@ -424,15 +429,15 @@ def tag_in_category_with_description(category, description)
424429
FactoryBot.create(:container_node, :name => "node", :ems_id => @ems.id)
425430
end
426431

427-
let(:container_volumes_count) { 21 }
432+
let(:container_volumes_count) { 68 }
428433
let(:persintent_volumes_count) { 3 }
429434
let(:object_counts) do
430435
# using strings instead of actual model classes for compact rspec diffs
431436
{
432437
'ContainerNode' => 2, # including the fake node
433-
'ContainerGroup' => 9,
434-
'Container' => 9,
435-
'ContainerService' => 12,
438+
'ContainerGroup' => 22,
439+
'Container' => 22,
440+
'ContainerService' => 16,
436441
'ContainerQuota' => 9,
437442
'ContainerQuotaScope' => 9,
438443
'ContainerQuotaItem' => 30,
@@ -588,7 +593,7 @@ def assert_specific_persistent_volume_claim
588593
end
589594
# ContainerVolume records don't get archived themselves, but some belong to archived pods.
590595
expect(ContainerVolume.where(:type => 'ContainerVolume').count).to eq(container_volumes_count)
591-
expect(@ems.container_volumes.count).to eq(container_volumes_count - 12)
596+
expect(@ems.container_volumes.count).to eq(container_volumes_count - 18)
592597

593598
container0 = Container.find_by(:name => "my-container", :container_group => pod0)
594599
container1 = Container.find_by(:name => "my-container", :container_group => pod1)

spec/vcr_cassettes/manageiq/providers/kubernetes/container_manager/refresher_after_deletions.txt

+170-107
Large diffs are not rendered by default.

spec/vcr_cassettes/manageiq/providers/kubernetes/container_manager/refresher_after_deletions.yml

+2,517-1,350
Large diffs are not rendered by default.

spec/vcr_cassettes/manageiq/providers/kubernetes/container_manager/refresher_before_deletions.txt

+201-138
Large diffs are not rendered by default.

spec/vcr_cassettes/manageiq/providers/kubernetes/container_manager/refresher_before_deletions.yml

+2,547-1,377
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)