kube-platform 3.3.1.gk.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.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +31 -0
  3. data/README.md +192 -0
  4. data/bin/kube-platform +37 -0
  5. data/lib/kube-platform/application.rb +203 -0
  6. data/lib/kube-platform/cli.rb +114 -0
  7. data/lib/kube-platform/client.rb +217 -0
  8. data/lib/kube-platform/cluster.rb +224 -0
  9. data/lib/kube-platform/cluster_definition.rb +115 -0
  10. data/lib/kube-platform/configuration.rb +145 -0
  11. data/lib/kube-platform/exceptions.rb +9 -0
  12. data/lib/kube-platform/handlers/dockerhub_secret_copy.rb +52 -0
  13. data/lib/kube-platform/handlers/ebs_from_snapshot.rb +108 -0
  14. data/lib/kube-platform/handlers/handler.rb +36 -0
  15. data/lib/kube-platform/handlers/recreate_resource.rb +11 -0
  16. data/lib/kube-platform/handlers/secret_copy.rb +43 -0
  17. data/lib/kube-platform/handlers/wait_for_job_completion.rb +69 -0
  18. data/lib/kube-platform/handlers/wait_for_termination.rb +47 -0
  19. data/lib/kube-platform/health_check.rb +19 -0
  20. data/lib/kube-platform/health_checks/pods_ready.rb +188 -0
  21. data/lib/kube-platform/health_checks/r53_records.rb +82 -0
  22. data/lib/kube-platform/helpers/retry.rb +20 -0
  23. data/lib/kube-platform/images/descriptor.rb +49 -0
  24. data/lib/kube-platform/images/docker_hub_image.rb +49 -0
  25. data/lib/kube-platform/images/dockerhub_image_factory.rb +64 -0
  26. data/lib/kube-platform/images/kubernetes_docker_hub_secret_provider.rb +44 -0
  27. data/lib/kube-platform/images/repository.rb +77 -0
  28. data/lib/kube-platform/images/tag_associator.rb +80 -0
  29. data/lib/kube-platform/images/tagged_dockerhub_image.rb +36 -0
  30. data/lib/kube-platform/logger.rb +32 -0
  31. data/lib/kube-platform/manifest.rb +61 -0
  32. data/lib/kube-platform/pre_checks/r53_records.rb +66 -0
  33. data/lib/kube-platform/pre_checks/valid_platform_dependencies.rb +52 -0
  34. data/lib/kube-platform/pre_checks.rb +19 -0
  35. data/lib/kube-platform/resource.rb +152 -0
  36. data/lib/kube-platform/resource_repository.rb +73 -0
  37. data/lib/kube-platform/thor/descriptor_to_option_adapter.rb +33 -0
  38. data/lib/kube-platform/update_checker.rb +39 -0
  39. data/lib/kube-platform/version.rb +5 -0
  40. data/lib/kube-platform.rb +40 -0
  41. metadata +179 -0
