def update_minikube_in_hosts(self): self.get_minikube_ip() name = "Update minikube.local to /etc/hosts" cmd = "sed -i -e $'s/.*minikube.*/{0}\tminikube.local registry.minikube.local elasticsearch.minikube.local kibana.minikube.local kafka.minikube.local rest.kafka.minikube.local grafana.minikube.local flink.minikube.local neo4j.minikube.local/' /etc/hosts".format( self.settings.master_ip) Static.msg(name, '.') Cmd.local_sudo_prompt_run(name, cmd)
def add_minikube_to_hosts(self): self.get_minikube_ip() name = "Add minikube.local to /etc/hosts" cmd = "bash -c \"echo $'{0}\tminikube.local registry.minikube.local elasticsearch.minikube.local kibana.minikube.local kafka.minikube.local rest.kafka.minikube.local grafana.minikube.local flink.minikube.local neo4j.minikube.local' >> /etc/hosts\"".format( self.settings.master_ip) Static.msg(name, '.') Cmd.local_sudo_prompt_run(name, cmd)
def taint_add_to_master_noschedule(self): name = "Add Taint Master. No Schedule" master_node = self.get_master_node() cmd = "kubectl taint nodes {0} node-role.kubernetes.io/master=:NoSchedule".format( master_node) Static.msg(name, master_node) Cmd.local_run_long(name, cmd)
def registry_port_forward_enable(self): name = "Enable PortForward to Registy" cmd = "kubectl port-forward --namespace kube-system {0} 5000:5000 & echo $$! > {1}/port-forward.pid".format( self.settings.folder_user_populated, self.get_registry_pod()) master_node = Cmd.local_run_get_out(name, cmd) Static.msg(name, master_node) Static.msg(">", cmd) return master_node
def mini_hostname(self): Static.figletcyber("HOSTNAME") if self.minikube.is_minikube_in_hosts(): # replace, exists self.minikube.update_minikube_in_hosts() else: # append, new self.minikube.add_minikube_to_hosts() Static.msg("/etc/hosts entry for minikube.local updated to", self.settings.master_ip)
def destroy_cluster(self): name = "DESTROY CLUSTER" Static.figletcyber(name) cmd = "kops delete cluster --state={0} {1} --yes".format( self.settings.provision.s3_store, self.settings.provision.domain ) Static.msg(name, "KOPS: aws") Cmd.local_run_realtime_continue_on_fail(name, cmd)
def taint_remove_from_master(self): name = "Remove Taint Master" master_node = self.get_master_node() cmd = "kubectl taint nodes {0} node-role.kubernetes.io/master-".format( master_node) Static.msg(name, master_node) try: Cmd.local_run_long(name, cmd) except: pass
def get_ingress_ips(self): name = "Get Ingress IPs" if self.get_context() == "minikube": cmd = "minikube ip" self.settings.ingress_ips.append(self.settings.master_ip) else: self.settings.ingress_ips = self.get_ig_ips( self.settings.cluster.ingress_instance_group) Static.msg(name, self.settings.ingress_ips) return self.settings.ingress_ips
def add_instance_group(self, ig): name = "ADD INSTANCE GROUP" Static.figletcyber(name) cmd = "kops create ig {0} --state={1} {2}".format( ig.name, self.settings.provision.s3_store, self.settings.provision.domain ) Static.msg(name, "KOPS: aws") Cmd.local_run_long(name, cmd)
def validate_cluster(self): name = "VALIDATE CLUSTER" task = "Validate Provisioned Cluster" cmd = "kops validate cluster --name={0} --state={1} -v={2} 2>&1".format( self.settings.provision.domain, self.settings.provision.s3_store, self.settings.provision.kops_verbosity ) print cmd Cmd.local_run_long_until_success(name, cmd) Static.msg("Provisioning of Kubernetes Cluster", "VERIFIED")
def local_run_long_until_success(name, cmd): attempt = 1 while attempt < 101: try: if attempt > 1: Static.msg("RETRYING", "VALIDATE in 15s") time.sleep(15) Cmd.local_run_long(name, cmd) return except: attempt += 1
def registry_port_forward_disable(self): name = "Disable PortForward to Registy" cmd1 = "kill $(shell cat {0}/port-forward.pid) || true".format( self.settings.folder_user_populated) cmd1_out = Cmd.local_run_get_out(name, cmd1) cmd2 = "rm -f {0}/port-forward.pid".format( self.settings.folder_user_populated) cmd2_out = Cmd.local_run_get_out(name, cmd2) Static.msg(name, master_node) Static.msg(">", cmd) return master_node
def use_context(self): name = "Kubectl Use Context" cmd = None context = None if self.settings.provision.cloud != "minikube": cmd = "kubectl config use-context {0}".format( self.settings.provision.domain) context = self.settings.provision.domain else: cmd = "kubectl config use-context minikube" context = "minikube" Static.msg(name, context) Cmd.local_run_long(name, cmd) print
def create_cluster(self): name = "CREATE CLUSTER" Static.figletcyber(name) cmd = "kops create cluster --zones {0} --vpc {1} --dns-zone={2} --state={3} {4}".format( self.settings.aws_zone, self.settings.provision.vpc_id, self.settings.provision.dnszone_id, self.settings.provision.s3_store, self.settings.provision.domain ) print cmd Static.msg(name, "KOPS: aws") Cmd.local_run_long(name, cmd)
def provision_cluster(self): name = "PROVISION CLUSTER" Static.figletcyber(name) task = "Provision in Cloud" cmd = "kops update cluster {0} --state={1} --yes -v={2} 2>&1".format( self.settings.provision.domain, self.settings.provision.s3_store, self.settings.provision.kops_verbosity ) Static.msg(name, task) print cmd Cmd.local_run_long(name, cmd) self.validate_cluster()
def update_cluster(self): name = "UPDATE CLUSTER" Static.figletcyber(name) task = "Rolling Update CLuster" cmd = "kops rolling-update cluster {0} --state={1} --yes -v={2} 2>&1".format( self.settings.provision.domain, self.settings.provision.s3_store, self.settings.provision.kops_verbosity ) Static.msg(name, task) print cmd Cmd.local_run_long(name, cmd) self.validate_cluster()
def local_run_long_until_ready(name, cmd): result = False while not result: proc1 = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, preexec_fn=os.setsid) proc1.wait() for line in iter(proc1.stdout.readline, ''): if not "ready: true" in line: Static.msg("Waiting for", name.upper()) time.sleep(10) continue Static.msg("Success for", name.upper()) return
def install(self, element): name = "INSTALL CHART" task = "Populate Chart Values" Static.msg(name, task) self.localtemplate.generate_template_element(element) # name autoassigned, replace to use same name, unsafe in prod, good for testing cmd = "helm upgrade --install --debug --namespace {1} --values={2} {0} {3}".format( element.release, element.name, self.localtemplate.path_populated, element.chart ) print cmd Static.msg(name, "{0}".format(element.chart)) Cmd.local_run_long(name, cmd)
def get_master_ip(self): name = "Get Master IP" if self.get_context() == "minikube": cmd = "minikube ip" self.settings.master_ip = Cmd.local_run_get_out(name, cmd) else: cmd = "kubectl get nodes | grep master | sed 's/ .*//'" master_node = Cmd.local_run_get_out(name, cmd) ip_list = master_node.split( '-' ) # highly dependant on hostname not being changed from amazon default. find better way fast (example: 'ip-172-32-56-155.ec2.internal') self.settings.master_ip = '{0}.{1}.{2}.{3}'.format( ip_list[1], ip_list[2], ip_list[3], ip_list[4].split('.')[0], ) Static.msg(name, self.settings.master_ip) return self.settings.master_ip
def initialize_new_clusterfile(self): clusterfile_src = os.path.join(self.folder_app_clusters, self.args.init[0]) clusterfile_dst = os.path.join(self.folder_user_clusters, self.args.init[1]) if os.path.isfile(clusterfile_dst): print "DESTINATION FILE {0} ALREADY EXISTS".format(clusterfile_dst) if not os.path.isfile(clusterfile_src): print "SOURCE FILE {0} NOT FOUND".format(clusterfile_src) Static.msg("Initializing New Clusterfile", clusterfile_dst) Cmd.local_run_get_out( "INITIATED CLUSTERFILE {0}".format(clusterfile_src), "cp {0} {1}".format(clusterfile_src, clusterfile_dst)) self.settings.clusterfile = clusterfile_dst self.save_settings_file()
def add_instance_group(self, name): single_ig = Struct(**list(filter(lambda d: d['name'] in [name], self.settings.provision.instance_groups))[0]) populated_ig_file = self.get_ig_filename(single_ig.name) task = "Get Kops Instance Group {0} settings".format(single_ig.name) cmd = "kops get ig --name={0} nodes -oyaml --state={1} > {2}/remote.{3}".format( self.settings.provision.domain, self.settings.provision.s3_store, self.settings.folder_user_populated, populated_ig_file) Static.msg(name, task) Cmd.local_run_long(name, cmd) task = "Render Instance Group {0} Template".format(single_ig.name) Static.msg(name, task) self.localtemplate.generate_template_node(self.file_local_nodes, populated_ig_file, single_ig) task = "Update Kops Instance Group {0} settings".format(single_ig.name) cmd = "kops replace -f {0}/{1} --state={2} --force".format( self.settings.folder_user_populated, populated_ig_file, self.settings.provision.s3_store ) Static.msg(name, task) Cmd.local_run_long(name, cmd)
def get_nodes(self): name = "Get Nodes" cmd = "kubectl get nodes --show-labels -o wide" Static.msg(name, self.settings.provision.domain) Cmd.local_run_long(name, cmd) print
def get_registry_pod(self): name = "Get Registry Pod" cmd = "kubectl get pods --namespace kube-system -l k8s-app=kube-registry-upstream -o template --template '{{range .items}}{{.metadata.name}} {{.status.phase}}{{\"\\n\"}}{{end}}'" master_node = Cmd.local_run_get_out(name, cmd).split(' ')[0] Static.msg(name, master_node) return master_node
def get_context(self): name = "kubectl config current-context" cmd = "kubectl config current-context" self.settings.current_context = Cmd.local_run_get_out(name, cmd) Static.msg(name, self.settings.current_context) return self.settings.current_context
def apply(self, component_item): cmd = "kubectl apply -f {0}/{1}".format( self.settings.folder_user_populated, component_item.template) Static.msg("Adding Component", component_item.name) Cmd.local_run_long(component_item.name, cmd)
def wait_until_kube_system_ready(self): name = "Wait Until Kube-System Ready" cmd = "kubectl get pods -n kube-system -o=yaml | grep 'ready: true'" Static.msg(name, "") Cmd.local_run_long_until_ready(name, cmd)
def get_all_on_namespace(self, name): cmd = "kubectl get pods,svc,ing --namespace={0}".format(name) Static.msg("Displaying status of namespace", name) Cmd.local_run_long("Get Namespace Details", cmd)
def get_ing(self): name = "Get Ingress" cmd = "kubectl get ing --all-namespaces" Static.msg(name, self.settings.provision.domain) Cmd.local_run_long(name, cmd) print
def get_svc(self): name = "Get Services" cmd = "kubectl get svc --all-namespaces" Static.msg(name, self.settings.provision.domain) Cmd.local_run_long(name, cmd) print
def get_pods(self): name = "Get Pods (sorted by nodeName)" cmd = 'kubectl get pods --all-namespaces -o wide --sort-by="{.spec.nodeName}"' Static.msg(name, self.settings.provision.domain) Cmd.local_run_long(name, cmd) print