/cli/src/katello/client/core/content_view_definition.py

https://bitbucket.org/guymatz/katello · Python · 437 lines · 311 code · 108 blank · 18 comment · 17 complexity · 7308762f4c0004c94d06e35011099ec0 MD5 · raw file

  1. #
  2. # Katello Organization actions
  3. # Copyright (c) 2012 Red Hat, Inc.
  4. #
  5. # This software is licensed to you under the GNU General Public License,
  6. # version 2 (GPLv2). There is NO WARRANTY for this software, express or
  7. # implied, including the implied warranties of MERCHANTABILITY or FITNESS
  8. # FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
  9. # along with this software; if not, see
  10. # http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
  11. #
  12. # Red Hat trademarks are not licensed under GPLv2. No permission is
  13. # granted to use or replicate Red Hat trademarks that are incorporated
  14. # in this software or its documentation.
  15. #
  16. import os
  17. from katello.client.api.content_view_definition import ContentViewDefinitionAPI
  18. from katello.client.cli.base import opt_parser_add_org
  19. from katello.client.core.base import BaseAction, Command
  20. from katello.client.api.utils import get_content_view, get_cv_definition, \
  21. get_product, get_repo
  22. from katello.client.lib.async import AsyncTask, evaluate_task_status
  23. from katello.client.lib.ui.progress import run_spinner_in_bg, wait_for_async_task
  24. # base content_view_definition action ----------------------------------------
  25. class ContentViewDefinitionAction(BaseAction):
  26. def __init__(self):
  27. super(ContentViewDefinitionAction, self).__init__()
  28. self.api = ContentViewDefinitionAPI()
  29. self.def_api = ContentViewDefinitionAPI()
  30. @classmethod
  31. def _add_get_cvd_opts(cls, parser):
  32. parser.add_option('--label', dest='label',
  33. help=_("definition label eg: def1"))
  34. parser.add_option('--id', dest='id',
  35. help=_("definition id eg: 42"))
  36. parser.add_option('--name', dest='name',
  37. help=_("definition name eg: def1"))
  38. @classmethod
  39. def _add_get_cvd_opts_check(cls, validator):
  40. validator.require_at_least_one_of(('name', 'label', 'id'))
  41. validator.mutually_exclude('name', 'label', 'id')
  42. # cvd definition actions -----------------------------------------------------
  43. class List(ContentViewDefinitionAction):
  44. description = _('list known content view definitions')
  45. def setup_parser(self, parser):
  46. opt_parser_add_org(parser, required=1)
  47. def check_options(self, validator):
  48. validator.require('org')
  49. def run(self):
  50. org_name = self.get_option('org')
  51. defs = self.def_api.content_view_definitions_by_org(org_name)
  52. self.printer.add_column('id', _("ID"))
  53. self.printer.add_column('name', _("Name"))
  54. self.printer.add_column('label', _("Label"))
  55. self.printer.add_column('description', _("Description"), multiline=True)
  56. self.printer.add_column('organization', _('Org'))
  57. self.printer.set_header(_("Content View Definition List"))
  58. self.printer.print_items(defs)
  59. return os.EX_OK
  60. class Publish(ContentViewDefinitionAction):
  61. description = _("create a content view from a definition")
  62. def setup_parser(self, parser):
  63. opt_parser_add_org(parser)
  64. self._add_get_cvd_opts(parser)
  65. parser.add_option('--view_name', dest='view_name',
  66. help=_("name to give published view (required)"))
  67. parser.add_option('--view_label', dest='view_label',
  68. help=_("label to give published view"))
  69. parser.add_option('--description', dest='description',
  70. help=_("description to give published view"))
  71. parser.add_option('--async', dest='async', action='store_true',
  72. help=_("publish the view asynchronously"))
  73. def check_options(self, validator):
  74. validator.require(('org', 'view_name'))
  75. self._add_get_cvd_opts_check(validator)
  76. def run(self):
  77. org_name = self.get_option('org')
  78. label = self.get_option('label')
  79. name = self.get_option('name')
  80. def_id = self.get_option('id')
  81. view_label = self.get_option('view_label')
  82. view_name = self.get_option('view_name')
  83. description = self.get_option('description')
  84. async = self.get_option('async')
  85. cvd = get_cv_definition(org_name, label, name, def_id)
  86. task = self.def_api.publish(org_name, cvd["id"], view_name, view_label, description)
  87. if not async:
  88. task = AsyncTask(task)
  89. run_spinner_in_bg(wait_for_async_task, [task],
  90. message=_("Publishing content view, please wait..."))
  91. return evaluate_task_status(task,
  92. ok = _("Content view [ %s ] published successfully.") % name,
  93. failed = _("Content view [ %s ] failed to be promoted") % name
  94. )
  95. else:
  96. print _("Publish task [ %s ] was successfully created.") % task['uuid']
  97. return os.EX_OK
  98. class Info(ContentViewDefinitionAction):
  99. description = _('list a specific content view definition')
  100. def setup_parser(self, parser):
  101. opt_parser_add_org(parser)
  102. self._add_get_cvd_opts(parser)
  103. def check_options(self, validator):
  104. validator.require(('org'))
  105. self._add_get_cvd_opts_check(validator)
  106. def run(self):
  107. org_name = self.get_option('org')
  108. def_label = self.get_option('label')
  109. def_name = self.get_option('name')
  110. def_id = self.get_option('id')
  111. cvd = get_cv_definition(org_name, def_label, def_name, def_id)
  112. self.printer.add_column('id', _("ID"))
  113. self.printer.add_column('name', _("Name"))
  114. self.printer.add_column('label', _("Label"))
  115. self.printer.add_column('description', _("Description"), multiline=True)
  116. self.printer.add_column('organization', _('Org'))
  117. self.printer.add_column('content_views', _('Published Views'), multiline=True)
  118. self.printer.add_column('components', _('Component Views'), multiline=True)
  119. self.printer.add_column('products', _("Products"), multiline=True)
  120. self.printer.add_column('repos', _("Repos"), multiline=True)
  121. self.printer.set_header(_("Content View Definition Info"))
  122. self.printer.print_item(cvd)
  123. return os.EX_OK
  124. class Create(ContentViewDefinitionAction):
  125. description = _('create an content view definition')
  126. def setup_parser(self, parser):
  127. parser.add_option('--name', dest='name',
  128. help=_("content view definition name eg: Database (required)"))
  129. opt_parser_add_org(parser, required=1)
  130. parser.add_option('--description', dest='description',
  131. help=_("definition description"))
  132. parser.add_option('--label', dest='label',
  133. help=_("definition label"))
  134. def check_options(self, validator):
  135. validator.require(('name', 'org'))
  136. def run(self):
  137. org_id = self.get_option('org')
  138. name = self.get_option('name')
  139. description = self.get_option('description')
  140. label = self.get_option('label')
  141. self.def_api.create(org_id, name, label, description)
  142. print _("Successfully created content view definition [ %s ]") % name
  143. return os.EX_OK
  144. class Update(ContentViewDefinitionAction):
  145. description = _('update an content view definition')
  146. def setup_parser(self, parser):
  147. parser.add_option("--description", dest="description",
  148. help=_("content view description eg: foo's content view"))
  149. opt_parser_add_org(parser, required=1)
  150. parser.add_option('--label', dest='label',
  151. help=_("content view definition label (required)"))
  152. parser.add_option('--name', dest='name', help=_("content view name"))
  153. def check_options(self, validator):
  154. validator.require(('org', 'label'))
  155. def run(self):
  156. name = self.get_option('name')
  157. description = self.get_option('description')
  158. org_name = self.get_option('org')
  159. def_label = self.get_option('view')
  160. cvd = get_cv_definition(org_name, def_label)
  161. cvd = self.def_api.update(org_name, cvd["id"], name, description)
  162. print _("Successfully updated content_view [ %s ]") % cvd['name']
  163. return os.EX_OK
  164. class Delete(ContentViewDefinitionAction):
  165. description = _('delete an content view definition')
  166. def setup_parser(self, parser):
  167. opt_parser_add_org(parser, required=1)
  168. self._add_get_cvd_opts(parser)
  169. def check_options(self, validator):
  170. validator.require(('org'))
  171. self._add_get_cvd_opts_check(validator)
  172. def run(self):
  173. org_name = self.get_option('org')
  174. def_label = self.get_option('label')
  175. def_name = self.get_option('name')
  176. def_id = self.get_option('id')
  177. cvd = get_cv_definition(org_name, def_label, def_name, def_id)
  178. self.def_api.delete(cvd["id"])
  179. print _("Successfully deleted definition [ %s ]") % def_label
  180. return os.EX_OK
  181. class AddRemoveProduct(ContentViewDefinitionAction):
  182. select_by_env = False
  183. addition = True
  184. @property
  185. def description(self):
  186. if self.addition:
  187. return _('add a product to a content view definition')
  188. else:
  189. return _('remove a product from a content view definition')
  190. def __init__(self, addition):
  191. super(AddRemoveProduct, self).__init__()
  192. self.addition = addition
  193. def setup_parser(self, parser):
  194. opt_parser_add_org(parser, required=1)
  195. parser.add_option('--product', dest='product',
  196. help=_("product name (product name, label or id required)"))
  197. parser.add_option('--product_label', dest='product_label',
  198. help=_("product label (product name, label or id required)"))
  199. parser.add_option('--product_id', dest='product_id',
  200. help=_("product id (product name, label or id required)"))
  201. self._add_get_cvd_opts(parser)
  202. def check_options(self, validator):
  203. validator.require('org')
  204. self._add_get_cvd_opts_check(validator)
  205. validator.require_at_least_one_of(('product', 'product_label', 'product_id'))
  206. validator.mutually_exclude('product', 'product_label', 'product_id')
  207. def run(self):
  208. org_name = self.get_option('org')
  209. def_label = self.get_option('label')
  210. def_name = self.get_option('name')
  211. def_id = self.get_option('id')
  212. product_name = self.get_option('product')
  213. product_id = self.get_option('product_id')
  214. product_label = self.get_option('product_label')
  215. view = get_cv_definition(org_name, def_label, def_name, def_id)
  216. product = get_product(org_name, product_name, product_label, product_id)
  217. products = self.def_api.products(org_name, view['id'])
  218. products = [f['id'] for f in products]
  219. self.update_products(org_name, view, products, product)
  220. return os.EX_OK
  221. def update_products(self, org_name, cvd, products, product):
  222. if self.addition:
  223. products.append(product['id'])
  224. message = _("Added product [ %(prod)s ] to definition [ %(def)s ]" % \
  225. ({"prod": product['label'], "def": cvd["label"]}))
  226. else:
  227. products.remove(product['id'])
  228. message = _("Removed product [ %(prod)s ] to definition [ %(def)s ]" % \
  229. ({"prod": product['label'], "def": cvd["label"]}))
  230. self.def_api.update_products(org_name, cvd['id'], products)
  231. print message
  232. class AddRemoveRepo(ContentViewDefinitionAction):
  233. select_by_env = False
  234. addition = True
  235. @property
  236. def description(self):
  237. if self.addition:
  238. return _('add a repo to a content view definition')
  239. else:
  240. return _('remove a repo from a content view definition')
  241. def __init__(self, addition):
  242. super(AddRemoveRepo, self).__init__()
  243. self.addition = addition
  244. def setup_parser(self, parser):
  245. opt_parser_add_org(parser, required=1)
  246. parser.add_option('--repo', dest='repo',
  247. help=_("repository name (required)"))
  248. parser.add_option('--product', dest='product',
  249. help=_("product name (product name, label or id required)"))
  250. parser.add_option('--product_label', dest='product_label',
  251. help=_("product label (product name, label or id required)"))
  252. parser.add_option('--product_id', dest='product_id',
  253. help=_("product id (product name, label or id required)"))
  254. self._add_get_cvd_opts(parser)
  255. def check_options(self, validator):
  256. validator.require(('repo', 'org', 'product'))
  257. self._add_get_cvd_opts_check(validator)
  258. def run(self):
  259. org_name = self.get_option('org')
  260. def_label = self.get_option('label')
  261. def_name = self.get_option('name')
  262. def_id = self.get_option('id')
  263. repo_name = self.get_option('repo')
  264. product = self.get_option('product')
  265. product_label = self.get_option('product_label')
  266. product_id = self.get_option('product_id')
  267. view = get_cv_definition(org_name, def_label, def_name, def_id)
  268. repo = get_repo(org_name, repo_name, product, product_label, product_id)
  269. repos = self.def_api.repos(org_name, view['id'])
  270. repos = [f['id'] for f in repos]
  271. self.update_repos(org_name, view, repos, repo)
  272. return os.EX_OK
  273. def update_repos(self, org_name, cvd, repos, repo):
  274. if self.addition:
  275. repos.append(repo["id"])
  276. message = _("Added repository [ %(repo)s ] to definition [ %(def)s ]" % \
  277. ({"repo": repo["name"], "def": cvd["label"]}))
  278. else:
  279. repos.remove(repo["id"])
  280. message = _("Removed repository [ %(repo)s ] to definition [ %(def)s ]" % \
  281. ({"repo": repo["name"], "def": cvd["label"]}))
  282. self.def_api.update_repos(org_name, cvd['id'], repos)
  283. print message
  284. class AddRemoveContentView(ContentViewDefinitionAction):
  285. select_by_env = False
  286. addition = True
  287. @property
  288. def description(self):
  289. if self.addition:
  290. return _('add a content view to a content view definition')
  291. else:
  292. return _('remove a content view from a content view definition')
  293. def __init__(self, addition):
  294. super(AddRemoveContentView, self).__init__()
  295. self.addition = addition
  296. def setup_parser(self, parser):
  297. self._add_get_cvd_opts(parser)
  298. opt_parser_add_org(parser, required=1)
  299. parser.add_option('--content_view', dest='view',
  300. help=_("content view label (required)"))
  301. def check_options(self, validator):
  302. self._add_get_cvd_opts_check(validator)
  303. validator.require(('org', 'view'))
  304. def run(self):
  305. org_name = self.get_option('org')
  306. def_label = self.get_option('label')
  307. def_name = self.get_option('name')
  308. def_id = self.get_option('id')
  309. content_view_label = self.get_option('view')
  310. cvd = get_cv_definition(org_name, def_label, def_name, def_id)
  311. content_view = get_content_view(org_name, content_view_label)
  312. content_views = self.def_api.content_views(cvd['id'])
  313. content_views = [f['id'] for f in content_views]
  314. self.update_content_views(cvd, content_views, content_view)
  315. return os.EX_OK
  316. def update_content_views(self, cvd, content_views, content_view):
  317. if self.addition:
  318. content_views.append(content_view["id"])
  319. message = _("Added content view [ %(view)s ] to definition [ %(def)s ]" % \
  320. ({"def": content_view["name"], "view": cvd["label"]}))
  321. else:
  322. content_views.remove(content_view["id"])
  323. message = _("Removed content view [ %(view)s ] to content view [ %(def)s ]" % \
  324. ({"def": content_view["name"], "view": cvd["label"]}))
  325. self.def_api.update_content_views(cvd['id'], content_views)
  326. print message
  327. # cvd def command ------------------------------------------------------------
  328. class ContentViewDefinition(Command):
  329. description = _('content view definition actions for the katello server')