sct 0.1.14 → 0.1.15

Sign up to get free protection for your applications and to get access to all the features.
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: