sct 0.1.14 → 0.1.15

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: 2377fe5a5cfd760e9a8ed93321849ac8207588721325ce48aa2d6bd8cf8f631e
4
- data.tar.gz: 5952de0af59fb21add421797a785584763a27286f94feb8303aadfaa3e57cc91
3
+ metadata.gz: e2cc3d1d71c372b97290ca23b05a60bfeabd5240a81ed72ca16c433f1ee6dae5
4
+ data.tar.gz: e85b9c5e1643ee6d9eb794c54e187f9e7637ccb89c37943383cab8802938af7b
5
5
  SHA512:
6
- metadata.gz: 85ce38ef50434f38d01560de81c688aeea4c5ae9362c9f7b6eab2ea77acb8381906a2adcc506d8f4e2f812ec4d191ae8fc6d80e6c49e1ebcf4ac9de0a711ccf2
7
- data.tar.gz: 1678c667cf147b5c406819bfe5b2aa00624de2f08a42776d49725cc8416457e89bf3c96f06f8b25cdd02182e12aab191cb42ca83c166f8cdffb2b809d2d44e5e
6
+ metadata.gz: 42001ffa5ccd0cf558a1f38fde92e58908b7621e2b3a98c975cb2f40afd2ec34c6ce9fd1fa105b6cc6097143f272a2407d3f31573cd4429937babc490d103375
7
+ data.tar.gz: 23fbd32a6a5cc1cdaa0fc7b32006097a16bcd2bb4b5b543f57dc63e3ba6c806bcb163b0f7b1a332a70f747c208b9db81a72c3a1633b0d5a75b8b10295ea83d06
@@ -0,0 +1,12 @@
1
+ The Definition of a Done Code Review
2
+ ====================================
3
+ | by _The Team_ |
4
+ |---------------------------------:|
5
+
6
+ - [ ] Approved (thumbs up) by three other team members (from different operating systems).
7
+ - [ ] Verified if it worked on all operating systems.
8
+ - [ ] Verified if it solved the problem.
9
+ - [ ] Verified if the help section is updated.
10
+ - [ ] Verified if it complied with Ruby code standards.
11
+ - [ ] Documentation is updated, 100% complete.
12
+ - [ ] SCT documentation.
@@ -5,11 +5,11 @@ module Sct
5
5
  class ClusterCommand
6
6
 
7
7
  IS_PUBLIC_COMMAND = true
8
- SYNTAX = 'sct cluster up | sct cluster down | sct cluster reset | sct cluster update-config'
9
- SUMMARY = 'Starts/stops/resets or updates the config of the minikube cluster.'
10
- EXAMPLE = 'sct cluster up | sct cluster down | sct cluster reset | sct cluster update-config'
11
- EXAMPLE_DESCRIPTION = 'Starts/stops/resets or updates the config of the minikube cluster.'
12
- DESCRIPTION = "sct cluster allows you to start, stop, reset or update the config of the Spend Cloud minikube cluster."
8
+ SYNTAX = 'sct cluster up | sct cluster down | sct cluster setup | sct cluster reset | sct cluster update-config | sct cluster delete-stalled-pods'
9
+ SUMMARY = 'Perform actions on the minikube cluster.'
10
+ EXAMPLE = 'sct cluster up | sct cluster down | sct cluster setup | sct cluster reset | sct cluster update-config | sct cluster delete-stalled-pods'
11
+ EXAMPLE_DESCRIPTION = 'Perform actions on the minikube cluster.'
12
+ DESCRIPTION = "sct cluster allows you to start, stop, setup/reset, update the config, or delete the stalled pods of the Spend Cloud minikube cluster."
13
13
 
14
14
  OPTIONS = []
15
15
 
@@ -23,22 +23,41 @@ module Sct
23
23
  down
24
24
  when "update-config"
25
25
  update_config
26
- when "reset"
26
+ when "setup", "reset"
27
27
  reset
28
+ when "delete-stalled-pods"
29
+ delete_stalled_pods(feedback: true)
28
30
  else
29
- puts "Unknown or missing argument. Please run 'sct cluster up','sct cluster down' or 'sct cluster update-config'".red
31
+ puts "Unknown or missing argument. Please run 'sct cluster up', 'sct cluster down', 'sct cluster setup', 'sct cluster reset', 'sct cluster update-config', or 'sct cluster delete-stalled-pods'.".red
30
32
  end
31
33
  end
32
34
 
33
35
  def up
34
36
  start
35
- system "kubectl delete pod -n kube-system $(kubectl get pods -n kube-system | grep registry-creds | awk '{print $1}')"
36
- system "kubectl rollout status -n kube-system deployment/registry-creds"
37
+ run_command "kubectl delete pod -n kube-system #{pods("kube-system").map { |pod| pod[:name] if pod[:name].start_with? "registry-creds" } .compact.join(" ")}"
38
+ run_command "kubectl rollout status -n kube-system deployment/registry-creds"
37
39
  post_start
