This repository was archived by the owner on Apr 7, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathservctl
More file actions
executable file
·168 lines (132 loc) · 8.56 KB
/
servctl
File metadata and controls
executable file
·168 lines (132 loc) · 8.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#!/usr/bin/env python2.7
import argparse
import logging
import os
import sys
from deploy.utils.constants import DEPLOYMENT_TARGETS, DEPLOYABLE_COMPONENTS
from deploy.utils.deploy_utils import deploy
from deploy.utils.kubectl_utils import run_in_pod
from deploy.utils.servctl_utils import print_log, port_forward, show_dashboard, show_status, \
troubleshoot_component, delete_component, delete_all, get_component_port_pairs, \
check_kubernetes_context, set_environment
from utils.shell_utils import wait_for
logging.basicConfig(format='%(asctime)s %(levelname)-8s %(message)s')
logger = logging.getLogger()
logger.setLevel(logging.INFO)
SET_ENVIRONMENT_COMMAND = 'set-env'
STATUS_COMMAND = 'status'
DEPLOY_COMMAND = 'deploy'
LOAD_COMMAND = 'load'
LOG_COMMAND = 'logs'
TROUBLESHOOT_COMMAND = 'troubleshoot'
PORT_FORWARD_COMMAND = 'port-forward'
PORT_FORWARD_AND_LOG_COMMAND = 'connect-to'
SHELL_COMMAND = 'shell'
DASHBOARD_COMMAND ='dashboard'
DELETE_COMMAND = 'delete'
DELETE_ALL_COMMAND = 'delete-all'
p = argparse.ArgumentParser()
subparsers = p.add_subparsers(dest='command')
## DEPLOY_COMMAND
def check_restore_db(filename):
if not os.path.isfile(filename):
p.error("File doesn't exist: %s" % filename)
return os.path.abspath(filename)
sp = subparsers.add_parser(DEPLOY_COMMAND, description="Deploy one or more components")
sp.add_argument("-o", "--output-dir", help="output directory for deployment files and logs")
sp.add_argument("-b", "--build-docker-image", action="store_true", help="use 'docker build --no-cache' to rebuild docker image from the beginning without using cache")
sp.add_argument("-d", "--delete-before-deploy", action="store_true", help="use 'kubectl delete' and then 'kubectl create' to deploy component(s) instead of just 'kubectl update'")
sp.add_argument("-f", "--force", dest="build_docker_image_and_reset_db", action="store_true", help="Same as -b and -d together - reset the db and rebuild the docker image.")
sp.add_argument("component", nargs="?", help="if provided, only this one component will be deployed. Otherwise, all components will be deployed.", choices=DEPLOYABLE_COMPONENTS)
sp.add_argument("deployment_target", choices=DEPLOYMENT_TARGETS, help="which kubernetes cluster to deploy to")
## ENVIRONMENT_COMMAND
sp = subparsers.add_parser(SET_ENVIRONMENT_COMMAND, description="Set terminal environment for a particular deployment target (eg. 'local', 'gcloud-dev', etc.)")
sp.add_argument("deployment_target", choices=DEPLOYMENT_TARGETS, help="kubernetes cluster")
## LOG_COMMAND
sp = subparsers.add_parser(LOG_COMMAND, description="Show logs for one or more components")
sp.add_argument("-f", "--stream-log", action="store_true", help="stream the log")
sp.add_argument("components", nargs="+", help="show log", choices=DEPLOYABLE_COMPONENTS)
sp.add_argument("deployment_target", choices=DEPLOYMENT_TARGETS, help="kubernetes cluster")
## TROUBLESHOOT_COMMAND
sp = subparsers.add_parser(TROUBLESHOOT_COMMAND, description="Print detailed debugging info to troubleshoot components not starting")
sp.add_argument("component", help="print detailed debugging info", choices=DEPLOYABLE_COMPONENTS)
sp.add_argument("deployment_target", choices=DEPLOYMENT_TARGETS, help="kubernetes cluster")
## PORT_FORWARD_COMMAND
sp = subparsers.add_parser(PORT_FORWARD_COMMAND, description="Start port-forwarding for service(s) running inside one or more containers, "
"allowing connections via localhost. After starting port-forwarding as a background process, start streaming logs from these components. ")
sp.add_argument("components", nargs="+", help="start port-forwarding for service(s) running in the given component container(s), allowing connections via localhost", choices=DEPLOYABLE_COMPONENTS)
sp.add_argument("deployment_target", choices=DEPLOYMENT_TARGETS, help="kubernetes cluster")
## PORT_FORWARD_AND_LOG_COMMAND
sp = subparsers.add_parser(PORT_FORWARD_AND_LOG_COMMAND, description="Start port-forwarding for service(s) running inside one or more containers, allowing connections via localhost")
sp.add_argument("components", nargs="+", help="start port-forwarding for service(s) running in the given component container(s), allowing connections via localhost", choices=DEPLOYABLE_COMPONENTS)
sp.add_argument("deployment_target", choices=DEPLOYMENT_TARGETS, help="kubernetes cluster")
## SHELL_COMMAND
sp = subparsers.add_parser(SHELL_COMMAND, description="Open a bash shell inside one of the component containers")
sp.add_argument("component", help="open a bash shell inside this component container", choices=DEPLOYABLE_COMPONENTS)
sp.add_argument("deployment_target", choices=DEPLOYMENT_TARGETS, help="kubernetes cluster")
## STATUS_COMMAND
sp = subparsers.add_parser(STATUS_COMMAND, description="Print docker and kubectl info")
## DASHBOARD_COMMAND
sp = subparsers.add_parser(DASHBOARD_COMMAND, description="Show the kubernetes dashboard")
sp.add_argument("deployment_target", choices=DEPLOYMENT_TARGETS, help="kubernetes cluster")
## DELETE_COMMAND
sp = subparsers.add_parser(DELETE_COMMAND, description="Terminate any live deployments, services, and pods for a given component")
sp.add_argument("components", nargs="+", help="terminate all deployments, services, and pods for the given component(s)", choices=DEPLOYABLE_COMPONENTS)
sp.add_argument("deployment_target", choices=DEPLOYMENT_TARGETS, help="kubernetes cluster")
## DELETE_ALL_COMMAND
sp = subparsers.add_parser(DELETE_ALL_COMMAND, description="Delete all components + the cluster")
sp.add_argument("deployment_target", choices=DEPLOYMENT_TARGETS, help="kubernetes cluster")
args = p.parse_args()
# process command-line args
if hasattr(args, "deployment_target") and args.command != SET_ENVIRONMENT_COMMAND:
check_kubernetes_context(args.deployment_target)
if getattr(args, "command") not in [DEPLOY_COMMAND, DELETE_COMMAND]:
if getattr(args, "component", None) == "elasticsearch":
args.component = "es-client"
if getattr(args, "components", None) == ["elasticsearch"]:
args.components = ["es-client"]
other_settings = {}
other_settings["BASE_DIR"] = os.path.abspath(os.path.dirname(__file__))
if args.command == DEPLOY_COMMAND:
other_settings["DELETE_BEFORE_DEPLOY"] = True if args.delete_before_deploy or args.build_docker_image_and_reset_db else None
other_settings["BUILD_DOCKER_IMAGE"] = True if args.build_docker_image or args.build_docker_image_and_reset_db else None
deploy(args.deployment_target, components=[args.component] if args.component else None, other_settings=other_settings)
if getattr(args, "component", None) == "elasticsearch":
args.component = "es-client"
if args.component:
logger.info("=============")
logger.info("tail %s logs ..." % args.component)
os.system("sleep 10")
component_port_pairs = get_component_port_pairs([args.component])
if component_port_pairs:
procs1 = port_forward(component_port_pairs, deployment_target=args.deployment_target, wait=False, open_browser=True)
procs2 = print_log([args.component], deployment_target=args.deployment_target, enable_stream_log=True, wait=False)
wait_for(procs1 + procs2)
elif args.command == LOG_COMMAND:
components = args.components if args.components else DEPLOYABLE_COMPONENTS
print_log(components, args.deployment_target, args.stream_log)
elif args.command == PORT_FORWARD_COMMAND:
component_port_pairs = get_component_port_pairs(args.components)
port_forward(component_port_pairs, deployment_target=args.deployment_target)
elif args.command == PORT_FORWARD_AND_LOG_COMMAND:
component_port_pairs = get_component_port_pairs(args.components)
procs1 = port_forward(component_port_pairs, deployment_target=args.deployment_target, wait=False, open_browser=True)
procs2 = print_log(args.components, args.deployment_target, enable_stream_log=True, wait=False)
wait_for(procs1 + procs2)
elif args.command == SHELL_COMMAND:
run_in_pod(args.component, '/bin/bash', deployment_target=args.deployment_target, is_interactive=True)
elif args.command == SET_ENVIRONMENT_COMMAND:
set_environment(args.deployment_target)
elif args.command == STATUS_COMMAND:
show_status()
elif args.command == DASHBOARD_COMMAND:
show_dashboard()
elif args.command == DELETE_COMMAND:
for component in args.components:
delete_component(component, deployment_target=args.deployment_target)
elif args.command == TROUBLESHOOT_COMMAND:
troubleshoot_component(args.component, deployment_target=args.deployment_target)
elif args.command == DELETE_ALL_COMMAND:
delete_all(args.deployment_target)
else:
p.error("Unexpected command: " + str(args.command))