beaker-gke 0.0.1 → 0.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4867a7f5a9b76a9a07fad205175c626ad5ffc25a186fdade9d08ebf82eeb87de
4
- data.tar.gz: 6d51919cb4ae4984fa182d734520af144d50232d302a45bc988ca0aa43a8fcaa
3
+ metadata.gz: 7088a7e3170a2710eab2fdd6fd718e24da57daec4a59233bd8c9c2213dec2c79
4
+ data.tar.gz: 190e006996fd60900469009ea5a6d6b68efbdd2410b2c0731e684b4be4774052
5
5
  SHA512:
6
- metadata.gz: 71b29c3e55c85fb5bb3910dcf0ce6d8051225ea50044063075e625b2883a252e57baf5414ec0f8dbb1ba307169b96d49781af677394be6f3004f0400a1bee1a6
7
- data.tar.gz: ab01abfd573b934508440a8d9e01a77b6946ccc75f05bbfff3436346cff24dc419ac857ddd15da2da12bbcbe8b5577ebc85ec1a3510969ab7ddca3b71d2ef772
6
+ metadata.gz: 73a0b108eb1bb49deffd6f7041a04d881366b2a5d2739202c761d1246f83d2bfa8d9530c0d173d68fa53f03036d3399e6021846225322fb87f152352789e680b
7
+ data.tar.gz: 2cbd244cd17946c6bf5047ec9db0db67b156b477b645cfd31b5e0907bb0a84a940f8aa93b3ec5b880d8e28662709352dc79f03f7b48cfa28dff1296fd5b7287c
@@ -0,0 +1,8 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ time: "13:00"
8
+ open-pull-requests-limit: 10
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ # bundler
2
+ .bundle
3
+ Gemfile.local
4
+ Gemfile.lock
5
+
6
+ # JetBrains IDEA
7
+ *.iml
8
+ .idea/
9
+
10
+ # rbenv file
11
+ .ruby-version
12
+ .ruby-gemset
13
+
14
+ /.yardoc
15
+ /_yardoc/
16
+ /coverage/
17
+ /doc/
18
+ /pkg/
19
+ /spec/reports/
20
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,36 @@
1
+ ---
2
+ require:
3
+ - rubocop-rspec
4
+ - rubocop-performance
5
+ AllCops:
6
+ TargetRubyVersion: 2.5
7
+ NewCops: enable
8
+
9
+ Style/Documentation:
10
+ Enabled: false
11
+
12
+ Metrics/MethodLength:
13
+ Max: 25
14
+
15
+ Layout/LineLength:
16
+ Max: 120
17
+
18
+ Metrics/AbcSize:
19
+ Enabled: false
20
+
21
+ Naming/FileName:
22
+ Exclude:
23
+ - 'lib/beaker-gke.rb'
24
+
25
+ Security/Eval:
26
+ Exclude:
27
+ - 'Gemfile'
28
+
29
+ Metrics/BlockLength:
30
+ Enabled: false
31
+
32
+ Metrics/ModuleLength:
33
+ Enabled: false
34
+
35
+ RSpec/FilePath:
36
+ Enabled: false
data/.travis.yml ADDED
@@ -0,0 +1,17 @@
1
+ language: ruby
2
+ sudo: false
3
+ bundler_args: --jobs 4 --retry 2 --without packaging documentation
4
+ before_install:
5
+ - gem update --system && gem install bundler --no-document
6
+ script:
7
+ - "bundle exec rake $CHECK"
8
+ notifications:
9
+ email: false
10
+
11
+ matrix:
12
+ include:
13
+ - rvm: 2.5
14
+ env: "CHECK=rubocop"
15
+
16
+ - rvm: 2.5
17
+ env: "CHECK=test:spec:run"
data/CODEOWNERS CHANGED
@@ -1 +1,2 @@
1
- * @puppetlabs/night-s-watch
1
+ * @puppetlabs/release-engineering
2
+
data/Gemfile CHANGED
@@ -1,3 +1,29 @@
1
- source ENV['GEM_SOURCE'] || "https://rubygems.org"
1
+ # frozen_string_literal: true
2
2
 
