kube_schema 1.4.3 → 1.4.5
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/.github/workflows/gh-pages.yml +57 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +189 -1
- data/LICENSE +201 -0
- data/guides/block-dsl/readme.md +50 -0
- data/guides/getting-started/readme.md +37 -0
- data/guides/links.yaml +10 -0
- data/guides/manifests/readme.md +68 -0
- data/guides/schema-versions/readme.md +31 -0
- data/guides/validation/readme.md +31 -0
- data/kube_schema.gemspec +1 -1
- data/lib/kube/monkey_patches.rb +18 -0
- data/lib/kube/schema/version.rb +1 -1
- data/readme.md +28 -0
- data/schemas/crd-definitions.json +225 -37
- data/schemas/kubevirt-definitions.json +4 -4
- metadata +11 -3
- data/README.md +0 -259
data/README.md
DELETED
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
# kube_schema
|
|
2
|
-
|
|
3
|
-
Ruby objects for every Kubernetes resource. Validated against the real OpenAPI spec.
|
|
4
|
-
|
|
5
|
-
```ruby
|
|
6
|
-
Kube::Schema["Deployment"].new {
|
|
7
|
-
metadata.name = "web"
|
|
8
|
-
metadata.namespace = "prod"
|
|
9
|
-
spec.replicas = 3
|
|
10
|
-
spec.template.spec.containers = [
|
|
11
|
-
{ name: "app", image: "nginx:1.27", ports: [{ containerPort: 80 }] }
|
|
12
|
-
]
|
|
13
|
-
}
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
No YAML. No hash literals. Just Ruby blocks that know their schema.
|
|
17
|
-
|
|
18
|
-
## Contents
|
|
19
|
-
|
|
20
|
-
- [Install](#install)
|
|
21
|
-
- [Resources](#resources)
|
|
22
|
-
- [The block DSL](#the-block-dsl)
|
|
23
|
-
- [Subclassing](#subclassing)
|
|
24
|
-
- [Validation](#validation)
|
|
25
|
-
- [Error messages](#error-messages)
|
|
26
|
-
- [Manifests](#manifests)
|
|
27
|
-
- [File I/O](#file-io)
|
|
28
|
-
- [Composition](#composition)
|
|
29
|
-
- [Enumerable](#enumerable)
|
|
30
|
-
- [Schema versions](#schema-versions)
|
|
31
|
-
- [Related projects](#related-projects)
|
|
32
|
-
- [Built with](#built-with)
|
|
33
|
-
|
|
34
|
-
## Install
|
|
35
|
-
|
|
36
|
-
```
|
|
37
|
-
gem install kube_schema
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## Resources
|
|
41
|
-
|
|
42
|
-
Every Kubernetes kind is a class. Fetch it by name.
|
|
43
|
-
|
|
44
|
-
```ruby
|
|
45
|
-
Kube::Schema["Deployment"] # => Class < Kube::Schema::Resource
|
|
46
|
-
Kube::Schema["Service"]
|
|
47
|
-
Kube::Schema["ConfigMap"]
|
|
48
|
-
Kube::Schema["NetworkPolicy"]
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
Specific versions:
|
|
52
|
-
|
|
53
|
-
```ruby
|
|
54
|
-
Kube::Schema["1.34"]["Deployment"]
|
|
55
|
-
Kube::Schema["1.31"]["Pod"]
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
Discovery:
|
|
59
|
-
|
|
60
|
-
```ruby
|
|
61
|
-
Kube::Schema.schema_versions # => ["1.19", "1.20", ..., "1.35"]
|
|
62
|
-
Kube::Schema.latest_version # => "1.35"
|
|
63
|
-
|
|
64
|
-
Kube::Schema["1.34"].list_resources
|
|
65
|
-
# => ["Binding", "CSIDriver", "ConfigMap", "Deployment", ...]
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
## The block DSL
|
|
69
|
-
|
|
70
|
-
Nested attributes just work. No intermediate hashes, no string keys.
|
|
71
|
-
|
|
72
|
-
```ruby
|
|
73
|
-
deploy = Kube::Schema["Deployment"].new {
|
|
74
|
-
metadata.name = "web"
|
|
75
|
-
metadata.namespace = "prod"
|
|
76
|
-
metadata.labels = { app: "web" }
|
|
77
|
-
|
|
78
|
-
spec.replicas = 3
|
|
79
|
-
spec.selector.matchLabels = { app: "web" }
|
|
80
|
-
|
|
81
|
-
spec.template.metadata.labels = { app: "web" }
|
|
82
|
-
spec.template.spec.containers = [
|
|
83
|
-
{ name: "app", image: "nginx:1.27", ports: [{ containerPort: 80 }] }
|
|
84
|
-
]
|
|
85
|
-
}
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
`apiVersion` and `kind` are derived from the schema automatically:
|
|
89
|
-
|
|
90
|
-
```ruby
|
|
91
|
-
deploy.to_h[:apiVersion] # => "apps/v1"
|
|
92
|
-
deploy.to_h[:kind] # => "Deployment"
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## Subclassing
|
|
96
|
-
|
|
97
|
-
```ruby
|
|
98
|
-
class RailsApp < Kube::Schema["Deployment"]
|
|
99
|
-
def default_image
|
|
100
|
-
"ruby:3.4"
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
app = RailsApp.new {
|
|
105
|
-
metadata.name = "rails"
|
|
106
|
-
spec.template.spec.containers = [
|
|
107
|
-
{ name: "web", image: "myapp:latest" }
|
|
108
|
-
]
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
app.default_image # => "ruby:3.4"
|
|
112
|
-
app.valid? # => true
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
## Validation
|
|
116
|
-
|
|
117
|
-
Every resource validates against the full Kubernetes OpenAPI spec.
|
|
118
|
-
|
|
119
|
-
```ruby
|
|
120
|
-
deploy.valid? # => true
|
|
121
|
-
|
|
122
|
-
bad = Kube::Schema["Deployment"].new {
|
|
123
|
-
self.apiVersion = 12345
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
bad.valid? # => false
|
|
127
|
-
|
|
128
|
-
bad.valid!
|
|
129
|
-
# Kube::ValidationError: Schema validation failed for Deployment:
|
|
130
|
-
# - apiVersion = 12345 — expected string, got Integer
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
`to_yaml` refuses to serialize invalid resources:
|
|
134
|
-
|
|
135
|
-
```ruby
|
|
136
|
-
bad.to_yaml # raises Kube::ValidationError
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
## Error messages
|
|
140
|
-
|
|
141
|
-
Validation errors render annotated YAML with color-coded diagnostics. Error lines are highlighted in red, missing required keys are injected inline, and each problem gets a clear explanation:
|
|
142
|
-
|
|
143
|
-

|
|
144
|
-
|
|
145
|
-
## Manifests
|
|
146
|
-
|
|
147
|
-
Group resources into multi-document YAML.
|
|
148
|
-
|
|
149
|
-
```ruby
|
|
150
|
-
manifest = Kube::Schema::Manifest.new
|
|
151
|
-
|
|
152
|
-
manifest << Kube::Schema["Namespace"].new {
|
|
153
|
-
metadata.name = "prod"
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
manifest << Kube::Schema["Deployment"].new {
|
|
157
|
-
metadata.name = "web"
|
|
158
|
-
metadata.namespace = "prod"
|
|
159
|
-
spec.replicas = 3
|
|
160
|
-
spec.template.spec.containers = [
|
|
161
|
-
{ name: "app", image: "nginx:1.27" }
|
|
162
|
-
]
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
manifest << Kube::Schema["Service"].new {
|
|
166
|
-
metadata.name = "web"
|
|
167
|
-
metadata.namespace = "prod"
|
|
168
|
-
spec.selector = { app: "web" }
|
|
169
|
-
spec.ports = [{ port: 80, targetPort: 8080 }]
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
puts manifest.to_yaml
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
```yaml
|
|
176
|
-
---
|
|
177
|
-
apiVersion: v1
|
|
178
|
-
kind: Namespace
|
|
179
|
-
metadata:
|
|
180
|
-
name: prod
|
|
181
|
-
---
|
|
182
|
-
apiVersion: apps/v1
|
|
183
|
-
kind: Deployment
|
|
184
|
-
metadata:
|
|
185
|
-
name: web
|
|
186
|
-
namespace: prod
|
|
187
|
-
spec:
|
|
188
|
-
replicas: 3
|
|
189
|
-
...
|
|
190
|
-
---
|
|
191
|
-
apiVersion: v1
|
|
192
|
-
kind: Service
|
|
193
|
-
metadata:
|
|
194
|
-
name: web
|
|
195
|
-
namespace: prod
|
|
196
|
-
spec:
|
|
197
|
-
selector:
|
|
198
|
-
app: web
|
|
199
|
-
ports:
|
|
200
|
-
- port: 80
|
|
201
|
-
targetPort: 8080
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
### File I/O
|
|
205
|
-
|
|
206
|
-
```ruby
|
|
207
|
-
# Write
|
|
208
|
-
manifest.write("cluster.yaml")
|
|
209
|
-
|
|
210
|
-
# Read
|
|
211
|
-
loaded = Kube::Schema::Manifest.open("cluster.yaml")
|
|
212
|
-
|
|
213
|
-
# Modify and write back
|
|
214
|
-
loaded << new_resource
|
|
215
|
-
loaded.write
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
### Composition
|
|
219
|
-
|
|
220
|
-
Manifests flatten into each other. No nesting.
|
|
221
|
-
|
|
222
|
-
```ruby
|
|
223
|
-
infra = Kube::Schema::Manifest.new(namespace, configmap, secret)
|
|
224
|
-
app = Kube::Schema::Manifest.new(deployment, service)
|
|
225
|
-
|
|
226
|
-
combined = Kube::Schema::Manifest.new
|
|
227
|
-
combined << infra
|
|
228
|
-
combined << app
|
|
229
|
-
combined.size # => 5
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### Enumerable
|
|
233
|
-
|
|
234
|
-
```ruby
|
|
235
|
-
manifest.map { |r| r.to_h[:kind] }
|
|
236
|
-
manifest.select { |r| r.to_h[:kind] == "Service" }
|
|
237
|
-
manifest.any? { |r| r.to_h[:kind] == "Pod" }
|
|
238
|
-
manifest.count
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
## Schema versions
|
|
242
|
-
|
|
243
|
-
Bundled schemas ship with the gem for Kubernetes 1.19 through 1.35. Updated automatically via CI.
|
|
244
|
-
|
|
245
|
-
```ruby
|
|
246
|
-
Kube::Schema.schema_version = "1.31"
|
|
247
|
-
Kube::Schema["Deployment"] # uses 1.31
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
## Related projects
|
|
251
|
-
|
|
252
|
-
- [kube_cluster](https://github.com/general-intelligence-systems/kube_cluster) -- OOP resource management with dirty tracking and persistence
|
|
253
|
-
- [kube_kubectl](https://github.com/general-intelligence-systems/kube_ctl) -- Ruby DSL that compiles to kubectl and helm commands
|
|
254
|
-
- [kube_kit](https://github.com/general-intelligence-systems/kube_kit) -- Generators for kube_cluster projects
|
|
255
|
-
- [kube_engine](https://github.com/general-intelligence-systems/kube_engine) -- Kubernetes engine
|
|
256
|
-
|
|
257
|
-
## Built with
|
|
258
|
-
|
|
259
|
-
[json_schemer](https://github.com/davishmcclurg/json_schemer) -- JSON Schema validation against the real Kubernetes OpenAPI specs.
|