38
40
  end
39
41
 
40
42
  def down
41
- system "#{minikube} stop"
43
+ run_command "#{minikube} stop"
44
+ end
45
+
46
+ def reset
47
+ run_command "#{minikube} delete"
48
+ start
49
+ create_secrets
50
+ run_command "#{minikube} addons enable registry-creds"
51
+ run_command "#{minikube} addons enable ingress"
52
+ run_command "kubectl rollout status -n kube-system deployment/registry-creds"
53
+ run_command "kubectl rollout status -n kube-system deployment/nginx-ingress-controller"
54
+ wait_for_gcr_secret
55
+ run_command "kubectl apply -f ~/development/spend-cloud/k8s/ingress.yml"
56
+ wait_for_ingress_ip
57
+ run_command "kubectl apply -f ~/development/spend-cloud/k8s/dependencies.yml"
58
+ wait_for_pods
59
+ run_command "kubectl apply -f ~/development/spend-cloud/k8s/"
60
+ post_start
42
61
  end
43
62
 
44
63
  def update_config
@@ -50,59 +69,120 @@ module Sct
50
69
  return puts "#{kube_file_path} doesn't exist".red
51
70
  end
52
71
 
53
- system("sed -e 's~\\\\~/~g' -e 's~C:~/mnt/c~g' < #{kube_file_path} > ~/.kube/minikube-config")
72
+ run_command "sed -e 's~\\\\~/~g' -e 's~C:~/mnt/c~g' < #{kube_file_path} > ~/.kube/minikube-config"
54
73
 
55
74
  puts "#{kube_file_path} copied to ~/.kube/minikube-config".green
56
75
  end
57
76
 
58
- system "kubectl config use-context minikube"
77
+ run_command "kubectl config use-context minikube"
78
+
79
+ run_command "kubectl replace -n kube-system -f #{File.expand_path('../../../resources/corefile.yml', __dir__)}"
80
+ run_command "kubectl delete pod -n kube-system #{pods("kube-system").map { |pod| pod[:name] if pod[:name].start_with? "coredns" } .compact.join(" ")}"
81
+ run_command "kubectl rollout status -n kube-system deployment/coredns"
59
82
  end
60
83
 
61
- def reset
62
- system "#{minikube} delete"
63
- start
64
- system "kubectl create secret generic gcloud-credentials --from-file=\"$(echo ~)/.config/gcloud/application_default_credentials.json\""
65
- system "kubectl create secret generic -n kube-system registry-creds-dpr --from-literal DOCKER_PRIVATE_REGISTRY_PASSWORD=changeme --from-literal DOCKER_PRIVATE_REGISTRY_SERVER=changeme --from-literal DOCKER_PRIVATE_REGISTRY_USER=changeme"
66
- system "kubectl patch secret -n kube-system registry-creds-dpr -p='{\"metadata\": {\"labels\": { \"app\": \"registry-creds\", \"cloud\": \"dpr\", \"kubernetes.io/minikube-addons\": \"registry-creds\"}}}'"
67
- system "kubectl create secret generic -n kube-system registry-creds-ecr --from-literal AWS_ACCESS_KEY_ID=changeme --from-literal AWS_SECRET_ACCESS_KEY=changeme --from-literal AWS_SESSION_TOKEN=\"\" --from-literal aws-account=changeme --from-literal aws-assume-role=changeme --from-literal aws-region=changeme"
68
- system "kubectl patch secret -n kube-system registry-creds-ecr -p='{\"metadata\": {\"labels\": { \"app\": \"registry-creds\", \"cloud\": \"ecr\", \"kubernetes.io/minikube-addons\": \"registry-creds\"}}}'"
69
- system "kubectl create secret generic -n kube-system registry-creds-gcr --from-file=\"$(echo ~)/.config/gcloud/application_default_credentials.json\" --from-literal=gcrurl=\"https://eu.gcr.io\""
70
- system "kubectl patch secret -n kube-system registry-creds-gcr -p='{\"metadata\": {\"labels\": { \"app\": \"registry-creds\", \"cloud\": \"gcr\", \"kubernetes.io/minikube-addons\": \"registry-creds\"}}}'"
71
- system "kubectl create secret generic -n kube-system registry-creds-acr --from-literal ACR_PASSWORD=changeme --from-literal ACR_CLIENT_ID=changeme --from-literal ACR_URL=changeme"
72
- system "kubectl patch secret -n kube-system registry-creds-acr -p='{\"metadata\": {\"labels\": { \"app\": \"registry-creds\", \"cloud\": \"acr\", \"kubernetes.io/minikube-addons\": \"registry-creds\"}}}'"
73
- system "#{minikube} addons enable registry-creds"
74
- system "#{minikube} addons enable ingress"
75
- system "kubectl rollout status -n kube-system deployment/registry-creds"
76
- system "kubectl rollout status -n kube-system deployment/nginx-ingress-controller"
77
- wait_for_gcr_secret
78
- system "kubectl apply -f ~/development/spend-cloud/k8s/"
79
- post_start
84
+ def delete_stalled_pods(feedback: false)
85
+ stalled_pods = pods.select { |pod| pod[:stalled] }
86
+
87
+ if stalled_pods.empty?
88
+ puts "There are no stalled pods.".green if feedback
89
+ else
90
+ run_command "kubectl delete pods #{stalled_pods.map { |pod| pod[:name] } .join(" ")}"
91
+ end
80
92
  end