3
- gemspec
3
+ source ENV['GEM_SOURCE'] || 'https://rubygems.org'
4
+
5
+ gemspec
6
+
7
+ group :development, :test do
8
+ gem 'rubocop', require: false
9
+ gem 'rubocop-performance', require: false
10
+ gem 'rubocop-rspec', require: false
11
+ end
12
+
13
+ def location_for(place, fake_version = nil)
14
+ if place =~ /^git:([^#]*)#(.*)/
15
+ [fake_version, { git: Regexp.last_match(1), branch: Regexp.last_match(2), require: false }].compact
16
+ elsif place =~ %r{^file://(.*)}
17
+ ['>= 0', { path: File.expand_path(Regexp.last_match(1)), require: false }]
18
+ else
19
+ [place, { require: false }]
20
+ end
21
+ end
22
+
23
+ # We don't put beaker in as a test dependency because we
24
+ # don't want to create a transitive dependency
25
+ group :acceptance_testing do
26
+ gem 'beaker', *location_for(ENV['BEAKER_VERSION'] || '~> 4.0')
27
+ end
28
+
29
+ eval(File.read("#{__FILE__}.local"), binding) if File.exist? "#{__FILE__}.local"
data/Rakefile ADDED
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ namespace :test do
6
+ namespace :spec do
7
+ desc 'Run spec tests'
8
+ RSpec::Core::RakeTask.new(:run) do |t|
9
+ t.rspec_opts = ['--color']
10
+ t.pattern = 'spec/'
11
+ end
12
+ end
13
+ end
14
+
15
+ desc 'run static analysis with rubocop'
16
+ task(:rubocop) do
17
+ require 'rubocop'
18
+ cli = RuboCop::CLI.new
19
+ exit_code = cli.run(%w[--display-cop-names --format simple])
20
+ raise 'RuboCop detected offenses' if exit_code != 0
21
+ end
22
+
23
+ # namespace-named default tasks.
24
+ # these are the default tasks invoked when only the namespace is referenced.
25
+ # they're needed because `task :default` in those blocks doesn't work as expected.
26
+ task 'test:spec' => 'test:spec:run'
27
+ task 'test:acceptance' => 'test:acceptance:quick'
28
+
29
+ # global defaults
30
+ task test: 'test:spec'
31
+ task default: :test
data/beaker-gke.gemspec CHANGED
@@ -1,43 +1,36 @@
1
- # -*- encoding: utf-8 -*-
2
- $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift File.expand_path('lib', __dir__)
4
+
3
5
  require 'beaker-gke/version'
4
6
 
5
7
  Gem::Specification.new do |s|
6
- s.name = "beaker-gke"
8
+ s.name = 'beaker-gke'
7
9
  s.version = BeakerGke::VERSION
8
10
  s.authors = ["Night's Watch"]
9
- s.email = ["team-nw@puppet.com"]
10
- s.homepage = "https://github.com/puppetlabs/beaker-gke"
11
- s.summary = %q{Beaker hypervisor for GKE!}
12
- s.description = %q{For use for the Beaker acceptance testing tool}
13
- s.license = 'Apache2'
11
+ s.email = ['team-nw@puppet.com']
12
+ s.homepage = 'https://github.com/puppetlabs/beaker-gke'
13
+ s.summary = 'Beaker hypervisor for GKE!'
14
+ s.description = 'Add GKE support to Beaker acceptance testing tool'
15
+ s.license = 'Apache-2.0'
14
16
 
15
17
  s.files = `git ls-files`.split("\n")
16
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
- s.require_paths = ["lib"]
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |file| File.basename(file) }
20
+ s.require_paths = ['lib']
21
+
22
+ # Required ruby version
23
+ s.required_ruby_version = '~> 2.5'
19
24
 
20
25
  # Testing dependencies
26
+ s.add_development_dependency 'climate_control'
27
+ s.add_development_dependency 'fakefs', '~> 1.2', '<= 1.2.3'
28
+ s.add_development_dependency 'rake', '~> 13.0'
21
29
  s.add_development_dependency 'rspec', '~> 3.0'
22
30
  s.add_development_dependency 'rspec-its'
23
- # pin fakefs for Ruby < 2.3
24
- if RUBY_VERSION < "2.3"
25
- s.add_development_dependency 'fakefs', '~> 0.6', '< 0.14'
26
- else
27
- s.add_development_dependency 'fakefs', '~> 0.6'
28
- end
29
- s.add_development_dependency 'rake', '~> 10.1'
30
31
  s.add_development_dependency 'simplecov'
31
- s.add_development_dependency 'pry', '~> 0.10'
32
-
33
- # Documentation dependencies
34
- s.add_development_dependency 'yard'
35
- s.add_development_dependency 'markdown'
36
- s.add_development_dependency 'thin'
37
32
 
38
33
  # Run time dependencies
39
- s.add_runtime_dependency 'kubeclient', '~> 4.4.0'
40
- s.add_runtime_dependency 'jsonpath'
41
- s.add_runtime_dependency 'googleauth'
42
-
43
- end
34
+ s.add_runtime_dependency 'googleauth', '~> 0.9'
35
+ s.add_runtime_dependency 'kubeclient', '>= 4.4', '< 4.10'
36
+ end
data/bin/beaker-gke CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'rubygems' unless defined?(Gem)
4
5
  require 'beaker-gke'
data/config/pod.yaml CHANGED
@@ -1,23 +1,38 @@
1
- apiVersion: v1
2
- kind: Pod
3
- metadata:
4
- name: "%{pod_name}"
5
- namespace: gke-puppetagent-ci
6
- labels:
7
- app: "%{pod_name}"
8
- spec:
9
- hostname: "%{pod_name}"
10
- containers:
11
- - image: gcr.io/puppetagent-ci/centos-7:v5
12
- name: "centos-7"
13
- dnsPolicy: "None"
14
- dnsConfig:
1
+ ---
2
+ :apiVersion: v1
3
+ :kind: Pod
4
+ :metadata:
5
+ :name: "%{pod_name}"
6
+ :namespace: gke-puppetagent-ci
7
+ :labels:
8
+ :app: "%{pod_name}"
9
+ :project: puppet-agent-ci
10
+ :spec:
11
+ :hostname: "%{pod_name}"
12
+ :containers:
13
+ - :image: <%= ENV.fetch("CONTAINER_IMAGE") { "gcr.io/puppetagent-ci/centos-7-base:v3" } %>
14
+ :name: "centos-7-base"
15
+ :securityContext:
16
+ :capabilities:
17
+ :add:
18
+ - NET_ADMIN
19
+ :dnsPolicy: "None"
20
+ :dnsConfig:
15
21
  nameservers:
16
22
  - 10.240.0.10
17
23
  - 10.240.1.10
18
- searches:
24
+ :searches:
19
25
  - gke-puppetagent-ci.puppet.net
20
- hostAliases:
21
- - ip: "169.254.169.254"
22
- hostnames:
23
- - "metadata.google.internal"
26
+ :hostAliases:
27
+ - :ip: "169.254.169.254"
28
+ :hostnames:
29
+ - "metadata.google.internal"
30
+ :affinity:
31
+ :podAntiAffinity:
32
+ :preferredDuringSchedulingIgnoredDuringExecution:
33
+ - :weight: 100
34
+ :podAffinityTerm:
35
+ :labelSelector:
36
+ :matchLabels:
37
+ :project: puppet-agent-ci
38
+ :topologyKey: kubernetes.io/hostname
data/config/service.yaml CHANGED
@@ -1,11 +1,12 @@
1
- apiVersion: v1
2
- kind: Service
3
- metadata:
4
- name: "%{pod_name}"
5
- namespace: gke-puppetagent-ci
6
- labels:
7
- app: "%{pod_name}"
8
- spec:
9
- selector:
10
- app: "%{pod_name}"
11
- clusterIP: "None"
1
+ ---
2
+ :apiVersion: v1
3
+ :kind: Service
4
+ :metadata:
5
+ :name: "%{pod_name}"
6
+ :namespace: gke-puppetagent-ci
7
+ :labels:
8
+ :app: "%{pod_name}"
9
+ :spec:
10
+ :selector:
11
+ :app: "%{pod_name}"
12
+ :clusterIP: "None"
@@ -1,13 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'kubeclient'
2
- require 'jsonpath'
3
- require 'beaker'
4
4
  require 'beaker-gke'
5
5
  require 'googleauth'
6
+ require 'erb'
6
7
 
7
8
  module Beaker
8
9
  class Gke < Beaker::Hypervisor
9
- SERVICE_NAMESPACE = 'gke-puppetagent-ci'.freeze
10
- PROXY_IP = '10.236.0.3'.freeze
10
+ SERVICE_NAMESPACE = 'gke-puppetagent-ci'
11
+ PROXY_IP = '10.236.0.3'
11
12
  PROXY_PORT = 8899
12
13
  MAX_RETRIES = 5
13
14
  # OS environment variable must be set to continue
@@ -18,12 +19,16 @@ module Beaker
18
19
  begin
19
20
  ENV.fetch('KUBECONFIG')
20
21
  ENV.fetch('GOOGLE_APPLICATION_CREDENTIALS')
21
- rescue
22
- raise ArgumentError, 'OS environment variable KUBECONFIG and GOOGLE_APPLICATION_CREDENTIALS must be set'
22
+ rescue KeyError
23
+ raise(
24
+ ArgumentError,
25
+ 'OS environment variable KUBECONFIG and GOOGLE_APPLICATION_CREDENTIALS must be set'
26
+ )
23
27
  end
24
- @hosts = hosts
25
- @options = options
26
- @client = client
28
+ @hosts = hosts
29
+ @options = options
30
+ @client = client
31
+ @logger = options[:logger]
27
32
  end
28
33
 
29
34
  def provision
@@ -32,39 +37,43 @@ module Beaker
32
37
  create_pod(hostname)
33
38
  create_srv(hostname)
34
39
  retries = 0
40
+
35
41
  begin
36
42
  pod = get_pod(hostname)
37
- raise StandardError if pod.status.podIP.nil?
43
+ raise StandardError unless pod.status.podIP
38
44
  rescue StandardError => e
39
- if retries <= MAX_RETRIES
40
- retries += 1
41
- puts 'Retrying , could not get podIP'
42
- sleep(2 ** retries)
45
+ raise "Timeout: #{e.message}" unless retries <= MAX_RETRIES
46
+
47
+ @logger.info("Retrying, could not get podIP for #{hostname}")
48
+
49
+ retries += 1
50
+ sleep(2**retries)
43
51
  retry
44
- else
45
- raise "Timeout: #{e.message}"
46
- end
47
52
  end
53
+
48
54
  host[:vmhostname] = "#{hostname}.gke-puppetagent-ci.puppet.net"
49
55
  host[:hostname] = hostname
50
56
  host[:ip] = pod.status.podIP
57
+ host[:gke_container] = true
51
58
  end
52
59
  nil
53
60
  end
54
61
 
55
62
  def cleanup
56
63
  @hosts.each do |host|
64
+ @logger.info("Deleting POD with ID: #{host[:hostname]}")
65
+
57
66
  delete_pod(host[:hostname])
58
67
  delete_service(host[:hostname])
59
68
  end
60
69
  end
61
70
 
62
- def connection_preference(host)
63
- [:ip, :vmhostname, :hostname]
71
+ def connection_preference(_host)
72
+ %i[ip vmhostname hostname]
64
73
  end
65
74
 
66
75
  def create_pod(name)
67
- pod_config=read_symbols('pod.yaml',{pod_name:name} )
76
+ pod_config = read_symbols('pod.yaml', pod_name: name)
68
77
  @client.create_pod(pod_config)
69
78
  end
70
79
 
@@ -73,24 +82,22 @@ module Beaker
73
82
  end
74
83
 
75
84
  def create_srv(name)
76
- service_config=read_symbols('service.yaml',{pod_name:name} )
85
+ service_config = read_symbols('service.yaml', pod_name: name)
77
86
  @client.create_service(service_config)
78
87
  end
79
88
 
80
89
  def delete_pod(pod_name)
81
- @client.delete_pod(pod_name, SERVICE_NAMESPACE, delete_options: { 'force': 1, 'grace-period': 0 } )
90
+ @client.delete_pod(
91
+ pod_name,
92
+ SERVICE_NAMESPACE,
93
+ delete_options: { 'force': 1, '--grace-period': 0 }
94
+ )
82
95
  end
83
96
 
84
97
  def delete_service(srv_name)
85
- begin
86
- if srv_name.instance_of?(String)
87
- client.delete_service(srv_name, SERVICE_NAMESPACE)
88
- else
89
- raise ArgumentError, 'Wrong argument type - #{srv_name.class}'
90
- end
91
- end
98
+ @client.delete_service(srv_name, SERVICE_NAMESPACE)
92
99
  rescue Kubeclient::ResourceNotFoundError => e
93
- puts "Service #{srv_name} could not be deleted #{e.to_s}"
100
+ @logger.info("Service #{srv_name} could not be deleted #{e}")
94
101
  end
95
102
 
96
103
  private
@@ -100,21 +107,20 @@ module Beaker
100
107
  context = config.context
101
108
  proxy_uri = URI::HTTP.build(host: PROXY_IP, port: PROXY_PORT)
102
109
  Kubeclient::Client.new(
103
- context.api_endpoint, 'v1',
104
- http_proxy_uri: proxy_uri,
105
- ssl_options: context.ssl_options,
106
- auth_options: context.auth_options
110
+ context.api_endpoint, 'v1',
111
+ http_proxy_uri: proxy_uri,
112
+ ssl_options: context.ssl_options,
113
+ auth_options: context.auth_options
107
114
  )
108
115
  end
109
116
 
110
117
  def read_file(file_name)
111
- path = File.join(ROOT_DIR, 'config', file_name)
112
- File.read(path)
118
+ File.read(File.join(ROOT_DIR, 'config', file_name))
113
119
  end
114
120
 
115
121
  def read_symbols(file, substitution = {})
116
- data = read_file(file)
117
- Psych.load(data %substitution , symbolize_names: true)
122
+ data = ERB.new(read_file(file)).result
123
+ Psych.load(data % substitution, symbolize_names: true)
118
124
  end
119
125
  end
120
126
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module BeakerGke
2
- VERSION = '0.0.1'
4
+ VERSION = '0.1.0'
3
5
  end
data/lib/beaker-gke.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pathname'
2
4
 
3
5
  ROOT_DIR = Pathname.new(File.expand_path('..', __dir__)) unless defined?(ROOT_DIR)
@@ -0,0 +1,176 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'beaker/hypervisor/gke'
4
+
5
+ describe Beaker::Gke do
6
+ let(:hosts) { make_hosts }
7
+
8
+ let(:options) { { logger: logger } }
9
+
10
+ let(:logger) do
11
+ logger = instance_double('logger')
12
+ allow(logger).to receive(:debug)
13
+ allow(logger).to receive(:info)
14
+ allow(logger).to receive(:warn)
15
+ allow(logger).to receive(:error)
16
+ allow(logger).to receive(:notify)
17
+ logger
18
+ end
19
+
20
+ let(:config) { instance_double('config') }
21
+
22
+ let(:context) do
23
+ instance_double('context',
24
+ api_endpoint: 'v1',
25
+ ssl_options: {
26
+ verify_ssl: 1,
27
+ cert_store: true
28
+ },
29
+ auth_options: {
30
+ bearer_token: 'TOKEN_STRING'
31
+ })
32
+ end
33
+
34
+ let(:gke) { ::Beaker::Gke.new(hosts, options) }
35
+
36
+ def pass_through_initialization
37
+ allow(ENV).to receive(:fetch).with('KUBECONFIG').and_return('default_value')
38
+ allow(ENV).to receive(:fetch).with('GOOGLE_APPLICATION_CREDENTIALS').and_return('default_value')
39
+ allow(config).to receive(:context).and_return(context)
40
+ allow(Kubeclient::Config).to receive(:read).with(ENV['KUBECONFIG']).and_return(config)
41
+ end
42
+
43
+ before do
44
+ FakeFS.deactivate!
45
+ end
46
+
47
+ describe ' #initialize' do
48
+ let(:env_error_message) { 'OS environment variable KUBECONFIG and GOOGLE_APPLICATION_CREDENTIALS must be set' }
49
+
50
+ it 'raises error when KUBECONFIG and GOOGLE_APPLICATION_CREDENTIALS ENV variables are not set' do
51
+ expect { gke }.to raise_error(ArgumentError, env_error_message)
52
+ end
53
+
54
+ it 'raises error when only GOOGLE_APPLICATION_CREDENTIALS ENV variable is set' do
55
+ with_modified_env GOOGLE_APPLICATION_CREDENTIALS: 'default_value' do
56
+ expect { gke }.to raise_error(ArgumentError, env_error_message)
57
+ end
58
+ end
59
+
60
+ it 'raises error when only KUBECONFIG ENV variable is set' do
61
+ with_modified_env KUBECONFIG: 'default_value' do
62
+ expect { gke }.to raise_error(ArgumentError, env_error_message)
63
+ end
64
+ end
65
+
66
+ context 'when both KUBECONFIG and GOOGLE_APPLICATION_CREDENTIALS ENV are set' do
67
+ before do
68
+ pass_through_initialization
69
+ end
70
+
71
+ it 'sets the hosts data member accordingly' do
72
+ expect(gke.instance_variable_get(:@hosts)).to equal(hosts)
73
+ end
74
+
75
+ it 'sets the options data member accordingly' do
76
+ expect(gke.instance_variable_get(:@options)).to equal(options)
77
+ end
78
+
79
+ it 'sets the logger data member accordingly' do
80
+ expect(gke.instance_variable_get(:@logger)).to equal(logger)
81
+ end
82
+
83
+ it 'succeeds and does not raise any errors' do
84
+ expect { gke }.not_to raise_error
85
+ end
86
+ end
87
+ end
88
+
89
+ describe ' #provision' do
90
+ let(:pod) { instance_double('pod') }
91
+
92
+ let(:status) { instance_double('status', podIP: '10.236.246.250') }
93
+ let(:empty_ip_status) { instance_double('status', podIP: nil) }
94
+
95
+ def pass_through_pod_and_service_creation
96
+ allow(gke).to receive(:create_pod).and_return(nil)
97
+ allow(gke).to receive(:read_file).with('pod.yaml').and_return('pod.yaml content')
98
+
99
+ allow(gke).to receive(:create_srv).and_return(nil)
100
+ allow(gke).to receive(:read_file).with('service.yaml').and_return('service.yaml content')
101
+ end
102
+
103
+ before do
104
+ pass_through_initialization
105
+ pass_through_pod_and_service_creation
106
+ allow(gke).to receive(:sleep).and_return(true)
107
+ end
108
+
109
+ context 'when no hosts given' do
110
+ let(:no_hosts_gke) { ::Beaker::Gke.new([], options) }
111
+
112
+ it 'returns nil' do
113
+ expect(no_hosts_gke.provision).to eq(nil)
114
+ end
115
+
116
+ it 'logs no info' do
117
+ no_hosts_gke.provision
118
+ expect(logger).not_to have_received(:info)
119
+ end
120
+
121
+ it 'does not raise any error' do
122
+ expect { no_hosts_gke.provision }.not_to raise_error
123
+ end
124
+ end
125
+
126
+ it 'raises StandardError and logs podIP retrieval attempts' do # rubocop:disable RSpec/MultipleExpectations
127
+ allow(gke).to receive(:get_pod).and_return(pod)
128
+ allow(pod).to receive(:status).and_return(empty_ip_status)
129
+
130
+ expect { gke.provision }.to raise_error(StandardError)
131
+ expect(logger).to have_received(:info).with(/Retrying, could not get podIP for/).at_least(:once)
132
+ end
133
+
134
+ it 'succeeds' do
135
+ allow(gke).to receive(:get_pod).and_return(pod)
136
+ allow(pod).to receive(:status).and_return(status)
137
+
138
+ expect(gke.provision).to eq(nil)
139
+ end
140
+ end
141
+
142
+ describe ' #cleanup' do
143
+ before do
144
+ pass_through_initialization
145
+ end
146
+
147
+ context 'when no hosts given' do
148
+ let(:no_hosts_gke) { ::Beaker::Gke.new([], options) }
149
+
150
+ it 'does not raise any error' do
151
+ expect { no_hosts_gke.cleanup }.not_to raise_error
152
+ end
153
+
154
+ it 'logs no info' do
155
+ no_hosts_gke.cleanup
156
+ expect(logger).not_to have_received(:info)
157
+ end
158
+ end
159
+
160
+ context 'when succeeds' do
161
+ before do
162
+ allow(gke).to receive(:delete_pod).and_return(nil)
163
+ allow(gke).to receive(:delete_service).and_return(nil)
164
+ end
165
+
166
+ it 'does not raise any error' do
167
+ expect { gke.cleanup }.not_to raise_error
168
+ end
169
+
170
+ it 'logs deleted pods' do
171
+ gke.cleanup
172
+ expect(logger).to have_received(:info).with(/Deleting POD with ID:/).exactly(hosts.size).times
173
+ end
174
+ end
175
+ end
176
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'beaker'
4
+ require 'simplecov'
5
+ require 'climate_control'
6
+ require 'fakefs/spec_helpers'
7
+
8
+ Dir.glob(Dir.pwd + '/lib/beaker/hypervisor/*.rb').sort { |file| require file }
9
+
10
+ # setup & require beaker's spec_helper.rb
11
+ beaker_gem_spec = Gem::Specification.find_by_name('beaker')
12
+ beaker_gem_dir = beaker_gem_spec.gem_dir
13
+ beaker_spec_path = File.join(beaker_gem_dir, 'spec')
14
+ $LOAD_PATH << beaker_spec_path
15
+ require File.join(beaker_spec_path, 'spec_helper.rb')
16
+
17
+ RSpec.configure do |config|
18
+ config.include TestFileHelpers
19
+ config.include HostHelpers
20
+ end
21
+
22
+ def with_modified_env(options, &block)
23
+ ClimateControl.modify(options, &block)
24
+ end
metadata CHANGED
@@ -1,31 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beaker-gke
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Night's Watch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-26 00:00:00.000000000 Z
11
+ date: 2022-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rspec
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '3.0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '3.0'
27
- - !ruby/object:Gem::Dependency
28
- name: rspec-its
14
+ name: climate_control
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - ">="
@@ -44,72 +30,50 @@ dependencies:
44
30
  requirements:
45
31
  - - "~>"
46
32
  - !ruby/object:Gem::Version
47
- version: '0.6'
33
+ version: '1.2'
34
+ - - "<="
35
+ - !ruby/object:Gem::Version
36
+ version: 1.2.3
48
37
  type: :development
49
38
  prerelease: false
50
39
  version_requirements: !ruby/object:Gem::Requirement
51
40
  requirements:
52
41
  - - "~>"
53
42
  - !ruby/object:Gem::Version
54
- version: '0.6'
43
+ version: '1.2'
44
+ - - "<="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.2.3
55
47
  - !ruby/object:Gem::Dependency
56
48
  name: rake
57
49
  requirement: !ruby/object:Gem::Requirement
58
50
  requirements:
59
51
  - - "~>"
60
52
  - !ruby/object:Gem::Version
61
- version: '10.1'
53
+ version: '13.0'
62
54
  type: :development
63
55
  prerelease: false
64
56
  version_requirements: !ruby/object:Gem::Requirement
65
57
  requirements:
66
58
  - - "~>"
67
59
  - !ruby/object:Gem::Version
68
- version: '10.1'
60
+ version: '13.0'
69
61
  - !ruby/object:Gem::Dependency
70
- name: simplecov
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: pry
62
+ name: rspec
85
63
  requirement: !ruby/object:Gem::Requirement
86
64
  requirements:
87
65
  - - "~>"
88
66
  - !ruby/object:Gem::Version
89
- version: '0.10'
67
+ version: '3.0'
90
68
  type: :development
91
69
  prerelease: false
92
70
  version_requirements: !ruby/object:Gem::Requirement
93
71
  requirements:
94
72
  - - "~>"
95
73
  - !ruby/object:Gem::Version
96
- version: '0.10'
97
- - !ruby/object:Gem::Dependency
98
- name: yard
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
74
+ version: '3.0'
111
75
  - !ruby/object:Gem::Dependency
112
- name: markdown
76
+ name: rspec-its
113
77
  requirement: !ruby/object:Gem::Requirement
114
78
  requirements:
115
79
  - - ">="
@@ -123,7 +87,7 @@ dependencies:
123
87
  - !ruby/object:Gem::Version
124
88
  version: '0'
125
89
  - !ruby/object:Gem::Dependency
126
- name: thin
90
+ name: simplecov
127
91
  requirement: !ruby/object:Gem::Requirement
128
92
  requirements:
129
93
  - - ">="
@@ -137,48 +101,40 @@ dependencies:
137
101
  - !ruby/object:Gem::Version
138
102
  version: '0'
139
103
  - !ruby/object:Gem::Dependency
140
- name: kubeclient
104
+ name: googleauth
141
105
  requirement: !ruby/object:Gem::Requirement
142
106
  requirements:
143
107
  - - "~>"
144
108
  - !ruby/object:Gem::Version
145
- version: 4.4.0
109
+ version: '0.9'
146
110
  type: :runtime
147
111
  prerelease: false
148
112
  version_requirements: !ruby/object:Gem::Requirement
149
113
  requirements:
150
114
  - - "~>"
151
115
  - !ruby/object:Gem::Version
152
- version: 4.4.0
116
+ version: '0.9'
153
117
  - !ruby/object:Gem::Dependency
154
- name: jsonpath
118
+ name: kubeclient
155
119
  requirement: !ruby/object:Gem::Requirement
156
120
  requirements:
157
121
  - - ">="
158
122
  - !ruby/object:Gem::Version
159
- version: '0'
160
- type: :runtime
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - ">="
123
+ version: '4.4'
124
+ - - "<"
165
125
  - !ruby/object:Gem::Version
166
- version: '0'
167
- - !ruby/object:Gem::Dependency
168
- name: googleauth
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - ">="
172
- - !ruby/object:Gem::Version
173
- version: '0'
126
+ version: '4.10'
174
127
  type: :runtime
175
128
  prerelease: false
176
129
  version_requirements: !ruby/object:Gem::Requirement
177
130
  requirements:
178
131
  - - ">="
179
132
  - !ruby/object:Gem::Version
180
- version: '0'
181
- description: For use for the Beaker acceptance testing tool
133
+ version: '4.4'
134
+ - - "<"
135
+ - !ruby/object:Gem::Version
136
+ version: '4.10'
137
+ description: Add GKE support to Beaker acceptance testing tool
182
138
  email:
183
139
  - team-nw@puppet.com
184
140
  executables:
@@ -186,10 +142,16 @@ executables:
186
142
  extensions: []
187
143
  extra_rdoc_files: []
188
144
  files:
145
+ - ".github/dependabot.yml"
146
+ - ".gitignore"
147
+ - ".rspec"
148
+ - ".rubocop.yml"
149
+ - ".travis.yml"
189
150
  - CODEOWNERS
190
151
  - Gemfile
191
152
  - LICENSE
192
153
  - README.md
154
+ - Rakefile
193
155
  - beaker-gke.gemspec
194
156
  - bin/beaker-gke
195
157
  - config/pod.yaml
@@ -198,9 +160,11 @@ files:
198
160
  - lib/beaker-gke.rb
199
161
  - lib/beaker-gke/version.rb
200
162
  - lib/beaker/hypervisor/gke.rb
163
+ - spec/gke/hypervisor/gke_spec.rb
164
+ - spec/spec_helper.rb
201
165
  homepage: https://github.com/puppetlabs/beaker-gke
202
166
  licenses:
203
- - Apache2
167
+ - Apache-2.0
204
168
  metadata: {}
205
169
  post_install_message:
206
170
  rdoc_options: []
@@ -208,16 +172,16 @@ require_paths:
208
172
  - lib
209
173
  required_ruby_version: !ruby/object:Gem::Requirement
210
174
  requirements:
211
- - - ">="
175
+ - - "~>"
212
176
  - !ruby/object:Gem::Version
213
- version: '0'
177
+ version: '2.5'
214
178
  required_rubygems_version: !ruby/object:Gem::Requirement
215
179
  requirements:
216
180
  - - ">="
217
181
  - !ruby/object:Gem::Version
218
182
  version: '0'
219
183
  requirements: []
220
- rubygems_version: 3.0.4
184
+ rubygems_version: 3.0.9
221
185
  signing_key:
222
186
  specification_version: 4
223
187
  summary: Beaker hypervisor for GKE!