Skip to content

Commit

Permalink
Merge pull request #2979 from zendesk/jylee/whitelistmetricsserver
Browse files Browse the repository at this point in the history
read apiVersion from yml files
  • Loading branch information
eatwithforks authored Oct 8, 2018
2 parents 8c532fa + 5eab435 commit aeab2e6
Show file tree
Hide file tree
Showing 15 changed files with 61 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -107,16 +107,20 @@ def update_secret(namespace)
}

if secret_exist?(secret)
@cluster.client.update_secret(secret)
secrets_client.update_secret(secret)
else
@cluster.client.create_secret(secret)
secrets_client.create_secret(secret)
end
end

def secret_exist?(secret)
@cluster.client.get_secret(secret.fetch(:metadata).fetch(:name), secret.fetch(:metadata).fetch(:namespace))
secrets_client.get_secret(secret.fetch(:metadata).fetch(:name), secret.fetch(:metadata).fetch(:namespace))
true
rescue *SamsonKubernetes.connection_errors
false
end

def secrets_client
@cluster.client('v1')
end
end
18 changes: 7 additions & 11 deletions plugins/kubernetes/app/models/kubernetes/cluster.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class Cluster < ActiveRecord::Base

before_destroy :ensure_unused

def client(type = :default)
def client(type)
(@client ||= {})[type] ||= build_client(type)
end

Expand All @@ -28,43 +28,39 @@ def context
end

def namespaces
client.get_namespaces.fetch(:items).map { |ns| ns.dig(:metadata, :name) } - %w[kube-system]
client('v1').get_namespaces.fetch(:items).map { |ns| ns.dig(:metadata, :name) } - %w[kube-system]
end

def kubeconfig
@kubeconfig ||= Kubeclient::Config.read(config_filepath)
end

def schedulable_nodes
nodes = client.get_nodes.fetch(:items)
nodes = client('v1').get_nodes.fetch(:items)
nodes.reject { |n| n.dig(:spec, :unschedulable) }
rescue
rescue *SamsonKubernetes.connection_errors
Rails.logger.error("Error loading nodes from cluster #{id}: #{$!}")
[]
end

def server_version
version = Rails.cache.fetch(cache_key, expires_in: 1.hour) do
JSON.parse(client.create_rest_client('version').get.body).fetch('gitVersion')[1..-1]
JSON.parse(client('v1').create_rest_client('version').get.body).fetch('gitVersion')[1..-1]
end
Gem::Version.new(version)
end

private

def connection_valid?
client.api_valid?
client('v1').api_valid?
rescue *SamsonKubernetes.connection_errors
false
end

def build_client(type)
endpoint = context.api_endpoint
if type == :default
type = context.api_version
else
endpoint = endpoint.sub(/\/api$/, '') + '/apis'
end
endpoint += '/apis' unless type.match? /^v\d+/ # TODO: remove by fixing via https://github.com/abonas/kubeclient/issues/284