81
93
 
82
94
  def start
83
- system "#{minikube} start --cpus=$(cat /proc/cpuinfo | grep processor | wc -l) --memory=16G"
84
- system "#{minikube} ssh -- 'sudo su -c \"echo 10048576 > /proc/sys/fs/inotify/max_user_watches\"'"
95
+ if Sct::Helpers.operatingSystem == Sct::Helpers::MAC_OS
96
+ run_command "#{minikube} start --cpus=$(sysctl -n hw.ncpu) --memory=8G"
97
+ else
98
+ run_command "#{minikube} start --cpus=$(cat /proc/cpuinfo | grep processor | wc -l) --memory=10G"
99
+ end
100
+ run_command "#{minikube} ssh -- 'sudo su -c \"echo 10048576 > /proc/sys/fs/inotify/max_user_watches\"'"
85
101
  update_config
86
102
  end
87
103
 
88
104
  def post_start
89
- system "kubectl rollout status deployment/spend-cloud-api"
90
- system "sudo sct hostfile"
91
- puts "\n✔️ You can visit your environment at 👉 https://spend-cloud.spend.cloud.local 👌 (might still take a few minutes)"
105
+ wait_for_pods
106
+ run_command "sudo sct hostfile"
107
+ puts "\n✔️ You can visit your environment at 👉 https://spend-cloud.spend.cloud.local 👌"
108
+ end
109
+
110
+ def create_secrets
111
+ run_command "kubectl create secret generic gcloud-credentials --from-file=\"$(echo ~)/.config/gcloud/application_default_credentials.json\""
112
+ run_command "kubectl create secret generic -n kube-system registry-creds-dpr --from-literal DOCKER_PRIVATE_REGISTRY_PASSWORD=changeme --from-literal DOCKER_PRIVATE_REGISTRY_SERVER=changeme --from-literal DOCKER_PRIVATE_REGISTRY_USER=changeme"
113
+ run_command "kubectl patch secret -n kube-system registry-creds-dpr -p='{\"metadata\": {\"labels\": { \"app\": \"registry-creds\", \"cloud\": \"dpr\", \"kubernetes.io/minikube-addons\": \"registry-creds\"}}}'"
114
+ run_command "kubectl create secret generic -n kube-system registry-creds-ecr --from-literal AWS_ACCESS_KEY_ID=changeme --from-literal AWS_SECRET_ACCESS_KEY=changeme --from-literal AWS_SESSION_TOKEN=\"\" --from-literal aws-account=changeme --from-literal aws-assume-role=changeme --from-literal aws-region=changeme"
115
+ run_command "kubectl patch secret -n kube-system registry-creds-ecr -p='{\"metadata\": {\"labels\": { \"app\": \"registry-creds\", \"cloud\": \"ecr\", \"kubernetes.io/minikube-addons\": \"registry-creds\"}}}'"
116
+ run_command "kubectl create secret generic -n kube-system registry-creds-gcr --from-file=\"$(echo ~)/.config/gcloud/application_default_credentials.json\" --from-literal=gcrurl=\"https://eu.gcr.io\""
117
+ run_command "kubectl patch secret -n kube-system registry-creds-gcr -p='{\"metadata\": {\"labels\": { \"app\": \"registry-creds\", \"cloud\": \"gcr\", \"kubernetes.io/minikube-addons\": \"registry-creds\"}}}'"
118
+ run_command "kubectl create secret generic -n kube-system registry-creds-acr --from-literal ACR_PASSWORD=changeme --from-literal ACR_CLIENT_ID=changeme --from-literal ACR_URL=changeme"
119
+ run_command "kubectl patch secret -n kube-system registry-creds-acr -p='{\"metadata\": {\"labels\": { \"app\": \"registry-creds\", \"cloud\": \"acr\", \"kubernetes.io/minikube-addons\": \"registry-creds\"}}}'"
92
120
  end