@@ -0,0 +1,152 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "invocaops_docker-render"
4
+
5
+ module KubePlatform
6
+ class Resource
7
+ attr_reader :handlers
8
+
9
+ MalformedResourceException = Class.new(KubePlatformException)
10
+ ResourceNotFoundException = Class.new(KubePlatformException)
11
+
12
+ REQUIRED_ATTRIBUTES = [:kind, :apiVersion, :metadata].freeze
13
+ FILENAME_ANNOTATION = "invoca.com/resource_filename"
14
+
15
+ def initialize(spec, handlers)
16
+ validate_spec(spec)
17
+ @handlers = handlers
18
+ @resource = Kubeclient::Resource.new(spec)
19
+ @handlers.each { |handler| handler.resource = self }
20
+ end
21
+
22
+ def ==(other)
23
+ self.class == other.class && unwrap.to_h == other.unwrap.to_h
24
+ end
25
+
26
+ def pre_create(client)
27
+ handlers.each { |handler| handler.pre_create(client) }
28
+ end
29
+
30
+ def post_create(client)
31
+ handlers.each { |handler| handler.post_create(client) }
32
+ end
33
+
34
+ def pre_update(client)
35
+ handlers.each { |handler| handler.pre_update(client) }
36
+ end
37
+
38
+ def post_update(client)
39
+ handlers.each { |handler| handler.post_update(client) }
40
+ end
41
+
42
+ def pre_delete(client)
43
+ handlers.each { |handler| handler.pre_delete(client) }
44
+ end
45
+
46
+ def post_delete(client)
47
+ handlers.each { |handler| handler.post_delete(client) }
48
+ end
49
+
50
+ def name
51
+ metadata.name
52
+ end
53
+
54
+ def namespace
55
+ metadata.namespace
56
+ end
57
+
58
+ def namespace=(namespace)
59
+ metadata.namespace = namespace
60
+ end
61
+
62
+ def api_version
63
+ unwrap.apiVersion
64
+ end
65
+
66
+ def kind
67
+ unwrap.kind
68
+ end
69
+
70
+ def unwrap
71
+ @resource
72
+ end
73
+
74
+ def namespaced?
75
+ metadata.respond_to?(:namespace)
76
+ end
77
+
78
+ def annotations
79
+ metadata&.annotations&.to_h
80
+ end
81
+
82
+ def annotation(name)
83
+ metadata&.annotations&.[](name)
84
+ end
85
+
86
+ def pod_annotation(name)
87
+ unwrap&.spec&.template&.metadata&.annotations&.[](name)
88
+ end
89
+
90
+ def annotate(key, value)
91
+ metadata.annotations ||= {}
92
+ metadata.annotations[key] = value
93
+ end
94
+
95
+ def annotate_pod(key, value)
96
+ unwrap.spec.template.metadata ||= {}
97
+ unwrap.spec.template.metadata.annotations ||= {}
98
+ unwrap.spec.template.metadata.annotations[key] = value
99
+ end
100
+
101
+ def pod_template?
102
+ unwrap&.spec&.template != nil
103
+ end
104
+
105
+ private
106
+
107
+ def metadata
108
+ unwrap.metadata
109
+ end
110
+
111
+ def validate_spec(spec)
112
+ REQUIRED_ATTRIBUTES.each do |attr|
113
+ spec[attr] || spec[attr.to_s] or raise MalformedResourceException, "Resource is missing '#{attr}' attribute: #{spec}"
114
+ end
115
+ end
116
+
117
+ class << self
118
+ def from_yaml(filename, handlers: [], config: nil, jsonnet_library_path: nil)
119
+ template = case filename
120
+ when /\.erb|.yaml\z/
121
+ InvocaopsDocker::Render::ErbTemplate.render(filename, config, erb_binding: config.nil? ? nil : config.binding)
122
+ when /\.jsonnet\z/
123
+ InvocaopsDocker::Render::JsonnetTemplate.render(filename, config, jsonnet_library_path: jsonnet_library_path)
124
+ end
125
+ spec = YAML.safe_load(template)
126
+ resource = from_spec(handlers: handlers, **spec.symbolize_keys)
127
+ annotate_pod_with_filename(resource, filename)
128
+ rescue Errno::ENOENT
129
+ raise ResourceNotFoundException, "#{filename} was not found"
130
+ end
131
+
132
+ def from_spec(handlers: [], **spec)
133
+ new(spec, handlers)
134
+ end
135
+
136
+ private
137
+
138
+ def render_erb(template, config)
139
+ renderer = ERB.new(template)
140
+ config.nil? ? renderer.result : renderer.result(config.binding)
141
+ end
142
+
143
+ def annotate_pod_with_filename(resource, filename)
144
+ if resource.pod_template?
145
+ resource.annotate_pod(FILENAME_ANNOTATION, File.basename(filename))
146
+ end
147
+
148
+ resource
149
+ end
150
+ end
151
+ end
152
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+ require_relative "logger"
5
+
6
+ module KubePlatform
7
+ class ResourceRepository
8
+ include Logger
9
+
10
+ attr_reader :url, :branch
11
+
12
+ TARGET_DIR = "repo"
13
+
14
+ def initialize(url:, branch:)
15
+ @url = url
16
+ @branch = branch
17
+ end
18
+
19
+ def retrieve
20
+ Dir.mktmpdir do |path|
21
+ Dir.chdir(path) do
22
+ repository_dir = File.join(path, TARGET_DIR)
23
+ clone(repository_dir)
24
+ Dir.chdir(repository_dir) do
25
+ jb_install
26
+ yield repository_dir
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def clone(repository_dir)
35
+ logger.info("Cloning #{url}")
36
+ execute_command("git clone --depth 1 --single-branch --branch #{branch} #{url} #{TARGET_DIR}", "Error cloning #{url}", tries: 2)
37
+ logger.debug("Cloned #{url} into #{repository_dir}")
38
+ end
39
+
40
+ def jb_install
41
+ logger.info("Running jb install")
42
+ execute_command("jb install --jsonnetpkg-home=vendor-jb", "Error running jb install", tries: 2)
43
+ end
44
+
45
+ def execute_command(command, error_prefix, tries: 1)
46
+ executor = nil # so it stays in scope since we need access for raise
47
+ tries.times do
48
+ executor = CommandExecutor.new(command)
49
+ executor.execute
50
+ executor.success? and return
51
+ end
52
+ raise KubePlatformException, "#{error_prefix}: #{executor.stderr}"
53
+ end
54
+
55
+ class CommandExecutor
56
+ attr_reader :success, :command, :stderr
57
+
58
+ alias success? success
59
+
60
+ def initialize(command)
61
+ @command = command
62
+ @success = false
63
+ end
64
+
65
+ def execute
66
+ Open3.popen3(command) do |_stdin, _stdout, stderr, wait_thr|
67
+ @success = wait_thr.value.exitstatus.zero?
68
+ @stderr = stderr.read
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KubePlatform
4
+ module Thor
5
+ class DescriptorToOptionAdapter
6
+ attr_reader :descriptor
7
+
8
+ def initialize(descriptor:)
9
+ @descriptor = descriptor
10
+ end
11
+
12
+ def key
13
+ descriptor.key
14
+ end
15
+
16
+ def aliases
17
+ key_alias = descriptor.key_alias
18
+ case key_alias&.length
19
+ when nil, 0
20
+ []
21
+ when 1
22
+ ["-#{key_alias}"]
23
+ else
24
+ ["--#{key_alias}"]
25
+ end
26
+ end
27
+
28
+ def desc
29
+ descriptor.description
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "logger"
4
+
5
+ module KubePlatform
6
+ class UpdateChecker
7
+ include Logger
8
+
9
+ attr_reader :manifest
10
+
11
+ def initialize(manifest:)
12
+ @manifest = manifest
13
+ end
14
+
15
+ def update_required? # TODO: Move this logging into the caller. The error can just be part of the exception.
16
+ if up_to_date?
17
+ logger.debug("Version is up-to-date")
18
+ false
19
+ else
20
+ logger.error("This version of kube-platform is out-of-date: #{available_version} is required, but running #{running_version}. Please update kube-platform: brew update && brew upgrade kube-platform")
21
+ true
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def up_to_date?
28
+ Gem::Version.new(running_version) >= Gem::Version.new(available_version)
29
+ end
30
+
31
+ def running_version
32
+ KubePlatform::VERSION
33
+ end
34
+
35
+ def available_version
36
+ manifest.version
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module KubePlatform
4
+ VERSION = "3.3.1.gk.0"
5
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "kubeclient"
4
+ require "active_support/deprecation"
5
+ require_relative "kube-platform/version"
6
+ require_relative "kube-platform/logger"
7
+ require_relative "kube-platform/exceptions"
8
+ require_relative "kube-platform/application"
9
+ require_relative "kube-platform/cli"
10
+ require_relative "kube-platform/configuration"
11
+ require_relative "kube-platform/client"
12
+ require_relative "kube-platform/manifest"
13
+ require_relative "kube-platform/cluster"
14
+ require_relative "kube-platform/cluster_definition"
15
+ require_relative "kube-platform/resource"
16
+ require_relative "kube-platform/helpers/retry"
17
+ require_relative "kube-platform/thor/descriptor_to_option_adapter"
18
+ require_relative "kube-platform/images/docker_hub_image"
19
+ require_relative "kube-platform/images/tagged_dockerhub_image"
20
+ require_relative "kube-platform/images/dockerhub_image_factory"
21
+ require_relative "kube-platform/images/kubernetes_docker_hub_secret_provider"
22
+ require_relative "kube-platform/images/descriptor"
23
+ require_relative "kube-platform/images/repository"
24
+ require_relative "kube-platform/images/tag_associator"
25
+ require_relative "kube-platform/resource_repository"
26
+ require_relative "kube-platform/update_checker"
27
+ require_relative "kube-platform/handlers/handler"
28
+ require_relative "kube-platform/handlers/dockerhub_secret_copy"
29
+ require_relative "kube-platform/handlers/ebs_from_snapshot"
30
+ require_relative "kube-platform/handlers/handler"
31
+ require_relative "kube-platform/handlers/recreate_resource"
32
+ require_relative "kube-platform/handlers/secret_copy"
33
+ require_relative "kube-platform/handlers/wait_for_termination"
34
+ require_relative "kube-platform/handlers/wait_for_job_completion"
35
+ require_relative "kube-platform/health_check"
36
+ require_relative "kube-platform/health_checks/pods_ready"
37
+ require_relative "kube-platform/health_checks/r53_records"
38
+ require_relative "kube-platform/pre_checks"
39
+ require_relative "kube-platform/pre_checks/r53_records"
40
+ require_relative "kube-platform/pre_checks/valid_platform_dependencies"
metadata ADDED
@@ -0,0 +1,179 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kube-platform
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.3.1.gk.0
5
+ platform: ruby
6
+ authors:
7
+ - Invoca Operations
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-04-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: aws-sdk-ec2
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: aws-sdk-route53
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.9'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: hashie
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.5'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.5'
69
+ - !ruby/object:Gem::Dependency
70
+ name: invoca-jsonnet
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
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: kubeclient
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '4.5'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '4.5'
97
+ - !ruby/object:Gem::Dependency
98
+ name: thor
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 0.20.0
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.20.0
111
+ description: Library to manage Invoca development clusters in Kubernetes. See the
112
+ README for more details.
113
+ email: operations@invoca.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - Gemfile
119
+ - README.md
120
+ - bin/kube-platform
121
+ - lib/kube-platform.rb
122
+ - lib/kube-platform/application.rb
123
+ - lib/kube-platform/cli.rb
124
+ - lib/kube-platform/client.rb
125
+ - lib/kube-platform/cluster.rb
126
+ - lib/kube-platform/cluster_definition.rb
127
+ - lib/kube-platform/configuration.rb
128
+ - lib/kube-platform/exceptions.rb
129
+ - lib/kube-platform/handlers/dockerhub_secret_copy.rb
130
+ - lib/kube-platform/handlers/ebs_from_snapshot.rb
131
+ - lib/kube-platform/handlers/handler.rb
132
+ - lib/kube-platform/handlers/recreate_resource.rb
133
+ - lib/kube-platform/handlers/secret_copy.rb
134
+ - lib/kube-platform/handlers/wait_for_job_completion.rb
135
+ - lib/kube-platform/handlers/wait_for_termination.rb
136
+ - lib/kube-platform/health_check.rb
137
+ - lib/kube-platform/health_checks/pods_ready.rb
138
+ - lib/kube-platform/health_checks/r53_records.rb
139
+ - lib/kube-platform/helpers/retry.rb
140
+ - lib/kube-platform/images/descriptor.rb
141
+ - lib/kube-platform/images/docker_hub_image.rb
142
+ - lib/kube-platform/images/dockerhub_image_factory.rb
143
+ - lib/kube-platform/images/kubernetes_docker_hub_secret_provider.rb
144
+ - lib/kube-platform/images/repository.rb
145
+ - lib/kube-platform/images/tag_associator.rb
146
+ - lib/kube-platform/images/tagged_dockerhub_image.rb
147
+ - lib/kube-platform/logger.rb
148
+ - lib/kube-platform/manifest.rb
149
+ - lib/kube-platform/pre_checks.rb
150
+ - lib/kube-platform/pre_checks/r53_records.rb
151
+ - lib/kube-platform/pre_checks/valid_platform_dependencies.rb
152
+ - lib/kube-platform/resource.rb
153
+ - lib/kube-platform/resource_repository.rb
154
+ - lib/kube-platform/thor/descriptor_to_option_adapter.rb
155
+ - lib/kube-platform/update_checker.rb
156
+ - lib/kube-platform/version.rb
157
+ homepage: https://github.com/Invoca/kube-platform
158
+ licenses: []
159
+ metadata: {}
160
+ post_install_message:
161
+ rdoc_options: []
162
+ require_paths:
163
+ - lib
164
+ required_ruby_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
169
+ required_rubygems_version: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">"
172
+ - !ruby/object:Gem::Version
173
+ version: 1.3.1
174
+ requirements: []
175
+ rubygems_version: 3.1.6
176
+ signing_key:
177
+ specification_version: 4
178
+ summary: Library to manage development Kubernetes clusters
179
+ test_files: []