iop-select 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. #!/usr/bin/env python
  2. #
  3. # Licensed to the Apache Software Foundation (ASF) under one
  4. # or more contributor license agreements. See the NOTICE file
  5. # distributed with this work for additional information
  6. # regarding copyright ownership. The ASF licenses this file
  7. # to you under the Apache License, Version 2.0 (the
  8. # "License"); you may not use this file except in compliance
  9. # with the License. You may obtain a copy of the License at
  10. #
  11. # http://www.apache.org/licenses/LICENSE-2.0
  12. #
  13. # Unless required by applicable law or agreed to in writing, software
  14. # distributed under the License is distributed on an "AS IS" BASIS,
  15. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. # See the License for the specific language governing permissions and
  17. # limitations under the License.
  18. #
  19. import optparse
  20. import copy
  21. import os
  22. import re
  23. import sys
  24. # The global prefix and current directory
  25. root = "/usr/iop"
  26. current = root + "/current"
  27. versionRegex = re.compile('[-.]')
  28. # The packages and where in the release they should point to
  29. leaves = {
  30. "accumulo-client": "accumulo",
  31. "accumulo-gc": "accumulo",
  32. "accumulo-master": "accumulo",
  33. "accumulo-monitor": "accumulo",
  34. "accumulo-tablet": "accumulo",
  35. "accumulo-tracer": "accumulo",
  36. "atlas-server": "atlas",
  37. "atlas-client": "atlas",
  38. "falcon-client": "falcon",
  39. "falcon-server": "falcon",
  40. "flume-server": "flume",
  41. "hadoop-client": "hadoop",
  42. "hadoop-hdfs-datanode": "hadoop-hdfs",
  43. "hadoop-hdfs-journalnode": "hadoop-hdfs",
  44. "hadoop-hdfs-nfs3": "hadoop-hdfs",
  45. "hadoop-hdfs-namenode": "hadoop-hdfs",
  46. "hadoop-hdfs-portmap": "hadoop-hdfs",
  47. "hadoop-hdfs-secondarynamenode": "hadoop-hdfs",
  48. "hadoop-httpfs": "hadoop-httpfs",
  49. "hadoop-mapreduce-historyserver": "hadoop-mapreduce",
  50. "hadoop-yarn-resourcemanager": "hadoop-yarn",
  51. "hadoop-yarn-nodemanager": "hadoop-yarn",
  52. "hadoop-yarn-timelineserver": "hadoop-yarn",
  53. "hbase-client": "hbase",
  54. "hbase-master": "hbase",
  55. "hbase-regionserver": "hbase",
  56. "hive-metastore": "hive",
  57. "hive-server2": "hive",
  58. "hive-webhcat": "hive-hcatalog",
  59. "hive-server2-hive2": "hive2",
  60. "kafka-broker": "kafka",
  61. "knox-server": "knox",
  62. "livy-server": "livy",
  63. "mahout-client": "mahout",
  64. "oozie-client": "oozie",
  65. "oozie-server": "oozie",
  66. "phoenix-client": "phoenix",
  67. "phoenix-server": "phoenix",
  68. "slider-client": "slider",
  69. "sqoop-client": "sqoop",
  70. "sqoop-server": "sqoop",
  71. "storm-client": "storm",
  72. "storm-nimbus": "storm",
  73. "storm-supervisor": "storm",
  74. "storm-slider-client": "storm-slider-client",
  75. "zeppelin-server": "zeppelin",
  76. "zookeeper-client": "zookeeper",
  77. "zookeeper-server": "zookeeper",
  78. "ranger-admin" : "ranger-admin",
  79. "ranger-kms" : "ranger-kms",
  80. "ranger-usersync" : "ranger-usersync",
  81. "ranger-tagsync" : "ranger-tagsync",
  82. "spark-client" : "spark",
  83. "spark-thriftserver" : "spark",
  84. "spark-historyserver" : "spark",
  85. "spark2-client" : "spark2",
  86. "spark2-thriftserver" : "spark2",
  87. "spark2-historyserver" : "spark2",
  88. }
  89. # Define the aliases and the list of leaves they correspond to
  90. aliases = {
  91. "accumulo-server": ["accumulo-gc",
  92. "accumulo-master",
  93. "accumulo-monitor",
  94. "accumulo-tablet",
  95. "accumulo-tracer"],
  96. "all": leaves.keys(),
  97. "client" : ["accumulo-client",
  98. "atlas-client",
  99. "falcon-client",
  100. "hadoop-client",
  101. "hbase-client",
  102. "mahout-client",
  103. "oozie-client",
  104. "phoenix-client",
  105. "slider-client",
  106. "sqoop-client",
  107. "storm-client",
  108. "zookeeper-client",
  109. "spark2-client",
  110. "spark-client"],
  111. "hadoop-hdfs-server": ["hadoop-hdfs-datanode",
  112. "hadoop-hdfs-journalnode",
  113. "hadoop-hdfs-nfs3",
  114. "hadoop-hdfs-namenode",
  115. "hadoop-hdfs-secondarynamenode"],
  116. "hadoop-mapreduce-server": ["hadoop-mapreduce-historyserver"],
  117. "hadoop-yarn-server": ["hadoop-yarn-resourcemanager",
  118. "hadoop-yarn-nodemanager",
  119. "hadoop-yarn-timelineserver"],
  120. "hive-server": ["hive-metastore",
  121. "hive-server2",
  122. "hive-webhcat"],
  123. }
  124. locked_contexts = {
  125. "hadoop-client": [("hadoop-hdfs-client", "hadoop-hdfs"),
  126. ("hadoop-httpfs", "hadoop-httpfs"),
  127. ("hadoop-yarn-client", "hadoop-yarn"),
  128. ("hadoop-mapreduce-client", "hadoop-mapreduce"),
  129. ("hive-client", "hive"),
  130. ("pig-client", "pig"),
  131. ("tez-client", "tez"),
  132. ("livy-client", "livy"),
  133. ("spark2-client", "spark2"),
  134. ("spark-client", "spark")]
  135. }
  136. command_symlinks = {
  137. "accumulo" : "accumulo-client/bin/accumulo",
  138. "atlas-start" : "atlas-server/bin/metadata-start.sh",
  139. "atlas-stop" : "atlas-server/bin/metadata-stop.sh",
  140. "beeline" : "hive-client/bin/beeline",
  141. "falcon" : "falcon-client/bin/falcon",
  142. "flume-ng" : "flume-server/bin/flume-ng",
  143. "hadoop" : "hadoop-client/bin/hadoop",
  144. "hbase" : "hbase-client/bin/hbase",
  145. "phoenix-sqlline" : "phoenix-client/bin/sqlline.py",
  146. "phoenix-sqlline-thin" : "phoenix-client/bin/sqlline-thin.py",
  147. "phoenix-psql" : "phoenix-client/bin/psql.py",
  148. "phoenix-queryserver" : "phoenix-server/bin/queryserver.py",
  149. "hcat" : "hive-client/../hive-hcatalog/bin/hcat",
  150. "hdfs" : "hadoop-hdfs-client/bin/hdfs",
  151. "hive" : "hive-client/bin/hive",
  152. "hiveserver2" : "hive-server2/bin/hiveserver2",
  153. "mahout" : "mahout-client/bin/mahout",
  154. "mapred" : "hadoop-mapreduce-client/bin/mapred",
  155. "oozie" : "oozie-client/bin/oozie",
  156. "oozied.sh" : "oozie-server/bin/oozied.sh",
  157. "pig" : "pig-client/bin/pig",
  158. "slider": "slider-client/bin/slider",
  159. "sqoop" : "sqoop-client/bin/sqoop",
  160. "sqoop-codegen" : "sqoop-client/bin/sqoop-codegen",
  161. "sqoop-create-hive-table" : "sqoop-client/bin/sqoop-create-hive-table",
  162. "sqoop-eval" : "sqoop-client/bin/sqoop-eval",
  163. "sqoop-export" : "sqoop-client/bin/sqoop-export",
  164. "sqoop-help" : "sqoop-client/bin/sqoop-help",
  165. "sqoop-import" : "sqoop-client/bin/sqoop-import",
  166. "sqoop-import-all-tables" : "sqoop-client/bin/sqoop-import-all-tables",
  167. "sqoop-job" : "sqoop-client/bin/sqoop-job",
  168. "sqoop-list-databases" : "sqoop-client/bin/sqoop-list-databases",
  169. "sqoop-list-tables" : "sqoop-client/bin/sqoop-list-tables",
  170. "sqoop-merge" : "sqoop-client/bin/sqoop-merge",
  171. "sqoop-metastore" : "sqoop-server/bin/sqoop-metastore",
  172. "sqoop-version" : "sqoop-client/bin/sqoop-version",
  173. "storm" : "storm-client/bin/storm",
  174. "worker-lanucher": "storm-client/bin/worker-launcher",
  175. "storm-slider": "storm-slider-client/bin/storm-slider",
  176. "kafka" : "kafka-broker/bin/kafka",
  177. "yarn" : "hadoop-yarn-client/bin/yarn",
  178. "zookeeper-client" : "zookeeper-client/bin/zookeeper-client",
  179. "zookeeper-server" : "zookeeper-server/bin/zookeeper-server",
  180. "zookeeper-server-cleanup" : "zookeeper-server/bin/zookeeper-server-cleanup",
  181. "ranger-admin-start" : "ranger-admin/ews/ranger-admin-start",
  182. "ranger-admin-stop" : "ranger-admin/ews/ranger-admin-stop",
  183. "ranger-kms" : "ranger-kms/ranger-kms",
  184. "ranger-usersync-start" : "ranger-usersync/ranger-usersync-start",
  185. "ranger-usersync-stop" : "ranger-usersync/ranger-usersync-stop",
  186. "run-example" : "spark-client/bin/run-example",
  187. "sparkR" : "spark-client/bin/sparkR",
  188. "spark-class" : "spark-client/bin/spark-class",
  189. "spark-shell" : "spark-client/bin/spark-shell",
  190. "spark-sql" : "spark-client/bin/spark-sql",
  191. "spark-submit" : "spark-client/bin/spark-submit",
  192. "pyspark" : "spark-client/bin/pyspark",
  193. }
  194. bin_directory = "/usr/bin"
  195. # Given a package or alias name, get the full list of packages
  196. def getPackages( name ):
  197. if name == None:
  198. return leaves.keys()
  199. if name in aliases:
  200. return aliases[name]
  201. if name in leaves:
  202. return [ name ]
  203. print "ERROR: Invalid package - " + name
  204. print
  205. printPackages()
  206. sys.exit(1)
  207. # Print the status of each of the given packages
  208. def listPackages( packages ):
  209. if packages == None:
  210. packages = leaves
  211. packages.sort()
  212. for pkg in packages:
  213. linkname = current + "/" + pkg
  214. if os.path.isdir(linkname):
  215. print (pkg + " - " +
  216. os.path.basename(os.path.dirname(os.readlink(linkname))))
  217. else:
  218. print pkg + " - None"
  219. # Print the avaialable package names
  220. def printPackages():
  221. packages = leaves.keys()
  222. packages.sort()
  223. print "Packages:"
  224. for pkg in packages:
  225. print " ", pkg
  226. groups = aliases.keys()
  227. groups.sort()
  228. print "Aliases:"
  229. for pkg in groups:
  230. print " ", pkg
  231. # Print the installed packages
  232. def printVersions():
  233. result = {}
  234. for f in os.listdir(root):
  235. if f not in [".", "..", "current", "share", "lost+found"]:
  236. try:
  237. result[tuple(map(int, versionRegex.split(f)))] = f
  238. except ValueError:
  239. print ("ERROR: Unexpected file/directory found in %s: %s" % (root, f))
  240. sys.exit(1)
  241. keys = result.keys()
  242. keys.sort()
  243. for k in keys:
  244. print result[k]
  245. # Set the list of packages to the given version
  246. def setPackages(packages, version, rpm_mode):
  247. if packages == None or version == None:
  248. print "ERROR: 'set' command must give both package and version"
  249. print
  250. printHelp()
  251. sys.exit(1)
  252. target = root + "/" + version
  253. if not os.path.isdir(target):
  254. print "ERROR: Invalid version " + version
  255. print
  256. print "Valid choices:"
  257. printVersions()
  258. sys.exit(1)
  259. if not os.path.isdir(current):
  260. os.mkdir(current, 0755)
  261. packages.sort()
  262. for pkg in packages:
  263. linkname = current + "/" + pkg
  264. if os.path.islink(linkname) and rpm_mode:
  265. continue
  266. elif os.path.islink(linkname):
  267. os.remove(linkname)
  268. if os.path.exists(linkname):
  269. print("symlink target %s for %s already exists and it is not a symlink." % (linkname, leaves[pkg]))
  270. sys.exit(1)
  271. os.symlink(target + "/" + leaves[pkg], linkname)
  272. if pkg in locked_contexts:
  273. for (kid, dir) in locked_contexts[pkg]:
  274. linkname = current + "/" + kid
  275. if os.path.islink(linkname):
  276. os.remove(linkname)
  277. os.symlink(target + "/" + dir, linkname)
  278. # Create command symlinks
  279. def createCommandSymlinks(packages, rpm_mode):
  280. work_packages = copy.copy(packages)
  281. for pkg in packages:
  282. if pkg in locked_contexts:
  283. for (child, dir) in locked_contexts[pkg]:
  284. work_packages.append(child)
  285. for symlink in command_symlinks:
  286. pkg = command_symlinks[symlink].split('/')[0]
  287. filename = bin_directory + "/" + symlink
  288. target = current + "/" + command_symlinks[symlink]
  289. if rpm_mode and os.path.lexists(filename):
  290. continue
  291. if pkg in work_packages:
  292. if not os.path.lexists(filename):
  293. os.symlink(target, filename)
  294. elif os.path.islink(filename):
  295. old_value = os.readlink(filename)
  296. if old_value != target:
  297. print "WARNING: Replacing link", filename, "from", old_value
  298. os.remove(filename)
  299. os.symlink(target, filename)
  300. else:
  301. print "ERROR:", filename, "is a regular file instead of symlink."
  302. print
  303. print "Please ensure that the IOP 4.0 (and earlier) packages are"
  304. print "removed."
  305. # Do a sanity check on the tables
  306. def sanityCheckTables():
  307. for alias in aliases:
  308. for child in aliases[alias]:
  309. if not child in leaves:
  310. print "ERROR: Alias", alias, "has bad child", child
  311. sys.exit(1)
  312. locked = set()
  313. for parent in locked_contexts:
  314. for (kid, dir) in locked_contexts[parent]:
  315. locked.add(kid)
  316. for symlink in command_symlinks:
  317. parts = command_symlinks[symlink].split('/')
  318. if not parts[0] in leaves and not parts[0] in locked:
  319. print "ERROR: command symlink", symlink, "points to an invalid package",\
  320. parts[0]
  321. sys.exit(1)
  322. def printHelp():
  323. print """
  324. usage: distro-select [-h] [<command>] [<package>] [<version>]
  325. Set the selected version of HDP.
  326. positional arguments:
  327. <command> One of set, status, versions, or packages
  328. <package> the package name to set
  329. <version> the HDP version to set
  330. optional arguments:
  331. -h, --help show this help message and exit
  332. -r, --rpm-mode if true checks if there is symlink exists and creates the symlink if it doesn't
  333. Commands:
  334. set : set the package to a specified version
  335. status : show the version of the package
  336. versions : show the currently installed versions
  337. packages : show the individual package names
  338. """
  339. def checkCommandParameters(cmd, realLen, rightLen):
  340. if realLen != rightLen:
  341. print "ERROR:", cmd, "command takes", rightLen - 1,\
  342. "parameters, instead of", realLen - 1
  343. printHelp()
  344. sys.exit(1)
  345. ############################
  346. #
  347. # Start of main
  348. sanityCheckTables()
  349. parser = optparse.OptionParser(add_help_option=False)
  350. parser.add_option("-h", "--help", action="store_true", dest="help",
  351. help="print help")
  352. parser.add_option("-r", "--rpm-mode", action="store_true", dest="rpm_mode", default=False,
  353. help="if true checks if there is symlink exists and creates the symlink if it doesn't")
  354. (options, args) = parser.parse_args()
  355. if options.help:
  356. printHelp()
  357. else:
  358. if len(args) == 0 or args[0] == 'status':
  359. if len(args) > 1:
  360. listPackages(getPackages(args[1]))
  361. else:
  362. listPackages(getPackages("all"))
  363. elif args[0] == "set":
  364. checkCommandParameters('set', len(args), 3)
  365. pkgs = getPackages(args[1])
  366. setPackages(pkgs, args[2], options.rpm_mode)
  367. createCommandSymlinks(pkgs, options.rpm_mode)
  368. elif args[0] == "versions":
  369. checkCommandParameters('versions', len(args), 1)
  370. printVersions()
  371. elif args[0] == "packages":
  372. checkCommandParameters('packages', len(args), 1)
  373. printPackages()
  374. else:
  375. print "ERROR: Unknown command -", args[0]
  376. printHelp()
  377. sys.exit(1)