Kubeclient::Client.new(
endpoint,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ def print_resource_events(doc)
selector << "involvedObject.uid=#{uid}"
end

events = doc.deploy_group.kubernetes_cluster.client.get_events(
events = doc.deploy_group.kubernetes_cluster.client('v1').get_events(
namespace: resource.namespace,
field_selector: selector.join(',')
).fetch(:items)
Expand Down
2 changes: 1 addition & 1 deletion plugins/kubernetes/app/models/kubernetes/release.rb
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ def clients
]
end
# avoiding doing a .uniq on clients which might do weird stuff
scopes.uniq.map { |group, query| [group.kubernetes_cluster.client, query] }
scopes.uniq.map { |group, query| [group.kubernetes_cluster.client('v1'), query] }
end

def url
Expand Down
36 changes: 2 additions & 34 deletions plugins/kubernetes/app/models/kubernetes/resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -211,11 +211,11 @@ def request(method, *args)
end

def client
pod_client
@deploy_group.kubernetes_cluster.client(@template.fetch(:apiVersion))
end

def pod_client
@deploy_group.kubernetes_cluster.client
@deploy_group.kubernetes_cluster.client('v1')
end

def loop_sleep
Expand All @@ -241,11 +241,6 @@ class ConfigMap < Base
end

class HorizontalPodAutoscaler < Base
private

def client
@deploy_group.kubernetes_cluster.client('autoscaling/v1')
end
end

class Service < Base
Expand Down Expand Up @@ -286,10 +281,6 @@ def request_delete
# delete the actual deployment
super
end

def client
@deploy_group.kubernetes_cluster.client('extensions/v1beta1')
end
end

class DaemonSet < Base
Expand Down Expand Up @@ -357,10 +348,6 @@ def pods_count
resource.dig_fetch(:status, :currentNumberScheduled) + resource.dig_fetch(:status, :numberMisscheduled)
end

def client
@deploy_group.kubernetes_cluster.client('extensions/v1beta1')
end

def wait_for_termination_of_all_pods
30.times do
loop_sleep
Expand Down Expand Up @@ -421,10 +408,6 @@ def with_patch_header
ensure
client.headers['Content-Type'] = old
end

def client
@deploy_group.kubernetes_cluster.client('apps/v1beta1')
end
end

class Job < Base
Expand All @@ -444,18 +427,9 @@ def revert(_previous)
def request_delete
delete_pods { super }
end

def client
@deploy_group.kubernetes_cluster.client('batch/v1')
end
end

class CronJob < Base
private

def client
@deploy_group.kubernetes_cluster.client('batch/v1beta1')
end
end

class Pod < Base
Expand All @@ -471,12 +445,6 @@ def deploy
delete
create unless @template[:delete] # allow deletion through release_doc logic
end

private

def client
@deploy_group.kubernetes_cluster.client('policy/v1beta1')
end
end

def self.build(*args)
Expand Down
5 changes: 5 additions & 0 deletions plugins/kubernetes/app/models/kubernetes/role_validator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ def validate
validate_name
validate_namespace
validate_kinds
validate_api_version
validate_containers
validate_container_name
validate_job_restart_policy
Expand Down Expand Up @@ -85,6 +86,10 @@ def validate_kinds
", supported combinations are: #{supported} and #{IGNORED.join(", ")}"
end

def validate_api_version
@errors << "Needs apiVersion specified" if map_attributes([:apiVersion]).any?(&:nil?)
end

# spec actually allows this, but blows up when used
def validate_numeric_limits
[:requests, :limits].each do |scope|
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,7 @@ def set_image_pull_secrets

docker_credentials = Rails.cache.fetch(["docker_credentials", cluster], expires_in: 1.hour) do
secrets = SamsonKubernetes.retry_on_connection_errors do
cluster.client.get_secrets(namespace: template.dig_fetch(:metadata, :namespace)).fetch(:items)
cluster.client('v1').get_secrets(namespace: template.dig_fetch(:metadata, :namespace)).fetch(:items)
end
secrets.
select { |secret| docker_configs.include? secret.fetch(:type) }.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
<div class="form-group">
<label class="col-lg-2 control-label">URL</label>
<div class="col-lg-4">
<p class="form-control-static"><%= @cluster.client.api_endpoint %></p>
<p class="form-control-static"><%= @cluster.client('v1').api_endpoint %></p>
</div>
</div>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def self.use_example_config
end

it "renders capacity" do
stub_request(:get, "http://foobar.server/api/v1/nodes").to_return(body: "[]")
stub_request(:get, "http://foobar.server/api/v1/nodes").to_return(body: {items: []}.to_json)
get :index, params: {capacity: true}
assert_template :index
end
Expand Down
2 changes: 1 addition & 1 deletion plugins/kubernetes/test/models/kubernetes/api/pod_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
let(:pod_with_client) do
Kubernetes::Api::Pod.new(
pod_attributes,
client: deploy_groups(:pod1).kubernetes_cluster.client
client: deploy_groups(:pod1).kubernetes_cluster.client('v1')
)
end
let(:start_time) { "2017-03-31T22:56:20Z" }
Expand Down
4 changes: 2 additions & 2 deletions plugins/kubernetes/test/models/kubernetes/cluster_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,11 @@

describe '#client' do
it 'creates a client' do
cluster.client.must_be_kind_of Kubeclient::Client
cluster.client('v1').must_be_kind_of Kubeclient::Client
end

it 'caches' do
cluster.client.object_id.must_equal cluster.client.object_id
cluster.client('v1').object_id.must_equal cluster.client('v1').object_id
end

it 'can build for other types' do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,7 @@ def worker_is_unstable
Kubernetes::ReleaseDoc.any_instance.unstub(:raw_template)
GitRepository.any_instance.stubs(:file_content).with('kubernetes/resque_worker.yml', commit).returns({
'kind' => 'Job',
'apiVersion' => 'batch/v1',
'spec' => {
'template' => {
'metadata' => {'labels' => {'project' => 'foobar', 'role' => 'migrate'}},
Expand Down Expand Up @@ -508,6 +509,7 @@ def worker_is_unstable
it "rolls back when previous resource existed" do
old = {
kind: 'Service',
apiVersion: 'v1',
metadata: {uid: '123', name: 'some-project', namespace: 'staging', resourceVersion: 'X'},
spec: {clusterIP: "Y"}
}
Expand Down
Loading

0 comments on commit aeab2e6

Please sign in to comment.