93
121
 
94
122
  def wait_for_gcr_secret
95
123
  puts "Waiting for Google Cloud Registry secret to become available...".yellow
96
124
 
97
- while true
98
- secrets = `kubectl get secrets`
125
+ while ! `kubectl get secrets`.include? "gcr-secret"
126
+ sleep 5
127
+ end
99
128
 
100
- if secrets.include? "gcr-secret"
101
- puts "Google Cloud Registry secret is now available.".green
102
- break
103
- else
104
- sleep 1
105
- end
129
+ puts "Google Cloud Registry secret is now available.".green
130
+ end
131
+
132
+ def wait_for_ingress_ip
133
+ puts "Waiting for ingress IP to become available...".yellow
134
+
135
+ while `kubectl describe ingress | grep "Address" | awk '{print $2}'`.empty?
136
+ sleep 5
137
+ end
138
+
139
+ puts "Ingress IP is now available.".green
140
+ end
141
+
142
+ def wait_for_pods
143
+ puts "Waiting for pods to become ready...".yellow
144
+
145
+ while ! pods.all? { |pod| pod[:status] == "Running" }
146
+ delete_stalled_pods
147
+
148
+ sleep 5
149
+ end
150
+
151
+ puts "Pods are now ready.".green
152
+ end
153
+
154
+ def pods(namespace = nil)
155
+ if namespace
156
+ output = `kubectl get pods -n #{namespace}`
157
+ else
158
+ output = `kubectl get pods`
159
+ end
160
+
161
+ # split output lines
162
+ lines = output.split "\n"
163
+
164
+ # exclude first line (table header)
165
+ lines = lines[1..-1]
166
+
167
+ # get name and status of each pod
168
+ lines.map do |line|
169
+ columns = line.split(" ")
170
+
171
+ name = columns[0]
172
+ status = columns[2]
173
+ stalled = status == "ErrImagePull" || status == "ImagePullBackOff"
174
+
175
+ {
176
+ name: name,
177
+ status: status,
178
+ stalled: stalled
179
+ }
180
+ end
181
+ end
182
+
183
+ def run_command command
184
+ if ! system command
185
+ raise command.red
106
186
  end
107
187
  end
108
188
 
data/lib/sct/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Sct
2
- VERSION = "0.1.14"
2
+ VERSION = "0.1.15"
3
3
  end
@@ -0,0 +1,45 @@
1
+ apiVersion: v1
2
+ data:
3
+ Corefile: |
4
+ .:53 {
5
+ errors
6
+ health {
7
+ lameduck 5s
8
+ }
9
+ ready
10
+ kubernetes cluster.local in-addr.arpa ip6.arpa {
11
+ pods insecure
12
+ fallthrough in-addr.arpa ip6.arpa
13
+ ttl 30
14
+ }
15
+ prometheus :9153
16
+ forward . 8.8.8.8
17
+ cache 30
18
+ loop
19
+ reload
20
+ loadbalance
21
+ }
22
+ Corefile-backup: |
23
+ .:53 {
24
+ errors
25
+ health {
26
+ lameduck 5s
27
+ }
28
+ ready
29
+ kubernetes cluster.local in-addr.arpa ip6.arpa {
30
+ pods insecure
31
+ fallthrough in-addr.arpa ip6.arpa
32
+ ttl 30
33
+ }
34
+ prometheus :9153
35
+ forward . /etc/resolv.conf
36
+ cache 30
37
+ loop
38
+ reload
39
+ loadbalance
40
+ }
41
+ kind: ConfigMap
42
+ metadata:
43
+ creationTimestamp: null
44
+ name: coredns
45
+ selfLink: /api/v1/namespaces/kube-system/configmaps/coredns
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sct
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.14
4
+ version: 0.1.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reshad Farid
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-26 00:00:00.000000000 Z
11
+ date: 2020-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: class_interface
@@ -133,6 +133,7 @@ extra_rdoc_files: []
133
133
  files:
134
134
  - ".DS_Store"
135
135
  - ".gitignore"
136
+ - ".gitlab/merge_request_templates/DefinitionOfDone.md"
136
137
  - ".rspec"
137
138
  - ".travis.yml"
138
139
  - CODE_OF_CONDUCT.md
@@ -165,6 +166,7 @@ files:
165
166
  - lib/sct/docker/yarn.rb
166
167
  - lib/sct/setup/helpers.rb
167
168
  - lib/sct/version.rb
169
+ - resources/corefile.yml
168
170
  - sct.gemspec
169
171
  homepage: https://gitlab.com/proactive-software/packages/sct
170
172
  licenses: