kerbi 0.0.1 → 0.0.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.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/lib/cli/base_handler.rb +194 -0
  3. data/lib/cli/base_serializer.rb +120 -0
  4. data/lib/cli/config_handler.rb +51 -0
  5. data/lib/cli/entry_serializers.rb +99 -0
  6. data/lib/cli/project_handler.rb +2 -2
  7. data/lib/cli/release_handler.rb +41 -0
  8. data/lib/cli/release_serializer.rb +46 -0
  9. data/lib/cli/root_handler.rb +34 -13
  10. data/lib/cli/state_handler.rb +88 -0
  11. data/lib/cli/values_handler.rb +4 -3
  12. data/{boilerplate → lib/code-gen/new-project}/Gemfile.erb +0 -0
  13. data/lib/code-gen/new-project/kerbifile.rb.erb +9 -0
  14. data/lib/code-gen/new-project/values.yaml.erb +1 -0
  15. data/lib/config/cli_schema.rb +343 -28
  16. data/lib/config/config_file.rb +60 -0
  17. data/lib/config/globals.rb +4 -0
  18. data/lib/config/run_opts.rb +162 -0
  19. data/lib/config/state_consts.rb +11 -0
  20. data/lib/kerbi.rb +35 -10
  21. data/lib/main/code_gen.rb +1 -1
  22. data/lib/main/errors.rb +115 -0
  23. data/lib/main/mixer.rb +20 -10
  24. data/lib/mixins/cli_state_helpers.rb +108 -0
  25. data/lib/mixins/cm_backend_testing.rb +109 -0
  26. data/lib/mixins/entry_tag_logic.rb +183 -0
  27. data/lib/state/base_backend.rb +93 -0
  28. data/lib/state/config_map_backend.rb +173 -0
  29. data/lib/state/entry.rb +173 -0
  30. data/lib/state/entry_set.rb +137 -0
  31. data/lib/state/metadata.yaml.erb +11 -0
  32. data/lib/state/mixers.rb +23 -0
  33. data/lib/state/resources.yaml.erb +17 -0
  34. data/lib/utils/cli.rb +108 -9
  35. data/lib/utils/helm.rb +10 -12
  36. data/lib/utils/k8s_auth.rb +87 -0
  37. data/lib/utils/misc.rb +36 -1
  38. data/lib/utils/mixing.rb +1 -1
  39. data/lib/utils/values.rb +13 -22
  40. data/spec/cli/config_handler_spec.rb +38 -0
  41. data/spec/cli/release_handler_spec.rb +127 -0
  42. data/spec/cli/root_handler_spec.rb +100 -0
  43. data/spec/cli/state_handler_spec.rb +108 -0
  44. data/spec/cli/values_handler_spec.rb +17 -0
  45. data/spec/fixtures/expectations/common/bad-tag.txt +1 -0
  46. data/spec/fixtures/expectations/config/bad-set.txt +1 -0
  47. data/spec/fixtures/expectations/config/set.txt +1 -0
  48. data/spec/fixtures/expectations/config/show-default.yaml +6 -0
  49. data/spec/fixtures/expectations/release/delete.txt +1 -0
  50. data/spec/fixtures/expectations/release/init-already-existed.txt +2 -0
  51. data/spec/fixtures/expectations/release/init-both-created.txt +2 -0
  52. data/spec/fixtures/expectations/release/list.txt +5 -0
  53. data/spec/fixtures/expectations/release/status-all-working.txt +5 -0
  54. data/spec/fixtures/expectations/release/status-data-unreadable.txt +5 -0
  55. data/spec/fixtures/expectations/release/status-not-provisioned.txt +5 -0
  56. data/spec/fixtures/expectations/root/template-inlines.yaml +31 -0
  57. data/spec/fixtures/expectations/root/template-production.yaml +31 -0
  58. data/spec/fixtures/expectations/root/template-read-inlines.yaml +31 -0
  59. data/spec/fixtures/expectations/root/template-read.yaml +31 -0
  60. data/spec/fixtures/expectations/root/template-write.yaml +31 -0
  61. data/spec/fixtures/expectations/root/template.yaml +31 -0
  62. data/spec/fixtures/expectations/root/values.json +28 -0
  63. data/spec/fixtures/expectations/state/delete.txt +1 -0
  64. data/spec/fixtures/expectations/state/demote.txt +1 -0
  65. data/spec/fixtures/expectations/state/list.json +51 -0
  66. data/spec/fixtures/expectations/state/list.txt +6 -0
  67. data/spec/fixtures/expectations/state/list.yaml +35 -0
  68. data/spec/fixtures/expectations/state/promote.txt +1 -0
  69. data/spec/fixtures/expectations/state/prune-candidates.txt +1 -0
  70. data/spec/fixtures/expectations/state/retag.txt +1 -0
  71. data/spec/fixtures/expectations/state/set.txt +1 -0
  72. data/spec/fixtures/expectations/state/show.json +13 -0
  73. data/spec/fixtures/expectations/state/show.txt +13 -0
  74. data/spec/fixtures/expectations/state/show.yaml +8 -0
  75. data/spec/fixtures/expectations/values/order-of-precedence.yaml +4 -0
  76. data/spec/main/configmap_backend_spec.rb +110 -0
  77. data/spec/main/project_code_gen_spec.rb +8 -2
  78. data/spec/main/state_entry_set_spec.rb +112 -0
  79. data/spec/main/state_entry_spec.rb +109 -0
  80. data/spec/mini-projects/hello-kerbi/common/metadata.yaml.erb +5 -0
  81. data/spec/mini-projects/hello-kerbi/consts.rb +5 -0
  82. data/spec/mini-projects/hello-kerbi/helpers.rb +8 -0
  83. data/spec/mini-projects/hello-kerbi/kerbifile.rb +18 -0
  84. data/spec/mini-projects/hello-kerbi/pod-and-service.yaml.erb +23 -0
  85. data/spec/mini-projects/hello-kerbi/values/production.yaml +2 -0
  86. data/spec/mini-projects/hello-kerbi/values/v2.yaml +2 -0
  87. data/spec/mini-projects/hello-kerbi/values/values.yaml +4 -0
  88. data/spec/spec_helper.rb +143 -1
  89. data/spec/utils/helm_spec.rb +89 -109
  90. data/spec/utils/k8s_auth_spec.rb +32 -0
  91. data/spec/utils/misc_utils_spec.rb +9 -0
  92. data/spec/utils/values_utils_spec.rb +12 -19
  93. metadata +143 -16
  94. data/boilerplate/kerbifile.rb.erb +0 -9
  95. data/boilerplate/values.yaml.erb +0 -1
  96. data/lib/cli/base.rb +0 -83
  97. data/lib/config/cli_opts.rb +0 -50
  98. data/lib/config/manager.rb +0 -36
  99. data/lib/main/state_manager.rb +0 -47
  100. data/lib/utils/kubectl.rb +0 -58
  101. data/spec/main/examples_spec.rb +0 -12
  102. data/spec/main/state_manager_spec.rb +0 -84
  103. data/spec/utils/state_utils.rb +0 -15
@@ -0,0 +1,127 @@
1
+ require_relative './../spec_helper'
2
+
3
+ RSpec.describe "$ kerbi release [COMMAND]" do
4
+
5
+ let(:namespace) { "kerbi-spec" }
6
+ let(:release_name) { "kerbi-spec" }
7
+ let(:cm_name) { Kerbi::State::ConfigMapBackend.mk_cm_name(release_name) }
8
+ let(:exps_dir) { "release" }
9
+
10
+ let(:set) do
11
+ new_state_set(
12
+ one: { values: {x: "x"}, created_at: Time.new(2000).to_s },
13
+ two: { message: "message", created_at: Time.new(2001).to_s },
14
+ "[cand]-three".to_sym => { created_at: Time.new(2002).to_s },
15
+ "[cand]-four".to_sym => { created_at: Time.new(2003).to_s }
16
+ )
17
+ end
18
+
19
+ before :each do
20
+ create_ns(release_name)
21
+ delete_cm(cm_name, namespace)
22
+ backend = make_backend(release_name, namespace)
23
+ configmap_dict = backend.template_resource(set.entries)
24
+ backend.apply_resource(configmap_dict)
25
+ end
26
+
27
+ describe "$ kerbi release init [RELEASE_NAME]" do
28
+ let(:cmd) { "release init #{release_name}" }
29
+ context "when resources already existed" do
30
+ it "echoes the correct text" do
31
+ exp_cli_eq_file(cmd, exps_dir, "init-already-existed")
32
+ end
33
+ end
34
+
35
+ context "when the resources did not exist" do
36
+ it "echoes the correct text" do
37
+ delete_ns(namespace)
38
+ exp_cli_eq_file(cmd, exps_dir, "init-both-created")
39
+ end
40
+ end
41
+ end
42
+
43
+ describe "$ kerbi release delete [RELEASE_NAME]" do
44
+ before :each do
45
+ backend = make_backend(release_name, namespace)
46
+ backend.provision_missing_resources
47
+ end
48
+
49
+ let(:cmd) { "release delete #{release_name} " \
50
+ "--namespace #{namespace} " \
51
+ "--confirm"
52
+ }
53
+
54
+ it "deletes the resource" do
55
+ backend = make_backend(release_name, namespace)
56
+ expect(backend.read_write_ready?).to eq(true)
57
+ backend = make_backend(release_name, namespace)
58
+ exp_cli_eq_file(cmd, exps_dir, "delete")
59
+ expect(backend.read_write_ready?).to eq(false)
60
+ end
61
+ end
62
+
63
+ describe "$ kerbi release status [RELEASE_NAME]" do
64
+ let(:cmd) { "release status #{release_name}" }
65
+ context "when resources are provisioned" do
66
+ context "when the data is readable" do
67
+ it "echoes the correct text" do
68
+ exp_cli_eq_file(cmd, exps_dir, "status-all-working")
69
+ end
70
+ end
71
+ context "when the data is not readable" do
72
+ it "echoes the correct text" do
73
+ backend = make_backend(release_name, namespace)
74
+ corrupt_cm(backend)
75
+ exp_cli_eq_file(cmd, exps_dir, "status-data-unreadable")
76
+ end
77
+ end
78
+ end
79
+
80
+ context "when connected but resources not provisioned" do
81
+ it "echoes the correct text" do
82
+ delete_ns(namespace)
83
+ exp_cli_eq_file(cmd, exps_dir, "status-not-provisioned")
84
+ end
85
+ end
86
+ end
87
+
88
+ describe "$ kerbi release list" do
89
+
90
+ before(:each) { delete_ns("kerbi-spec") }
91
+
92
+ def provision(release_name, namespace, entry_count)
93
+ backend = make_backend(release_name, namespace)
94
+ backend.provision_missing_resources(quiet: true)
95
+ expect(backend.read_write_ready?).to eq(true)
96
+
97
+ if entry_count >= 0
98
+ entries = []
99
+ entry_count.times do |i|
100
+ entries << new_state("#{i + 1}.0.0")
101
+ end
102
+ new_dict = backend.template_resource(entries)
103
+ backend.apply_resource(new_dict, mode: "update")
104
+ else
105
+ corrupt_cm(backend)
106
+ end
107
+ end
108
+
109
+ before :all do
110
+ delete_ns("tuna")
111
+ delete_ns("macron")
112
+
113
+ provision("tuna", "tuna", 2)
114
+ provision("dirt", "tuna", -1)
115
+ provision("tuna", "macron", 0)
116
+ end
117
+
118
+ after :all do
119
+ delete_ns("tuna")
120
+ delete_ns("macron")
121
+ end
122
+
123
+ it "works" do
124
+ exp_cli_eq_file("release list", exps_dir, "list")
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,100 @@
1
+ require_relative './../spec_helper'
2
+ require 'io/console'
3
+
4
+ RSpec.describe "$ kerbi [COMMAND]" do
5
+ let(:namespace) { "kerbi-spec" }
6
+ let(:release_name) { "kerbi-spec" }
7
+ let(:exps_dir) { "root" }
8
+ let(:root_dir) { "#{__dir__}/../../examples/hello-kerbi" }
9
+
10
+ spec_bundles = [
11
+ ["", "template"],
12
+ ["-f production", "template-production"],
13
+ ["-f production --set pod.image=ubuntu", "template-inlines"]
14
+ ].freeze
15
+
16
+ describe "$ kerbi template" do
17
+
18
+ context "without state" do
19
+ spec_bundles.each do |bundle|
20
+ context "with #{bundle[0].presence || "no args"}" do
21
+ it "echos the expected text" do
22
+ cmd = hello_kerbi("template foo #{bundle[0]}")
23
+ exp_cli_eq_file(cmd, "root", bundle[1], "yaml")
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ context "with state" do
30
+
31
+ let(:backend){ make_backend(release_name, namespace) }
32
+
33
+ before :each do
34
+ create_ns(namespace)
35
+ delete_cm(backend.resource_name, namespace)
36
+ backend.provision_missing_resources(quiet: true)
37
+ end
38
+
39
+ def exp_vals(which)
40
+ str_keyed_hash = read_exp_file("root", "values", "json")
41
+ str_keyed_hash.deep_symbolize_keys[which.to_sym]
42
+ end
43
+
44
+ def template_write_cmd(pod_image)
45
+ base_cmd = "template #{release_name} " \
46
+ "--set pod.image=#{pod_image}" \
47
+ " --write-state foo"
48
+ hello_kerbi(base_cmd)
49
+ end
50
+
51
+ context "with writing" do
52
+ before :each do
53
+ cmd = template_write_cmd("centos")
54
+ exp_cli_eq_file(cmd, "root", "template-write", "yaml")
55
+ end
56
+
57
+ context "--write-state when the entry does not yet exist" do
58
+ it "creates a new entry with the expected values" do
59
+ entry = backend.entries[0]
60
+ expect(backend.entries.count).to eq(1)
61
+ expect(entry.tag).to eq("foo")
62
+ expect(entry.values).to eq(exp_vals("centos"))
63
+ expect(entry.default_values).to eq(exp_vals("nginx"))
64
+ end
65
+ end
66
+
67
+ context "--write-state with an existing state entry" do
68
+ it "updates the existing entry with the expected values" do
69
+ cli(template_write_cmd("centos"))
70
+ cli(template_write_cmd("debian"))
71
+ expect(backend.entries.count).to eq(1)
72
+ entry = backend.entries[0]
73
+ expect(entry.tag).to eq("foo")
74
+ expect(entry.values).to eq(exp_vals("debian"))
75
+ expect(entry.default_values).to eq(exp_vals("nginx"))
76
+ end
77
+ end
78
+ end
79
+
80
+ context "--read-state with an existing state entry" do
81
+ before(:each) { cli(template_write_cmd("centos")) }
82
+
83
+ context "without inline overrides" do
84
+ it "echos the expected text" do
85
+ cmd = hello_kerbi("template #{release_name} --read-state foo")
86
+ exp_cli_eq_file(cmd, "root", "template-read", "yaml")
87
+ end
88
+ end
89
+
90
+ context "with inline overrides" do
91
+ it "echos the expected text, preferring the inline over the state" do
92
+ base = "template #{release_name} --read-state foo --set pod.image=busybox"
93
+ cmd = hello_kerbi(base)
94
+ exp_cli_eq_file(cmd, "root", "template-read-inlines", "yaml")
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,108 @@
1
+ require_relative './../spec_helper'
2
+
3
+ RSpec.describe "$ kerbi state [COMMAND]" do
4
+
5
+ let(:namespace) { "kerbi-spec" }
6
+ let(:release_name) { "kerbi-spec" }
7
+ let(:cm_name) { Kerbi::State::ConfigMapBackend.mk_cm_name(release_name) }
8
+ let(:exps_dir) { "state" }
9
+
10
+ let(:set) do
11
+ new_state_set(
12
+ one: { values: {x: "x"}, created_at: Time.new(2000).to_s },
13
+ two: { message: "message", created_at: Time.new(2001).to_s },
14
+ "[cand]-three".to_sym => { created_at: Time.new(2002).to_s },
15
+ "[cand]-four".to_sym => { created_at: Time.new(2003).to_s }
16
+ )
17
+ end
18
+
19
+ before :each do
20
+ create_ns(release_name)
21
+ delete_cm(cm_name, namespace)
22
+ backend = make_backend(release_name, namespace)
23
+ configmap_dict = backend.template_resource(set.entries)
24
+ backend.apply_resource(configmap_dict)
25
+ end
26
+
27
+ describe "$ kerbi state list [RELEASE_NAME]" do
28
+ cmd_group_spec("state list kerbi-spec", "state", "list")
29
+ end
30
+
31
+ describe "$ kerbi state show [TAG]" do
32
+ cmd_group_spec(
33
+ "state show kerbi-spec one",
34
+ "state",
35
+ "show"
36
+ )
37
+
38
+ cmd_group_spec(
39
+ "state show kerbi-spec @oldest",
40
+ "state",
41
+ "show",
42
+ context_append: " using @oldest instead of a literal tag"
43
+ )
44
+ end
45
+
46
+ describe "$ kerbi state retag [RELEASE_NAME] [OLD_TAG] [NEW_TAG]" do
47
+ def make_cmd(old_tag)
48
+ "state retag #{namespace} #{old_tag} born-again"
49
+ end
50
+
51
+ context "when the old tag exists" do
52
+ context "using a literal tag" do
53
+ it "echos the expected text" do
54
+ exp_cli_eq_file(make_cmd("two"), exps_dir, "retag")
55
+ end
56
+ end
57
+
58
+ context "using @latest or @oldest" do
59
+ it "echos the expected text" do
60
+ exp_cli_eq_file(make_cmd("@latest"), exps_dir, "retag")
61
+ end
62
+ end
63
+ end
64
+
65
+ context "when the old tag does not exist" do
66
+ it "echos the expected text" do
67
+ exp_cli_eq_file(make_cmd("bad-tag"), "common", "bad-tag")
68
+ end
69
+ end
70
+ end
71
+
72
+ describe "$ kerbi state promote [RELEASE_NAME] [TAG]" do
73
+ let(:cmd) { "state promote #{release_name} @candidate" }
74
+ it "echos the expected text" do
75
+ exp_cli_eq_file(cmd, exps_dir, "promote")
76
+ end
77
+ end
78
+
79
+ describe "$ kerbi state demote [RELEASE_NAME] [TAG]" do
80
+ let(:cmd) { "state demote #{release_name} @latest" }
81
+ it "echos the expected text" do
82
+ exp_cli_eq_file(cmd, exps_dir, "demote")
83
+ end
84
+ end
85
+
86
+ describe "$ kerbi state set [RELEASE_NAME] [TAG] [ATTR] [VAL]" do
87
+ let(:easy_part) { "state set #{release_name} @latest message" }
88
+ let(:cmd) { easy_part.split(" ") + ["new message", "-n", namespace] }
89
+ it "echos the expected text" do
90
+ exp_cli_eq_file(cmd, exps_dir, "set")
91
+ end
92
+ end
93
+
94
+ describe "$ kerbi state delete [RELEASE_NAME] [TAG]" do
95
+ let(:cmd) { "state delete #{release_name} @latest" }
96
+ it "echos the expected text" do
97
+ exp_cli_eq_file(cmd, exps_dir, "delete")
98
+ end
99
+ end
100
+
101
+ describe "$ kerbi state prune-candidates [RELEASE_NAME]" do
102
+ let(:cmd) { "state prune-candidates #{release_name}" }
103
+ it "echos the expected text" do
104
+ exp_cli_eq_file(cmd, exps_dir, "prune-candidates")
105
+ end
106
+ end
107
+
108
+ end
@@ -0,0 +1,17 @@
1
+ require_relative './../spec_helper'
2
+ require 'io/console'
3
+
4
+ RSpec.describe "$ kerbi values [COMMAND]" do
5
+ let(:namespace) { "kerbi-spec" }
6
+
7
+ describe "$ kerbi values show" do
8
+ context "without state" do
9
+ it "respects --set > -f > defaults" do
10
+ base = "values show -f v2 -f production --set service.type=NodePort"
11
+ cmd = hello_kerbi(base)
12
+ exp_cli_eq_file(cmd, "values", "order-of-precedence", "yaml")
13
+ end
14
+ end
15
+ end
16
+
17
+ end
@@ -0,0 +1 @@
1
+ \e[1;31;49mState given by tag bad-tag not found\e[0m
@@ -0,0 +1 @@
1
+ \e[1;31;49mIllegal config assignment. 'bad-key' not in ["state-backend", "namespace", "auth-type", "kube-config-context", "username", "password", "token"]\e[0m
@@ -0,0 +1 @@
1
+ \e[0;32;49mUpdated config[namespace] from => kerbi-spec\e[0m
@@ -0,0 +1,6 @@
1
+ load-defaults: true
2
+ inline-value: []
3
+ values-file: []
4
+ output-format: yaml
5
+ state-backend: configmap
6
+ auth-type: kube-config
@@ -0,0 +1 @@
1
+ Deleted configmaps/kerbi-spec/kerbi-kerbi-spec-db
@@ -0,0 +1,2 @@
1
+ \e[1;39;49mnamespaces/kerbi-spec: \e[0m\e[1;32;49mAlready existed\e[0m
2
+ \e[1;39;49mkerbi-spec/configmaps/kerbi-kerbi-spec-db: \e[0m\e[1;32;49mAlready existed\e[0m
@@ -0,0 +1,2 @@
1
+ \e[1;39;49mnamespaces/kerbi-spec: \e[0m\e[1;34;49mCreated\e[0m
2
+ \e[1;39;49mkerbi-spec/configmaps/kerbi-kerbi-spec-db: \e[0m\e[1;34;49mCreated\e[0m
@@ -0,0 +1,5 @@
1
+ NAME BACKEND NAMESPACE RESOURCE STATES LATEST
2
+
3
+ tuna ConfigMap macron kerbi-tuna-db 0
4
+ dirt ConfigMap tuna kerbi-dirt-db ERR ERR
5
+ tuna ConfigMap tuna kerbi-tuna-db 2 1.0.0
@@ -0,0 +1,5 @@
1
+ \e[1;39;49m1. Create Kubernetes client: \e[0m\e[1;32;49mSuccess\e[0m
2
+ \e[1;39;49m2. List cluster namespaces: \e[0m\e[1;32;49mSuccess\e[0m
3
+ \e[1;39;49m3. Target namespace kerbi-spec exists: \e[0m\e[1;32;49mSuccess\e[0m
4
+ \e[1;39;49m4. Resource kerbi-spec/cm/kerbi-kerbi-spec-db exists: \e[0m\e[1;32;49mSuccess\e[0m
5
+ \e[1;39;49m5. Data from resource is readable: \e[0m\e[1;32;49mSuccess\e[0m
@@ -0,0 +1,5 @@
1
+ \e[1;39;49m1. Create Kubernetes client: \e[0m\e[1;32;49mSuccess\e[0m
2
+ \e[1;39;49m2. List cluster namespaces: \e[0m\e[1;32;49mSuccess\e[0m
3
+ \e[1;39;49m3. Target namespace kerbi-spec exists: \e[0m\e[1;32;49mSuccess\e[0m
4
+ \e[1;39;49m4. Resource kerbi-spec/cm/kerbi-kerbi-spec-db exists: \e[0m\e[1;32;49mSuccess\e[0m
5
+ \e[1;39;49m5. Data from resource is readable: \e[0m\e[1;31;49mFailure\e[0m
@@ -0,0 +1,5 @@
1
+ \e[1;39;49m1. Create Kubernetes client: \e[0m\e[1;32;49mSuccess\e[0m
2
+ \e[1;39;49m2. List cluster namespaces: \e[0m\e[1;32;49mSuccess\e[0m
3
+ \e[1;39;49m3. Target namespace kerbi-spec exists: \e[0m\e[1;31;49mFailure\e[0m
4
+ \e[1;39;49m4. Resource kerbi-spec/cm/kerbi-kerbi-spec-db exists: \e[0m\e[1;31;49mFailure\e[0m
5
+ \e[1;39;49m5. Data from resource is readable: \e[0m\e[1;31;49mFailure\e[0m
@@ -0,0 +1,31 @@
1
+ apiVersion: v1
2
+ kind: Pod
3
+ metadata:
4
+ name: hello-kerbi
5
+ namespace: foo
6
+ annotations:
7
+ author: person
8
+ labels:
9
+ app: hello-kerbi
10
+ spec:
11
+ containers:
12
+ - name: main
13
+ image: ubuntu:alpine
14
+
15
+ ---
16
+
17
+ apiVersion: v1
18
+ kind: Service
19
+ metadata:
20
+ name: hello-kerbi
21
+ namespace: foo
22
+ annotations:
23
+ author: person
24
+ labels:
25
+ app: hello-kerbi
26
+ spec:
27
+ type: LoadBalancer
28
+ selector:
29
+ app: hello-kerbi
30
+ ports:
31
+ - port: 80
@@ -0,0 +1,31 @@
1
+ apiVersion: v1
2
+ kind: Pod
3
+ metadata:
4
+ name: hello-kerbi
5
+ namespace: foo
6
+ annotations:
7
+ author: person
8
+ labels:
9
+ app: hello-kerbi
10
+ spec:
11
+ containers:
12
+ - name: main
13
+ image: nginx:alpine
14
+
15
+ ---
16
+
17
+ apiVersion: v1
18
+ kind: Service
19
+ metadata:
20
+ name: hello-kerbi
21
+ namespace: foo
22
+ annotations:
23
+ author: person
24
+ labels:
25
+ app: hello-kerbi
26
+ spec:
27
+ type: LoadBalancer
28
+ selector:
29
+ app: hello-kerbi
30
+ ports:
31
+ - port: 80
@@ -0,0 +1,31 @@
1
+ apiVersion: v1
2
+ kind: Pod
3
+ metadata:
4
+ name: hello-kerbi
5
+ namespace: kerbi-spec
6
+ annotations:
7
+ author: person
8
+ labels:
9
+ app: hello-kerbi
10
+ spec:
11
+ containers:
12
+ - name: main
13
+ image: busybox:alpine
14
+
15
+ ---
16
+
17
+ apiVersion: v1
18
+ kind: Service
19
+ metadata:
20
+ name: hello-kerbi
21
+ namespace: kerbi-spec
22
+ annotations:
23
+ author: person
24
+ labels:
25
+ app: hello-kerbi
26
+ spec:
27
+ type: ClusterIP
28
+ selector:
29
+ app: hello-kerbi
30
+ ports:
31
+ - port: 80
@@ -0,0 +1,31 @@
1
+ apiVersion: v1
2
+ kind: Pod
3
+ metadata:
4
+ name: hello-kerbi
5
+ namespace: kerbi-spec
6
+ annotations:
7
+ author: person
8
+ labels:
9
+ app: hello-kerbi
10
+ spec:
11
+ containers:
12
+ - name: main
13
+ image: centos:alpine
14
+
15
+ ---
16
+
17
+ apiVersion: v1
18
+ kind: Service
19
+ metadata:
20
+ name: hello-kerbi
21
+ namespace: kerbi-spec
22
+ annotations:
23
+ author: person
24
+ labels:
25
+ app: hello-kerbi
26
+ spec:
27
+ type: ClusterIP
28
+ selector:
29
+ app: hello-kerbi
30
+ ports:
31
+ - port: 80
@@ -0,0 +1,31 @@
1
+ apiVersion: v1
2
+ kind: Pod
3
+ metadata:
4
+ name: hello-kerbi
5
+ namespace: kerbi-spec
6
+ annotations:
7
+ author: person
8
+ labels:
9
+ app: hello-kerbi
10
+ spec:
11
+ containers:
12
+ - name: main
13
+ image: centos:alpine
14
+
15
+ ---
16
+
17
+ apiVersion: v1
18
+ kind: Service
19
+ metadata:
20
+ name: hello-kerbi
21
+ namespace: kerbi-spec
22
+ annotations:
23
+ author: person
24
+ labels:
25
+ app: hello-kerbi
26
+ spec:
27
+ type: ClusterIP
28
+ selector:
29
+ app: hello-kerbi
30
+ ports:
31
+ - port: 80
@@ -0,0 +1,31 @@
1
+ apiVersion: v1
2
+ kind: Pod
3
+ metadata:
4
+ name: hello-kerbi
5
+ namespace: foo
6
+ annotations:
7
+ author: person
8
+ labels:
9
+ app: hello-kerbi
10
+ spec:
11
+ containers:
12
+ - name: main
13
+ image: nginx:alpine
14
+
15
+ ---
16
+
17
+ apiVersion: v1
18
+ kind: Service
19
+ metadata:
20
+ name: hello-kerbi
21
+ namespace: foo
22
+ annotations:
23
+ author: person
24
+ labels:
25
+ app: hello-kerbi
26
+ spec:
27
+ type: ClusterIP
28
+ selector:
29
+ app: hello-kerbi
30
+ ports:
31
+ - port: 80
@@ -0,0 +1,28 @@
1
+ {
2
+ "centos": {
3
+ "pod": {
4
+ "image": "centos"
5
+ },
6
+ "service": {
7
+ "type": "ClusterIP"
8
+ }
9
+ },
10
+
11
+ "nginx": {
12
+ "pod": {
13
+ "image": "nginx"
14
+ },
15
+ "service": {
16
+ "type": "ClusterIP"
17
+ }
18
+ },
19
+
20
+ "debian": {
21
+ "pod": {
22
+ "image": "debian"
23
+ },
24
+ "service": {
25
+ "type": "ClusterIP"
26
+ }
27
+ }
28
+ }
@@ -0,0 +1 @@
1
+ Deleted state[two]. Remaining entries: 3
@@ -0,0 +1 @@
1
+ \e[0;32;49mUpdated state[[cand]-two].tag from two => [cand]-two\e[0m
@@ -0,0 +1,51 @@
1
+ [
2
+ {
3
+ "tag": "[cand]-four",
4
+ "message": null,
5
+ "created_at": "2003-01-01 00:00:00 +0000",
6
+ "values": {
7
+ },
8
+ "default_values": {
9
+ },
10
+ "overridden_keys": [
11
+
12
+ ]
13
+ },
14
+ {
15
+ "tag": "[cand]-three",
16
+ "message": null,
17
+ "created_at": "2002-01-01 00:00:00 +0000",
18
+ "values": {
19
+ },
20
+ "default_values": {
21
+ },
22
+ "overridden_keys": [
23
+
24
+ ]
25
+ },
26
+ {
27
+ "tag": "two",
28
+ "message": "message",
29
+ "created_at": "2001-01-01 00:00:00 +0000",
30
+ "values": {
31
+ },
32
+ "default_values": {
33
+ },
34
+ "overridden_keys": [
35
+
36
+ ]
37
+ },
38
+ {
39
+ "tag": "one",
40
+ "message": null,
41
+ "created_at": "2000-01-01 00:00:00 +0000",
42
+ "values": {
43
+ "x": "x"
44
+ },
45
+ "default_values": {
46
+ },
47
+ "overridden_keys": [
48
+ "x"
49
+ ]
50
+ }
51
+ ]