././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.6000733 sahara-dashboard-16.0.0/0000775000175000017500000000000000000000000015005 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/.coveragerc0000664000175000017500000000024600000000000017130 0ustar00zuulzuul00000000000000[run] branch = True source = sahara_dashboard omit = .tox/* sahara_dashboard/test/* [paths] source = sahara_dashboard [report] ignore_errors = True precision = 3 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/.zuul.yaml0000664000175000017500000000301300000000000016743 0ustar00zuulzuul00000000000000- project: templates: - check-requirements - horizon-non-primary-django-jobs - openstack-lower-constraints-jobs-horizon - openstack-python3-yoga-jobs-horizon - release-notes-jobs-python3 experimental: jobs: - sahara-dashboard-integration - job: name: sahara-dashboard-tox-base parent: openstack-tox required-projects: - openstack/sahara-dashboard irrelevant-files: - ^.*\.rst$ - ^doc/.*$ - ^releasenotes/.*$ - ^sahara_dashboard/locale/.*$ - job: name: sahara-dashboard-integration parent: devstack required-projects: - openstack/heat - openstack/horizon - openstack/sahara - openstack/sahara-plugin-ambari - openstack/sahara-plugin-cdh - openstack/sahara-plugin-mapr - openstack/sahara-plugin-spark - openstack/sahara-plugin-storm - openstack/sahara-plugin-vanilla - openstack/sahara-dashboard roles: - zuul: openstack/horizon vars: devstack_plugins: sahara: 'https://opendev.org/openstack/sahara' sahara-dashboard: 'https://opendev.org/openstack/sahara-dashboard' heat: 'https://opendev.org/openstack/heat' devstack_services: horizon: true tls-proxy: false devstack_localrc: USE_PYTHON3: True pre-run: playbooks/sahara-dashboard-integration/pre.yaml run: playbooks/sahara-dashboard-integration/run.yaml irrelevant-files: - ^.*\.rst$ - ^doc/.*$ - ^releasenotes/.*$ ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641572.0 sahara-dashboard-16.0.0/AUTHORS0000664000175000017500000000731400000000000016062 0ustar00zuulzuul00000000000000Akihiro Motoki Akihiro Motoki Alexander Ignatov Alexander Kuznetsov Andreas Jaeger Andrew Lazarev Andrey Pavlov Andy Botting Cao Xuan Hoang Chad Roberts ChangBo Guo(gcb) Charles Short Christian Berendt Chuck Short Corey Bryant Dao Cong Tien Davanum Srinivas David Lyle Dirk Mueller Dmitry Mescheryakov Doug Hellmann Flavio Percoco Georgy Dyuldin Ghanshyam Mann Hangdong Zhang Hervé Beraud Ian Wienand Ian Y. Choi Ihor Kalnytskyi Ivan Kolodyazhny Iwona Kotlarska James E. Blair James E. Blair Jeremy Freudberg Jeremy Stanley LiuNanke Luigi Toscano Luong Anh Tuan MaoyangLiu Marianne Linhares Monteiro Mark Vanderwiel Matthew Farrellee Michael Ionkin Michael Lelyakin Michael Lelyakin Mike May Mikhail Mikhail Lelyakin Nadya Privalova Nguyen Van Trung Nikita Konovalov Nikolay Mahotkin OpenStack Release Bot Pavlo Shchelokovskyy Pierre Riteau Rajiv Kumar Sean McGinnis Sergey Lukjanov Sergey Reshetnyak Sergey Reshetnyak Shu Yingya Shu Yingya Telles Nobrega Telles Nobrega Thomas Goirand Timur Sufiev TimurNurlygayanov Tony Breeds Trevor McKay Vadim Rovachev Vitaly Gridnev Vu Cong Tuan ZhijunWei avnish blue55 chao liu guangpei.liu guotao hejunli <18438695326@163.com> huang.zhiping inspurericzhang kavithahr manchandavishal pawnesh.kumar pengyuesheng qiaomin ricolin shangxiaobj sharat.sharma sunqingliang6 venkatamahesh vrovachev wanghuagong yangyong yingya.shu@easystack.cn zhangyujun zhouguowei zhouyunfeng ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/CONTRIBUTING.rst0000664000175000017500000000120700000000000017446 0ustar00zuulzuul00000000000000The source repository for this project can be found at: https://opendev.org/openstack/sahara-dashboard Pull requests submitted through GitHub are not monitored. To start contributing to OpenStack, follow the steps in the contribution guide to set up and use Gerrit: https://docs.openstack.org/contributors/code-and-documentation/quick-start.html Bugs should be filed on Storyboard: https://storyboard.openstack.org/#!/project/openstack/sahara-dashboard For more specific information about contributing to this repository, see the sahara contributor guide: https://docs.openstack.org/sahara/latest/contributor/contributing.html ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641572.0 sahara-dashboard-16.0.0/ChangeLog0000664000175000017500000007445300000000000016574 0ustar00zuulzuul00000000000000CHANGES ======= 16.0.0 ------ * Update python testing classifier * Pass configured endpoint type to sahara client * Imported Translations from Zanata * Bump decorator version in lower-constraints.txt * Add Python3 yoga unit tests * Update master for stable/xena 15.0.0 ------ * Add Python3 xena unit tests * Update master for stable/wallaby 14.0.0 ------ * Imported Translations from Zanata * Fix lower-constraints job * Remove error links * fix the unicode problem * Imported Translations from Zanata * Add Python3 wallaby unit tests * Update master for stable/victoria 13.0.0 ------ * [goal] Migrate testing to ubuntu focal * Imported Translations from Zanata * Stop to use the \_\_future\_\_ module * Switch to newer openstackdocstheme and reno versions * Fix hacking min version to 3.0.1 * Imported Translations from Zanata * Imported Translations from Zanata * Cleanup py27 support * Bump default tox env from py37 to py38 * Add py38 package metadata * Add Python3 victoria unit tests * Update master for stable/ussuri 12.0.0.0rc1 ----------- * Ussuri contributor docs community goal * Imported Translations from Zanata * Test fixes: unittest.mock, better l-c job, pytest dep * Imported Translations from Zanata * Imported Translations from Zanata * Fix pyScss version in lower-constraints.txt * Update hacking for Python3 * Remove six usage * Drop Django 1.11 support * translation: drop babel extractor definitions * Imported Translations from Zanata * [ussuri][goal] Drop python 2.7 support and testing * Imported Translations from Zanata * Imported Translations from Zanata * fix invaild urls in CONTRIBUTING.rst * Use Horizon project template for django jobs * Switch to official Ussuri jobs * Imported Translations from Zanata * Update master for stable/train 11.0.0 ------ * Update the constraints url * Fix filter() usage for Py 3 * Imported Translations from Zanata * Imported Translations from Zanata * Limit envlist to py37 for Python 3 Train goal * Use the proper Python3 Train jobs * Bring now-deleted Horizon utils in-tree * Bump the openstackdocstheme extension to 1.20 * Update sphinx dependency * Use openstack-python3-train-jobs for python3 test runtime * Imported Translations from Zanata * Replace git.openstack.org URLs with opendev.org URLs * OpenDev Migration Patch * Dropping the py35 testing * Replace openstack.org git:// URLs with https:// * Update master for stable/stein 10.0.0 ------ * Bump python-saharaclient lower bound to 2.2.0 * Overhaul of the unit test jobs and tox environments * Sync APIv2 changes into dashboard * Native Zuul v3 dashboard-integration test * Imported Translations from Zanata * Increasing max number fields * Imported Translations from Zanata 10.0.0.0b1 ---------- * Use template for lower-constraints * Few python3 (and 3.6) compatibility improvements * fix the outdate link * Update devel info: mailing list * Increment versioning with pbr instruction * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Remove dead code * Switch test runner to django default runner * switch documentation job to new PTI * import zuul job settings from project-config * Imported Translations from Zanata * Update reno for stable/rocky 9.0.0.0rc1 ---------- * Imported Translations from Zanata * One missed hadoop\_version->plugin\_version * Bump python-saharaclient lower bound to 2.0.0 9.0.0.0b3 --------- * Boot from volume * APIv2 in dashboard * Relase notes: add the tracked branch to the mitaka index * Drop python-cinderclient usage * Support of S3 data sources in dashboard * Change approach to saharaclient authentication * Goodbye mox - no more needed * Remove mox from DataProcessingJobTemplateTests * Remove mox3 from DataProcessingClusterTemplateTests * Fix the coverage tox target * Sync Django requirements from global requirements * Add py36 testenv * add a link to release notes in README file * Fix \_cls\_registry type * fix tox python3 overrides 9.0.0.0b2 --------- * Use Django 2.0.x for py35dj20 tox environment * Explicitly use django\_nose.NoseTestSuiteRunner * Drop mox usage in SaharaApiTest * Imported Translations from Zanata * Drop mox3 from DataProcessingNodeGroupTests * Remove mox from DataProcessingClusterGuideTests * Mox removal for DataProcessingDataSourceTests * Remove mox3 from DataProcessingImageRegistryTests * Remove mox from DataProcessingClusterTests * Drop mox3 from DataProcessingPluginsTests * Drop mox3 from DataProcessingJobBinaryTests * Mox removal for DataProcessingJobTests * Imported Translations from Zanata * Require the (soon-to-be) Rocky version of Horizon 9.0.0.0b1 --------- * Updated from global requirements * add lower-constraints job * Migration to Storyboard (2) * Migration to Storyboard * Updated from global requirements * Avoid tox-install.sh * Updated from global requirements * Port away from django.core.urlresolves to django.urls * Updated from global requirements * Imported Translations from Zanata * Fix the job set required for Rocky * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * [trivial] fix typo * Imported Translations from Zanata * Update reno for stable/queens 8.0.0 ----- * Don't try to predetermine the Sahara URL * Zuul: Remove project name * Imported Translations from Zanata * Imported Translations from Zanata * use . instead of source * Imported Translations from Zanata * Imported Translations from Zanata 8.0.0.0b3 --------- * Imported Translations from Zanata * TrivialFix: remove redundant import alias * Updated from global requirements * Imported Translations from Zanata * Update url links in doc file of sahara-dashboard * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * fix an incorrect statement * horizon misspelling in README.rst * fix wrong url in bindep.txt, replate http with https * Support of S3 binaries in dashboard * Rename the 'SAHARA\_AUTO\_IP\_ALLOCATION\_ENABLED' config parameter * Fix the quickstart url and participate url * Updated from global requirements * Setting streaming options as not required * Fix attrs list of LabeledInput.render() method * Fix tox\_install.sh script * Imported Translations from Zanata * Imported Translations from Zanata * Use 'trimmed' for blocktrans in multi-line strings * Imported Translations from Zanata * Add import of cluster templates to GUI * Imported Translations from Zanata * Imported Translations from Zanata * heat\_data was removed from Horizon * Imported Translations from Zanata * Imported Translations from Zanata 8.0.0.0b2 --------- * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Align tox\_install.sh with other projects * Update bindep.txt for doc builds * Updated from global requirements * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Remove setting of version/release from releasenotes * Updated from global requirements * Drop django\_openstack\_auth from requirements.txt * Add import of node group templates * Fix issue creating NGT using dashboard * Initial Zuul v3 jobs: unittests 8.0.0.0b1 --------- * Imported Translations from Zanata * Imported Translations from Zanata * Update the documentation link for doc migration * Imported Translations from Zanata * Fix plugin version sorting * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * Updated from global requirements * Add export of cluster templates to UI * Add export of node group templates * Updated from global requirements * Updated from global requirements * Updated from global requirements * Updated from global requirements * Imported Translations from Zanata * Update reno for stable/pike 7.0.0.0rc1 ---------- * Imported Translations from Zanata * Fix the compatibility after django 1.11 support * Fix py27dj110 tox environment: really use Django 1.10 * Fix can't open the NGT creating form * Switch render() arguments to the new way * Updated from global requirements * Imported Translations from Zanata * Check for volumev2 and volumev3 too 7.0.0.0b3 --------- * Updated from global requirements * Updated from global requirements * Enable some off-by-default checks * Imported Translations from Zanata 7.0.0.0b2 --------- * Updated from global requirements * Updated from global requirements * Make health check info hideable * Fix neutron-related openstack\_dashboard imports * Updated from global requirements * Updated from global requirements * Imported Translations from Zanata * Reuse testenv env variables in py27/py35 envs * Fix JS syntax error in variable declaration * Updated from global requirements * Updated from global requirements * Adding missing translation blocks 7.0.0.0b1 --------- * Remove support for py34 * Replace six.iteritems() with .items() * Updated from global requirements * Fix bugs of redirect url * Imported Translations from Zanata * Replaces uuid.uuid4 with uuidutils.generate\_uuid() * Indicating the location tests directory in oslo\_debug\_helper * Updated from global requirements * [Fix gate]Update test requirement * Main binary should not be allowed for some job types in Horizon * Updated from global requirements * Updated from global requirements * Imported Translations from Zanata * Imported Translations from Zanata * Update reno for stable/ocata 6.0.0 ----- * Updated from global requirements 6.0.0.0b3 --------- * Imported Translations from Zanata * Updated from global requirements * Updated from global requirements * Updated from global requirements * Remove support for py33 * Remove useless iso8601 requirements * Updated from global requirements * Switch to oslo\_log * Imported Translations from Zanata * Make plugin version orderly in version list * Add Constraints support 6.0.0.0b2 --------- * Add licensing info in source file * Updated from global requirements * Show team and repo badges on README * fix unit tests for sahara-dashboard * Imported Translations from Zanata * Refactor some dict generators in sahara.py file * Remove unneded script from tools 6.0.0.0b1 --------- * Imported Translations from Zanata * Remove some debugging artifacts from file * Updated from global requirements * Updated from global requirements * Imported Translations from Zanata * Imported Translations from Zanata * fix error redirecting of image-register * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * Updated from global requirements * Remove unnessesary js code for hidden nav in workflows * Imported Translations from Zanata * Fix invalid links in detailed pages * Enable release notes translation * Do not make project depends on Babel by default * Trival: Update home-page * Updated from global requirements * Updated from global requirements * Imported Translations from Zanata * Add Apache 2.0 license to source file * Fix typo: Storm Pyelus -> Storm Pyleus * Imported Translations from Zanata * Allow translators to control word order in templates (again) * Imported Translations from Zanata * Allow translators to control word order in templates * Fix gate jobs * Imported Translations from Zanata * Update reno for stable/newton 5.0.0.0rc1 ---------- * Imported Translations from Zanata * Convert to unicode explicitly to avoid UnicodeDecodeError * Imported Translations from Zanata * Fix Done and Cancel button view in edit tags form * Drop unused directory in tox * Fix DataSource integration test * Add "Register Image" step to cluster creation guide * Imported Translations from Zanata * TrivialFix: Remove logging import unused * Imported Translations from Zanata * Skip pulling cinder information if cinder api is unavailable * Improve pulling configs for node groups * Fix tab navigation in clusters panel * Fix bullet lists view * Remove css styles from html templates 5.0.0.0b3 --------- * Updated from global requirements * Separate static folder by css and js * Remove unused templates and classes * Fix integration tests * Imported Translations from Zanata * Add warning to deprecated plugins * Imported Translations from Zanata * Fix "Done" and "Cancel" buttons view in Image Registry form * plugins api support * Updated from global requirements * Add pagination ability to UI * Updated from global requirements * Add warning about usernames to help template * use xenial ubuntu for integration tests * Move other-requirements.txt to bindep.txt * Designate integration * Updated from global requirements * Imported Translations from Zanata * Fix bug this doesn't work field "Value Type" * Small fix in tab Node Groups of Create Cluster Template workflow * Remove unnecessary class from templates * Updated from global requirements * Add Python 3.5 classifier and venv * add py27dj110 testenv * [Django 1.10] django.conf.urls.patterns() removed * Delete the requirement package "discover" in the "test-requirements.txt" * Updated from global requirements * replacing plugins into separate panel * fix unit and integration tests * be safer on retrieving objects * Adding Storm Pyleus job type * remove upload template form 5.0.0.0b2 --------- * Imported Translations from Zanata * List system dependencies for running common tests * Updated from global requirements * Imported Translations from Zanata * Fix unit tests * Updated from global requirements * Imported Translations from Zanata * fix sahara-dashboard translation job * Add mitaka page to release notes * Fix bug with detailed error on job binary creation * fix integration tests * Updated from global requirements * Imported Translations from Zanata * Start using reno for release notes * Add column "User" to "Image Registry" tab * fix integration tests again * Imported Translations from Zanata * Fix py27dj19 gate job * Resolve problem about not displayed volumes in cluster template and cluster information * fix integration tests * Fix gate-sahara-dashboard-python34 job 5.0.0.0b1 --------- * Updated from global requirements * Imported Translations from Zanata * Clean up Image Registry form tag fields * Updated from global requirements * Add testcase 'Run EDP jobs with many types' * Fix node processes view in node groups * Updated from global requirements * Imported Translations from Zanata * fix unit test failures * Fix job launching on new cluster * Imported Translations from Zanata * Updated from global requirements * Add testcases 'Update EDP resources' * Fix job launching with cluster in any state * Imported Translations from Zanata * Updated from global requirements * Updated from global requirements * Imported Translations from Zanata * Hiding undesired nav-pills * Updated from global requirements * Fixing font and style of close buttons * Fix time values of cluster provision steps * Uptime column for clusters * Add testcase Update nodegroup in cluster template * Add testcase 'Update cluster template' * Add testcase 'Update node group template' * Fix job and data sources time values * Simplifying plugin select logic * Add testenv for py34 jobs * Add Django 1.9 testenv * [Django 1.9] request.REQUEST is gone * Add testcase 'Run EDP job on cluster' * Add testcase for check cluster scaling * [Django 1.9] Remove load url from future * Imported Translations from Zanata 4.0.0.0rc1 ---------- * Imported Translations from Zanata * Imported Translations from Zanata * Fix default value for volumes per node in updates * Imported Translations from Zanata * Imported Translations from Zanata * Imported Translations from Zanata * Add test 'cluster create-delete with fake plugin' * Imported Translations from Zanata * Imported Translations from Zanata * Rewrite update calls in dashboard * Use %s when non-ascii characters can be contained * Imported Translations from Zanata * Imported Translations from Zanata * Updated from global requirements * Imported Translations from Zanata * implement auto refreshing health status in UI * Updated from global requirements * Fix job execution on a new cluster * Imported Translations from Zanata 4.0.0.0b3 --------- * Removing unused JavaScript code * Fixing cluster creation from cluster list tab * implement health checks in sahara-dashboard * Updated from global requirements * Added Base Image field on Node Group Template form * Fix action buttons for details views * Fix parse error in template * Import reorg and cleanup * Job duration column added * Use oslo timeutils for durations * Add missing duplicated action buttons * Updated from global requirements * Ensure to compile translation catalogs * Changing name of "Data image registry" * Restoring special search handling for job table * Add sahara\_dashboard to ADD\_INSTALLED\_APPS for translation support * Fix wrong redirect urls and template name * Fixing swift data sources update * Unbreak "setup.py install" * Fixing up integration tests after UI reorganization * Imported Translations from Zanata * Install horizon more efficiently * Translation setup for sahara-dashboard * Reorganizing job and cluster guide pages * Reorganizing job-related panels into tabs * Reorganizing cluster panels into tabs * Change color of status field * Updated from global requirements * Updated from global requirements * Updated from global requirements * Remove --upgrade option from setup\_develop * Updated from global requirements * fix integration test screen shots * Fix failing job\_binaries i9n test * Updated from global requirements * ACL support in Sahara UI * Remove microseconds from sahara\_data * Update devstack plugin * Adapt for all horizon i9n refactoring changes * Adding support for editing active cluster shares * Fixing imports and no longer always running int tests * Adapt for horizon i9n referencing table columns by name 4.0.0.0b2 --------- * Updated from global requirements * Adapt for horizon table page region simplification * Updated from global requirements * Added duplicate action buttons * Added color for statuses, changed cursor type for the link * Added status description field * Remove unused logging * Replace deprecated LOG.warn with warning * Run actual integration tests in post-install hook * Backport integration tests fixes from Horizon repo * Adding integration test support * Fix Mapreduce selection in job template creation * remove python 2.6 trove classifier * Supporting existing node group templates in guide * Add intial test hooks for integration tests * Adding a few missing files * Fixing extraneous output from tests * Adding cluster template support for shares * Fix job\_binaries deletion * Adding node group template support for shares * Adding manila shares as an option for data sources * Updated from global requirements * Fixing unit tests after removal from Horizon * [Sahara] Move cluster configuration to separate tab * Adding support for Manila-based shares in Sahara * Adding option for name and uuid substitution * [Sahara] Get urls of datasources safer * Adding devstack plugin support * Moving exception specification * Excising Sahara content from Horizon * Updated from global requirements * Removing all code from previous dashboard incarnation * Updated from global requirements * Updated from global requirements * Remove duplicate .coverage in .gitignore file * Updated from global requirements * Updated from global requirements * Updated from global requirements * Updated from global requirements * Updated from global requirements * Updated from global requirements * Updated from global requirements * Updated from global requirements * Updated from global requirements * Drop use of 'oslo' namespace package * Updated from global requirements * Updated from global requirements * Updated from global requirements * Updated from global requirements * Updated from global requirements * Updated from global requirements * Move to hacking 0.10 * Updated from global requirements * Workflow documentation is now in infra-manual * Updated from global requirements * Refactoring UI tests * Add fix with floating\_ip\_pool for ui tests * Fix typo in floating\_ip\_pool config name * Add fix for create/delete sahara cluser * add fix for testing data processing tab in horizon * Open Kilo development * Add CONTRIBUTING.rst * Updated from global requirements * Add entry for Timur to fix author name * Add warn re sorting requirements * Repository cleanup * Updated from global requirements * Updated from global requirements 2014.2.b2 --------- * Fix working "Register Image" button * Enabled checks for E226, E251, E265 * Enabled hacking checks H305 and H307 * Update oslo-incubator common \_\_init\_\_.py * Update oslo-incubator importutils module * Fixed job execution status display * Fixed issue with required field * Updated from global requirements * Updated from global requirements * Added new hacking version to requirements * Added start and end times to job execution details page * Added ability to import keypair from launch cluster dialog * Fixed help text for new cluster dialog * Fixed UI refresh for deleted clusters 2014.2.b1 --------- * Updated from global requirements * Allowing for HDFS data sources without hdfs:// * Updated from global requirements * Formally open Juno dev * Updated from global requirements * Update dicts with plugin services * Updated from global requirements * Removing backward compatibility for Folsom URLs 2014.1 ------ * Horizon compatibility fix * Remove Mirantis copyright from README * Fixing sahara image registry links * Add fix for delete Job Executions in tests * Remainder of renaming changes from savanna to sahara * Changing savanna-db to internal-db * Changing configuration from SAVANNA to SAHARA * Adapting to use the python-saharaclient library * Add sleep in await state cluster method * Changing savanna\_tag\_image as part of rename project * Renaming internal variables away from savanna * Rename namespace to match new dashboard slug * Add support for Django 1.6 * Rename dashboard slug to sahara * Update .gitreview to point on updated repo * Changing "Savanna" to "Sahara" in basic strings * Renaming savannadashboard directory to saharadashboard * Update oslo-incubator importutils module 2014.1.b3 --------- * Fixing image tags after form validation error * Add fix to UI tests * Fix to image registry to eliminate duplicate tags * Correcting show/hide functionality for node group templates * Compatibility with python-savannaclient>=0.5 * Updated from global requirements * Migragtes swift-internal urls to swift urls * Add changes to UI test * Treating blanked out config values as defaults for cluster templates * Implementing streaming MapReduce jobs * Sync with global requirements * Adding floating ip pool to node groups details for cluster * Sync with global-requirements * Moving main\_class and java\_opts to configs * Adding object names to job-execution details page * Adding job configuration information to job-execution details page * Dashboard now hides "mains" for Java/MapReduce jobs * Updated from global requirements * Dashboard now ignores empty job configuration items * Changing the args type for Pig jobs to a list * Adding HDFS as a possible data source type * Adding job type "Java" to possible jobs 2014.1.b2 --------- * Changing name of "Jar" jobs to "MapReduce" * Migrate to testr * Renamed tox virtualenv for UI tests * Adding ability to relaunch jobs * Removal of AUTHORS file from repo * Have tox install via setup.py develop * Fixing launch on new cluster functionality for jobs * Remove sitepackages usage from testenv * Removing vim headers from savannadashboard * Added EDP tests * Update default service name 2014.1.b1 --------- * Adding ability to download job binaries * Reverted floating-ip-pool UUID sending to Savanna * Hot Fix UI tests * Launch job on new cluster gives option to persist * Node Group Templates dialog improvement * Use unregister\_image(id) on unregister * Revert "Support building wheels (PEP-427)" * Bump version to 2014.1 * Support building wheels (PEP-427) * Adding mains and libs to job details view * Code style fixes and APIException import fix * Add HACKING.rst with link to the style guidelines * Hacking contains all needed requirements * Fix style errors and upgrade hacking * Fixing link to cluster template that broke the General Info tab * Changing "Job Origin" to "Job" in templates * Successful launch of job now brings up Job Executions page * Fixing url format in templates * Fixing importutils 0.3 --- * Use release version of python-savannaclient * Added transient cluster creation for job launch 0.3.rc4 ------- * Use python-savannaclient 0.3.rc4 * Adding help text to clarify the name field for job binaries 0.3.rc3 ------- * Use savanna client 0.3-rc3 * Fixes bug with wrong mains array * Add job parameters and arguments configuration * Hide uneditable images from register image form * Removed temporary templates 0.3.rc2 ------- * Bump savanna client version to 0.3-rc2 * Adding Jeremy Stanley to AUTHORS * Allow removing Node Group while scaling * Fixed error handling * Update .gitreview file following repository move * Sync with global requirements * Bump savanna client version to 0.3-rc1 * Cluster Details page improved * Job configs based on job type 0.3.rc1 ------- * Node Group Template flow improvement * Adding URL Hint for Data Sources * Compatibility for both Django 1.4 and 1.5 * Fixed wrong savanna-client calling * Adding help text to EDP forms * Fix EDP launch Job Execution * Migrate to using python-savannaclient 0.3a3 * Remove usage of pyvirtualdisplay 0.3a1 ----- * Job Origins migrated to Jobs * Deleting job binary now deletes associated job-binary-internal * Removing swift-external from job binaries * Adding on-the-fly script creation * JobOrigin UI impl * Status bar added for Job Execution * Added UI tests * Fixed scaling cluster message * Sync requirements with global requirements * Remove version pbr pins from setup\_requires * Job Binary description box is now multi-line * Floating IP assignement support * Adds EDP support in the UI for job execution * Fix Cluster Template name * Add neutron import available in the RDO release of Havanna * Add highlight https urls to cluster info * Neutron support * Migrate to pbr * Adds EDP support in the UI * Add \_\_author\_\_ attr check * Fix skipping node\_group\_id if not specified 0.2.1 ----- * Fixed tabs to work correctly with HDP * Fix default value handling 0.2.1.rc2 --------- * Validation Errors on Delete handled * Backward requests compatibility 0.2.1.rc1 --------- * Links on hadoop services are opening in new tab now * Cluster creation w/o user keypair * Links in Image Registry added * License file added * Error description added to Cluster Details page * Creating cluter w/o cluster template fixed * Button 'Upload Template' correctly work now * Error messages support added 0.2 --- * Project name fixed 0.2.rc2 ------- * Fix author/homepage in setup.py * Fixed help text for Cluster creation flow * AUTHORS file generation improved 0.2.rc1 ------- * Fixed version dropdowns for Image Registry * Fixed scaling button * Remove AA from launch cluster dialog * Help messages added to workflows * Added anti-affinity information * License checks added * AUTHORS file added * Add horizon to the pep8 excludes * Missed license headers added * Show template on Cluster Details page * Fix issue with UI sending description as configs * Create Cluster Flow shows only tagged images * Anti-affinity input populated * Anti-affinity selectors implemented for clusters and their templates 0.2a1 ----- * In cluster template details change node group id to name * UI for Cluster Scaling implementation * UI for Image Registry updated * Displaying single tab workflow improved * Formating success and fail messages for flows * Fix copy cluster template * Fix pep8 and pyflakes versions and fix tox.ini * Hide tab bars in wizards w/ single tab * General cluster configs didn't work * Hide flashing 'Configure' button on Clusters page * Several minor changes * Create cluster has been renamed to Launch cluster * Made "Create Cluster" button on Cluster Templates page * Support for Cluster Templates copy * Reliably hide "Configure" button * Fixed "show/hide advance configuration" in Cluster Templates * Allow registration of image without tags * Make Create Cluster dialog take images from IR * Node Group Template copy * Detailed Node Groups Templates page improvement * Session is not used for flow communications * Plugin params for node template now are passed via request * Node grops in Cluster Creation Flow disabled * Renaming buttons and table columns * Delete button fixed for Cluster Templates * Detailed pages improved * Cluster details page improved * Fixed exception handling in Cluster Templates flow * Removed the page reload after group adding to cluster template * Copyrigths added * Node Groups flow updated with storage field * Clusters Details page added * Cluster scoped configs added * Importing helpers fixed for Clusters * General Cluster Configurations support added * Add find method for python client * Node Group Templates do not pass default configs * Make parameters with default value optional * Cluster Creation Flow implementation * Improvment in node group templates * Populating Node Group Templates flow with defaults * Make imports compatible with Grizzly * Node Group flow Validation minor fix * Fixing wrong commit with Cluster Template Flow * Clusters table with auto-update * Partitial Cluster template flow implementation * Send cluster\_template\_id during cluster creation * Implemented conversion of plugin-specific template * Fixing UI validaion in Node Group creation flow * Fix remove unnecessary pop-up * Titles refactorings * Fix NoneType error while Node Group creation * Cluster templates page improvements * Delete nodegroup template button added * Set image's description to empty string if it missing * Detailed node group template page added * Part of REST client for Clusters * Improvement into image registration section: * Nodegroup templates table and flow data from api * Plugin details page with rest call * Part of REST client for Cluster Templates * Part of REST client for Savanna * Enhance Savanna discovery logic * Implementation for Image Registry pages * Create nodegroup template flow implementation * Simple rest clent and plugins table * Panels with empty tables added * Savanna dashboard added * Initial commit for savanna dashboard * Added .gitreview ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/HACKING.rst0000664000175000017500000000035700000000000016610 0ustar00zuulzuul00000000000000Sahara Style Commandments ========================== - Step 1: Read the OpenStack Style Commandments https://docs.openstack.org/hacking/latest/ - Step 2: Read on Sahara Specific Commandments ----------------------------- None so far ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/LICENSE0000664000175000017500000002363700000000000016025 0ustar00zuulzuul00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/MANIFEST.in0000664000175000017500000000013100000000000016536 0ustar00zuulzuul00000000000000recursive-include sahara_dashboard *.html *.scss *.js include AUTHORS include ChangeLog ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.6000733 sahara-dashboard-16.0.0/PKG-INFO0000664000175000017500000000574500000000000016115 0ustar00zuulzuul00000000000000Metadata-Version: 1.2 Name: sahara-dashboard Version: 16.0.0 Summary: Sahara Management Dashboard Home-page: https://docs.openstack.org/sahara/latest/ Author: OpenStack Author-email: openstack-discuss@lists.openstack.org License: UNKNOWN Description: ======================== Team and repository tags ======================== .. image:: https://governance.openstack.org/tc/badges/sahara-dashboard.svg :target: https://governance.openstack.org/tc/reference/tags/index.html .. Change things from this point on OpenStack Dashboard plugin for Sahara project ============================================= How to use with Horizon on server: ---------------------------------- Use pip to install the package on the server running Horizon. Then either copy or link the files in sahara_dashboard/enabled to openstack_dashboard/local/enabled. This step will cause the Horizon service to pick up the Sahara plugin when it starts. How to use with devstack: ------------------------- Add the following to your devstack ``local.conf`` file:: enable_plugin sahara-dashboard https://opendev.org/openstack/sahara-dashboard To run unit tests: ------------------ ./run_tests.sh NOTE: ===== As of the Mitaka release, the dashboard for sahara is now maintained outside of the horizon codebase, in the repository. Links: ------ Sahara project: https://opendev.org/openstack/sahara Storyboard project: https://storyboard.openstack.org/#!/project/936 Sahara docs site: https://docs.openstack.org/sahara/latest/ Quickstart guide: https://docs.openstack.org/sahara/latest/user/quickstart.html How to participate: https://docs.openstack.org/sahara/latest/contributor/how-to-participate.html Release notes: https://docs.openstack.org/releasenotes/sahara-dashboard/ License ------- Apache License Version 2.0 http://www.apache.org/licenses/LICENSE-2.0 Platform: UNKNOWN Classifier: Environment :: OpenStack Classifier: Intended Audience :: Information Technology Classifier: Intended Audience :: System Administrators Classifier: License :: OSI Approved :: Apache Software License Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Requires-Python: >=3.6 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/README.rst0000664000175000017500000000310200000000000016470 0ustar00zuulzuul00000000000000======================== Team and repository tags ======================== .. image:: https://governance.openstack.org/tc/badges/sahara-dashboard.svg :target: https://governance.openstack.org/tc/reference/tags/index.html .. Change things from this point on OpenStack Dashboard plugin for Sahara project ============================================= How to use with Horizon on server: ---------------------------------- Use pip to install the package on the server running Horizon. Then either copy or link the files in sahara_dashboard/enabled to openstack_dashboard/local/enabled. This step will cause the Horizon service to pick up the Sahara plugin when it starts. How to use with devstack: ------------------------- Add the following to your devstack ``local.conf`` file:: enable_plugin sahara-dashboard https://opendev.org/openstack/sahara-dashboard To run unit tests: ------------------ ./run_tests.sh NOTE: ===== As of the Mitaka release, the dashboard for sahara is now maintained outside of the horizon codebase, in the repository. Links: ------ Sahara project: https://opendev.org/openstack/sahara Storyboard project: https://storyboard.openstack.org/#!/project/936 Sahara docs site: https://docs.openstack.org/sahara/latest/ Quickstart guide: https://docs.openstack.org/sahara/latest/user/quickstart.html How to participate: https://docs.openstack.org/sahara/latest/contributor/how-to-participate.html Release notes: https://docs.openstack.org/releasenotes/sahara-dashboard/ License ------- Apache License Version 2.0 http://www.apache.org/licenses/LICENSE-2.0 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/babel-django.cfg0000664000175000017500000000005700000000000017775 0ustar00zuulzuul00000000000000[python: **.py] [django: **/templates/**.html] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/babel-djangojs.cfg0000664000175000017500000000006100000000000020325 0ustar00zuulzuul00000000000000[javascript: **.js] [angular: **/static/**.html] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/bindep.txt0000664000175000017500000000262400000000000017013 0ustar00zuulzuul00000000000000# This is a cross-platform list tracking distribution packages needed by tests; # see https://docs.openstack.org/infra/bindep/ for additional information. build-essential [platform:dpkg] gawk # gettext and graphviz are needed by doc builds only. For transition, # have them in both doc and test. gettext [doc test] graphviz [doc test] language-pack-en [platform:ubuntu] libevent-dev [platform:dpkg] libevent-devel [platform:rpm] libffi-dev [platform:dpkg] libffi-devel [platform:rpm] libjpeg-dev [platform:dpkg] libjpeg-turbo-devel [platform:rpm] libsasl2-dev [platform:dpkg] libselinux-python [platform:rpm] libsqlite3-dev [platform:dpkg] libuuid-devel [platform:rpm] locales [platform:debian] pkg-config [platform:dpkg] pkgconfig [platform:rpm] python-dev [platform:dpkg] python-devel [platform:rpm] python-lxml python3-all-dev [platform:ubuntu !platform:ubuntu-precise] python3-dev [platform:dpkg] python3-devel [platform:fedora] python3.4 [platform:ubuntu-trusty] python34-devel [platform:centos] python3.5 [platform:ubuntu-xenial] uuid-dev [platform:dpkg] zlib-devel [platform:rpm] zlib1g-dev [platform:dpkg] # integration tests firefox [integrationtests] dbus [integrationtests platform:redhat] dbus-1 [integrationtests platform:suse] xvfb [integrationtests platform:dpkg] # already part of xorg-x11-server on openSUSE xorg-x11-server-Xvfb [integrationtests platform:redhat] libav-tools [integrationtests platform:dpkg] ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.544071 sahara-dashboard-16.0.0/devstack/0000775000175000017500000000000000000000000016611 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/devstack/plugin.sh0000664000175000017500000000351700000000000020451 0ustar00zuulzuul00000000000000# plugin.sh - DevStack plugin.sh dispatch script sahara-dashboard SAHARA_DASH_DIR=$(cd $(dirname $BASH_SOURCE)/.. && pwd) function install_sahara_dashboard { setup_develop ${SAHARA_DASH_DIR} } function configure_sahara_dashboard { cp -a ${SAHARA_DASH_DIR}/sahara_dashboard/enabled/* ${DEST}/horizon/openstack_dashboard/local/enabled/ cp -a ${SAHARA_DASH_DIR}/sahara_dashboard/local_settings.d/* ${DEST}/horizon/openstack_dashboard/local/local_settings.d/ # NOTE: If locale directory does not exist, compilemessages will fail, # so check for an existence of locale directory is required. if [ -d ${SAHARA_DASH_DIR}/sahara_dashboard/locale ]; then (cd ${SAHARA_DASH_DIR}/sahara_dashboard; DJANGO_SETTINGS_MODULE=openstack_dashboard.settings $PYTHON ../manage.py compilemessages) fi } # check for service enabled if is_service_enabled sahara-dashboard; then if [[ "$1" == "stack" && "$2" == "pre-install" ]]; then # Set up system services # no-op : elif [[ "$1" == "stack" && "$2" == "install" ]]; then # Perform installation of service source echo_summary "Installing Sahara Dashboard" install_sahara_dashboard elif [[ "$1" == "stack" && "$2" == "post-config" ]]; then # Configure after the other layer 1 and 2 services have been configured echo_summary "Configuring Sahara Dashboard" configure_sahara_dashboard elif [[ "$1" == "stack" && "$2" == "extra" ]]; then # Initialize and start the app-catalog-ui service # no-op : fi if [[ "$1" == "unstack" ]]; then # Shut down app-catalog-ui services # no-op : fi if [[ "$1" == "clean" ]]; then # Remove state and transient data # Remember clean.sh first calls unstack.sh # no-op : fi fi ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/devstack/settings0000664000175000017500000000011400000000000020370 0ustar00zuulzuul00000000000000# settings file for sahara-dashboard plugin enable_service sahara-dashboard ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.544071 sahara-dashboard-16.0.0/doc/0000775000175000017500000000000000000000000015552 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/doc/requirements.txt0000664000175000017500000000045700000000000021044 0ustar00zuulzuul00000000000000# The order of packages is significant, because pip processes them in the order # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. sphinx>=2.0.0,!=2.1.0 # BSD openstackdocstheme>=2.2.1 # Apache-2.0 reno>=3.1.0 # Apache-2.0 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/lower-constraints.txt0000664000175000017500000000543300000000000021250 0ustar00zuulzuul00000000000000amqp==2.1.1 appdirs==1.3.0 asn1crypto==0.23.0 Babel==2.3.4 cachetools==2.0.0 cffi==1.14 cliff==2.8.0 cmd2==0.8.0 contextlib2==0.4.0 coverage==4.0 cryptography==3.0 ddt==1.0.1 debtcollector==1.2.0 decorator==4.4.2 deprecation==1.0 Django==2.2 django-appconf==1.0.2 django-babel==0.6.2 django-compressor==2.0 django-pyscss==2.0.2 dogpile.cache==0.6.2 eventlet==0.18.2 extras==1.0.0 fasteners==0.7.0 fixtures==3.0.0 futurist==1.2.0 greenlet==0.4.10 horizon==17.1.0 idna==2.6 iso8601==0.1.11 Jinja2==2.10 jmespath==0.9.0 jsonpatch==1.16 jsonpointer==1.13 jsonschema==2.6.0 keystoneauth1==3.8.0 kombu==4.0.0 linecache2==1.0.0 MarkupSafe==1.0 monotonic==0.6 msgpack-python==0.4.0 munch==2.1.0 netaddr==0.7.18 netifaces==0.10.4 openstacksdk==0.15.0 os-client-config==1.28.0 os-service-types==1.2.0 osc-lib==1.11.0 oslo.concurrency==3.26.0 oslo.config==5.2.0 oslo.context==2.19.2 oslo.i18n==3.15.3 oslo.log==3.36.0 oslo.messaging==5.29.0 oslo.middleware==3.31.0 oslo.policy==1.30.0 oslo.serialization==2.18.0 oslo.service==1.24.0 oslo.utils==3.33.0 osprofiler==2.3.0 Paste==2.0.2 PasteDeploy==1.5.0 pbr==2.0.0 pika==0.10.0 pika-pool==0.1.3 Pint==0.5 positional==1.2.1 prettytable==0.7.2 pycparser==2.18 pyinotify==0.9.6 pymongo==3.0.2 pyOpenSSL==19.1.0 pyparsing==2.1.0 pyperclip==1.5.27 pyScss==1.3.7 pytest==5.3.5 python-dateutil==2.5.3 python-designateclient==2.7.0 python-glanceclient==2.8.0 python-keystoneclient==3.22.0 python-manilaclient==1.16.0 python-mimeparse==1.6.0 python-neutronclient==6.7.0 python-novaclient==9.1.0 python-openstackclient==3.12.0 python-saharaclient==2.2.0 python-subunit==1.0.0 python-swiftclient==3.2.0 pytz==2013.6 PyYAML==3.12 rcssmin==1.0.6 repoze.lru==0.7 requests==2.14.2 requestsexceptions==1.2.0 rfc3986==0.3.1 rjsmin==1.0.12 Routes==2.3.1 selenium==2.50.1 semantic-version==2.3.1 simplejson==3.5.1 six==1.10.0 statsd==3.2.1 stevedore==1.20.0 tenacity==3.2.1 testscenarios==0.4 testtools==2.2.0 traceback2==1.4.0 unittest2==1.1.0 vine==1.1.4 warlock==1.2.0 WebOb==1.7.1 wrapt==1.7.0 XStatic==1.0.0 XStatic-Angular==1.5.8.0 XStatic-Angular-Bootstrap==2.2.0.0 XStatic-Angular-FileUpload==12.0.4.0 XStatic-Angular-Gettext==2.3.8.0 XStatic-Angular-lrdragndrop==1.0.2.2 XStatic-Angular-Schema-Form==0.8.13.0 XStatic-Bootstrap-Datepicker==1.3.1.0 XStatic-Bootstrap-SCSS==3.3.7.1 XStatic-bootswatch==3.3.7.0 XStatic-D3==3.5.17.0 XStatic-Font-Awesome==4.7.0.0 XStatic-Hogan==2.0.0.2 XStatic-Jasmine==2.4.1.1 XStatic-jQuery==1.8.2.1 XStatic-JQuery-Migrate==1.2.1.1 XStatic-jquery-ui==1.10.4.1 XStatic-JQuery.quicksearch==2.0.3.1 XStatic-JQuery.TableSorter==2.14.5.1 XStatic-JSEncrypt==2.3.1.1 XStatic-mdi==1.4.57.0 XStatic-objectpath==1.2.1.0 XStatic-Rickshaw==1.5.0.0 XStatic-roboto-fontface==0.5.0.0 XStatic-smart-table==1.4.13.2 XStatic-Spin==1.2.5.2 XStatic-term.js==0.0.7.0 XStatic-tv4==1.2.7.0 xvfbwrapper==0.1.3 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/manage.py0000775000175000017500000000150000000000000016606 0ustar00zuulzuul00000000000000#!/usr/bin/env python # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import os import sys from django.core.management import execute_from_command_line if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sahara_dashboard.test.settings") execute_from_command_line(sys.argv) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5280702 sahara-dashboard-16.0.0/playbooks/0000775000175000017500000000000000000000000017010 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.544071 sahara-dashboard-16.0.0/playbooks/sahara-dashboard-integration/0000775000175000017500000000000000000000000024515 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/playbooks/sahara-dashboard-integration/pre.yaml0000664000175000017500000000025300000000000026167 0ustar00zuulzuul00000000000000--- - hosts: controller roles: - role: bindep bindep_profile: integrationtests become: true - setup-selenium-tests - setup-sahara-ui-integration ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/playbooks/sahara-dashboard-integration/run.yaml0000664000175000017500000000036600000000000026212 0ustar00zuulzuul00000000000000--- - hosts: all strategy: linear roles: - orchestrate-devstack - hosts: controller roles: - post-devstack-sahara-ui-integration - role: tox tox_environment: AVCONV_INSTALLED: 1 tox_envlist: py27integration ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5280702 sahara-dashboard-16.0.0/releasenotes/0000775000175000017500000000000000000000000017476 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.544071 sahara-dashboard-16.0.0/releasenotes/notes/0000775000175000017500000000000000000000000020626 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/notes/.placeholder0000664000175000017500000000000000000000000023077 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/notes/apiv2-dashboard-dd3f97bc15ea609e.yaml0000664000175000017500000000042600000000000027045 0ustar00zuulzuul00000000000000--- features: - There is now support for APIv2 in sahara-dashboard. Enable it by setting the "data-processing" API version to "2" in the `OPENSTACK_API_VERSIONS` dictionary found in Horizon's local_settings.py. Some Sahara features are only exposed through APIv2. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/notes/cluster-details-fix-4c53edfa60500d8a.yaml0000664000175000017500000000011000000000000027656 0ustar00zuulzuul00000000000000--- fixes: - Fixed issue with retrieving details for public clusters. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/notes/designate-integration-0c11bb8cc115cf60.yaml0000664000175000017500000000011400000000000030244 0ustar00zuulzuul00000000000000--- features: - Added integration with Designate for hostname resolution. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/notes/django_data_upload_max_number-3fe39c838c275587.yaml0000664000175000017500000000047100000000000031632 0ustar00zuulzuul00000000000000--- security: - | Django 1.10 introduced a new var : DATA_UPLOAD_MAX_NUMBER_FIELDS which prevent DOS on data received via GET and POST methods. Default values is set to 2000 instead of upstream default of 1000 to keep the security feature and to not cause issue with the Sahara Dashboard forms. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/notes/drop-py-2-7-0812be5ce1752d7c.yaml0000664000175000017500000000033600000000000025622 0ustar00zuulzuul00000000000000--- upgrade: - | Python 2.7 support has been dropped. Last release of sahara-dashboard to support python 2.7 is OpenStack Train. The minimum version of Python now supported by sahara-dashboard is Python 3.6. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/notes/increase-max-fields-91b921991f1e8978.yaml0000664000175000017500000000020600000000000027354 0ustar00zuulzuul00000000000000--- fixes: - | Increasing DATA_UPLOAD_MAX_NUMBER_FIELDS django configuration to allow creation of CDH node group templates. ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/notes/more-apiv2-features-7e02b39be1b875fd.yaml0000664000175000017500000000071200000000000027610 0ustar00zuulzuul00000000000000--- features: - | Support for the new boot from volume options introduced in the Stein release of Sahara is added. other: - | Coinciding with the official stability of Sahara APIv2, operators should feel especially encouraged to set "data-processing" API version to "2" in the `OPENSTACK_API_VERSIONS` dictionary found in Horizon's local_settings.py. As previously stated, some Sahara features are only exposed through APIv2. ././@PaxHeader0000000000000000000000000000021100000000000011447 xustar0000000000000000115 path=sahara-dashboard-16.0.0/releasenotes/notes/rename-SAHARA_AUTO_IP_ALLOCATION_ENABLED-config-parameter.yaml 22 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/notes/rename-SAHARA_AUTO_IP_ALLOCATION_ENABLED-config-parameter0000664000175000017500000000047000000000000032236 0ustar00zuulzuul00000000000000--- prelude: > The config parameter 'SAHARA_FLOATING_IP_DISABLED' replaces 'SAHARA_AUTO_IP_ALLOCATION_ENABLED'. deprecations: - | The 'SAHARA_AUTO_IP_ALLOCATION_ENABLED' config parameter in Sahara was deprecated and replaced by 'SAHARA_FLOATING_IP_DISABLED' which has a less confusing name.././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/notes/start-using-reno-c29d489e7e7dafc9.yaml0000664000175000017500000000007600000000000027341 0ustar00zuulzuul00000000000000--- other: - Start using reno for release notes management. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5480711 sahara-dashboard-16.0.0/releasenotes/source/0000775000175000017500000000000000000000000020776 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5480711 sahara-dashboard-16.0.0/releasenotes/source/_static/0000775000175000017500000000000000000000000022424 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/_static/.placeholder0000664000175000017500000000000000000000000024675 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5480711 sahara-dashboard-16.0.0/releasenotes/source/_templates/0000775000175000017500000000000000000000000023133 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/_templates/.placeholder0000664000175000017500000000000000000000000025404 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/conf.py0000664000175000017500000001722500000000000022304 0ustar00zuulzuul00000000000000# -*- coding: utf-8 -*- # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ 'openstackdocstheme', 'reno.sphinxext', ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. copyright = '2013, Sahara Developers' # openstackdocstheme options openstackdocs_repo_name = 'openstack/sahara-dashboard' openstackdocs_use_storyboard = True # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [] # The reST default role (used for this markup: `text`) to use for all # documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'native' # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. # keep_warnings = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'openstackdocs' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. # html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". # html_static_path = ['_static'] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. # html_extra_path = [] # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'SaharaDashboardReleaseNotesdoc' # -- Options for LaTeX output --------------------------------------------- # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'SaharaDashboardReleaseNotes.tex', 'Sahara Dashboard Release Notes Documentation', 'Sahara Developers', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'saharadashboardreleasenotes', 'Sahara Dashboard Release Notes Documentation', ['Sahara Developers'], 1) ] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ('index', 'SaharaDashboardReleaseNotes', 'Sahara Dashboard Release Notes Documentation', 'Sahara Developers', 'SaharaDashboardReleaseNotes', 'One line description of project.', 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. # texinfo_no_detailmenu = False # -- Options for Internationalization output ------------------------------ locale_dirs = ['locale/'] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/index.rst0000664000175000017500000000040000000000000022631 0ustar00zuulzuul00000000000000=============================== Sahara Dashboard Release Notes =============================== .. toctree:: :maxdepth: 1 unreleased xena wallaby victoria ussuri train stein rocky queens pike ocata newton mitaka ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5280702 sahara-dashboard-16.0.0/releasenotes/source/locale/0000775000175000017500000000000000000000000022235 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5280702 sahara-dashboard-16.0.0/releasenotes/source/locale/de/0000775000175000017500000000000000000000000022625 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5480711 sahara-dashboard-16.0.0/releasenotes/source/locale/de/LC_MESSAGES/0000775000175000017500000000000000000000000024412 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/locale/de/LC_MESSAGES/releasenotes.po0000664000175000017500000001013400000000000027442 0ustar00zuulzuul00000000000000# Robert Simai , 2016. #zanata # Robert Simai , 2017. #zanata # Robert Simai , 2018. #zanata # Andreas Jaeger , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-10-26 16:02+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-09-28 07:55+0000\n" "Last-Translator: Andreas Jaeger \n" "Language-Team: German\n" "Language: de\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "10.0.0" msgstr "10.0.0" msgid "4.1.2" msgstr "4.1.2" msgid "5.0.0" msgstr "5.0.0" msgid "5.0.0.0b2" msgstr "5.0.0.0b2" msgid "5.0.0.0b3" msgstr "5.0.0.0b3" msgid "7.0.2" msgstr "7.0.2" msgid "8.0.0" msgstr "8.0.0" msgid "9.0.0" msgstr "9.0.0" msgid "Added integration with Designate for hostname resolution." msgstr "Integration mit Designate zur Auflösung von Hostnamen hinzugefügt." msgid "Bug Fixes" msgstr "Fehlerkorrekturen" msgid "Current Series Release Notes" msgstr "Aktuelle Serie Releasenotes" msgid "Deprecation Notes" msgstr "Ablaufwarnungen" msgid "" "Django 1.10 introduced a new var : DATA_UPLOAD_MAX_NUMBER_FIELDS which " "prevent DOS on data received via GET and POST methods. Default values is set " "to 2000 instead of upstream default of 1000 to keep the security feature and " "to not cause issue with the Sahara Dashboard forms." msgstr "" "Django 1.10 führt eine neue Variable ein: DATA_UPLOAD_MAX_NUMBER_FIELDS, " "welche DOS bei durch GET und POST Methoden empfangene Daten verhindert. Der " "Standardwert ist 2000, anstelle des Upstream-Standardwertes 1000, um das " "Sicherheitsmerkmal zu behalten ohne Schwierigkeiten mit den Sahara Dashboard " "Formularen hervorzurufen." msgid "Fixed issue with retrieving details for public clusters." msgstr "Problem beim abrufen von Details von öffentlichen Clustern beseitigt." msgid "Mitaka Series Release Notes" msgstr "Mitaka Series Releasenotes" msgid "New Features" msgstr "Neue Funktionen" msgid "Newton Series Release Notes" msgstr "Newton Series Releasenotes" msgid "Ocata Series Release Notes" msgstr "Ocata Serie Releasenotes" msgid "Other Notes" msgstr "Andere Notizen" msgid "Pike Series Release Notes" msgstr "Pike Serie Release Notes" msgid "Prelude" msgstr "Einleitung" msgid "Queens Series Release Notes" msgstr "Queens Serie Release Notes" msgid "Rocky Series Release Notes" msgstr "Rocky Serie Releasenotes" msgid "Sahara Dashboard Release Notes" msgstr "Sahara Dashboard Releasenotes" msgid "Security Issues" msgstr "Sicherheitsrelevante Probleme" msgid "Start using reno for release notes management." msgstr "Reno wird für die Verwaltung der Releasenotes verwendet." msgid "Stein Series Release Notes" msgstr "Stein Serie Releasenotes" msgid "" "The 'SAHARA_AUTO_IP_ALLOCATION_ENABLED' config parameter in Sahara was " "deprecated and replaced by 'SAHARA_FLOATING_IP_DISABLED' which has a less " "confusing name." msgstr "" "Der 'SAHARA_AUTO_IP_ALLOCATION_ENABLED' Konfigurationsparameter in Sahara " "wurde abgelöst und durch den weniger verwirrenden Namen " "'SAHARA_FLOATING_IP_DISABLED' ersetzt." msgid "" "The config parameter 'SAHARA_FLOATING_IP_DISABLED' replaces " "'SAHARA_AUTO_IP_ALLOCATION_ENABLED'." msgstr "" "Der Konfigurationsparameter 'SAHARA_FLOATING_IP_DISABLED' ersetzt " "'SAHARA_AUTO_IP_ALLOCATION_ENABLED'." msgid "" "There is now support for APIv2 in sahara-dashboard. Enable it by setting the " "\"data-processing\" API version to \"2\" in the `OPENSTACK_API_VERSIONS` " "dictionary found in Horizon's local_settings.py. Some Sahara features are " "only exposed through APIv2." msgstr "" "Es gibt jetzt Unterstützung für APIv2 in sahara-dashboard. Aktivieren Sie " "dies durch setzen von \"data-processing\" API Version auf \"2\" im " "`OPENSTACK_API_VERSIONS` Wörterbuch in der Horizon-Datei local_settings.py. " "Einige Sahara-Features können nur mittels der APIv2 verwendet werden." msgid "Train Series Release Notes" msgstr "Train Serie Releasenotes" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5280702 sahara-dashboard-16.0.0/releasenotes/source/locale/en_GB/0000775000175000017500000000000000000000000023207 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5480711 sahara-dashboard-16.0.0/releasenotes/source/locale/en_GB/LC_MESSAGES/0000775000175000017500000000000000000000000024774 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po0000664000175000017500000001355400000000000030035 0ustar00zuulzuul00000000000000# Andi Chandler , 2016. #zanata # Andi Chandler , 2017. #zanata # Andi Chandler , 2018. #zanata # Andi Chandler , 2019. #zanata # Andi Chandler , 2020. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-10-26 16:02+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2020-10-03 10:32+0000\n" "Last-Translator: Andi Chandler \n" "Language-Team: English (United Kingdom)\n" "Language: en_GB\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "10.0.0" msgstr "10.0.0" msgid "12.0.0" msgstr "12.0.0" msgid "12.0.0.0rc1" msgstr "12.0.0.0rc1" msgid "4.1.2" msgstr "4.1.2" msgid "5.0.0" msgstr "5.0.0" msgid "5.0.0.0b2" msgstr "5.0.0.0b2" msgid "5.0.0.0b3" msgstr "5.0.0.0b3" msgid "7.0.2" msgstr "7.0.2" msgid "8.0.0" msgstr "8.0.0" msgid "8.0.2" msgstr "8.0.2" msgid "9.0.0" msgstr "9.0.0" msgid "9.0.0.0b3" msgstr "9.0.0.0b3" msgid "9.0.2" msgstr "9.0.2" msgid "Added integration with Designate for hostname resolution." msgstr "Added integration with Designate for hostname resolution." msgid "Bug Fixes" msgstr "Bug Fixes" msgid "" "Coinciding with the official stability of Sahara APIv2, operators should " "feel especially encouraged to set \"data-processing\" API version to \"2\" " "in the `OPENSTACK_API_VERSIONS` dictionary found in Horizon's local_settings." "py. As previously stated, some Sahara features are only exposed through " "APIv2." msgstr "" "Coinciding with the official stability of Sahara APIv2, operators should " "feel especially encouraged to set \"data-processing\" API version to \"2\" " "in the `OPENSTACK_API_VERSIONS` dictionary found in Horizon's local_settings." "py. As previously stated, some Sahara features are only exposed through " "APIv2." msgid "Current Series Release Notes" msgstr "Current Series Release Notes" msgid "Deprecation Notes" msgstr "Deprecation Notes" msgid "" "Django 1.10 introduced a new var : DATA_UPLOAD_MAX_NUMBER_FIELDS which " "prevent DOS on data received via GET and POST methods. Default values is set " "to 2000 instead of upstream default of 1000 to keep the security feature and " "to not cause issue with the Sahara Dashboard forms." msgstr "" "Django 1.10 introduced a new var : DATA_UPLOAD_MAX_NUMBER_FIELDS which " "prevent DOS on data received via GET and POST methods. Default values is set " "to 2000 instead of upstream default of 1000 to keep the security feature and " "to not cause issue with the Sahara Dashboard forms." msgid "Fixed issue with retrieving details for public clusters." msgstr "Fixed issue with retrieving details for public clusters." msgid "" "Increasing DATA_UPLOAD_MAX_NUMBER_FIELDS django configuration to allow " "creation of CDH node group templates." msgstr "" "Increasing DATA_UPLOAD_MAX_NUMBER_FIELDS django configuration to allow " "creation of CDH node group templates." msgid "Mitaka Series Release Notes" msgstr "Mitaka Series Release Notes" msgid "New Features" msgstr "New Features" msgid "Newton Series Release Notes" msgstr "Newton Series Release Notes" msgid "Ocata Series Release Notes" msgstr "Ocata Series Release Notes" msgid "Other Notes" msgstr "Other Notes" msgid "Pike Series Release Notes" msgstr "Pike Series Release Notes" msgid "Prelude" msgstr "Prelude" msgid "" "Python 2.7 support has been dropped. Last release of sahara-dashboard to " "support python 2.7 is OpenStack Train. The minimum version of Python now " "supported by sahara-dashboard is Python 3.6." msgstr "" "Python 2.7 support has been dropped. Last release of Sahara-dashboard to " "support Python 2.7 is OpenStack Train. The minimum version of Python now " "supported by Sahara-dashboard is Python 3.6." msgid "Queens Series Release Notes" msgstr "Queens Series Release Notes" msgid "Rocky Series Release Notes" msgstr "Rocky Series Release Notes" msgid "Sahara Dashboard Release Notes" msgstr "Sahara Dashboard Release Notes" msgid "Security Issues" msgstr "Security Issues" msgid "Start using reno for release notes management." msgstr "Start using reno for release notes management." msgid "Stein Series Release Notes" msgstr "Stein Series Release Notes" msgid "" "Support for the new boot from volume options introduced in the Stein release " "of Sahara is added." msgstr "" "Support for the new boot from volume options introduced in the Stein release " "of Sahara is added." msgid "" "The 'SAHARA_AUTO_IP_ALLOCATION_ENABLED' config parameter in Sahara was " "deprecated and replaced by 'SAHARA_FLOATING_IP_DISABLED' which has a less " "confusing name." msgstr "" "The 'SAHARA_AUTO_IP_ALLOCATION_ENABLED' config parameter in Sahara was " "deprecated and replaced by 'SAHARA_FLOATING_IP_DISABLED' which has a less " "confusing name." msgid "" "The config parameter 'SAHARA_FLOATING_IP_DISABLED' replaces " "'SAHARA_AUTO_IP_ALLOCATION_ENABLED'." msgstr "" "The config parameter 'SAHARA_FLOATING_IP_DISABLED' replaces " "'SAHARA_AUTO_IP_ALLOCATION_ENABLED'." msgid "" "There is now support for APIv2 in sahara-dashboard. Enable it by setting the " "\"data-processing\" API version to \"2\" in the `OPENSTACK_API_VERSIONS` " "dictionary found in Horizon's local_settings.py. Some Sahara features are " "only exposed through APIv2." msgstr "" "There is now support for APIv2 in Sahara-Dashboard. Enable it by setting the " "\"data-processing\" API version to \"2\" in the `OPENSTACK_API_VERSIONS` " "dictionary found in Horizon's local_settings.py. Some Sahara features are " "only exposed through APIv2." msgid "Train Series Release Notes" msgstr "Train Series Release Notes" msgid "Upgrade Notes" msgstr "Upgrade Notes" msgid "Ussuri Series Release Notes" msgstr "Ussuri Series Release Notes" msgid "Victoria Series Release Notes" msgstr "Victoria Series Release Notes" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5280702 sahara-dashboard-16.0.0/releasenotes/source/locale/fr/0000775000175000017500000000000000000000000022644 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5480711 sahara-dashboard-16.0.0/releasenotes/source/locale/fr/LC_MESSAGES/0000775000175000017500000000000000000000000024431 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po0000664000175000017500000000274000000000000027465 0ustar00zuulzuul00000000000000# Gérald LONLAS , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-10-26 16:02+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-10-22 06:21+0000\n" "Last-Translator: Gérald LONLAS \n" "Language-Team: French\n" "Language: fr\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" msgid "5.0.0" msgstr "5.0.0" msgid "5.0.0.0b2" msgstr "5.0.0.0b2" msgid "5.0.0.0b3" msgstr "5.0.0.0b3" msgid "Added integration with Designate for hostname resolution." msgstr "Ajout l'intégration de la résolution du hostname avec Designate." msgid "Bug Fixes" msgstr "Corrections de bugs" msgid "Current Series Release Notes" msgstr "Note de la release actuelle" msgid "Fixed issue with retrieving details for public clusters." msgstr "" "Corrige un bug durant la récupération des détails des Clusters publics." msgid "Mitaka Series Release Notes" msgstr "Note de release pour Mitaka" msgid "New Features" msgstr "Nouvelles fonctionnalités" msgid "Newton Series Release Notes" msgstr "Note de release pour Newton" msgid "Other Notes" msgstr "Autres notes" msgid "Sahara Dashboard Release Notes" msgstr "Note de release pour le Tableau de bord Sahara" msgid "Start using reno for release notes management." msgstr "Commence à utiliser reno pour la gestion des notes de release" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5280702 sahara-dashboard-16.0.0/releasenotes/source/locale/id/0000775000175000017500000000000000000000000022631 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5480711 sahara-dashboard-16.0.0/releasenotes/source/locale/id/LC_MESSAGES/0000775000175000017500000000000000000000000024416 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/locale/id/LC_MESSAGES/releasenotes.po0000664000175000017500000001234200000000000027451 0ustar00zuulzuul00000000000000# suhartono , 2016. #zanata # suhartono , 2017. #zanata # suhartono , 2018. #zanata # suhartono , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-10-26 16:02+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-07-17 04:38+0000\n" "Last-Translator: suhartono \n" "Language-Team: Indonesian\n" "Language: id\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "10.0.0" msgstr "10.0.0" msgid "4.1.2" msgstr "4.1.2" msgid "5.0.0" msgstr "5.0.0" msgid "5.0.0.0b2" msgstr "5.0.0.0b2" msgid "5.0.0.0b3" msgstr "5.0.0.0b3" msgid "7.0.2" msgstr "7.0.2" msgid "8.0.0" msgstr "8.0.0" msgid "9.0.0" msgstr "9.0.0" msgid "Added integration with Designate for hostname resolution." msgstr "Ditambahkan integrasi dengan Designate untuk resolusi hostname" msgid "Bug Fixes" msgstr "Bug Fixes (perbaikan kerusakan)" msgid "" "Coinciding with the official stability of Sahara APIv2, operators should " "feel especially encouraged to set \"data-processing\" API version to \"2\" " "in the `OPENSTACK_API_VERSIONS` dictionary found in Horizon's local_settings." "py. As previously stated, some Sahara features are only exposed through " "APIv2." msgstr "" "Bertepatan dengan stabilitas resmi Sahara APIv2, operator harus merasa " "sangat dianjurkan untuk mengatur versi API \"data-processing\" menjadi " "\"2\" dalam kamus `OPENSTACK_API_VERSIONS` yang ditemukan di kamus Horizon " "local_settings.py. Seperti yang dinyatakan sebelumnya, beberapa fitur Sahara " "hanya diekspos melalui APIv2." msgid "Current Series Release Notes" msgstr "Current Series Release Notes (catatan rilis Curent Series)" msgid "Deprecation Notes" msgstr "Catatan Deprecation" msgid "" "Django 1.10 introduced a new var : DATA_UPLOAD_MAX_NUMBER_FIELDS which " "prevent DOS on data received via GET and POST methods. Default values is set " "to 2000 instead of upstream default of 1000 to keep the security feature and " "to not cause issue with the Sahara Dashboard forms." msgstr "" "Django 1.10 memperkenalkan sebuah var baru: DATA_UPLOAD_MAX_NUMBER_FIELDS " "yang mencegah DOS pada data yang diterima melalui metode GET dan POST. Nilai " "default diatur ke 2000, bukan default hulu 1000 untuk menjaga fitur keamanan " "dan tidak menimbulkan masalah dengan Dashboard Sahara form." msgid "Fixed issue with retrieving details for public clusters." msgstr "Isu tetap mengenai pengambilan rincian untuk kelompok masyarakat." msgid "" "Increasing DATA_UPLOAD_MAX_NUMBER_FIELDS django configuration to allow " "creation of CDH node group templates." msgstr "" "Meningkatkan konfigurasi django DATA_UPLOAD_MAX_NUMBER_FIELDS untuk " "memungkinkan pembuatan templat grup node CDH." msgid "Mitaka Series Release Notes" msgstr "Mitaka Series Release Notes (Catatan rilis Mitaka Series)" msgid "New Features" msgstr "New Features (fitur baru)" msgid "Newton Series Release Notes" msgstr "Newton Series Release Notes (catatan rilis Newton Series" msgid "Ocata Series Release Notes" msgstr "Catatan rilis seri Ocata" msgid "Other Notes" msgstr "Other Notes (catatan lain)" msgid "Pike Series Release Notes" msgstr "Catatan Rilis Seri Pike" msgid "Prelude" msgstr "Prelude" msgid "Queens Series Release Notes" msgstr "Catatan Rilis Seri Queens" msgid "Rocky Series Release Notes" msgstr "Rocky Series Release Notes" msgid "Sahara Dashboard Release Notes" msgstr "Sahara Dashboard Release Notes (catatan rilis Sahara Dashboard)" msgid "Security Issues" msgstr "Security Issues" msgid "Start using reno for release notes management." msgstr "Mulai menggunakan reno untuk manajemen catatan rilis." msgid "Stein Series Release Notes" msgstr "Catatan Rilis Seri Stein" msgid "" "Support for the new boot from volume options introduced in the Stein release " "of Sahara is added." msgstr "" "Dukungan untuk boot baru dari opsi volume yang diperkenalkan dalam rilis " "Sahara dari Stein ditambahkan." msgid "" "The 'SAHARA_AUTO_IP_ALLOCATION_ENABLED' config parameter in Sahara was " "deprecated and replaced by 'SAHARA_FLOATING_IP_DISABLED' which has a less " "confusing name." msgstr "" "Parameter konfigurasi 'SAHARA_AUTO_IP_ALLOCATION_ENABLED' di Sahara sudah " "tidak berlaku lagi dan diganti dengan 'SAHARA_FLOATING_IP_DISABLED' yang " "memiliki nama yang tidak membingungkan." msgid "" "The config parameter 'SAHARA_FLOATING_IP_DISABLED' replaces " "'SAHARA_AUTO_IP_ALLOCATION_ENABLED'." msgstr "" "Parameter konfigurasi 'SAHARA_FLOATING_IP_DISABLED' menggantikan " "'SAHARA_AUTO_IP_ALLOCATION_ENABLED'." msgid "" "There is now support for APIv2 in sahara-dashboard. Enable it by setting the " "\"data-processing\" API version to \"2\" in the `OPENSTACK_API_VERSIONS` " "dictionary found in Horizon's local_settings.py. Some Sahara features are " "only exposed through APIv2." msgstr "" "Sekarang ada dukungan untuk APIv2 di sahara-dashboard. Aktifkan dengan " "menyetel versi API \"data-processing\" ke \"2\" dalam kamus " "`OPENSTACK_API_VERSIONS` yang ditemukan di local_settings.py Horizon. " "Beberapa fitur Sahara hanya diekspos melalui APIv2." ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5280702 sahara-dashboard-16.0.0/releasenotes/source/locale/ja/0000775000175000017500000000000000000000000022627 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5480711 sahara-dashboard-16.0.0/releasenotes/source/locale/ja/LC_MESSAGES/0000775000175000017500000000000000000000000024414 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/locale/ja/LC_MESSAGES/releasenotes.po0000664000175000017500000000156200000000000027451 0ustar00zuulzuul00000000000000# Shu Muto , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: Sahara Dashboard Release Notes\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-02-09 18:15+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-06-16 05:52+0000\n" "Last-Translator: Shu Muto \n" "Language-Team: Japanese\n" "Language: ja\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "Current Series Release Notes" msgstr "開発中バージョンのリリースノート" msgid "Other Notes" msgstr "その他の注意点" msgid "Sahara Dashboard Release Notes" msgstr "Sahara Dashboard リリースノート" msgid "Start using reno for release notes management." msgstr "リリースノートの管理に reno を使い始めました。" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5280702 sahara-dashboard-16.0.0/releasenotes/source/locale/ko_KR/0000775000175000017500000000000000000000000023242 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5480711 sahara-dashboard-16.0.0/releasenotes/source/locale/ko_KR/LC_MESSAGES/0000775000175000017500000000000000000000000025027 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/locale/ko_KR/LC_MESSAGES/releasenotes.po0000664000175000017500000000740300000000000030064 0ustar00zuulzuul00000000000000# Ian Y. Choi , 2016. #zanata # Ian Y. Choi , 2017. #zanata # Sungjin Kang , 2017. #zanata # minwook-shin , 2017. #zanata # Hongjae Kim , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-10-26 16:02+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-11-02 09:05+0000\n" "Last-Translator: Hongjae Kim \n" "Language-Team: Korean (South Korea)\n" "Language: ko_KR\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "5.0.0" msgstr "5.0.0" msgid "5.0.0.0b2" msgstr "5.0.0.0b2" msgid "5.0.0.0b3" msgstr "5.0.0.0b3" msgid "Added integration with Designate for hostname resolution." msgstr "호스트 이름 변환을 위해 Designate와의 통합을 추가하였습니다." msgid "Bug Fixes" msgstr "버그 수정" msgid "" "Coinciding with the official stability of Sahara APIv2, operators should " "feel especially encouraged to set \"data-processing\" API version to \"2\" " "in the `OPENSTACK_API_VERSIONS` dictionary found in Horizon's local_settings." "py. As previously stated, some Sahara features are only exposed through " "APIv2." msgstr "" "사하라 APIv2의 공식 안정성과 일치하여 운영자들은 특히 Horizon의 " "local_settings.py.에 수록된 \"OPENSTACK_API_VERSIONS\" 사전에서 \"데이터 처리" "\" API 버전을 \"2\"로 설정하도록 권장해야 한다. 앞서 언급한 바와 같이 일부 사" "하라 기능은 APIv2를 통해서만 노출된다." msgid "Current Series Release Notes" msgstr "현재 시리즈에 대한 릴리즈 노트" msgid "Deprecation Notes" msgstr "감가 상각" msgid "" "Django 1.10 introduced a new var : DATA_UPLOAD_MAX_NUMBER_FIELDS which " "prevent DOS on data received via GET and POST methods. Default values is set " "to 2000 instead of upstream default of 1000 to keep the security feature and " "to not cause issue with the Sahara Dashboard forms." msgstr "" "Django 1.10에서 새로운 var: DATA_UPLOAD_를 도입함GET 및 POST 방법을 통해 수신" "된 데이터에 대한 DOS를 방지하는 MAX_NUMBER_FIELDS. 보안 기능을 유지하고 사하" "라 대시보드 양식에 문제를 일으키지 않으려면 기본값을 업스트림 기본값 1000이 " "아닌 2000으로 설정하십시오." msgid "Fixed issue with retrieving details for public clusters." msgstr "" "공용 클러스터에 대한 세부 사항을 가져오는 데 존재하던 이슈를 수정하였습니다." msgid "" "Increasing DATA_UPLOAD_MAX_NUMBER_FIELDS django configuration to allow " "creation of CDH node group templates." msgstr "" "DATA_UPLOAD_ 증가CDH 노드 그룹 템플릿을 만들 수 있도록 MAX_NUMBER_FIELDS " "django 구성." msgid "Mitaka Series Release Notes" msgstr "Mitaka 시리즈에 대한 릴리즈 노트" msgid "New Features" msgstr "새로운 기능" msgid "Newton Series Release Notes" msgstr "Newton 시리즈에 대한 릴리즈 노트" msgid "Ocata Series Release Notes" msgstr "Ocata 시리즈에 대한 릴리즈 노트" msgid "Other Notes" msgstr "기타 기능" msgid "Pike Series Release Notes" msgstr "Pike 시리즈에 대한 릴리즈 노트" msgid "Sahara Dashboard Release Notes" msgstr "Sahara 대시보드 릴리즈 노트" msgid "Start using reno for release notes management." msgstr "릴리즈 노트 관리를 위해 reno 사용을 시작합니다." msgid "" "Support for the new boot from volume options introduced in the Stein release " "of Sahara is added." msgstr "" "Sahara의 Stein 릴리스에 도입된 볼륨 옵션에서 새로운 부팅에 대한 지원이 추가되" "었다." ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5280702 sahara-dashboard-16.0.0/releasenotes/source/locale/zh_CN/0000775000175000017500000000000000000000000023236 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5480711 sahara-dashboard-16.0.0/releasenotes/source/locale/zh_CN/LC_MESSAGES/0000775000175000017500000000000000000000000025023 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/locale/zh_CN/LC_MESSAGES/releasenotes.po0000664000175000017500000000272000000000000030055 0ustar00zuulzuul00000000000000# sunanchen , 2016. #zanata # Bin , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-10-26 16:02+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-07-24 03:49+0000\n" "Last-Translator: Bin \n" "Language-Team: Chinese (China)\n" "Language: zh_CN\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "5.0.0" msgstr "5.0.0版本" msgid "5.0.0.0b2" msgstr "5.0.0.0b2版本" msgid "5.0.0.0b3" msgstr "5.0.0.0b3版本" msgid "Added integration with Designate for hostname resolution." msgstr "给Designate增加域名以便于主机名解析" msgid "Bug Fixes" msgstr "修复漏洞" msgid "Current Series Release Notes" msgstr "当前版本发布说明" msgid "Fixed issue with retrieving details for public clusters." msgstr "修复了公共集群的回收问题" msgid "Mitaka Series Release Notes" msgstr "Mitaka版本发布说明" msgid "New Features" msgstr "新特征" msgid "Newton Series Release Notes" msgstr "Newton版本发布说明" msgid "Ocata Series Release Notes" msgstr "Ocata版本发布说明" msgid "Other Notes" msgstr "其他注意事项" msgid "Sahara Dashboard Release Notes" msgstr "Sahara Dashboard发布说明" msgid "Start using reno for release notes management." msgstr "开始使用reno来管理版本发布" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/mitaka.rst0000664000175000017500000000021400000000000022773 0ustar00zuulzuul00000000000000============================ Mitaka Series Release Notes ============================ .. release-notes:: :branch: origin/stable/mitaka ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/newton.rst0000664000175000017500000000023200000000000023037 0ustar00zuulzuul00000000000000=================================== Newton Series Release Notes =================================== .. release-notes:: :branch: origin/stable/newton ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/ocata.rst0000664000175000017500000000023000000000000022612 0ustar00zuulzuul00000000000000=================================== Ocata Series Release Notes =================================== .. release-notes:: :branch: origin/stable/ocata ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/pike.rst0000664000175000017500000000021700000000000022460 0ustar00zuulzuul00000000000000=================================== Pike Series Release Notes =================================== .. release-notes:: :branch: stable/pike ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/queens.rst0000664000175000017500000000022300000000000023025 0ustar00zuulzuul00000000000000=================================== Queens Series Release Notes =================================== .. release-notes:: :branch: stable/queens ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/rocky.rst0000664000175000017500000000022100000000000022652 0ustar00zuulzuul00000000000000=================================== Rocky Series Release Notes =================================== .. release-notes:: :branch: stable/rocky ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/stein.rst0000664000175000017500000000022100000000000022645 0ustar00zuulzuul00000000000000=================================== Stein Series Release Notes =================================== .. release-notes:: :branch: stable/stein ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/train.rst0000664000175000017500000000017600000000000022651 0ustar00zuulzuul00000000000000========================== Train Series Release Notes ========================== .. release-notes:: :branch: stable/train ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/unreleased.rst0000664000175000017500000000016000000000000023654 0ustar00zuulzuul00000000000000============================== Current Series Release Notes ============================== .. release-notes:: ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/ussuri.rst0000664000175000017500000000020200000000000023054 0ustar00zuulzuul00000000000000=========================== Ussuri Series Release Notes =========================== .. release-notes:: :branch: stable/ussuri ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/victoria.rst0000664000175000017500000000021200000000000023343 0ustar00zuulzuul00000000000000============================= Victoria Series Release Notes ============================= .. release-notes:: :branch: stable/victoria ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/wallaby.rst0000664000175000017500000000020600000000000023161 0ustar00zuulzuul00000000000000============================ Wallaby Series Release Notes ============================ .. release-notes:: :branch: stable/wallaby ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/releasenotes/source/xena.rst0000664000175000017500000000017200000000000022463 0ustar00zuulzuul00000000000000========================= Xena Series Release Notes ========================= .. release-notes:: :branch: stable/xena ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/requirements.txt0000664000175000017500000000121300000000000020266 0ustar00zuulzuul00000000000000# The order of packages is significant, because pip processes them in the order # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. pbr!=2.1.0,>=2.0.0 # Apache-2.0 keystoneauth1>=3.8.0 # Apache-2.0 oslo.log>=3.36.0 # Apache-2.0 oslo.serialization!=2.19.1,>=2.18.0 # Apache-2.0 python-designateclient>=2.7.0 # Apache-2.0 python-keystoneclient>=3.22.0 # Apache-2.0 python-manilaclient>=1.16.0 # Apache-2.0 python-neutronclient>=6.7.0 # Apache-2.0 python-novaclient>=9.1.0 # Apache-2.0 python-saharaclient>=2.2.0 # Apache-2.0 pytz>=2013.6 # MIT horizon>=17.1.0 # Apache-2.0 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5280702 sahara-dashboard-16.0.0/roles/0000775000175000017500000000000000000000000016131 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5280702 sahara-dashboard-16.0.0/roles/post-devstack-sahara-ui-integration/0000775000175000017500000000000000000000000025111 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5480711 sahara-dashboard-16.0.0/roles/post-devstack-sahara-ui-integration/defaults/0000775000175000017500000000000000000000000026720 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/roles/post-devstack-sahara-ui-integration/defaults/main.yaml0000664000175000017500000000014700000000000030532 0ustar00zuulzuul00000000000000--- devstack_base_dir: "/opt/stack" sahara_cloud_admin: "devstack-admin" sahara_cloud_demo: "devstack" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5480711 sahara-dashboard-16.0.0/roles/post-devstack-sahara-ui-integration/files/0000775000175000017500000000000000000000000026213 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/roles/post-devstack-sahara-ui-integration/files/fake_config.json0000664000175000017500000000013300000000000031336 0ustar00zuulzuul00000000000000{ "plugin_labels": { "hidden": { "status": false } } } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5480711 sahara-dashboard-16.0.0/roles/post-devstack-sahara-ui-integration/tasks/0000775000175000017500000000000000000000000026236 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/roles/post-devstack-sahara-ui-integration/tasks/main.yaml0000664000175000017500000000053600000000000030052 0ustar00zuulzuul00000000000000--- - name: copy the updated config snipped which enables the fake plugin copy: src: fake_config.json dest: /tmp/sahara_fake_config.json - name: change the config of the fake plugin shell: | openstack --os-cloud {{ sahara_cloud_admin }} --os-project-name demo \ dataprocessing plugin update fake /tmp/sahara_fake_config.json ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5280702 sahara-dashboard-16.0.0/roles/setup-sahara-ui-integration/0000775000175000017500000000000000000000000023462 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5480711 sahara-dashboard-16.0.0/roles/setup-sahara-ui-integration/defaults/0000775000175000017500000000000000000000000025271 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/roles/setup-sahara-ui-integration/defaults/main.yaml0000664000175000017500000000046600000000000027107 0ustar00zuulzuul00000000000000--- devstack_base_dir: "/opt/stack" sahara_cloud_image: "https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img" # TODO: if the following option is changed, it should also be specified in tempest.conf sahara_cloud_image_remote_path: "/tmp/xenial-server-cloudimg-amd64-disk1.img" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5520713 sahara-dashboard-16.0.0/roles/setup-sahara-ui-integration/files/0000775000175000017500000000000000000000000024564 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/roles/setup-sahara-ui-integration/files/legacy_panels.conf0000664000175000017500000000006700000000000030244 0ustar00zuulzuul00000000000000[image] panel_type=legacy [flavors] panel_type=legacy ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5520713 sahara-dashboard-16.0.0/roles/setup-sahara-ui-integration/tasks/0000775000175000017500000000000000000000000024607 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/roles/setup-sahara-ui-integration/tasks/main.yaml0000664000175000017500000000152500000000000026422 0ustar00zuulzuul00000000000000--- - name: download the ubuntu image file get_url: url: "{{ sahara_cloud_image }}" dest: "{{ sahara_cloud_image_remote_path }}" # enable legacy panels (two files in local/local_settings.d and a new setting file # for the integration tests) - name: setup the old behavior of tables for testing purposes copy: src: "{{ devstack_base_dir }}/horizon/openstack_dashboard/local/local_settings.d/{{ item }}.example" dest: "{{ devstack_base_dir }}/horizon/openstack_dashboard/local/local_settings.d/{{ item }}" remote_src: yes with_items: - '_20_integration_tests_scaffolds.py' - '_2010_integration_tests_deprecated.py' - name: setup the old behavior of panels for testing purposes copy: src: legacy_panels.conf dest: "{{ devstack_base_dir }}/horizon/openstack_dashboard/test/integration_tests/local-horizon.conf" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5520713 sahara-dashboard-16.0.0/sahara_dashboard/0000775000175000017500000000000000000000000020253 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/__init__.py0000664000175000017500000000000000000000000022352 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5520713 sahara-dashboard-16.0.0/sahara_dashboard/api/0000775000175000017500000000000000000000000021024 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/api/__init__.py0000664000175000017500000000114600000000000023137 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from sahara_dashboard.api import sahara __all__ = [ "sahara" ] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/api/designate.py0000664000175000017500000000226100000000000023342 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from designateclient.v2 import client as designate from keystoneauth1.identity import generic from keystoneauth1 import session as keystone_session from openstack_dashboard.api import base def client(request): auth_url = base.url_for(request, 'identity') token_kwargs = dict( auth_url=auth_url, token=request.user.token.id, tenant_id=request.user.project_id, tenant_name=request.user.project_name, ) auth = generic.Token(**token_kwargs) session = keystone_session.Session(auth=auth) return designate.Client(session=session) def get_domain_names(request): return client(request).zones.list() ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/api/manila.py0000664000175000017500000000434200000000000022642 0ustar00zuulzuul00000000000000# Copyright 2012 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # # Copyright 2012 OpenStack Foundation # Copyright 2012 Nebula, Inc. # Copyright (c) 2012 X.commerce, a business unit of eBay Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.conf import settings from manilaclient.v1 import client as manila_client from oslo_log import log as logging from horizon import exceptions from horizon.utils.memoized import memoized # noqa from openstack_dashboard.api import base LOG = logging.getLogger(__name__) # API static values SHARE_STATE_AVAILABLE = "available" DEFAULT_QUOTA_NAME = 'default' def manilaclient(request): insecure = getattr(settings, 'OPENSTACK_SSL_NO_VERIFY', False) cacert = getattr(settings, 'OPENSTACK_SSL_CACERT', None) try: manila_url = base.url_for(request, 'share') except exceptions.ServiceCatalogException: LOG.debug('no share service configured.') return None c = manila_client.Client(request.user.username, input_auth_token=request.user.token.id, project_id=request.user.tenant_id, service_catalog_url=manila_url, insecure=insecure, cacert=cacert, http_log_debug=settings.DEBUG) c.client.auth_token = request.user.token.id c.client.management_url = manila_url return c def share_list(request, search_opts=None): return manilaclient(request).shares.list(search_opts=search_opts) def share_get(request, share_id): return manilaclient(request).shares.get(share_id) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/api/sahara.py0000664000175000017500000006324100000000000022643 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.conf import settings from keystoneauth1 import identity from keystoneauth1 import session from saharaclient.api.base import APIException from saharaclient.api.base import Page from saharaclient import client as api_client from horizon import exceptions from horizon.utils import functions from horizon.utils.memoized import memoized # noqa from openstack_dashboard.api import base from sahara_dashboard import utils as u # "type" of Sahara service registered in keystone SAHARA_SERVICE = 'data-processing' try: SAHARA_FLOATING_IP_DISABLED = getattr( settings, 'SAHARA_FLOATING_IP_DISABLED') except AttributeError: SAHARA_FLOATING_IP_DISABLED = getattr( settings, 'SAHARA_AUTO_IP_ALLOCATION_ENABLED', False) SAHARA_VERIFICATION_DISABLED = getattr( settings, 'SAHARA_VERIFICATION_DISABLED', False) VERSIONS = base.APIVersionManager( SAHARA_SERVICE, preferred_version=getattr(settings, 'OPENSTACK_API_VERSIONS', {}).get(SAHARA_SERVICE, 1.1)) VERSIONS.load_supported_version(1.1, {"client": api_client, "version": 1.1}) VERSIONS.load_supported_version(2, {"client": api_client, "version": 2}) SAHARA_PAGE_SIZE = 15 def get_page_size(request=None): if request: return functions.get_page_size(request) else: return SAHARA_PAGE_SIZE def _get_marker(request): return request.GET["marker"] if 'marker' in request.GET else None def _update_pagination_params(marker, limit, request=None): marker = _get_marker(request) if marker is None else marker limit = get_page_size(request) if limit is None else limit return marker, limit def safe_call(func, *args, **kwargs): """Call a function ignoring Not Found error This method is supposed to be used only for safe retrieving Sahara objects. If the object is no longer available, then None should be returned. """ try: return func(*args, **kwargs) except APIException as e: if e.error_code == 404: return None # Not found. Exiting with None raise # Other errors are not expected here @memoized def client(request): insecure = getattr(settings, 'OPENSTACK_SSL_NO_VERIFY', False) cacert = getattr(settings, 'OPENSTACK_SSL_CACERT', None) endpoint_type = getattr(settings, 'OPENSTACK_ENDPOINT_TYPE', 'publicURL') auth = identity.Token(auth_url=request.user.endpoint, token=request.user.token.id, project_id=request.user.project_id) verify = False if cacert: verify = cacert elif not insecure: verify = True sess = session.Session(auth=auth, verify=verify) return api_client.Client(VERSIONS.get_active_version()["version"], service_type=SAHARA_SERVICE, session=sess, endpoint_type=endpoint_type) def prepare_acl_update_dict(is_public=None, is_protected=None): data = dict(is_public=is_public, is_protected=is_protected) result = {} for key in data: if data[key] is not None: result[key] = data[key] return result def image_list(request, search_opts=None): return client(request).images.list(search_opts=search_opts) def image_get(request, image_id): return client(request).images.get(id=image_id) def image_unregister(request, image_id): client(request).images.unregister_image(image_id=image_id) def image_update(request, image_id, user_name, desc): client(request).images.update_image(image_id=image_id, user_name=user_name, desc=desc) def image_tags_update(request, image_id, image_tags): client(request).images.update_tags(image_id=image_id, new_tags=image_tags) def plugin_list(request, search_opts=None): return client(request).plugins.list(search_opts=search_opts) def plugin_get(request, plugin_name): return client(request).plugins.get(plugin_name=plugin_name) def plugin_get_version_details(request, plugin_name, hadoop_version): return client(request).plugins.get_version_details( plugin_name, hadoop_version) def nodegroup_template_create(request, name, plugin_name, hadoop_version, flavor_id, description=None, volumes_per_node=None, volumes_size=None, node_processes=None, node_configs=None, floating_ip_pool=None, security_groups=None, auto_security_group=False, availability_zone=False, volumes_availability_zone=False, volume_type=None, image_id=None, is_proxy_gateway=False, volume_local_to_instance=False, use_autoconfig=None, shares=None, is_public=None, is_protected=None, volume_mount_prefix=None, boot_from_volume=None, boot_volume_type=None, boot_volume_availability_zone=None, boot_volume_local_to_instance=None): payload = dict( name=name, plugin_name=plugin_name, flavor_id=flavor_id, description=description, volumes_per_node=volumes_per_node, volumes_size=volumes_size, node_processes=node_processes, node_configs=node_configs, floating_ip_pool=floating_ip_pool, security_groups=security_groups, auto_security_group=auto_security_group, availability_zone=availability_zone, volumes_availability_zone=volumes_availability_zone, volume_type=volume_type, image_id=image_id, is_proxy_gateway=is_proxy_gateway, volume_local_to_instance=volume_local_to_instance, use_autoconfig=use_autoconfig, shares=shares, is_public=is_public, is_protected=is_protected, volume_mount_prefix=volume_mount_prefix) if VERSIONS.active == '2': payload['plugin_version'] = hadoop_version payload['boot_from_volume'] = boot_from_volume payload['boot_volume_type'] = boot_volume_type payload['boot_volume_availability_zone'] = ( boot_volume_availability_zone ) payload['boot_volume_local_to_instance'] = ( boot_volume_local_to_instance ) else: payload['hadoop_version'] = hadoop_version return client(request).node_group_templates.create(**payload) def nodegroup_template_list(request, search_opts=None, marker=None, limit=None): marker, limit = _update_pagination_params(marker, limit, request) return client(request).node_group_templates.list( search_opts=search_opts, limit=limit, marker=marker) def nodegroup_template_get(request, ngt_id): return client(request).node_group_templates.get(ng_template_id=ngt_id) def nodegroup_template_find(request, **kwargs): if "hadoop_version" in kwargs and VERSIONS.active == '2': kwargs["plugin_version"] = kwargs.pop("hadoop_version") return client(request).node_group_templates.find(**kwargs) def nodegroup_template_delete(request, ngt_id): client(request).node_group_templates.delete(ng_template_id=ngt_id) def nodegroup_template_update(request, ngt_id, name, plugin_name, hadoop_version, flavor_id, description=None, volumes_per_node=None, volumes_size=None, node_processes=None, node_configs=None, floating_ip_pool=None, security_groups=None, auto_security_group=False, availability_zone=None, volumes_availability_zone=None, volume_type=None, is_proxy_gateway=False, volume_local_to_instance=False, use_autoconfig=None, shares=None, is_protected=None, is_public=None, image_id=None, boot_from_volume=None, boot_volume_type=None, boot_volume_availability_zone=None, boot_volume_local_to_instance=None): payload = dict( ng_template_id=ngt_id, name=name, plugin_name=plugin_name, flavor_id=flavor_id, description=description, volumes_per_node=volumes_per_node, volumes_size=volumes_size, node_processes=node_processes, node_configs=node_configs, floating_ip_pool=floating_ip_pool, security_groups=security_groups, auto_security_group=auto_security_group, availability_zone=availability_zone, volumes_availability_zone=volumes_availability_zone, volume_type=volume_type, is_proxy_gateway=is_proxy_gateway, volume_local_to_instance=volume_local_to_instance, use_autoconfig=use_autoconfig, shares=shares, is_public=is_public, is_protected=is_protected, image_id=image_id) if VERSIONS.active == '2': payload['plugin_version'] = hadoop_version payload['boot_from_volume'] = boot_from_volume payload['boot_volume_type'] = boot_volume_type payload['boot_volume_availability_zone'] = ( boot_volume_availability_zone ) payload['boot_volume_local_to_instance'] = ( boot_volume_local_to_instance ) else: payload['hadoop_version'] = hadoop_version return client(request).node_group_templates.update(**payload) def nodegroup_update_acl_rules(request, nid, is_public=None, is_protected=None): return client(request).node_group_templates.update( nid, **prepare_acl_update_dict(is_public, is_protected)) def nodegroup_template_export(request, object_id): return client(request).node_group_templates.export(object_id) def cluster_template_create(request, name, plugin_name, hadoop_version, description=None, cluster_configs=None, node_groups=None, anti_affinity=None, net_id=None, use_autoconfig=None, shares=None, is_public=None, is_protected=None, domain_name=None): payload = dict( name=name, plugin_name=plugin_name, description=description, cluster_configs=cluster_configs, node_groups=node_groups, anti_affinity=anti_affinity, net_id=net_id, use_autoconfig=use_autoconfig, shares=shares, is_public=is_public, is_protected=is_protected, domain_name=domain_name ) if VERSIONS.active == '2': payload['plugin_version'] = hadoop_version else: payload['hadoop_version'] = hadoop_version return client(request).cluster_templates.create(**payload) def cluster_template_list(request, search_opts=None, marker=None, limit=None): marker, limit = _update_pagination_params(marker, limit, request) return client(request).cluster_templates.list( search_opts=search_opts, limit=limit, marker=marker) def cluster_template_get(request, ct_id): return client(request).cluster_templates.get(cluster_template_id=ct_id) def cluster_template_delete(request, ct_id): client(request).cluster_templates.delete(cluster_template_id=ct_id) def cluster_template_update(request, ct_id, name, plugin_name, hadoop_version, description=None, cluster_configs=None, node_groups=None, anti_affinity=None, net_id=None, use_autoconfig=None, shares=None, is_public=None, is_protected=None, domain_name=None): try: payload = dict( cluster_template_id=ct_id, name=name, plugin_name=plugin_name, description=description, cluster_configs=cluster_configs, node_groups=node_groups, anti_affinity=anti_affinity, net_id=net_id, use_autoconfig=use_autoconfig, shares=shares, is_public=is_public, is_protected=is_protected, domain_name=domain_name ) if VERSIONS.active == '2': payload['plugin_version'] = hadoop_version else: payload['hadoop_version'] = hadoop_version template = client(request).cluster_templates.update(**payload) except APIException as e: raise exceptions.Conflict(e) return template def cluster_template_update_acl_rules(request, ct_id, is_public=None, is_protected=None): return client(request).cluster_templates.update( ct_id, **prepare_acl_update_dict(is_public, is_protected)) def cluster_template_export(request, object_id): return client(request).cluster_templates.export(object_id) def cluster_create(request, name, plugin_name, hadoop_version, cluster_template_id=None, default_image_id=None, is_transient=None, description=None, cluster_configs=None, node_groups=None, user_keypair_id=None, anti_affinity=None, net_id=None, count=None, use_autoconfig=None, is_public=None, is_protected=None): payload = dict( name=name, plugin_name=plugin_name, cluster_template_id=cluster_template_id, default_image_id=default_image_id, is_transient=is_transient, description=description, cluster_configs=cluster_configs, node_groups=node_groups, user_keypair_id=user_keypair_id, anti_affinity=anti_affinity, net_id=net_id, count=count, use_autoconfig=use_autoconfig, is_public=is_public, is_protected=is_protected) if VERSIONS.active == '2': payload['plugin_version'] = hadoop_version else: payload['hadoop_version'] = hadoop_version return client(request).clusters.create(**payload) def cluster_scale(request, cluster_id, scale_object): return client(request).clusters.scale( cluster_id=cluster_id, scale_object=scale_object) def cluster_list(request, search_opts=None, marker=None, limit=None): marker, limit = _update_pagination_params(marker, limit, request) return client(request).clusters.list( search_opts=search_opts, limit=limit, marker=marker) def _cluster_list(request): return client(request).clusters.list() def cluster_get(request, cluster_id, show_progress=False): return client(request).clusters.get( cluster_id=cluster_id, show_progress=show_progress) def cluster_delete(request, cluster_id): client(request).clusters.delete(cluster_id=cluster_id) def cluster_force_delete(request, cluster_id): client(request).clusters.force_delete(cluster_id=cluster_id) def cluster_update(request, cluster_id, name=None, description=None, is_public=None, is_protected=None, shares=None): return client(request).clusters.update(cluster_id, name=name, description=description, is_public=is_public, is_protected=is_protected, shares=shares) def cluster_update_shares(request, cl_id, shares): return client(request).clusters.update(cl_id, shares) def cluster_update_acl_rules(request, cl_id, is_public=None, is_protected=None): return client(request).clusters.update( cl_id, **prepare_acl_update_dict(is_public, is_protected)) def data_source_create(request, name, description, ds_type, url, credential_user=None, credential_pass=None, is_public=None, is_protected=None, s3_credentials=None): return client(request).data_sources.create( name=name, description=description, data_source_type=ds_type, url=url, credential_user=credential_user or None, credential_pass=credential_pass or None, is_public=is_public, is_protected=is_protected, s3_credentials=s3_credentials) def data_source_list(request, search_opts=None, limit=None, marker=None): marker, limit = _update_pagination_params(marker, limit, request) return client(request).data_sources.list( search_opts=search_opts, limit=limit, marker=marker) def data_source_get(request, ds_id): return client(request).data_sources.get(data_source_id=ds_id) def data_source_delete(request, ds_id): client(request).data_sources.delete(data_source_id=ds_id) def data_source_update(request, ds_id, data): return client(request).data_sources.update(ds_id, data) def job_binary_create(request, name, url, description, extra, is_public=None, is_protected=None): return client(request).job_binaries.create( name=name, url=url, description=description, extra=extra, is_public=is_public, is_protected=is_protected, ) def job_binary_list(request, search_opts=None, marker=None, limit=None): marker, limit = _update_pagination_params(marker, limit, request) return client(request).job_binaries.list( search_opts=search_opts, limit=limit, marker=marker) def job_binary_get(request, jb_id): return client(request).job_binaries.get(job_binary_id=jb_id) def job_binary_delete(request, jb_id): client(request).job_binaries.delete(job_binary_id=jb_id) def job_binary_get_file(request, jb_id): return client(request).job_binaries.get_file(job_binary_id=jb_id) def job_binary_update(request, jb_id, data): return client(request).job_binaries.update(jb_id, data) def job_binary_internal_create(request, name, data): return client(request).job_binary_internals.create( name=name, data=data) def job_binary_internal_list(request, search_opts=None, marker=None, limit=None): marker, limit = _update_pagination_params(marker, limit, request) return client(request).job_binary_internals.list( search_opts=search_opts, limit=limit, marker=marker) def job_binary_internal_get(request, jbi_id): # The argument name looks wrong. This should be changed in the sahara # client first and then updated here return client(request).job_binary_internals.get(job_binary_id=jbi_id) def job_binary_internal_delete(request, jbi_id): # The argument name looks wrong. This should be changed in the sahara # client first and then updated here client(request).job_binary_internals.delete(job_binary_id=jbi_id) def job_create(request, name, j_type, mains, libs, description, interface, is_public=None, is_protected=None): sahara = client(request) if VERSIONS.active == '2': manager = 'job_templates' else: manager = 'jobs' return getattr(sahara, manager).create( name=name, type=j_type, mains=mains, libs=libs, description=description, interface=interface, is_public=is_public, is_protected=is_protected) def job_update(request, job_id, is_public=None, is_protected=None): sahara = client(request) if VERSIONS.active == '2': manager = 'job_templates' else: manager = 'jobs' return getattr(sahara, manager).update( job_id=job_id, **prepare_acl_update_dict(is_public, is_protected)) def job_list(request, search_opts=None, marker=None, limit=None): marker, limit = _update_pagination_params(marker, limit, request) sahara = client(request) if VERSIONS.active == '2': manager = 'job_templates' else: manager = 'jobs' return getattr(sahara, manager).list( search_opts=search_opts, limit=limit, marker=marker) def _job_list(request): sahara = client(request) if VERSIONS.active == '2': manager = 'job_templates' else: manager = 'jobs' return getattr(sahara, manager).list() def job_get(request, job_id): sahara = client(request) if VERSIONS.active == '2': manager = 'job_templates' else: manager = 'jobs' return getattr(sahara, manager).get(job_id=job_id) def job_delete(request, job_id): sahara = client(request) if VERSIONS.active == '2': manager = 'job_templates' else: manager = 'jobs' getattr(sahara, manager).delete(job_id=job_id) def job_get_configs(request, job_type): sahara = client(request) if VERSIONS.active == '2': manager = 'job_templates' else: manager = 'jobs' return getattr(sahara, manager).get_configs(job_type=job_type) def job_execution_create(request, job_id, cluster_id, input_id, output_id, configs, interface, is_public=None, is_protected=None): if input_id in [None, "", "None"]: input_id = None if output_id in [None, "", "None"]: output_id = None sahara = client(request) if VERSIONS.active == '2': manager = 'jobs' else: manager = 'job_executions' return getattr(sahara, manager).create( job_id, cluster_id=cluster_id, input_id=input_id, output_id=output_id, configs=configs, interface=interface, is_public=is_public, is_protected=is_protected, ) def job_execution_update(request, jbe_id, is_public=None, is_protected=None): sahara = client(request) if VERSIONS.active == '2': manager = 'jobs' else: manager = 'job_executions' return getattr(sahara, manager).update(jbe_id, **prepare_acl_update_dict( is_public, is_protected)) def _resolve_job_execution_names(job_execution, cluster=None, job=None): job_execution.cluster_name = None if cluster: job_execution.cluster_name = cluster.name job_execution.job_name = None if job: job_execution.job_name = job.name return job_execution def job_execution_list(request, search_opts=None, marker=None, limit=None): marker, limit = _update_pagination_params(marker, limit, request) sahara = client(request) if VERSIONS.active == '2': manager = 'jobs' else: manager = 'job_executions' job_execution_list = getattr(sahara, manager).list( search_opts=search_opts, limit=limit, marker=marker) new_request = u.delete_pagination_params_from_request( request, save_limit=False) job_dict = {j.id: j for j in _job_list(new_request)} cluster_dict = {c.id: c for c in _cluster_list(new_request)} def _find_jt_id(jex_obj): try: return jex_obj.job_template_id # typical APIv2 except AttributeError: return jex_obj.job_id # APIv1.1, older APIv2 resolved_job_execution_list = [ _resolve_job_execution_names( job_execution, cluster_dict.get(job_execution.cluster_id), job_dict.get(_find_jt_id(job_execution))) for job_execution in job_execution_list ] return Page(resolved_job_execution_list, job_execution_list.prev, job_execution_list.next, job_execution_list.limit) def job_execution_get(request, jex_id): sahara = client(request) if VERSIONS.active == '2': je_manager = 'jobs' jt_manager = 'job_templates' else: je_manager = 'job_executions' jt_manager = 'jobs' jex = getattr(sahara, je_manager).get(obj_id=jex_id) cluster = safe_call(client(request).clusters.get, jex.cluster_id) try: jt_id = jex.job_template_id # typical APIv2 except AttributeError: jt_id = jex.job_id # APIv1.1, older APIv2 job = safe_call(getattr(sahara, jt_manager).get, jt_id) return _resolve_job_execution_names(jex, cluster, job) def job_execution_delete(request, jex_id): sahara = client(request) if VERSIONS.active == '2': manager = 'jobs' else: manager = 'job_executions' getattr(sahara, manager).delete(obj_id=jex_id) def job_types_list(request): return client(request).job_types.list() def verification_update(request, cluster_id, status): return client(request).clusters.verification_update(cluster_id, status) def plugin_update(request, plugin_name, values): return client(request).plugins.update(plugin_name, values) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5520713 sahara-dashboard-16.0.0/sahara_dashboard/content/0000775000175000017500000000000000000000000021725 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/__init__.py0000664000175000017500000000000000000000000024024 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5520713 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/0000775000175000017500000000000000000000000025072 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/__init__.py0000664000175000017500000000000000000000000027171 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5560715 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/0000775000175000017500000000000000000000000026736 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/__init__.py0000664000175000017500000000000000000000000031035 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5560715 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/0000775000175000017500000000000000000000000032475 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020700000000000011454 xustar0000000000000000113 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/__init__.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/__init__0000664000175000017500000000000000000000000034145 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5560715 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/forms/0000775000175000017500000000000000000000000033623 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021500000000000011453 xustar0000000000000000119 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/forms/__init__.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/forms/__0000664000175000017500000000000000000000000034111 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022100000000000011450 xustar0000000000000000123 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/forms/import_forms.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/forms/im0000664000175000017500000002020100000000000034146 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ from oslo_serialization import jsonutils as json from horizon import exceptions from horizon import forms from saharaclient.api import base as api_base from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing. \ utils.workflow_helpers as whelpers from sahara_dashboard import utils BASE_IMAGE_URL = "horizon:project:data_processing.clusters:register" class ImportClusterTemplateFileForm(forms.SelfHandlingForm): class Meta(object): name = _("Import Cluster Template") def __init__(self, *args, **kwargs): self.next_view = kwargs.pop("next_view") super(ImportClusterTemplateFileForm, self).__init__( *args, **kwargs) template_upload = forms.FileField( label=_("Template File"), required=True) def handle(self, request, data): kwargs = {"template_upload": data["template_upload"]} request.method = "GET" return self.next_view.as_view()(request, **kwargs) class ImportClusterTemplateNameForm(forms.SelfHandlingForm): class Meta(object): name = _("Import Cluster Template") template_upload = forms.CharField( widget=forms.widgets.HiddenInput) name = forms.CharField(label=_("Name"), required=False, help_text=_("Name must be provided " "either here or in the template. If " "provided in both places, this one " "will be used.")) def __init__(self, *args, **kwargs): try: request = args[0] template_string = "" self.next_view = kwargs.pop("next_view") if "template_upload" in kwargs: template_upload = kwargs.pop("template_upload") super(ImportClusterTemplateNameForm, self).__init__( *args, **kwargs) template_string = template_upload.read() self.fields["template_upload"].initial = template_string else: super(ImportClusterTemplateNameForm, self).__init__( *args, **kwargs) except (ValueError, KeyError): raise exceptions.BadRequest(_("Could not parse template")) except Exception: exceptions.handle(request) def handle(self, request, data): template = data["template_upload"] if data["name"]: template = json.loads(template) template["cluster_template"]["name"] = data["name"] template = json.dumps(template) kwargs = {"template_upload": template} request.method = "GET" return self.next_view.as_view()(request, **kwargs) class ImportClusterTemplateNodegroupsForm(forms.SelfHandlingForm): class Meta(object): name = _("Import Cluster Template") template_upload = forms.CharField( widget=forms.widgets.HiddenInput) hidden_nodegroups_field = forms.CharField( required=False, widget=forms.HiddenInput(attrs={"class": "hidden_nodegroups_field"})) forms_ids = forms.CharField( required=False, widget=forms.HiddenInput()) def __init__(self, *args, **kwargs): try: request = args[0] template_string = "" if "template_upload" in kwargs: template_string = kwargs.pop("template_upload") super(ImportClusterTemplateNodegroupsForm, self).__init__( *args, **kwargs) self.fields["template_upload"].initial = template_string else: super(ImportClusterTemplateNodegroupsForm, self).__init__( *args, **kwargs) template_string = self.data["template_upload"] template_json = json.loads(template_string) template_json = template_json["cluster_template"] req = request.GET.copy() req.update(request.POST) plugin = template_json["plugin_name"] version = (template_json.get("hadoop_version", None) or template_json["plugin_version"]) if not plugin or not version: self.templates = saharaclient.nodegroup_template_find(request) else: self.templates = saharaclient.nodegroup_template_find( request, plugin_name=plugin, hadoop_version=version) deletable = req.get("deletable", dict()) if "forms_ids" in req: self.groups = [] for id in json.loads(req["forms_ids"]): group_name = "group_name_" + str(id) template_id = "template_id_" + str(id) count = "count_" + str(id) serialized = "serialized_" + str(id) self.groups.append({"name": req[group_name], "template_id": req[template_id], "count": req[count], "id": id, "deletable": deletable.get( req[group_name], "true"), "serialized": req[serialized]}) whelpers.build_node_group_fields(self, group_name, template_id, count, serialized) except (ValueError, KeyError): raise exceptions.BadRequest(_("Could not parse template")) except Exception: exceptions.handle(request) def handle(self, request, data): try: template = data["template_upload"] template = json.loads(template) template = template["cluster_template"] if "name" not in template.keys(): return False if "neutron_management_network" in template: template["net_id"] = ( template.pop("neutron_management_network")) # default_image_id is not supported by the client now if "default_image_id" in template: template.pop("default_image_id") node_groups = [] ids = json.loads(data['forms_ids']) for id in ids: name = data['group_name_' + str(id)] template_id = data['template_id_' + str(id)] count = data['count_' + str(id)] raw_ng = data.get("serialized_" + str(id)) if raw_ng and raw_ng != 'null': ng = json.loads(utils.deserialize(str(raw_ng))) else: ng = dict() ng["name"] = name ng["count"] = count if template_id and template_id != u'None': ng["node_group_template_id"] = template_id node_groups.append(ng) template["node_groups"] = node_groups saharaclient.cluster_template_create(request, **template) return True except api_base.APIException as e: self.error_description = str(e) return False except Exception as e: if isinstance(e, TypeError): raise exceptions.BadRequest( _("Template JSON contained invalid key")) else: raise exceptions.BadRequest(_("Could not parse template")) ././@PaxHeader0000000000000000000000000000020500000000000011452 xustar0000000000000000111 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/tables.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/tables.p0000664000175000017500000001651300000000000034136 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django import http as http_response from django.template import defaultfilters as filters from django import urls from django.utils import http from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ungettext_lazy from horizon import tables from horizon.tabs import base as tabs_base from oslo_serialization import jsonutils as json from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing \ import tables as sahara_table from sahara_dashboard.content.data_processing.utils \ import acl as acl_utils class ClusterTemplatesFilterAction(tables.FilterAction): filter_type = "server" filter_choices = (('name', _("Name"), True), ('plugin_name', _("Plugin"), True), ('hadoop_version', _("Version"), True), ('description', _("Description"))) class CreateCluster(tables.LinkAction): name = "create cluster" verbose_name = _("Launch Cluster") url = "horizon:project:data_processing.clusters:configure-cluster" classes = ("ajax-modal",) icon = "plus" def get_link_url(self, datum): base_url = urls.reverse(self.url) if saharaclient.VERSIONS.active == '2': version_attr = "plugin_version" else: version_attr = "hadoop_version" params = http.urlencode({"hadoop_version": getattr(datum, version_attr), "plugin_name": datum.plugin_name, "cluster_template_id": datum.id}) return "?".join([base_url, params]) class CopyTemplate(tables.LinkAction): name = "copy" verbose_name = _("Copy Template") url = "horizon:project:data_processing.clusters:ct-copy" classes = ("ajax-modal", ) class ExportTemplate(tables.Action): name = "export" verbose_name = _("Export Template") classes = ("ajax-modal", ) def single(self, data_table, request, object_id): content = json.dumps(saharaclient.cluster_template_export( request, object_id)._info) response = http_response.HttpResponse( content, content_type="application/json") filename = '%s-cluster-template.json' % object_id disposition = 'attachment; filename="%s"' % filename response['Content-Disposition'] = disposition.encode('utf-8') response['Content-Length'] = str(len(response.content)) return response class EditTemplate(tables.LinkAction): name = "edit" verbose_name = _("Edit Template") url = "horizon:project:data_processing.clusters:ct-edit" classes = ("ajax-modal", ) class DeleteTemplate(tables.DeleteAction): @staticmethod def action_present(count): return ungettext_lazy( u"Delete Template", u"Delete Templates", count ) @staticmethod def action_past(count): return ungettext_lazy( u"Deleted Template", u"Deleted Templates", count ) def delete(self, request, template_id): saharaclient.cluster_template_delete(request, template_id) class CreateClusterTemplate(tables.LinkAction): name = "create" verbose_name = _("Create Template") url = ("horizon:project:data_processing.clusters:" "create-cluster-template") classes = ("ajax-modal", "create-clustertemplate-btn") icon = "plus" class ImportClusterTemplate(tables.LinkAction): name = "import" verbose_name = _("Import Template") url = ("horizon:project:data_processing.clusters:" "import-cluster-template-file") classes = ("ajax-modal",) icon = "plus" class ConfigureClusterTemplate(tables.LinkAction): name = "configure" verbose_name = _("Configure Cluster Template") url = ("horizon:project:data_processing.clusters:" "configure-cluster-template") classes = ("ajax-modal", "configure-clustertemplate-btn") icon = "plus" attrs = {"style": "display: none"} def render_node_groups(cluster_template): node_groups = [node_group['name'] + ': ' + str(node_group['count']) for node_group in cluster_template.node_groups] return node_groups class MakePublic(acl_utils.MakePublic): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.cluster_template_update_acl_rules( request, datum_id, **update_kwargs) class MakePrivate(acl_utils.MakePrivate): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.cluster_template_update_acl_rules( request, datum_id, **update_kwargs) class MakeProtected(acl_utils.MakeProtected): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.cluster_template_update_acl_rules( request, datum_id, **update_kwargs) class MakeUnProtected(acl_utils.MakeUnProtected): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.cluster_template_update_acl_rules( request, datum_id, **update_kwargs) class ClusterTemplatesTable(sahara_table.SaharaPaginateTabbedTable): tab_name = 'cluster_tabs%sclusters_templates_tab' % tabs_base.SEPARATOR name = tables.Column("name", verbose_name=_("Name"), link=("horizon:project:data_processing." "clusters:ct-details")) plugin_name = tables.Column("plugin_name", verbose_name=_("Plugin")) if saharaclient.VERSIONS.active == '2': version_attr = "plugin_version" else: version_attr = "hadoop_version" hadoop_version = tables.Column(version_attr, verbose_name=_("Version")) node_groups = tables.Column(render_node_groups, verbose_name=_("Node Groups"), wrap_list=True, filters=(filters.unordered_list,)) description = tables.Column("description", verbose_name=_("Description")) class Meta(object): name = "cluster_templates" verbose_name = _("Cluster Templates") table_actions = (CreateClusterTemplate, ImportClusterTemplate, ConfigureClusterTemplate, DeleteTemplate, ClusterTemplatesFilterAction,) table_actions_menu = (MakePublic, MakePrivate, MakeProtected, MakeUnProtected) row_actions = (CreateCluster, EditTemplate, CopyTemplate, ExportTemplate, DeleteTemplate, MakePublic, MakePrivate, MakeProtected, MakeUnProtected) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/tabs.py0000664000175000017500000001067300000000000034007 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from oslo_log import log as logging from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import tabs from openstack_dashboard.api import nova from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content. \ data_processing.utils import workflow_helpers as helpers from sahara_dashboard.content.data_processing.clusters.cluster_templates \ import tables as cluster_template_tables from sahara_dashboard.content.data_processing \ import tabs as sahara_tabs LOG = logging.getLogger(__name__) class ClusterTemplatesTab(sahara_tabs.SaharaTableTab): table_classes = (cluster_template_tables.ClusterTemplatesTable, ) name = _("Cluster Templates") slug = "clusters_templates_tab" template_name = "horizon/common/_detail_table.html" def get_cluster_templates_data(self): try: table = self._tables['cluster_templates'] search_opts = {} filter = self.get_server_filter_info(table.request, table) if filter['value'] and filter['field']: search_opts = {filter['field']: filter['value']} cluster_templates = saharaclient.cluster_template_list( self.request, search_opts) except Exception: cluster_templates = [] exceptions.handle(self.request, _("Unable to fetch cluster template list")) return cluster_templates class GeneralTab(tabs.Tab): name = _("General Info") slug = "cluster_template_details_tab" template_name = "cluster_templates/_details.html" def get_context_data(self, request): template_id = self.tab_group.kwargs['template_id'] try: template = saharaclient.cluster_template_get(request, template_id) except Exception as e: template = {} LOG.error("Unable to fetch cluster template details: %s" % str(e)) if saharaclient.VERSIONS.active == '2': template.hadoop_version = template.plugin_version return {"template": template} class ClusterTemplateConfigsDetails(tabs.Tab): name = _("Configuration Details") slug = "cluster_template_configs_details_tab" template_name = ( "cluster_templates/_cluster_template_configs_details.html") def get_context_data(self, request): template_id = self.tab_group.kwargs['template_id'] try: template = saharaclient.cluster_template_get(request, template_id) except Exception as e: template = {} LOG.error("Unable to fetch cluster template details: %s" % str(e)) return {"template": template} class NodeGroupsTab(tabs.Tab): name = _("Node Groups") slug = "cluster_template_nodegroups_tab" template_name = "cluster_templates/_nodegroups_details.html" def get_context_data(self, request): template_id = self.tab_group.kwargs['template_id'] try: template = saharaclient.cluster_template_get(request, template_id) for ng in template.node_groups: if not ng["flavor_id"]: continue ng["flavor_name"] = ( nova.flavor_get(request, ng["flavor_id"]).name) ng["node_group_template"] = saharaclient.safe_call( saharaclient.nodegroup_template_get, request, ng.get("node_group_template_id", None)) ng["security_groups_full"] = helpers.get_security_groups( request, ng.get("security_groups")) except Exception: template = {} exceptions.handle(request, _("Unable to fetch node group details.")) return {"template": template} class ClusterTemplateDetailsTabs(tabs.TabGroup): slug = "cluster_template_details" tabs = (GeneralTab, ClusterTemplateConfigsDetails, NodeGroupsTab, ) sticky = True ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/tests.py0000664000175000017500000001501700000000000034215 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import copy from django.urls import reverse from oslo_serialization import jsonutils from openstack_dashboard import api as dash_api from sahara_dashboard import api from sahara_dashboard.test import helpers as test from sahara_dashboard import utils INDEX_URL = reverse('horizon:project:data_processing.clusters:' 'cluster-templates-tab') DETAILS_URL = reverse( 'horizon:project:data_processing.clusters:ct-details', args=['id']) class DataProcessingClusterTemplateTests(test.TestCase): @test.create_mocks({api.sahara: ('cluster_template_list', 'image_list', 'cluster_list', 'nodegroup_template_list')}) def test_index(self): self.mock_cluster_template_list.return_value = \ self.cluster_templates.list() res = self.client.get(INDEX_URL) self.mock_cluster_template_list.assert_called_once_with( test.IsHttpRequest(), {}) self.assertTemplateUsed(res, 'clusters/index.html') self.assertContains(res, 'Cluster Templates') self.assertContains(res, 'Name') @test.create_mocks({api.sahara: ('cluster_template_get', 'nodegroup_template_get'), dash_api.nova: ('flavor_get',)}) def test_details(self): flavor = self.flavors.first() ct = self.cluster_templates.first() self.mock_flavor_get.return_value = flavor self.mock_cluster_template_get.return_value = ct res = self.client.get(DETAILS_URL) self.assertTemplateUsed(res, 'horizon/common/_detail.html') @test.create_mocks({api.sahara: ('client', 'cluster_template_get', 'plugin_get_version_details', 'nodegroup_template_find')}) def test_copy(self): ct = self.cluster_templates.first() ngts = self.nodegroup_templates.list() configs = self.plugins_configs.first() self.mock_cluster_template_get.return_value = ct self.mock_plugin_get_version_details.return_value = configs self.mock_nodegroup_template_find.return_value = ngts url = reverse('horizon:project:data_processing.clusters:ct-copy', args=[ct.id]) res = self.client.get(url) self.mock_cluster_template_get.assert_called_once_with( test.IsHttpRequest(), ct.id) workflow = res.context['workflow'] step = workflow.get_step("generalconfigaction") self.assertEqual(step.action['cluster_template_name'].field.initial, ct.name + "-copy") @test.create_mocks({api.sahara: ('cluster_template_list', 'cluster_template_delete')}) def test_delete(self): ct = self.cluster_templates.first() self.mock_cluster_template_list.return_value = \ self.cluster_templates.list() self.mock_cluster_template_delete.return_value = None form_data = {'action': 'cluster_templates__delete__%s' % ct.id} res = self.client.post(INDEX_URL, form_data) self.mock_cluster_template_list.assert_called_once_with( test.IsHttpRequest(), {}) self.mock_cluster_template_delete.assert_called_once_with( test.IsHttpRequest(), ct.id) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, INDEX_URL) self.assertMessageCount(success=1) @test.create_mocks({api.sahara: ('client', 'cluster_template_get', 'cluster_template_update', 'plugin_get_version_details', 'nodegroup_template_find')}) def test_update(self): ct = self.cluster_templates.first() ngts = self.nodegroup_templates.list() configs = self.plugins_configs.first() new_name = "UpdatedName" new_ct = copy.copy(ct) new_ct.name = new_name self.mock_cluster_template_get.return_value = ct self.mock_plugin_get_version_details.return_value = configs self.mock_nodegroup_template_find.return_value = ngts self.mock_cluster_template_update.return_value = new_ct url = reverse('horizon:project:data_processing.clusters:ct-edit', args=[ct.id]) def serialize(obj): return utils.serialize(jsonutils.dump_as_bytes(obj)) res = self.client.post( url, {'ct_id': ct.id, 'cluster_template_name': new_name, 'plugin_name': ct.plugin_name, 'hadoop_version': ct.hadoop_version, 'description': ct.description, 'hidden_configure_field': "", 'template_id_0': ct.node_groups[0]['node_group_template_id'], 'group_name_0': ct.node_groups[0]['name'], 'count_0': 1, 'serialized_0': serialize(ct.node_groups[0]), 'template_id_1': ct.node_groups[1]['node_group_template_id'], 'group_name_1': ct.node_groups[1]['name'], 'count_1': 2, 'serialized_1': serialize(ct.node_groups[1]), 'forms_ids': "[0,1]", }) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, INDEX_URL) self.assertMessageCount(success=1) self.mock_cluster_template_update.assert_called_once_with( request=test.IsHttpRequest(), ct_id=ct.id, name=new_name, plugin_name=ct.plugin_name, hadoop_version=ct.hadoop_version, description=ct.description, cluster_configs=ct.cluster_configs, node_groups=ct.node_groups, anti_affinity=ct.anti_affinity, use_autoconfig=False, shares=ct.shares, is_public=False, is_protected=False, domain_name=ct.domain_name ) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/views.py0000664000175000017500000001641100000000000034207 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.urls import reverse from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import forms from horizon import tabs from horizon.utils import memoized from horizon import workflows from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing.clusters. \ cluster_templates.tables as ct_tables import sahara_dashboard.content.data_processing.clusters. \ cluster_templates.tabs as _tabs import sahara_dashboard.content.data_processing.clusters. \ cluster_templates.workflows.copy as copy_flow import sahara_dashboard.content.data_processing.clusters. \ cluster_templates.workflows.create as create_flow import sahara_dashboard.content.data_processing.clusters. \ cluster_templates.workflows.edit as edit_flow import sahara_dashboard.content.data_processing.clusters. \ cluster_templates.forms.import_forms as import_forms class ClusterTemplateDetailsView(tabs.TabView): tab_group_class = _tabs.ClusterTemplateDetailsTabs template_name = 'horizon/common/_detail.html' page_title = "{{ template.name|default:template.id }}" @memoized.memoized_method def get_object(self): ct_id = self.kwargs["template_id"] try: return saharaclient.cluster_template_get(self.request, ct_id) except Exception: msg = _('Unable to retrieve details for ' 'cluster template "%s".') % ct_id redirect = self.get_redirect_url() exceptions.handle(self.request, msg, redirect=redirect) def get_context_data(self, **kwargs): context = super(ClusterTemplateDetailsView, self)\ .get_context_data(**kwargs) cluster_template = self.get_object() context['template'] = cluster_template context['url'] = self.get_redirect_url() context['actions'] = self._get_actions(cluster_template) return context def _get_actions(self, cluster_template): table = ct_tables.ClusterTemplatesTable(self.request) return table.render_row_actions(cluster_template) @staticmethod def get_redirect_url(): return reverse("horizon:project:data_processing." "clusters:index") class CreateClusterTemplateView(workflows.WorkflowView): workflow_class = create_flow.CreateClusterTemplate success_url = ("horizon:project:data_processing.clusters" ":create-cluster-template") classes = ("ajax-modal",) template_name = "cluster_templates/create.html" page_title = _("Create Cluster Template") class ConfigureClusterTemplateView(workflows.WorkflowView): workflow_class = create_flow.ConfigureClusterTemplate success_url = ("horizon:project:data_processing.clusters" ":index") template_name = "cluster_templates/configure.html" page_title = _("Configure Cluster Template") class CopyClusterTemplateView(workflows.WorkflowView): workflow_class = copy_flow.CopyClusterTemplate success_url = ("horizon:project:data_processing.clusters" ":index") template_name = "cluster_templates/configure.html" page_title = _("Copy Cluster Template") def get_context_data(self, **kwargs): context = super(CopyClusterTemplateView, self)\ .get_context_data(**kwargs) context["template_id"] = kwargs["template_id"] return context def get_object(self, *args, **kwargs): if not hasattr(self, "_object"): template_id = self.kwargs['template_id'] try: template = saharaclient.cluster_template_get(self.request, template_id) except Exception: template = {} exceptions.handle(self.request, _("Unable to fetch cluster template.")) self._object = template return self._object def get_initial(self): initial = super(CopyClusterTemplateView, self).get_initial() initial['template_id'] = self.kwargs['template_id'] return initial class EditClusterTemplateView(CopyClusterTemplateView): workflow_class = edit_flow.EditClusterTemplate success_url = ("horizon:project:data_processing.clusters" ":index") template_name = "cluster_templates/configure.html" class ImportClusterTemplateFileView(forms.ModalFormView): template_name = "cluster_templates/import.html" form_class = import_forms.ImportClusterTemplateFileForm submit_label = _("Next") submit_url = reverse_lazy("horizon:project:data_processing." "clusters:import-cluster-template-file") success_url = reverse_lazy("horizon:project:data_processing." "clusters:import-cluster-template-name") page_title = _("Import Cluster Template") def get_form_kwargs(self): kwargs = super(ImportClusterTemplateFileView, self).get_form_kwargs() kwargs['next_view'] = ImportClusterTemplateNameView return kwargs class ImportClusterTemplateNameView(forms.ModalFormView): template_name = "cluster_templates/import.html" form_class = import_forms.ImportClusterTemplateNameForm submit_label = _("Next") submit_url = reverse_lazy("horizon:project:data_processing." "clusters:import-cluster-template-name") success_url = reverse_lazy("horizon:project:data_processing." "clusters:import-cluster-template-nodegroups") page_title = _("Import Cluster Template") def get_form_kwargs(self): kwargs = super(ImportClusterTemplateNameView, self).get_form_kwargs() kwargs['next_view'] = ImportClusterTemplateNodegroupsView if 'template_upload' in self.kwargs: kwargs['template_upload'] = self.kwargs['template_upload'] return kwargs class ImportClusterTemplateNodegroupsView(forms.ModalFormView): template_name = "cluster_templates/import_nodegroups.html" # template_name = "some_random_stuff.html" form_class = import_forms.ImportClusterTemplateNodegroupsForm submit_label = _("Import") submit_url = reverse_lazy("horizon:project:data_processing." "clusters:import-cluster-template-nodegroups") success_url = reverse_lazy("horizon:project:data_processing." "clusters:index") page_title = _("Import Cluster Template") def get_form_kwargs(self): kwargs = super(ImportClusterTemplateNodegroupsView, self).get_form_kwargs() if 'template_upload' in self.kwargs: kwargs['template_upload'] = self.kwargs['template_upload'] return kwargs ././@PaxHeader0000000000000000000000000000021400000000000011452 xustar0000000000000000112 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/workflows/ 28 mtime=1648641572.5560715 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/workflow0000775000175000017500000000000000000000000034270 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022100000000000011450 xustar0000000000000000123 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/workflows/__init__.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/workflow0000664000175000017500000000000000000000000034260 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021500000000000011453 xustar0000000000000000119 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/workflows/copy.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/workflow0000664000175000017500000001350000000000000034271 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import json from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing.clusters. \ cluster_templates.workflows.create as create_flow import sahara_dashboard.content.data_processing.utils. \ workflow_helpers as wf_helpers from sahara_dashboard import utils class CopyClusterTemplate(create_flow.ConfigureClusterTemplate): success_message = _("Cluster Template copy %s created") entry_point = "generalconfigaction" def __init__(self, request, context_seed, entry_point, *args, **kwargs): self.cluster_template_id = context_seed["template_id"] try: self.template = saharaclient.cluster_template_get( request, self.cluster_template_id) self._set_configs_to_copy(self.template.cluster_configs) if saharaclient.VERSIONS.active == '2': version_attr = 'plugin_version' else: version_attr = 'hadoop_version' hadoop_version = getattr(self.template, version_attr) request.GET = request.GET.copy() request.GET.update({"plugin_name": self.template.plugin_name, version_attr: hadoop_version, "aa_groups": self.template.anti_affinity}) super(CopyClusterTemplate, self).__init__(request, context_seed, entry_point, *args, **kwargs) # Initialize node groups. # TODO(rdopieralski) The same (or very similar) code appears # multiple times in this dashboard. It should be refactored to # a function. for step in self.steps: if isinstance(step, create_flow.ConfigureNodegroups): ng_action = step.action template_ngs = self.template.node_groups if 'forms_ids' in request.POST: continue ng_action.groups = [] for i, templ_ng in enumerate(template_ngs): group_name = "group_name_%d" % i template_id = "template_id_%d" % i count = "count_%d" % i serialized = "serialized_%d" % i # save the original node group with all its fields in # case the template id is missing serialized_val = utils.serialize( json.dumps(wf_helpers.clean_node_group(templ_ng))) ng = { "name": templ_ng["name"], "count": templ_ng["count"], "id": i, "deletable": "true", "serialized": serialized_val } if "node_group_template_id" in templ_ng: ng["template_id"] = templ_ng[ "node_group_template_id"] ng_action.groups.append(ng) wf_helpers.build_node_group_fields( ng_action, group_name, template_id, count, serialized) elif isinstance(step, create_flow.GeneralConfig): fields = step.action.fields fields["cluster_template_name"].initial = ( self.template.name + "-copy") fields['use_autoconfig'].initial = ( self.template.use_autoconfig) fields["description"].initial = self.template.description elif isinstance(step, create_flow.SelectClusterShares): fields = step.action.fields fields["shares"].initial = ( self._get_share_defaults(fields["shares"].choices) ) fields['is_public'].initial = ( self.template.is_public) fields['is_protected'].initial = ( self.template.is_protected) elif isinstance(step, create_flow.SelectDnsDomains): fields = step.action.fields fields["domain_name"].initial = self.template.domain_name except Exception: exceptions.handle(request, _("Unable to fetch template to copy.")) def _get_share_defaults(self, choices): values = dict() for i, choice in enumerate(choices): share_id = choice[0] s = [s for s in self.template.shares if s['id'] == share_id] if len(s) > 0: path = s[0]["path"] if "path" in s[0] else "" values["share_id_{0}".format(i)] = { "id": s[0]["id"], "path": path, "access_level": s[0]["access_level"] } else: values["share_id_{0}".format(i)] = { "id": None, "path": None, "access_level": None } return values ././@PaxHeader0000000000000000000000000000021700000000000011455 xustar0000000000000000121 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/workflows/create.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/workflow0000664000175000017500000003733600000000000034306 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import json from django import urls from django.utils.translation import ugettext_lazy as _ from saharaclient.api import base as api_base from horizon import exceptions from horizon import forms from horizon import workflows from sahara_dashboard.api import designate as designateclient from sahara_dashboard.api import manila as manilaclient from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.utils import helpers from sahara_dashboard.content.data_processing. \ utils import anti_affinity as aa from sahara_dashboard.content.data_processing.utils \ import acl as acl_utils import sahara_dashboard.content.data_processing. \ utils.workflow_helpers as whelpers from sahara_dashboard import utils class SelectPluginAction(workflows.Action, whelpers.PluginAndVersionMixin): hidden_create_field = forms.CharField( required=False, widget=forms.HiddenInput(attrs={"class": "hidden_create_field"})) def __init__(self, request, *args, **kwargs): super(SelectPluginAction, self).__init__(request, *args, **kwargs) sahara = saharaclient.client(request) self._generate_plugin_version_fields(sahara) class Meta(object): name = _("Select plugin and hadoop version for cluster template") help_text_template = ("cluster_templates/" "_create_general_help.html") class SelectPlugin(workflows.Step): action_class = SelectPluginAction class CreateClusterTemplate(workflows.Workflow): slug = "create_cluster_template" name = _("Create Cluster Template") finalize_button_name = _("Next") success_message = _("Created") failure_message = _("Could not create") success_url = "horizon:project:data_processing.clusters:clusters-tab" default_steps = (SelectPlugin, ) def get_success_url(self): url = urls.reverse(self.success_url) return url class GeneralConfigAction(workflows.Action): hidden_configure_field = forms.CharField( required=False, widget=forms.HiddenInput(attrs={"class": "hidden_configure_field"})) hidden_to_delete_field = forms.CharField( required=False, widget=forms.HiddenInput(attrs={"class": "hidden_to_delete_field"})) cluster_template_name = forms.CharField(label=_("Template Name")) description = forms.CharField(label=_("Description"), required=False, widget=forms.Textarea(attrs={'rows': 4})) use_autoconfig = forms.BooleanField( label=_("Auto-configure"), help_text=_("If selected, instances of a cluster will be " "automatically configured during creation. Otherwise you " "should manually specify configuration values"), required=False, widget=forms.CheckboxInput(), initial=True, ) is_public = acl_utils.get_is_public_form(_("cluster template")) is_protected = acl_utils.get_is_protected_form(_("cluster template")) anti_affinity = aa.anti_affinity_field() def __init__(self, request, *args, **kwargs): super(GeneralConfigAction, self).__init__(request, *args, **kwargs) plugin, hadoop_version = whelpers.\ get_plugin_and_hadoop_version(request) self.fields["plugin_name"] = forms.CharField( widget=forms.HiddenInput(), initial=plugin ) self.fields["hadoop_version"] = forms.CharField( widget=forms.HiddenInput(), initial=hadoop_version ) populate_anti_affinity_choices = aa.populate_anti_affinity_choices def get_help_text(self): extra = dict() plugin_name, hadoop_version = whelpers\ .get_plugin_and_hadoop_version(self.request) extra["plugin_name"] = plugin_name extra["hadoop_version"] = hadoop_version plugin = saharaclient.plugin_get_version_details( self.request, plugin_name, hadoop_version) extra["deprecated"] = whelpers.is_version_of_plugin_deprecated( plugin, hadoop_version) return super(GeneralConfigAction, self).get_help_text(extra) def clean(self): cleaned_data = super(GeneralConfigAction, self).clean() if cleaned_data.get("hidden_configure_field", None) \ == "create_nodegroup": self._errors = dict() return cleaned_data class Meta(object): name = _("Details") help_text_template = ("cluster_templates/_configure_general_help.html") class GeneralConfig(workflows.Step): action_class = GeneralConfigAction contributes = ("hidden_configure_field", ) def contribute(self, data, context): for k, v in data.items(): context["general_" + k] = v post = self.workflow.request.POST context['anti_affinity_info'] = post.getlist("anti_affinity") return context class ConfigureNodegroupsAction(workflows.Action): hidden_nodegroups_field = forms.CharField( required=False, widget=forms.HiddenInput(attrs={"class": "hidden_nodegroups_field"})) forms_ids = forms.CharField( required=False, widget=forms.HiddenInput()) def __init__(self, request, *args, **kwargs): super(ConfigureNodegroupsAction, self). \ __init__(request, *args, **kwargs) # when we copy or edit a cluster template then # request contains valuable info in both GET and POST methods req = request.GET.copy() req.update(request.POST) plugin = req.get("plugin_name") version = req.get("hadoop_version", None) or req["plugin_version"] if plugin and not version: version_name = plugin + "_version" version = req.get(version_name) if not plugin or not version: self.templates = saharaclient.nodegroup_template_find(request) else: self.templates = saharaclient.nodegroup_template_find( request, plugin_name=plugin, hadoop_version=version) deletable = req.get("deletable", dict()) if 'forms_ids' in req: self.groups = [] for id in json.loads(req['forms_ids']): group_name = "group_name_" + str(id) template_id = "template_id_" + str(id) count = "count_" + str(id) serialized = "serialized_" + str(id) self.groups.append({"name": req[group_name], "template_id": req[template_id], "count": req[count], "id": id, "deletable": deletable.get( req[group_name], "true"), "serialized": req[serialized]}) whelpers.build_node_group_fields(self, group_name, template_id, count, serialized) def clean(self): cleaned_data = super(ConfigureNodegroupsAction, self).clean() if cleaned_data.get("hidden_nodegroups_field", None) \ == "create_nodegroup": self._errors = dict() return cleaned_data class Meta(object): name = _("Node Groups") class ConfigureNodegroups(workflows.Step): action_class = ConfigureNodegroupsAction contributes = ("hidden_nodegroups_field", ) template_name = ("cluster_templates/cluster_node_groups_template.html") def contribute(self, data, context): for k, v in data.items(): context["ng_" + k] = v return context class SelectClusterSharesAction(workflows.Action): def __init__(self, request, *args, **kwargs): super(SelectClusterSharesAction, self).__init__( request, *args, **kwargs) possible_shares = self.get_possible_shares(request) self.fields["shares"] = whelpers.MultipleShareChoiceField( label=_("Select Shares"), widget=whelpers.ShareWidget(choices=possible_shares), required=False, choices=possible_shares ) def get_possible_shares(self, request): try: shares = manilaclient.share_list(request) choices = [(s.id, s.name) for s in shares] except Exception: exceptions.handle(request, _("Failed to get list of shares")) choices = [] return choices def clean(self): cleaned_data = super(SelectClusterSharesAction, self).clean() self._errors = dict() return cleaned_data class Meta(object): name = _("Shares") help_text = _("Select the manila shares for this cluster") class SelectClusterShares(workflows.Step): action_class = SelectClusterSharesAction def contribute(self, data, context): post = self.workflow.request.POST shares_details = [] for index in range(0, len(self.action.fields['shares'].choices) * 3): if index % 3 == 0: share = post.get("shares_{0}".format(index)) if share: path = post.get("shares_{0}".format(index + 1)) permissions = post.get("shares_{0}".format(index + 2)) shares_details.append({ "id": share, "path": path, "access_level": permissions }) context['ct_shares'] = shares_details return context class SelectDnsDomainsAction(workflows.Action): domain_name = forms.DynamicChoiceField( label=_("Domain Name"), required=False ) def __init__(self, request, *args, **kwargs): super(SelectDnsDomainsAction, self).__init__(request, *args, **kwargs) def _get_domain_choices(self, request): domains = designateclient.get_domain_names(request) choices = [(None, _('No domain is specified'))] choices.extend( [(domain.get('name'), domain.get('name')) for domain in domains]) return choices def populate_domain_name_choices(self, request, context): return self._get_domain_choices(request) class Meta(object): name = _("DNS Domain Names") help_text_template = ( "cluster_templates/_config_domain_names_help.html") class SelectDnsDomains(workflows.Step): action_class = SelectDnsDomainsAction def contribute(self, data, context): for k, v in data.items(): context["dns_" + k] = v return context class ConfigureClusterTemplate(whelpers.ServiceParametersWorkflow, whelpers.StatusFormatMixin): slug = "configure_cluster_template" name = _("Create Cluster Template") finalize_button_name = _("Create") success_message = _("Created Cluster Template %s") name_property = "general_cluster_template_name" success_url = ("horizon:project:data_processing.clusters:" "cluster-templates-tab") default_steps = (GeneralConfig, ConfigureNodegroups) def __init__(self, request, context_seed, entry_point, *args, **kwargs): ConfigureClusterTemplate._cls_registry = [] hlps = helpers.Helpers(request) plugin, hadoop_version = whelpers.\ get_plugin_and_hadoop_version(request) general_parameters = hlps.get_cluster_general_configs( plugin, hadoop_version) service_parameters = hlps.get_targeted_cluster_configs( plugin, hadoop_version) if saharaclient.base.is_service_enabled(request, 'share'): ConfigureClusterTemplate._register_step(self, SelectClusterShares) if saharaclient.base.is_service_enabled(request, 'dns'): ConfigureClusterTemplate._register_step(self, SelectDnsDomains) self._populate_tabs(general_parameters, service_parameters) super(ConfigureClusterTemplate, self).__init__(request, context_seed, entry_point, *args, **kwargs) def is_valid(self): steps_valid = True for step in self.steps: if not step.action.is_valid(): steps_valid = False step.has_errors = True errors_fields = list(step.action.errors.keys()) step.action.errors_fields = errors_fields if not steps_valid: return steps_valid return self.validate(self.context) def handle(self, request, context): try: node_groups = [] configs_dict = whelpers.parse_configs_from_context(context, self.defaults) ids = json.loads(context['ng_forms_ids']) for id in ids: name = context['ng_group_name_' + str(id)] template_id = context['ng_template_id_' + str(id)] count = context['ng_count_' + str(id)] raw_ng = context.get("ng_serialized_" + str(id)) if raw_ng and raw_ng != 'null': ng = json.loads(utils.deserialize(str(raw_ng))) else: ng = dict() ng["name"] = name ng["count"] = count if template_id and template_id != u'None': ng["node_group_template_id"] = template_id node_groups.append(ng) plugin, hadoop_version = whelpers.\ get_plugin_and_hadoop_version(request) ct_shares = [] if "ct_shares" in context: ct_shares = context["ct_shares"] domain = context.get('dns_domain_name', None) if domain == 'None': domain = None # TODO(nkonovalov): Fix client to support default_image_id saharaclient.cluster_template_create( request, context["general_cluster_template_name"], plugin, hadoop_version, context["general_description"], configs_dict, node_groups, context["anti_affinity_info"], use_autoconfig=context['general_use_autoconfig'], shares=ct_shares, is_public=context['general_is_public'], is_protected=context['general_is_protected'], domain_name=domain ) hlps = helpers.Helpers(request) if hlps.is_from_guide(): request.session["guide_cluster_template_name"] = ( context["general_cluster_template_name"]) self.success_url = ( "horizon:project:data_processing.clusters:cluster_guide") return True except api_base.APIException as e: self.error_description = str(e) return False except Exception: exceptions.handle(request, _("Cluster template creation failed")) return False ././@PaxHeader0000000000000000000000000000021500000000000011453 xustar0000000000000000119 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/workflows/edit.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/cluster_templates/workflow0000664000175000017500000001117200000000000034274 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import json from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import forms from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing.clusters. \ cluster_templates.workflows.create as create_flow import sahara_dashboard.content.data_processing.clusters. \ cluster_templates.workflows.copy as copy_flow import sahara_dashboard.content.data_processing. \ utils.workflow_helpers as whelpers from sahara_dashboard import utils class EditClusterTemplate(copy_flow.CopyClusterTemplate): success_message = _("Cluster Template %s updated") entry_point = "generalconfigaction" finalize_button_name = _("Update") name = _("Edit Cluster Template") def __init__(self, request, context_seed, entry_point, *args, **kwargs): try: super(EditClusterTemplate, self).__init__(request, context_seed, entry_point, *args, **kwargs) for step in self.steps: if isinstance(step, create_flow.GeneralConfig): fields = step.action.fields fields["cluster_template_name"].initial = ( self.template.name) fields["cluster_template_id"] = forms.CharField( widget=forms.HiddenInput(), initial=self.cluster_template_id) elif isinstance(step, create_flow.SelectDnsDomains): fields = step.action.fields fields["domain_name"].initial = self.template.domain_name except Exception: exceptions.handle(request, _("Unable to fetch template to edit.")) def handle(self, request, context): try: node_groups = [] configs_dict = whelpers.parse_configs_from_context(context, self.defaults) ids = json.loads(context['ng_forms_ids']) for id in ids: name = context['ng_group_name_' + str(id)] template_id = context['ng_template_id_' + str(id)] count = context['ng_count_' + str(id)] raw_ng = context.get("ng_serialized_" + str(id)) if raw_ng and raw_ng != 'null': ng = json.loads(utils.deserialize(str(raw_ng))) else: ng = dict() ng["name"] = name ng["count"] = count if template_id and template_id != u'None': ng["node_group_template_id"] = template_id node_groups.append(ng) plugin, hadoop_version = whelpers. \ get_plugin_and_hadoop_version(request) ct_shares = [] if "ct_shares" in context: ct_shares = context["ct_shares"] domain = context.get('dns_domain_name', None) if domain == 'None': domain = None saharaclient.cluster_template_update( request=request, ct_id=self.cluster_template_id, name=context["general_cluster_template_name"], plugin_name=plugin, hadoop_version=hadoop_version, description=context["general_description"], cluster_configs=configs_dict, node_groups=node_groups, anti_affinity=context["anti_affinity_info"], use_autoconfig=context['general_use_autoconfig'], shares=ct_shares, is_public=context['general_is_public'], is_protected=context['general_is_protected'], domain_name=domain ) return True except exceptions.Conflict as e: self.error_description = str(e) return False except Exception: exceptions.handle(request, _("Cluster template update failed")) return False ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5560715 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/0000775000175000017500000000000000000000000030602 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/__init__.py0000664000175000017500000000000000000000000032701 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/tables.py0000664000175000017500000002414100000000000032430 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.http import Http404 # noqa from django.template.loader import render_to_string from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ungettext_lazy from saharaclient.api import base as api_base from horizon import messages from horizon import tables from horizon.tables import base as tables_base from horizon.tabs import base as tabs_base from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing \ import tables as sahara_table from sahara_dashboard.content.data_processing.utils \ import acl as acl_utils from sahara_dashboard.content.data_processing.utils import helpers SAHARA_VERIFICATION_DISABLED = saharaclient.SAHARA_VERIFICATION_DISABLED class ClustersFilterAction(tables.FilterAction): filter_type = "server" filter_choices = (('name', _("Name"), True), ('status', _("Status"), True)) class ClusterGuide(tables.LinkAction): name = "cluster_guide" verbose_name = _("Cluster Creation Guide") url = "horizon:project:data_processing.clusters:cluster_guide" class CreateCluster(tables.LinkAction): name = "create" verbose_name = _("Launch Cluster") url = "horizon:project:data_processing.clusters:create-cluster" classes = ("ajax-modal",) icon = "plus" class ScaleCluster(tables.LinkAction): name = "scale" verbose_name = _("Scale Cluster") url = "horizon:project:data_processing.clusters:scale" classes = ("ajax-modal", "btn-edit") def allowed(self, request, cluster=None): return cluster.status == "Active" class DeleteCluster(tables.DeleteAction): @staticmethod def action_present(count): return ungettext_lazy( u"Delete Cluster", u"Delete Clusters", count ) @staticmethod def action_past(count): return ungettext_lazy( u"Deleted Cluster", u"Deleted Clusters", count ) def delete(self, request, obj_id): saharaclient.cluster_delete(request, obj_id) class CheckClusterAction(tables.BatchAction): name = 'check_cluster' @staticmethod def action_present(count): return ungettext_lazy( u"Start Verification", u"Start Verifications", count ) @staticmethod def action_past(count): return ungettext_lazy( u"Started Verification", u"Started Verifications", count ) def action(self, request, datum_id): saharaclient.verification_update(request, datum_id, status='START') class ForceDeleteCluster(tables.DeleteAction): name = "force_delete" @staticmethod def action_present(count): return ungettext_lazy( u"Force Delete Cluster", u"Force Delete Clusters", count ) @staticmethod def action_past(count): return ungettext_lazy( u"Force Deleted Cluster", u"Force Deleted Clusters", count ) def delete(self, request, obj_id): saharaclient.cluster_force_delete(request, obj_id) class UpdateClusterShares(tables.LinkAction): name = "update_shares" verbose_name = _("Update Shares") url = "horizon:project:data_processing.clusters:update-shares" classes = ("ajax-modal", "btn-edit") def allowed(self, request, cluster=None): return cluster.status == "Active" class UpdateRow(tables.Row): ajax = True def get_data(self, request, instance_id): try: return saharaclient.cluster_get(request, instance_id) except api_base.APIException as e: if e.error_code == 404: raise Http404 else: messages.error(request, _("Unable to update row")) def get_instances_count(cluster): return sum([len(ng["instances"]) for ng in cluster.node_groups]) class RichErrorCell(tables_base.Cell): @property def status(self): # The error cell values becomes quite complex and cannot be handled # correctly with STATUS_CHOICES. Handling that explicitly. status = self.datum.status.lower() health = get_health_status_info(self.datum).lower() # error status always terminal if status == "error": return False if health == 'checking' or health == 'unknown': return None if status == "active": return True return None def get_rich_status_info(cluster): return { "status": cluster.status, "status_description": cluster.status_description } def rich_status_filter(status_dict): if status_dict['status'].lower() not in ['error', 'active']: return render_to_string("clusters/_in_progress.html", status_dict) # Render the status "as is" if no description is provided. if status_dict["status_description"]: # Error is rendered with a template containing an error description. return render_to_string("clusters/_rich_status.html", status_dict) return status_dict["status"] class ConfigureCluster(tables.LinkAction): name = "configure" verbose_name = _("Configure Cluster") url = "horizon:project:data_processing.clusters:configure-cluster" classes = ("ajax-modal", "configure-cluster-btn") icon = "plus" attrs = {"style": "display: none"} class MakePublic(acl_utils.MakePublic): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.cluster_update_acl_rules( request, datum_id, **update_kwargs) class MakePrivate(acl_utils.MakePrivate): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.cluster_update_acl_rules( request, datum_id, **update_kwargs) class MakeProtected(acl_utils.MakeProtected): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.cluster_update_acl_rules( request, datum_id, **update_kwargs) class MakeUnProtected(acl_utils.MakeUnProtected): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.cluster_update_acl_rules( request, datum_id, **update_kwargs) def get_health_status_info(cluster): try: return cluster.verification['status'] except (AttributeError, KeyError): return 'UNKNOWN' def get_health_filter(health): if health == 'CHECKING': return render_to_string("clusters/_in_progress.html", { 'status': _("Checking")}) mapper = {'GREEN': 'success', 'YELLOW': 'warning', 'RED': 'danger', 'CHECKING': 'info'} label = mapper.get(health, 'default') return render_to_string('clusters/_health_status.html', {'status': health, 'label': label}) class ClustersTable(sahara_table.SaharaPaginateTabbedTable): tab_name = 'cluster_tabs%sclusters_tab' % tabs_base.SEPARATOR class UptimeColumn(tables.Column): def get_data(self, cluster): return helpers.Helpers(None).get_duration(cluster.created_at) name = tables.Column("name", verbose_name=_("Name"), link=("horizon:project:data_processing." "clusters:cluster-details")) plugin = tables.Column("plugin_name", verbose_name=_("Plugin")) if saharaclient.VERSIONS.active == '2': version_attr = "plugin_version" else: version_attr = "hadoop_version" version = tables.Column(version_attr, verbose_name=_("Version")) # Status field need the whole cluster object to build the rich status. status = tables.Column(get_rich_status_info, verbose_name=_("Status"), filters=(rich_status_filter,)) if not SAHARA_VERIFICATION_DISABLED: health = tables.Column(get_health_status_info, verbose_name=_("Health"), filters=(get_health_filter,)) instances_count = tables.Column(get_instances_count, verbose_name=_("Instances Count")) uptime = UptimeColumn("uptime", verbose_name=_("Uptime")) class Meta(object): name = "clusters" verbose_name = _("Clusters") row_class = UpdateRow cell_class = RichErrorCell status_columns = ["status"] if not SAHARA_VERIFICATION_DISABLED: status_columns.append("health") table_actions = (ClusterGuide, CreateCluster, ConfigureCluster, DeleteCluster, ClustersFilterAction) if saharaclient.VERSIONS.active == '2': table_actions = table_actions + (ForceDeleteCluster,) table_actions_menu = (MakePublic, MakePrivate, MakeProtected, MakeUnProtected) if SAHARA_VERIFICATION_DISABLED: row_actions = (ScaleCluster, UpdateClusterShares, DeleteCluster, MakePublic, MakePrivate, MakeProtected, MakeUnProtected) else: row_actions = (ScaleCluster, UpdateClusterShares, DeleteCluster, MakePublic, MakePrivate, MakeProtected, MakeUnProtected, CheckClusterAction) if saharaclient.VERSIONS.active == '2': row_actions = row_actions + (ForceDeleteCluster,) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/tabs.py0000664000175000017500000002255200000000000032113 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from oslo_log import log as logging from django.utils.translation import ugettext_lazy as _ from sahara_dashboard.api import sahara as saharaclient from horizon import exceptions from horizon import tables from horizon import tabs from openstack_dashboard.api import glance from openstack_dashboard.api import neutron from openstack_dashboard.api import nova from sahara_dashboard.content.data_processing.clusters.clusters \ import tables as cluster_tables from sahara_dashboard.content.data_processing \ import tabs as sahara_tabs from sahara_dashboard.content.data_processing.utils \ import workflow_helpers as helpers LOG = logging.getLogger(__name__) class ClustersTab(sahara_tabs.SaharaTableTab): table_classes = (cluster_tables.ClustersTable, ) name = _("Clusters") slug = "clusters_tab" template_name = "horizon/common/_detail_table.html" def get_clusters_data(self): try: table = self._tables['clusters'] search_opts = {} filter = self.get_server_filter_info(table.request, table) if filter['value'] and filter['field']: search_opts = {filter['field']: filter['value']} clusters = saharaclient.cluster_list(self.request, search_opts) except Exception: clusters = [] exceptions.handle(self.request, _("Unable to fetch cluster list")) return clusters class GeneralTab(tabs.Tab): name = _("General Info") slug = "cluster_details_tab" template_name = "clusters/_details.html" def get_context_data(self, request): cluster_id = self.tab_group.kwargs['cluster_id'] cluster_info = {} try: sahara = saharaclient.client(request) cluster = sahara.clusters.get(cluster_id) for info_key, info_val in cluster.info.items(): for key, val in info_val.items(): if str(val).startswith(('http://', 'https://')): cluster.info[info_key][key] = build_link(val) try: base_image = glance.image_get(request, cluster.default_image_id) except Exception: exceptions.handle( request, _("Unable to fetch base image details")) base_image = {} if getattr(cluster, 'cluster_template_id', None): cluster_template = saharaclient.safe_call( sahara.cluster_templates.get, cluster.cluster_template_id) else: cluster_template = None try: if getattr(cluster, 'neutron_management_network', None): net_id = cluster.neutron_management_network network = neutron.network_get(request, net_id) net_name = network.name_or_id else: net_name = None except Exception: exceptions.handle( request, _("Unable to fetch network details")) net_name = None cluster_info.update({"cluster": cluster, "base_image": base_image, "cluster_template": cluster_template, "network": net_name}) if saharaclient.VERSIONS.active == '2': cluster_info["cluster"].hadoop_version = ( cluster_info["cluster"].plugin_version ) except Exception as e: LOG.error("Unable to fetch cluster details: %s" % str(e)) return cluster_info class ClusterConfigsDetails(tabs.Tab): name = _("Configuration Details") slug = "cluster_configs_details_tab" template_name = ( "clusters/_cluster_configs_details.html") def get_context_data(self, request): cluster_id = self.tab_group.kwargs['cluster_id'] cluster = {} try: sahara = saharaclient.client(request) cluster = sahara.clusters.get(cluster_id) except Exception as e: LOG.error("Unable to fetch cluster details: %s" % str(e)) return {'cluster': cluster} def build_link(url): return "" + url + "" class NodeGroupsTab(tabs.Tab): name = _("Node Groups") slug = "cluster_nodegroups_tab" template_name = "clusters/_nodegroups_details.html" def get_context_data(self, request): cluster_id = self.tab_group.kwargs['cluster_id'] try: sahara = saharaclient.client(request) cluster = sahara.clusters.get(cluster_id) for ng in cluster.node_groups: if ng["flavor_id"]: ng["flavor_name"] = ( nova.flavor_get(request, ng["flavor_id"]).name) if ng["floating_ip_pool"]: ng["floating_ip_pool_name"] = ( self._get_floating_ip_pool_name( request, ng["floating_ip_pool"])) if ng.get("node_group_template_id", None): ng["node_group_template"] = saharaclient.safe_call( sahara.node_group_templates.get, ng["node_group_template_id"]) ng["security_groups_full"] = helpers.get_security_groups( request, ng["security_groups"]) except Exception: cluster = {} exceptions.handle(request, _("Unable to get node group details.")) return {"cluster": cluster} def _get_floating_ip_pool_name(self, request, pool_id): pools = [pool for pool in neutron.floating_ip_pools_list( request) if pool.id == pool_id] return pools[0].name if pools else pool_id class Instance(object): def __init__(self, name=None, id=None, internal_ip=None, management_ip=None): self.name = name self.id = id self.internal_ip = internal_ip self.management_ip = management_ip class InstancesTable(tables.DataTable): name = tables.Column("name", link="horizon:project:instances:detail", verbose_name=_("Name")) internal_ip = tables.Column("internal_ip", verbose_name=_("Internal IP")) management_ip = tables.Column("management_ip", verbose_name=_("Management IP")) class Meta(object): name = "cluster_instances" verbose_name = _("Cluster Instances") class InstancesTab(tabs.TableTab): name = _("Instances") slug = "cluster_instances_tab" template_name = "clusters/_instances_details.html" table_classes = (InstancesTable, ) def get_cluster_instances_data(self): cluster_id = self.tab_group.kwargs['cluster_id'] try: sahara = saharaclient.client(self.request) cluster = sahara.clusters.get(cluster_id) instances = [] for ng in cluster.node_groups: for instance in ng["instances"]: instances.append(Instance( name=instance["instance_name"], id=instance["instance_id"], internal_ip=instance.get("internal_ip", "Not assigned"), management_ip=instance.get("management_ip", "Not assigned"))) except Exception: instances = [] exceptions.handle(self.request, _("Unable to fetch instance details.")) return instances class EventLogTab(tabs.Tab): name = _("Cluster Events") slug = "cluster_event_log" template_name = "clusters/_event_log.html" def get_context_data(self, request, **kwargs): cluster_id = self.tab_group.kwargs['cluster_id'] kwargs["cluster_id"] = cluster_id kwargs['data_update_url'] = request.get_full_path() return kwargs class HealthChecksTab(tabs.Tab): name = _("Cluster health checks") slug = 'cluster_health_checks' template_name = "clusters/_health_checks_table.html" def get_context_data(self, request, **kwargs): cluster_id = self.tab_group.kwargs['cluster_id'] kwargs['cluster_id'] = cluster_id kwargs['data_update_url'] = request.get_full_path() return kwargs class ClusterDetailsTabs(tabs.TabGroup): slug = "cluster_details" if saharaclient.SAHARA_VERIFICATION_DISABLED: tabs = (GeneralTab, ClusterConfigsDetails, NodeGroupsTab, InstancesTab, EventLogTab) else: tabs = (GeneralTab, ClusterConfigsDetails, NodeGroupsTab, InstancesTab, EventLogTab, HealthChecksTab) sticky = True ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/tests.py0000664000175000017500000001355300000000000032325 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.urls import reverse from oslo_serialization import jsonutils from openstack_dashboard import api as os_api from sahara_dashboard import api from sahara_dashboard.test import helpers as test from sahara_dashboard.test.helpers import IsHttpRequest INDEX_URL = reverse('horizon:project:data_processing.clusters:clusters-tab') DETAILS_URL = reverse( 'horizon:project:data_processing.clusters:details', args=['id']) class DataProcessingClusterTests(test.TestCase): @test.create_mocks({api.sahara: ('cluster_template_list', 'image_list', 'cluster_list', 'nodegroup_template_list')}) def test_index(self): self.mock_cluster_list.return_value = self.clusters.list() res = self.client.get(INDEX_URL) self.mock_cluster_list.assert_called_once_with(IsHttpRequest(), {}) self.assertTemplateUsed(res, 'clusters/index.html') self.assertContains(res, 'Clusters') self.assertContains(res, 'Name') @test.create_mocks({api.sahara: ('cluster_template_list', 'image_list', 'plugin_get_version_details'), os_api.neutron: ('network_list',), os_api.nova: ('keypair_list',)}) def test_launch_cluster_get_nodata(self): self.mock_cluster_template_list.return_value = [] self.mock_image_list.return_value = [] url = reverse( 'horizon:project:data_processing.clusters:configure-cluster') res = self.client.get("%s?plugin_name=shoes&hadoop_version=1.1" % url) self.mock_cluster_template_list.assert_called_once_with( IsHttpRequest()) self.mock_image_list.assert_called_once_with(IsHttpRequest()) self.assertContains(res, "No Images Available") self.assertContains(res, "No Templates Available") @test.create_mocks({api.sahara: ('cluster_get',)}) def test_event_log_tab(self): cluster = self.clusters.list()[-1] self.mock_cluster_get.return_value = cluster url = reverse( 'horizon:project:data_processing.clusters:events', args=["cl2"]) res = self.client.get(url) data = jsonutils.loads(res.content) self.mock_cluster_get.assert_called_once_with( IsHttpRequest(), "cl2", show_progress=True) self.assertIn("provision_steps", data) self.assertEqual(data["need_update"], False) step_0 = data["provision_steps"][0] self.assertEqual(2, step_0["completed"]) self.assertEqual(2, len(step_0["events"])) for evt in step_0["events"]: self.assertEqual(True, evt["successful"]) step_1 = data["provision_steps"][1] self.assertEqual(3, step_1["completed"]) self.assertEqual(0, len(step_1["events"])) @test.create_mocks({api.sahara: ('cluster_get', )}) def test_health_checks_tab_sc1(self): cluster = self.clusters.list()[-1] self.mock_cluster_get.return_value = cluster url = reverse( 'horizon:project:data_processing.clusters:verifications', args=["cl2"]) res = self.client.get(url) data = jsonutils.loads(res.content) self.mock_cluster_get.assert_called_once_with( IsHttpRequest(), "cl2") self.assertFalse(data['need_update']) check0 = data['checks'][0] check1 = data['checks'][1] self.assertEqual('success', check0['label']) self.assertEqual('danger', check1['label']) self.assertEqual('GREEN', check0['status']) self.assertEqual('RED', check1['status']) self.assertEqual('0:07:40', check0['duration']) @test.create_mocks({api.sahara: ('cluster_get', )}) def test_health_checks_tab_sc2(self): cluster = self.clusters.list()[0] cl1_id = 'ec9a0d28-5cfb-4028-a0b5-40afe23f1533' self.mock_cluster_get.return_value = cluster url = reverse( 'horizon:project:data_processing.clusters:verifications', args=[cl1_id]) res = self.client.get(url) data = jsonutils.loads(res.content) self.mock_cluster_get.assert_called_once_with( IsHttpRequest(), cl1_id) self.assertTrue(data['need_update']) check0 = data['checks'][0] check1 = data['checks'][1] self.assertEqual('info', check0['label']) self.assertEqual('danger', check1['label']) self.assertEqual('CHECKING', check0['status']) self.assertEqual('RED', check1['status']) self.assertEqual('Houston, we have a problem', check1['description']) @test.create_mocks({api.sahara: ('cluster_list', 'cluster_delete')}) def test_delete(self): cluster = self.clusters.first() self.mock_cluster_list.return_value = self.clusters.list() self.mock_cluster_delete.return_value = None form_data = {'action': 'clusters__delete__%s' % cluster.id} res = self.client.post(INDEX_URL, form_data) self.mock_cluster_list.assert_called_once_with( IsHttpRequest(), {}) self.mock_cluster_delete.assert_called_once_with( IsHttpRequest(), cluster.id) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, INDEX_URL) self.assertMessageCount(success=1) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/views.py0000664000175000017500000002436500000000000032323 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import json from django.http import HttpResponse from django.urls import reverse from django.utils.translation import ugettext as _ from django.views.generic import base as django_base from oslo_utils import timeutils from saharaclient.api.base import APIException from horizon import exceptions from horizon import tabs from horizon.utils import memoized from horizon import workflows from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing.clusters.clusters. \ tables as c_tables import sahara_dashboard.content.data_processing.clusters.clusters. \ tabs as _tabs import sahara_dashboard.content.data_processing.clusters.clusters. \ workflows.create as create_flow import sahara_dashboard.content.data_processing.clusters.clusters. \ workflows.scale as scale_flow import sahara_dashboard.content.data_processing.clusters.clusters. \ workflows.update as update_flow import sahara_dashboard.content.data_processing.utils.helpers as helpers class ClusterDetailsView(tabs.TabView): tab_group_class = _tabs.ClusterDetailsTabs template_name = 'horizon/common/_detail.html' page_title = "{{ cluster.name|default:cluster.id }}" @memoized.memoized_method def get_object(self): cl_id = self.kwargs["cluster_id"] try: return saharaclient.cluster_get(self.request, cl_id) except Exception: msg = _('Unable to retrieve details for cluster "%s".') % cl_id redirect = self.get_redirect_url() exceptions.handle(self.request, msg, redirect=redirect) def get_context_data(self, **kwargs): context = super(ClusterDetailsView, self).get_context_data(**kwargs) cluster = self.get_object() context['cluster'] = cluster context['url'] = self.get_redirect_url() context['actions'] = self._get_actions(cluster) return context def _get_actions(self, cluster): table = c_tables.ClustersTable(self.request) return table.render_row_actions(cluster) @staticmethod def get_redirect_url(): return reverse("horizon:project:data_processing.clusters:index") class ClusterEventsView(django_base.View): @staticmethod def _created_at_key(obj): return timeutils.parse_isotime(obj["created_at"]) def get(self, request, *args, **kwargs): cluster_id = kwargs.get("cluster_id") time_helpers = helpers.Helpers(request) try: cluster = saharaclient.cluster_get(request, cluster_id, show_progress=True) node_group_mapping = {} for node_group in cluster.node_groups: node_group_mapping[node_group["id"]] = node_group["name"] provision_steps = cluster.provision_progress # Sort by create time provision_steps = sorted(provision_steps, key=ClusterEventsView._created_at_key, reverse=True) for step in provision_steps: # Sort events of the steps also step["events"] = sorted(step["events"], key=ClusterEventsView._created_at_key, reverse=True) successful_events_count = 0 for event in step["events"]: if event["node_group_id"]: event["node_group_name"] = node_group_mapping[ event["node_group_id"]] event_result = _("Unknown") if event["successful"] is True: successful_events_count += 1 event_result = _("Completed Successfully") elif event["successful"] is False: event_result = _("Failed") event["result"] = event_result if not event["event_info"]: event["event_info"] = _("No info available") step["duration"] = time_helpers.get_duration( step["created_at"], step["updated_at"]) step['started_at'] = time_helpers.to_time_zone( step["created_at"], localize=True) result = _("In progress") step["completed"] = successful_events_count if step["successful"] is True: step["completed"] = step["total"] result = _("Completed Successfully") elif step["successful"] is False: result = _("Failed") step["result"] = result status = cluster.status.lower() need_update = status not in ("active", "error") except APIException: # Cluster is not available. Returning empty event log. need_update = False provision_steps = [] context = {"provision_steps": provision_steps, "need_update": need_update} return HttpResponse(json.dumps(context), content_type='application/json') class ClusterHealthChecksView(django_base.View): _date_format = "%Y-%m-%dT%H:%M:%S" _status_in_progress = 'CHECKING' def _get_checks(self, cluster): try: return cluster.verification['checks'] except (AttributeError, KeyError): return [] def get(self, request, *args, **kwargs): time_helpers = helpers.Helpers(request) cluster_id = kwargs.get("cluster_id") need_update, not_done_count, checks = False, 0, [] mapping_to_label_type = {'red': 'danger', 'yellow': 'warning', 'green': 'success', 'checking': 'info'} try: cluster = saharaclient.cluster_get(request, cluster_id) for check in self._get_checks(cluster): check['label'] = mapping_to_label_type.get( check['status'].lower()) if not check['description']: check['description'] = _("No description") if check['status'] == self._status_in_progress: not_done_count += 1 check['duration'] = time_helpers.get_duration( check['created_at'], check['updated_at']) checks.append(check) except APIException: need_update = False checks = [] if not_done_count > 0: need_update = True context = {"checks": checks, "need_update": need_update} return HttpResponse(json.dumps(context), content_type='application/json') class CreateClusterView(workflows.WorkflowView): workflow_class = create_flow.CreateCluster success_url = \ "horizon:project:data_processing.clusters:create-cluster" classes = ("ajax-modal",) template_name = "clusters/create.html" page_title = _("Launch Cluster") class ConfigureClusterView(workflows.WorkflowView): workflow_class = create_flow.ConfigureCluster success_url = "horizon:project:data_processing.clusters:index" template_name = "clusters/configure.html" page_title = _("Configure Cluster") def get_initial(self): initial = super(ConfigureClusterView, self).get_initial() initial.update(self.kwargs) return initial class ScaleClusterView(workflows.WorkflowView): workflow_class = scale_flow.ScaleCluster success_url = "horizon:project:data_processing.clusters:index" classes = ("ajax-modal",) template_name = "clusters/scale.html" page_title = _("Scale Cluster") def get_context_data(self, **kwargs): context = super(ScaleClusterView, self)\ .get_context_data(**kwargs) context["cluster_id"] = kwargs["cluster_id"] return context def get_object(self, *args, **kwargs): if not hasattr(self, "_object"): template_id = self.kwargs['cluster_id'] try: template = saharaclient.cluster_template_get(self.request, template_id) except Exception: template = None exceptions.handle(self.request, _("Unable to fetch cluster template.")) self._object = template return self._object def get_initial(self): initial = super(ScaleClusterView, self).get_initial() initial.update({'cluster_id': self.kwargs['cluster_id']}) return initial class UpdateClusterSharesView(workflows.WorkflowView): workflow_class = update_flow.UpdateShares success_url = "horizon:project:data_processing.clusters" classes = ("ajax-modal",) template_name = "clusters/update.html" page_title = _("Update Cluster Shares") def get_context_data(self, **kwargs): context = super(UpdateClusterSharesView, self)\ .get_context_data(**kwargs) context["cluster_id"] = kwargs["cluster_id"] return context def get_object(self, *args, **kwargs): if not hasattr(self, "_object"): cluster_id = self.kwargs['cluster_id'] try: cluster = saharaclient.cluster_get(self.request, cluster_id) except Exception: cluster = None exceptions.handle(self.request, _("Unable to fetch cluster.")) self._object = cluster return self._object def get_initial(self): initial = super(UpdateClusterSharesView, self).get_initial() initial.update({ 'cluster_id': self.kwargs['cluster_id'], 'cluster': self.get_object()}) return initial ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5600717 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/workflows/0000775000175000017500000000000000000000000032637 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021000000000000011446 xustar0000000000000000114 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/workflows/__init__.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/workflows/__init_0000664000175000017500000000000000000000000034150 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020600000000000011453 xustar0000000000000000112 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/workflows/create.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/workflows/create.0000664000175000017500000002177000000000000034112 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from horizon import exceptions from horizon import forms from horizon import workflows from django.utils.translation import ugettext_lazy as _ from saharaclient.api import base as api_base from openstack_dashboard.api import nova from sahara_dashboard.content.data_processing.utils \ import acl as acl_utils from sahara_dashboard.content.data_processing.utils import neutron_support import sahara_dashboard.content.data_processing.utils. \ workflow_helpers as whelpers from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing.clusters. \ cluster_templates.workflows.create as t_flows KEYPAIR_IMPORT_URL = "horizon:project:key_pairs:import" BASE_IMAGE_URL = "horizon:project:data_processing.clusters:register" TEMPLATE_UPLOAD_URL = ( "horizon:project:data_processing.clusters:upload_file") class SelectPluginAction(t_flows.SelectPluginAction): class Meta(object): name = _("Select plugin and hadoop version for cluster") help_text_template = "clusters/_create_general_help.html" class SelectPlugin(t_flows.SelectPlugin): action_class = SelectPluginAction class CreateCluster(t_flows.CreateClusterTemplate): slug = "create_cluster" name = _("Launch Cluster") success_url = "horizon:project:data_processing.clusters:clusters-tab" default_steps = (SelectPlugin,) class GeneralConfigAction(workflows.Action): populate_neutron_management_network_choices = \ neutron_support.populate_neutron_management_network_choices hidden_configure_field = forms.CharField( required=False, widget=forms.HiddenInput(attrs={"class": "hidden_configure_field"})) hidden_to_delete_field = forms.CharField( required=False, widget=forms.HiddenInput(attrs={"class": "hidden_to_delete_field"})) cluster_name = forms.CharField(label=_("Cluster Name")) description = forms.CharField(label=_("Description"), required=False, widget=forms.Textarea(attrs={'rows': 4})) cluster_template = forms.DynamicChoiceField( label=_("Cluster Template"), initial=(None, "None"), add_item_link=TEMPLATE_UPLOAD_URL) cluster_count = forms.IntegerField(min_value=1, label=_("Cluster Count"), initial=1, help_text=( _("Number of clusters to launch."))) image = forms.DynamicChoiceField(label=_("Base Image"), add_item_link=BASE_IMAGE_URL) keypair = forms.DynamicChoiceField( label=_("Keypair"), required=False, help_text=_("Which keypair to use for authentication."), add_item_link=KEYPAIR_IMPORT_URL) def __init__(self, request, *args, **kwargs): super(GeneralConfigAction, self).__init__(request, *args, **kwargs) plugin, hadoop_version = whelpers.\ get_plugin_and_hadoop_version(request) if saharaclient.base.is_service_enabled(request, 'network'): self.fields["neutron_management_network"] = forms.ChoiceField( label=_("Neutron Management Network"), choices=self.populate_neutron_management_network_choices( request, {}) ) self.fields['is_public'] = acl_utils.get_is_public_form( _("cluster")) self.fields['is_protected'] = acl_utils.get_is_protected_form( _("cluster")) self.fields["plugin_name"] = forms.CharField( widget=forms.HiddenInput(), initial=plugin ) self.fields["hadoop_version"] = forms.CharField( widget=forms.HiddenInput(), initial=hadoop_version ) def populate_image_choices(self, request, context): return whelpers.populate_image_choices(self, request, context) def populate_keypair_choices(self, request, context): try: keypairs = nova.keypair_list(request) except Exception: keypairs = [] exceptions.handle(request, _("Unable to fetch keypair choices.")) keypair_list = [(kp.name, kp.name) for kp in keypairs] keypair_list.insert(0, ("", _("No keypair"))) return keypair_list def populate_cluster_template_choices(self, request, context): templates = saharaclient.cluster_template_list(request) plugin, hadoop_version = whelpers.\ get_plugin_and_hadoop_version(request) choices = [] for template in templates: version = ( getattr(template, "hadoop_version", None) or template.plugin_version ) if version == hadoop_version and template.plugin_name == plugin: choices.append((template.id, template.name)) if not choices: choices.append(("", _("No Templates Available"))) # cluster_template_id comes from cluster templates table, when # Create Cluster from template is clicked there selected_template_name = None req = request.GET or request.POST if req.get("cluster_template_name"): selected_template_name = ( req.get("cluster_template_name")) if selected_template_name: for template in templates: if template.name == selected_template_name: selected_template_id = template.id break else: selected_template_id = ( req.get("cluster_template_id", None)) for template in templates: if template.id == selected_template_id: self.fields['cluster_template'].initial = template.id return choices def get_help_text(self): extra = dict() plugin, hadoop_version = whelpers.\ get_plugin_and_hadoop_version(self.request) extra["plugin_name"] = plugin extra["hadoop_version"] = hadoop_version return super(GeneralConfigAction, self).get_help_text(extra) def clean(self): cleaned_data = super(GeneralConfigAction, self).clean() if cleaned_data.get("hidden_configure_field", None) \ == "create_nodegroup": self._errors = dict() return cleaned_data class Meta(object): name = _("Configure Cluster") help_text_template = "clusters/_configure_general_help.html" class GeneralConfig(workflows.Step): action_class = GeneralConfigAction contributes = ("hidden_configure_field", ) def contribute(self, data, context): for k, v in data.items(): context["general_" + k] = v return context class ConfigureCluster(whelpers.StatusFormatMixin, workflows.Workflow): slug = "configure_cluster" name = _("Launch Cluster") finalize_button_name = _("Launch") success_message = _("Launched Cluster %s") name_property = "general_cluster_name" success_url = "horizon:project:data_processing.clusters:clusters-tab" default_steps = (GeneralConfig, ) def handle(self, request, context): try: # TODO(nkonovalov) Implement AJAX Node Groups. node_groups = None plugin, hadoop_version = whelpers.\ get_plugin_and_hadoop_version(request) cluster_template_id = context["general_cluster_template"] or None user_keypair = context["general_keypair"] or None image_id = context["general_image"] or None saharaclient.cluster_create( request, context["general_cluster_name"], plugin, hadoop_version, cluster_template_id=cluster_template_id, default_image_id=image_id, description=context["general_description"], node_groups=node_groups, user_keypair_id=user_keypair, count=context['general_cluster_count'], net_id=context.get("general_neutron_management_network", None), is_public=context['general_is_public'], is_protected=context['general_is_protected'] ) return True except api_base.APIException as e: self.error_description = str(e) return False except Exception: exceptions.handle(request, _('Unable to create the cluster')) return False ././@PaxHeader0000000000000000000000000000020500000000000011452 xustar0000000000000000111 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/workflows/scale.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/workflows/scale.p0000664000175000017500000001527000000000000034114 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import json from django.utils.translation import ugettext_lazy as _ from saharaclient.api import base as api_base from horizon import exceptions from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing.clusters. \ cluster_templates.workflows.create as clt_create_flow import sahara_dashboard.content.data_processing.clusters. \ clusters.workflows.create as cl_create_flow from sahara_dashboard.content.data_processing.utils import workflow_helpers from sahara_dashboard import utils class NodeGroupsStep(clt_create_flow.ConfigureNodegroups): pass class ScaleCluster(cl_create_flow.ConfigureCluster, workflow_helpers.StatusFormatMixin): slug = "scale_cluster" name = _("Scale Cluster") finalize_button_name = _("Scale") success_url = "horizon:project:data_processing.clusters:index" default_steps = (NodeGroupsStep, ) def __init__(self, request, context_seed, entry_point, *args, **kwargs): ScaleCluster._cls_registry = [] self.success_message = _("Scaled cluster successfully started.") cluster_id = context_seed["cluster_id"] try: cluster = saharaclient.cluster_get(request, cluster_id) plugin = cluster.plugin_name if saharaclient.VERSIONS.active == '2': version_attr = 'plugin_version' else: version_attr = 'hadoop_version' hadoop_version = getattr(cluster, version_attr) # Initialize deletable node groups. deletable = dict() for group in cluster.node_groups: deletable[group["name"]] = "false" request.GET = request.GET.copy() request.GET.update({ "cluster_id": cluster_id, "plugin_name": plugin, version_attr: hadoop_version, "deletable": deletable }) super(ScaleCluster, self).__init__(request, context_seed, entry_point, *args, **kwargs) # Initialize node groups. for step in self.steps: if not isinstance(step, clt_create_flow.ConfigureNodegroups): continue ng_action = step.action template_ngs = cluster.node_groups if 'forms_ids' in request.POST: continue ng_action.groups = [] for i, templ_ng in enumerate(template_ngs): group_name = "group_name_%d" % i template_id = "template_id_%d" % i count = "count_%d" % i serialized = "serialized_%d" % i serialized_val = utils.serialize(json.dumps( workflow_helpers.clean_node_group(templ_ng))) ng_action.groups.append({ "name": templ_ng["name"], "template_id": templ_ng["node_group_template_id"], "count": templ_ng["count"], "id": i, "deletable": "false", "serialized": serialized_val }) workflow_helpers.build_node_group_fields(ng_action, group_name, template_id, count, serialized) except Exception: exceptions.handle(request, _("Unable to fetch cluster to scale")) def format_status_message(self, message): # Scaling form requires special handling because it has no Cluster name # in it's context error_description = getattr(self, 'error_description', None) if error_description: return error_description else: return self.success_message def handle(self, request, context): cluster_id = request.GET["cluster_id"] try: cluster = saharaclient.cluster_get(request, cluster_id) existing_node_groups = set([]) for ng in cluster.node_groups: existing_node_groups.add(ng["name"]) scale_object = dict() ids = json.loads(context["ng_forms_ids"]) for _id in ids: name = context["ng_group_name_%s" % _id] template_id = context["ng_template_id_%s" % _id] count = context["ng_count_%s" % _id] if name not in existing_node_groups: if "add_node_groups" not in scale_object: scale_object["add_node_groups"] = [] scale_object["add_node_groups"].append( {"name": name, "node_group_template_id": template_id, "count": int(count)}) else: old_count = None for ng in cluster.node_groups: if name == ng["name"]: old_count = ng["count"] break if old_count != count: if "resize_node_groups" not in scale_object: scale_object["resize_node_groups"] = [] scale_object["resize_node_groups"].append( {"name": name, "count": int(count)} ) except Exception: scale_object = {} exceptions.handle(request, _("Unable to fetch cluster to scale.")) try: saharaclient.cluster_scale(request, cluster_id, scale_object) return True except api_base.APIException as e: self.error_description = str(e) return False except Exception: exceptions.handle(request, _("Scale cluster operation failed")) return False ././@PaxHeader0000000000000000000000000000020600000000000011453 xustar0000000000000000112 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/workflows/update.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/clusters/workflows/update.0000664000175000017500000001134100000000000034122 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ from saharaclient.api import base as api_base from horizon import exceptions from horizon import forms from horizon import workflows from sahara_dashboard.api import manila as manilaclient from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing. \ utils.workflow_helpers as whelpers class SelectSharesAction(workflows.Action): def __init__(self, request, *args, **kwargs): super(SelectSharesAction, self).__init__( request, *args, **kwargs) possible_shares = self.get_possible_shares(request) cluster_id = [x["cluster_id"] for x in args if "cluster_id" in x][0] self.fields["cluster_id"] = forms.CharField( widget=forms.HiddenInput(), initial=cluster_id) self.fields["shares"] = whelpers.MultipleShareChoiceField( label=_("Select Shares"), widget=whelpers.ShareWidget(choices=possible_shares), required=False, choices=possible_shares, ) cluster = [x["cluster"] for x in args if "cluster" in x][0] self.fields["shares"].initial = ( self._get_share_defaults(cluster.shares, self.fields["shares"])) def _get_share_defaults(self, cluster_shares, share_field): values = dict() choices = share_field.choices for i, choice in enumerate(choices): share_id = choice[0] s = [s for s in cluster_shares if s['id'] == share_id] if len(s) > 0: path = s[0]["path"] if "path" in s[0] else "" values["share_id_{0}".format(i)] = { "id": s[0]["id"], "path": path, "access_level": s[0]["access_level"] } else: values["share_id_{0}".format(i)] = { "id": None, "path": None, "access_level": None } return values def get_possible_shares(self, request): try: shares = manilaclient.share_list(request) choices = [(s.id, s.name) for s in shares] except Exception: exceptions.handle(request, _("Failed to get list of shares")) choices = [] return choices def clean(self): cleaned_data = super(SelectSharesAction, self).clean() self._errors = dict() return cleaned_data class Meta(object): name = _("Shares") help_text = _("Select the manila shares for this cluster") class SelectShares(workflows.Step): action_class = SelectSharesAction depends_on = ("cluster_id", "cluster") def contribute(self, data, context): post = self.workflow.request.POST shares_details = [] for index in range(0, len(self.action.fields['shares'].choices) * 3): if index % 3 == 0: share = post.get("shares_{0}".format(index)) if share: path = post.get("shares_{0}".format(index + 1)) permissions = post.get("shares_{0}".format(index + 2)) shares_details.append({ "id": share, "path": path, "access_level": permissions }) context['cluster_shares'] = shares_details return context class UpdateShares(workflows.Workflow): slug = "update_cluster_shares" name = _("Update Cluster Shares") success_message = _("Updated") failure_message = _("Could not update cluster shares") success_url = "horizon:project:data_processing.clusters:index" default_steps = (SelectShares,) def handle(self, request, context): try: saharaclient.cluster_update_shares( request, context["cluster_id"], context["cluster_shares"]) return True except api_base.APIException as e: self.error_description = str(e) return False except Exception: exceptions.handle(request, _("Cluster share update failed.")) return False ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5600717 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/image_registry/0000775000175000017500000000000000000000000031750 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/image_registry/__init__.py0000664000175000017500000000000000000000000034047 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/image_registry/forms.py0000664000175000017500000001034000000000000033446 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import json from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import forms from horizon import messages from openstack_dashboard.api import glance from sahara_dashboard.api import sahara as saharaclient class ImageForm(forms.SelfHandlingForm): image_id = forms.CharField(widget=forms.HiddenInput()) tags_list = forms.CharField(widget=forms.HiddenInput()) user_name = forms.CharField(max_length=80, label=_("User Name")) description = forms.CharField(max_length=80, label=_("Description"), required=False, widget=forms.Textarea(attrs={'rows': 4})) def handle(self, request, data): try: image_id = data['image_id'] user_name = data['user_name'] desc = data['description'] saharaclient.image_update(request, image_id, user_name, desc) image_tags = json.loads(data["tags_list"]) saharaclient.image_tags_update(request, image_id, image_tags) updated_image = saharaclient.image_get(request, image_id) messages.success(request, _("Successfully updated image.")) return updated_image except Exception: exceptions.handle(request, _("Failed to update image.")) return False class EditTagsForm(ImageForm): image_id = forms.CharField(widget=forms.HiddenInput()) class RegisterImageForm(ImageForm): image_id = forms.ChoiceField(label=_("Image")) def __init__(self, request, *args, **kwargs): super(RegisterImageForm, self).__init__(request, *args, **kwargs) self._populate_image_id_choices() def _populate_image_id_choices(self): images = self._get_available_images(self.request) choices = [(image.id, image.name) for image in images if image.to_dict()['properties'].get( "image_type") != "snapshot"] if choices: choices.insert(0, ("", _("Select Image"))) else: choices.insert(0, ("", _("No images available."))) self.fields['image_id'].choices = choices def _get_images(self, request, filter): try: images, _more, _prev = ( glance.image_list_detailed(request, filters=filter)) except Exception: images = [] exceptions.handle(request, _("Unable to retrieve images with filter %s.") % filter) return images def _get_public_images(self, request): filter = {"is_public": True, "status": "active"} return self._get_images(request, filter) def _get_tenant_images(self, request): filter = {"owner": request.user.tenant_id, "status": "active"} return self._get_images(request, filter) def _get_available_images(self, request): images = self._get_tenant_images(request) if request.user.is_superuser: images += self._get_public_images(request) final_images = [] try: image_ids = set(img.id for img in saharaclient.image_list(request)) except Exception: image_ids = set() exceptions.handle(request, _("Unable to fetch available images.")) for image in images: if (image not in final_images and image.id not in image_ids and image.container_format not in ('aki', 'ari')): final_images.append(image) return final_images ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/image_registry/tables.py0000664000175000017500000000465400000000000033605 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django import template from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ungettext_lazy from horizon import tables from sahara_dashboard.api import sahara as saharaclient class EditTagsAction(tables.LinkAction): name = "edit_tags" verbose_name = _("Edit Tags") url = "horizon:project:data_processing.clusters:edit_tags" classes = ("ajax-modal",) def tags_to_string(image): template_name = 'image_registry/_list_tags.html' context = {"image": image} return template.loader.render_to_string(template_name, context) class RegisterImage(tables.LinkAction): name = "register" verbose_name = _("Register Image") url = "horizon:project:data_processing.clusters:register" classes = ("ajax-modal",) icon = "plus" class UnregisterImages(tables.DeleteAction): name = "unregister" @staticmethod def action_present(count): return ungettext_lazy( u"Unregister Image", u"Unregister Images", count ) @staticmethod def action_past(count): return ungettext_lazy( u"Unregistered Image", u"Unregistered Images", count ) def delete(self, request, obj_id): saharaclient.image_unregister(request, obj_id) class ImageRegistryTable(tables.DataTable): name = tables.Column("name", verbose_name=_("Image"), link=("horizon:project:" "images:images:detail")) tags = tables.Column(tags_to_string, verbose_name=_("Tags")) user = tables.Column("username", verbose_name=_("User")) class Meta(object): name = "image_registry" verbose_name = _("Image Registry") table_actions = (RegisterImage, UnregisterImages,) row_actions = (EditTagsAction, UnregisterImages,) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/image_registry/tabs.py0000664000175000017500000000247600000000000033264 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import tabs from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.clusters.image_registry \ import tables as image_registry_tables class ImageRegistryTab(tabs.TableTab): table_classes = (image_registry_tables.ImageRegistryTable, ) name = _("Image Registry") slug = "image_registry_tab" template_name = "horizon/common/_detail_table.html" def get_image_registry_data(self): try: images = saharaclient.image_list(self.request) except Exception: images = [] msg = _('Unable to retrieve image list') exceptions.handle(self.request, msg) return images ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/image_registry/tests.py0000664000175000017500000001212500000000000033465 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.urls import reverse from openstack_dashboard import api as dash_api from sahara_dashboard import api from sahara_dashboard.test import helpers as test from sahara_dashboard.test.helpers import IsHttpRequest INDEX_URL = reverse( 'horizon:project:data_processing.clusters:image-registry-tab') REGISTER_URL = reverse( 'horizon:project:data_processing.clusters:register') SUCCESS_URL = reverse( 'horizon:project:data_processing.clusters:index') class DataProcessingImageRegistryTests(test.TestCase): @test.create_mocks({api.sahara: ('cluster_template_list', 'image_list', 'cluster_list', 'nodegroup_template_list')}) def test_index(self): self.mock_image_list.return_value = self.images.list() res = self.client.get(INDEX_URL) self.mock_image_list.assert_called_once_with( IsHttpRequest()) self.assertTemplateUsed(res, 'clusters/index.html') self.assertContains(res, 'Image Registry') self.assertContains(res, 'Image') self.assertContains(res, 'Tags') @test.create_mocks({api.sahara: ('image_get', 'image_update', 'image_tags_update', 'image_list'), dash_api.glance: ('image_list_detailed',)}) def test_register(self): image = self.images.first() image_id = image.id test_username = 'myusername' test_description = 'mydescription' self.mock_image_get.return_value = image self.mock_image_list_detailed.return_value = ( self.images.list(), False, False) self.mock_image_update.return_value = True self.mock_image_tags_update.return_value = True self.mock_image_list.return_value = [] res = self.client.post( REGISTER_URL, {'image_id': image_id, 'user_name': test_username, 'description': test_description, 'tags_list': '{}'}) self.mock_image_list_detailed.assert_called_once_with( IsHttpRequest(), filters={'owner': self.user.id, 'status': 'active'}) self.mock_image_update.assert_called_once_with( IsHttpRequest(), image_id, test_username, test_description) self.mock_image_tags_update.assert_called_once_with( IsHttpRequest(), image_id, {}) self.mock_image_list.assert_called_once_with( IsHttpRequest()) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, SUCCESS_URL) self.assertMessageCount(success=1) @test.create_mocks({api.sahara: ('image_list', 'image_unregister')}) def test_unregister(self): image = self.images.first() self.mock_image_list.return_value = self.images.list() self.mock_image_unregister.return_value = None form_data = {'action': 'image_registry__unregister__%s' % image.id} res = self.client.post(INDEX_URL, form_data) self.mock_image_list.assert_called_once_with( IsHttpRequest()) self.mock_image_unregister.assert_called_once_with( IsHttpRequest(), image.id) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, INDEX_URL) self.assertMessageCount(success=1) @test.create_mocks({api.sahara: ('image_get', 'image_update', 'image_tags_update')}) def test_edit_tags(self): image = self.registered_images.first() self.mock_image_get.return_value = image self.mock_image_update.return_value = True self.mock_image_tags_update.return_value = True edit_tags_url = reverse( 'horizon:project:data_processing.clusters:edit_tags', args=[image.id]) res = self.client.post( edit_tags_url, {'image_id': image.id, 'user_name': image.username, 'description': image.description, 'tags_list': '{"0": "mytag"}'}) self.mock_image_update.assert_called_once_with( IsHttpRequest(), image.id, image.username, image.description) self.mock_image_tags_update.assert_called_once_with( IsHttpRequest(), image.id, {"0": "mytag"}) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, SUCCESS_URL) self.assertMessageCount(success=1) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/image_registry/views.py0000664000175000017500000000756100000000000033470 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from collections import OrderedDict import json from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import forms from horizon.utils import memoized from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content. \ data_processing.clusters.image_registry.forms import EditTagsForm from sahara_dashboard.content. \ data_processing.clusters.image_registry.forms import RegisterImageForm from sahara_dashboard import utils def update_context_with_plugin_tags(request, context): try: plugins = saharaclient.plugin_list(request) except Exception: plugins = [] msg = _("Unable to process plugin tags") exceptions.handle(request, msg) plugins_object = dict() for plugin in plugins: plugins_object[plugin.name] = OrderedDict() for version in sorted(plugin.versions, reverse=True, key=utils.smart_sort_helper): try: details = saharaclient. \ plugin_get_version_details(request, plugin.name, version) plugins_object[plugin.name][version] = ( details.required_image_tags) except Exception: msg = _("Unable to process plugin tags") exceptions.handle(request, msg) context["plugins"] = plugins_object class EditTagsView(forms.ModalFormView): form_class = EditTagsForm template_name = 'image_registry/edit_tags.html' success_url = reverse_lazy( 'horizon:project:data_processing.clusters:index') page_title = _("Edit Image Tags") def get_context_data(self, **kwargs): context = super(EditTagsView, self).get_context_data(**kwargs) context['image'] = self.get_object() update_context_with_plugin_tags(self.request, context) return context @memoized.memoized_method def get_object(self): try: image = saharaclient.image_get(self.request, self.kwargs["image_id"]) except Exception: image = None msg = _("Unable to fetch the image details") exceptions.handle(self.request, msg) return image def get_initial(self): image = self.get_object() return {"image_id": image.id, "tags_list": json.dumps(image.tags), "user_name": image.username, "description": image.description} class RegisterImageView(forms.ModalFormView): form_class = RegisterImageForm template_name = 'image_registry/register_image.html' success_url = reverse_lazy( 'horizon:project:data_processing.clusters:index') page_title = _("Register Image") def get_context_data(self, **kwargs): context = super(RegisterImageView, self).get_context_data(**kwargs) context['action_url'] = ('horizon:project' ':data_processing.clusters:register') update_context_with_plugin_tags(self.request, context) return context def get_initial(self): # need this initialization to allow registration # of images without tags return {"tags_list": json.dumps([])} ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5600717 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/0000775000175000017500000000000000000000000033016 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021100000000000011447 xustar0000000000000000115 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/__init__.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/__init0000664000175000017500000000000000000000000034170 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5600717 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/forms/0000775000175000017500000000000000000000000034144 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021700000000000011455 xustar0000000000000000121 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/forms/__init__.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/forms/0000664000175000017500000000000000000000000034134 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022300000000000011452 xustar0000000000000000125 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/forms/import_forms.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/forms/0000664000175000017500000001456300000000000034157 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import forms from openstack_dashboard.api import neutron from openstack_dashboard.dashboards.project.instances \ import utils as nova_utils from oslo_serialization import jsonutils as json from saharaclient.api import base as api_base from sahara_dashboard.api import sahara as saharaclient BASE_IMAGE_URL = "horizon:project:data_processing.clusters:register" class ImportNodegroupTemplateFileForm(forms.SelfHandlingForm): class Meta(object): name = _("Import Node Group Template") def __init__(self, *args, **kwargs): self.next_view = kwargs.pop('next_view') super(ImportNodegroupTemplateFileForm, self).__init__( *args, **kwargs) template_upload = forms.FileField( label=_('Template File'), required=True) def handle(self, request, data): kwargs = {'template_upload': data['template_upload']} request.method = 'GET' return self.next_view.as_view()(request, **kwargs) class ImportNodegroupTemplateDetailsForm(forms.SelfHandlingForm): class Meta(object): name = _("Import Node Group Template") template = forms.CharField( widget=forms.widgets.HiddenInput) name = forms.CharField(label=_("Name"), required=False, help_text=_("Name must be provided " "either here or in the template. If " "provided in both places, this one " "will be used.")) security_groups = forms.MultipleChoiceField( label=_("Security Groups"), widget=forms.CheckboxSelectMultiple(), help_text=_("Launch instances in these security groups. " "Auto security group will be determined by the " "value present in the imported template."), required=False) floating_ip_pool = forms.ChoiceField( label=_("Floating IP Pool"), required=False) flavor = forms.ChoiceField(label=_("OpenStack Flavor")) image_id = forms.DynamicChoiceField(label=_("Base Image"), add_item_link=BASE_IMAGE_URL) def _populate_image_choices(self, request, plugin, hadoop_version): all_images = saharaclient.image_list(request) details = saharaclient.plugin_get_version_details(request, plugin, hadoop_version) return [(image.id, image.name) for image in all_images if (set(details.required_image_tags). issubset(set(image.tags)))] def __init__(self, *args, **kwargs): try: request = args[0] template_string = "" if "template_upload" in kwargs: template_upload = kwargs.pop('template_upload') super(ImportNodegroupTemplateDetailsForm, self).__init__( *args, **kwargs) template_string = template_upload.read() self.fields["template"].initial = template_string else: super(ImportNodegroupTemplateDetailsForm, self).__init__( *args, **kwargs) template_string = self.data["template"] template_json = json.loads(template_string) template_json = template_json["node_group_template"] security_group_list = neutron.security_group_list(request) security_group_choices = \ [(sg.id, sg.name) for sg in security_group_list] self.fields["security_groups"].choices = security_group_choices pools = neutron.floating_ip_pools_list(request) pool_choices = [(pool.id, pool.name) for pool in pools] pool_choices.insert(0, (None, "Do not assign floating IPs")) self.fields["floating_ip_pool"].choices = pool_choices flavors = nova_utils.flavor_list(request) if flavors: self.fields["flavor"].choices = nova_utils.sort_flavor_list( request, flavors) else: self.fields["flavor"].choices = [] version = (template_json.get("hadoop_version", None) or template_json["plugin_version"]) self.fields["image_id"].choices = \ self._populate_image_choices(request, template_json["plugin_name"], version) except (ValueError, KeyError): raise exceptions.BadRequest(_("Could not parse template")) except Exception: exceptions.handle(request) def handle(self, request, data): try: template = data["template"] template = json.loads(template) template = template["node_group_template"] if not data["name"] and "name" not in template.keys(): return False if data["name"]: template["name"] = data["name"] template["security_groups"] = data["security_groups"] template["floating_ip_pool"] = data["floating_ip_pool"] template["flavor_id"] = data["flavor"] template["image_id"] = data["image_id"] saharaclient.nodegroup_template_create(request, **template) return True except api_base.APIException as e: self.error_description = str(e) return False except Exception as e: if isinstance(e, TypeError): raise exceptions.BadRequest( _("Template JSON contained invalid key")) else: raise exceptions.BadRequest(_("Could not parse template")) ././@PaxHeader0000000000000000000000000000020700000000000011454 xustar0000000000000000113 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/tables.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/tables0000664000175000017500000001406400000000000034220 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django import http from django.template import defaultfilters as filters from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ungettext_lazy from horizon import tables from horizon.tabs import base as tabs_base from oslo_serialization import jsonutils as json from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing \ import tables as sahara_table from sahara_dashboard.content.data_processing.utils \ import acl as acl_utils class NodeGroupTemplatesFilterAction(tables.FilterAction): filter_type = "server" filter_choices = (('name', _("Name"), True), ('plugin_name', _("Plugin"), True), ('hadoop_version', _("Version"), True)) class CreateNodegroupTemplate(tables.LinkAction): name = "create" verbose_name = _("Create Template") url = ("horizon:project:data_processing.clusters:" "create-nodegroup-template") classes = ("ajax-modal", "create-nodegrouptemplate-btn") icon = "plus" class ImportNodegroupTemplate(tables.LinkAction): name = "import" verbose_name = _("Import Template") url = ("horizon:project:data_processing.clusters:" "import-nodegroup-template-file") classes = ("ajax-modal",) icon = "plus" class ConfigureNodegroupTemplate(tables.LinkAction): name = "configure" verbose_name = _("Configure Template") url = ("horizon:project:data_processing.clusters:" "configure-nodegroup-template") classes = ("ajax-modal", "configure-nodegrouptemplate-btn") icon = "plus" attrs = {"style": "display: none"} class CopyTemplate(tables.LinkAction): name = "copy" verbose_name = _("Copy Template") url = "horizon:project:data_processing.clusters:copy" classes = ("ajax-modal", ) class EditTemplate(tables.LinkAction): name = "edit" verbose_name = _("Edit Template") url = "horizon:project:data_processing.clusters:edit" classes = ("ajax-modal", ) class ExportTemplate(tables.Action): name = "export" verbose_name = _("Export Template") classes = ("ajax-modal", ) def single(self, data_table, request, object_id): content = json.dumps(saharaclient.nodegroup_template_export( request, object_id)._info) response = http.HttpResponse(content, content_type="application/json") filename = '%s-node-group-template.json' % object_id disposition = 'attachment; filename="%s"' % filename response['Content-Disposition'] = disposition.encode('utf-8') response['Content-Length'] = str(len(response.content)) return response class DeleteTemplate(tables.DeleteAction): @staticmethod def action_present(count): return ungettext_lazy( u"Delete Template", u"Delete Templates", count ) @staticmethod def action_past(count): return ungettext_lazy( u"Deleted Template", u"Deleted Templates", count ) def delete(self, request, template_id): saharaclient.nodegroup_template_delete(request, template_id) class MakePublic(acl_utils.MakePublic): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.nodegroup_update_acl_rules( request, datum_id, **update_kwargs) class MakePrivate(acl_utils.MakePrivate): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.nodegroup_update_acl_rules( request, datum_id, **update_kwargs) class MakeProtected(acl_utils.MakeProtected): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.nodegroup_update_acl_rules( request, datum_id, **update_kwargs) class MakeUnProtected(acl_utils.MakeUnProtected): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.nodegroup_update_acl_rules( request, datum_id, **update_kwargs) class NodegroupTemplatesTable(sahara_table.SaharaPaginateTabbedTable): tab_name = 'cluster_tabs%snode_group_templates_tab' % tabs_base.SEPARATOR name = tables.Column( "name", verbose_name=_("Name"), link="horizon:project:data_processing.clusters:details") plugin_name = tables.Column("plugin_name", verbose_name=_("Plugin")) if saharaclient.VERSIONS.active == '2': version_attr = "plugin_version" else: version_attr = "hadoop_version" hadoop_version = tables.Column(version_attr, verbose_name=_("Version")) node_processes = tables.Column("node_processes", verbose_name=_("Node Processes"), wrap_list=True, filters=(filters.unordered_list,)) class Meta(object): name = "nodegroup_templates" verbose_name = _("Node Group Templates") table_actions = (CreateNodegroupTemplate, ImportNodegroupTemplate, ConfigureNodegroupTemplate, DeleteTemplate, NodeGroupTemplatesFilterAction,) table_actions_menu = (MakePublic, MakePrivate, MakeProtected, MakeUnProtected) row_actions = (EditTemplate, CopyTemplate, ExportTemplate, DeleteTemplate, MakePublic, MakePrivate, MakeProtected, MakeUnProtected) ././@PaxHeader0000000000000000000000000000020500000000000011452 xustar0000000000000000111 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/tabs.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/tabs.p0000664000175000017500000001203100000000000034125 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from oslo_log import log as logging from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import tabs from openstack_dashboard.api import neutron from openstack_dashboard.api import nova from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing \ import tabs as sahara_tabs from sahara_dashboard.content. \ data_processing.utils import workflow_helpers as helpers from sahara_dashboard.content.data_processing.clusters.nodegroup_templates \ import tables as node_group_template_tables LOG = logging.getLogger(__name__) class NodeGroupTemplatesTab(sahara_tabs.SaharaTableTab): table_classes = (node_group_template_tables.NodegroupTemplatesTable, ) name = _("Node Group Templates") slug = "node_group_templates_tab" template_name = "horizon/common/_detail_table.html" def get_nodegroup_templates_data(self): try: table = self._tables['nodegroup_templates'] search_opts = {} filter = self.get_server_filter_info(table.request, table) if filter['value'] and filter['field']: search_opts = {filter['field']: filter['value']} node_group_templates = saharaclient.nodegroup_template_list( self.request, search_opts) except Exception: node_group_templates = [] exceptions.handle(self.request, _("Unable to fetch node group template list")) return node_group_templates class GeneralTab(tabs.Tab): name = _("General Info") slug = "nodegroup_template_details_tab" template_name = "nodegroup_templates/_details.html" def get_context_data(self, request): template_id = self.tab_group.kwargs['template_id'] try: template = saharaclient.nodegroup_template_get( request, template_id) except Exception as e: template = {} LOG.error( "Unable to fetch node group template details: %s" % str(e)) return {"template": template} try: flavor = nova.flavor_get(request, template.flavor_id) except Exception: flavor = {} exceptions.handle(request, _("Unable to fetch flavor for template.")) floating_ip_pool_name = None if template.floating_ip_pool: try: floating_ip_pool_name = self._get_floating_ip_pool_name( request, template.floating_ip_pool) except Exception: exceptions.handle(request, _("Unable to fetch floating ip pools.")) base_image_name = None if template.image_id: try: base_image_name = saharaclient.image_get( request, template.image_id).name except Exception: exceptions.handle(request, _("Unable to fetch Base Image with id: %s.") % template.image_id) security_groups = helpers.get_security_groups( request, template.security_groups) if getattr(template, 'boot_from_volume', None) is None: show_bfv = False else: show_bfv = True return {"template": template, "flavor": flavor, "floating_ip_pool_name": floating_ip_pool_name, "base_image_name": base_image_name, "security_groups": security_groups, "show_bfv": show_bfv} def _get_floating_ip_pool_name(self, request, pool_id): pools = [pool for pool in neutron.floating_ip_pools_list( request) if pool.id == pool_id] return pools[0].name if pools else pool_id class ConfigsTab(tabs.Tab): name = _("Service Configurations") slug = "nodegroup_template_service_configs_tab" template_name = "nodegroup_templates/_service_confs.html" def get_context_data(self, request): template_id = self.tab_group.kwargs['template_id'] try: template = saharaclient.nodegroup_template_get( request, template_id) except Exception as e: template = {} LOG.error( "Unable to fetch node group template details: %s" % str(e)) return {"template": template} class NodegroupTemplateDetailsTabs(tabs.TabGroup): slug = "nodegroup_template_details" tabs = (GeneralTab, ConfigsTab, ) sticky = True ././@PaxHeader0000000000000000000000000000020600000000000011453 xustar0000000000000000112 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/tests.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/tests.0000664000175000017500000004011700000000000034164 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from unittest import mock from django.urls import reverse from openstack_dashboard import api as dash_api from sahara_dashboard import api from sahara_dashboard.content.data_processing.utils \ import workflow_helpers from sahara_dashboard.content.data_processing.clusters. \ nodegroup_templates.workflows import create as create_workflow from sahara_dashboard.test import helpers as test INDEX_URL = reverse( 'horizon:project:data_processing.clusters:nodegroup-templates-tab') DETAILS_URL = reverse( 'horizon:project:data_processing.clusters:details', args=['id']) CREATE_URL = reverse( 'horizon:project:data_processing.clusters:' + 'configure-nodegroup-template') class DataProcessingNodeGroupTests(test.TestCase): @mock.patch('openstack_dashboard.api.base.is_service_enabled') def _setup_copy_test(self, service_checker): service_checker.return_value = True ngt = self.nodegroup_templates.first() configs = self.plugins_configs.first() self.mock_extension_supported.return_value = True self.mock_availability_zone_list.return_value = \ self.availability_zones.list() self.mock_volume_type_list.return_value = [] self.mock_nodegroup_template_get.return_value = ngt self.mock_plugin_get_version_details.return_value = configs self.mock_floating_ip_pools_list.return_value = [] self.mock_security_group_list.return_value = [] url = reverse( 'horizon:project:data_processing.clusters:copy', args=[ngt.id]) res = self.client.get(url) self.mock_availability_zone_list.assert_called_once_with( test.IsHttpRequest()) self.mock_availability_zone_list.assert_called_once_with( test.IsHttpRequest()) self.mock_volume_type_list.assert_called_once_with( test.IsHttpRequest()) self.mock_nodegroup_template_get.assert_called_once_with( test.IsHttpRequest(), ngt.id) self.assert_mock_multiple_calls_with_same_arguments( self.mock_plugin_get_version_details, 6, mock.call(test.IsHttpRequest(), ngt.plugin_name, ngt.hadoop_version)) self.mock_floating_ip_pools_list.assert_called_once_with( test.IsHttpRequest()) self.mock_security_group_list.assert_called_once_with( test.IsHttpRequest()) return ngt, configs, res @test.create_mocks({api.sahara: ('cluster_template_list', 'image_list', 'cluster_list', 'nodegroup_template_list')}) def test_index(self): self.mock_nodegroup_template_list.return_value = \ self.nodegroup_templates.list() res = self.client.get(INDEX_URL + "?tab=cluster_tabs__node_group_templates_tab") self.assertTemplateUsed(res, 'clusters/index.html') self.assertContains(res, 'Node Group Templates') self.assertContains(res, 'Name') self.assertContains(res, 'Plugin') self.mock_nodegroup_template_list.assert_called_once_with( test.IsHttpRequest(), {}) @test.create_mocks({api.sahara: ('nodegroup_template_get',), dash_api.nova: ('flavor_get',)}) def test_details(self): flavor = self.flavors.first() ngt = self.nodegroup_templates.first() self.mock_flavor_get.return_value = flavor self.mock_nodegroup_template_get.return_value = ngt res = self.client.get(DETAILS_URL) self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertContains(res, 'sample-template') self.assert_mock_multiple_calls_with_same_arguments( self.mock_flavor_get, 1, mock.call(test.IsHttpRequest(), flavor.id)) @test.create_mocks({api.sahara: ('nodegroup_template_list', 'nodegroup_template_delete')}) def test_delete(self): ngt = self.nodegroup_templates.first() self.mock_nodegroup_template_list.return_value = \ self.nodegroup_templates.list() self.mock_nodegroup_template_delete.return_value = None form_data = {'action': 'nodegroup_templates__delete__%s' % ngt.id} res = self.client.post(INDEX_URL, form_data) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, INDEX_URL) self.assertMessageCount(success=1) self.mock_nodegroup_template_list.assert_called_once_with( test.IsHttpRequest(), {}) self.mock_nodegroup_template_delete.assert_called_once_with( test.IsHttpRequest(), ngt.id) @test.create_mocks({api.sahara: ('nodegroup_template_get', 'plugin_get_version_details', 'image_list'), dash_api.nova: ('availability_zone_list', 'flavor_list'), dash_api.neutron: ('floating_ip_pools_list', 'security_group_list'), dash_api.cinder: ('extension_supported', 'availability_zone_list', 'volume_type_list')}) def test_copy(self): ngt, configs, res = self._setup_copy_test() workflow = res.context['workflow'] step = workflow.get_step("generalconfigaction") self.assertEqual(step.action['nodegroup_name'].field.initial, ngt.name + "-copy") @test.create_mocks({api.sahara: ('client', 'nodegroup_template_create', 'plugin_get_version_details'), dash_api.neutron: ('floating_ip_pools_list', 'security_group_list'), dash_api.nova: ('flavor_list', 'availability_zone_list'), dash_api.cinder: ('extension_supported', 'availability_zone_list', 'volume_type_list')}) @mock.patch('openstack_dashboard.api.base.is_service_enabled') @mock.patch.object(workflow_helpers, 'parse_configs_from_context') def test_create(self, mock_workflow, service_checker): service_checker.return_value = True mock_workflow.return_value = {} flavor = self.flavors.first() ngt = self.nodegroup_templates.first() configs = self.plugins_configs.first() new_name = ngt.name + '-new' self.mock_extension_supported.return_value = True self.mock_availability_zone_list.return_value = \ self.availability_zones.list() self.mock_volume_type_list.return_value = [] self.mock_flavor_list.return_value = [flavor] self.mock_plugin_get_version_details.return_value = configs self.mock_floating_ip_pools_list.return_value = [] self.mock_security_group_list.return_value = [] self.mock_nodegroup_template_create.return_value = True res = self.client.post( CREATE_URL, {'nodegroup_name': new_name, 'plugin_name': ngt.plugin_name, ngt.plugin_name + '_version': '1.2.1', 'hadoop_version': ngt.hadoop_version, 'description': ngt.description, 'flavor': flavor.id, 'availability_zone': '', 'storage': 'ephemeral_drive', 'volumes_per_node': 0, 'volumes_size': 0, 'volume_type': '', 'volume_local_to_instance': False, 'volumes_availability_zone': '', 'floating_ip_pool': '', 'security_autogroup': True, 'processes': 'HDFS:namenode', 'use_autoconfig': True, 'shares': [], 'is_public': False, 'is_protected': False}) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, INDEX_URL) self.assertMessageCount(success=1) self.mock_extension_supported.assert_called_once_with( test.IsHttpRequest(), 'AvailabilityZones') self.mock_availability_zone_list.assert_called_once_with( test.IsHttpRequest()) self.mock_flavor_list.assert_called_once_with( test.IsHttpRequest()) self.assert_mock_multiple_calls_with_same_arguments( self.mock_plugin_get_version_details, 4, mock.call(test.IsHttpRequest(), ngt.plugin_name, ngt.hadoop_version)) self.mock_floating_ip_pools_list.assert_called_once_with( test.IsHttpRequest()) self.mock_security_group_list.assert_called_once_with( test.IsHttpRequest()) self.mock_nodegroup_template_create( test.IsHttpRequest(), **{'name': new_name, 'plugin_name': ngt.plugin_name, 'hadoop_version': ngt.hadoop_version, 'description': ngt.description, 'flavor_id': flavor.id, 'volumes_per_node': None, 'volumes_size': None, 'volume_type': None, 'volume_local_to_instance': False, 'volumes_availability_zone': None, 'node_processes': ['namenode'], 'node_configs': {}, 'floating_ip_pool': None, 'security_groups': [], 'image_id': None, 'auto_security_group': True, 'availability_zone': None, 'is_proxy_gateway': False, 'use_autoconfig': True, 'shares': [], 'is_public': False, 'is_protected': False}) @test.create_mocks({api.sahara: ('client', 'nodegroup_template_create', 'nodegroup_template_update', 'nodegroup_template_get', 'plugin_get_version_details'), dash_api.neutron: ('floating_ip_pools_list', 'security_group_list'), dash_api.nova: ('flavor_list', 'availability_zone_list'), dash_api.cinder: ('extension_supported', 'availability_zone_list', 'volume_type_list')}) @mock.patch('openstack_dashboard.api.base.is_service_enabled') @mock.patch.object(workflow_helpers, 'parse_configs_from_context') def test_update(self, mock_workflow, service_checker): service_checker.return_value = True flavor = self.flavors.first() ngt = self.nodegroup_templates.first() configs = self.plugins_configs.first() new_name = ngt.name + '-updated' UPDATE_URL = reverse( 'horizon:project:data_processing.clusters:edit', kwargs={'template_id': ngt.id}) mock_workflow.return_value = {} self.mock_extension_supported.return_value = True self.mock_availability_zone_list.return_value = \ self.availability_zones.list() self.mock_volume_type_list.return_value = [] self.mock_flavor_list.return_value = [flavor] self.mock_plugin_get_version_details.return_value = configs self.mock_floating_ip_pools_list.return_value = [] self.mock_security_group_list.return_value = [] self.mock_nodegroup_template_get.return_value = ngt self.mock_nodegroup_template_update.return_value = True res = self.client.post( UPDATE_URL, {'ng_id': ngt.id, 'nodegroup_name': new_name, 'plugin_name': ngt.plugin_name, ngt.plugin_name + '_version': '1.2.1', 'hadoop_version': ngt.hadoop_version, 'description': ngt.description, 'flavor': flavor.id, 'availability_zone': '', 'storage': 'ephemeral_drive', 'volumes_per_node': 0, 'volumes_size': 0, 'volume_type': '', 'volume_local_to_instance': False, 'volumes_availability_zone': '', 'floating_ip_pool': '', 'is_proxy_gateway': False, 'security_autogroup': True, 'processes': 'HDFS:namenode', 'use_autoconfig': True}) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, INDEX_URL) self.assertMessageCount(success=1) self.mock_extension_supported.assert_called_once_with( test.IsHttpRequest(), 'AvailabilityZones') self.mock_availability_zone_list.assert_called_once_with( test.IsHttpRequest()) self.mock_volume_type_list.assert_called_once_with( test.IsHttpRequest()) self.mock_flavor_list.assert_called_once_with( test.IsHttpRequest()) self.assert_mock_multiple_calls_with_same_arguments( self.mock_plugin_get_version_details, 5, mock.call(test.IsHttpRequest(), ngt.plugin_name, ngt.hadoop_version)) self.mock_floating_ip_pools_list.assert_called_once_with( test.IsHttpRequest()) self.mock_security_group_list.assert_called_once_with( test.IsHttpRequest()) self.mock_nodegroup_template_get.assert_called_once_with( test.IsHttpRequest(), ngt.id) self.mock_nodegroup_template_update.assert_called_once_with( request=test.IsHttpRequest(), ngt_id=ngt.id, name=new_name, plugin_name=ngt.plugin_name, hadoop_version=ngt.hadoop_version, flavor_id=flavor.id, description=ngt.description, volumes_per_node=0, volumes_size=None, volume_type=None, volume_local_to_instance=False, volumes_availability_zone=None, node_processes=['namenode'], node_configs={}, floating_ip_pool='', security_groups=[], auto_security_group=True, availability_zone='', use_autoconfig=True, is_proxy_gateway=False, shares=[], is_protected=False, is_public=False, image_id=ngt.image_id, ) @test.create_mocks({api.sahara: ('nodegroup_template_get', 'plugin_get_version_details', 'image_list'), dash_api.nova: ('availability_zone_list', 'flavor_list'), dash_api.neutron: ('floating_ip_pools_list', 'security_group_list'), dash_api.cinder: ('extension_supported', 'availability_zone_list', 'volume_type_list')}) def test_workflow_steps(self): # since the copy workflow is the child of create workflow # it's better to test create workflow through copy workflow ngt, configs, res = self._setup_copy_test() workflow = res.context['workflow'] expected_instances = [ create_workflow.GeneralConfig, create_workflow.SelectNodeProcesses, create_workflow.SecurityConfig ] for expected, observed in zip(expected_instances, workflow.steps): self.assertIsInstance(observed, expected) ././@PaxHeader0000000000000000000000000000020600000000000011453 xustar0000000000000000112 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/views.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/views.0000664000175000017500000001514300000000000034160 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.urls import reverse from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import forms from horizon import tabs from horizon.utils import memoized from horizon import workflows from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing.clusters. \ nodegroup_templates.tables as _tables import sahara_dashboard.content.data_processing.clusters. \ nodegroup_templates.tabs as _tabs import sahara_dashboard.content.data_processing.clusters. \ nodegroup_templates.workflows.copy as copy_flow import sahara_dashboard.content.data_processing.clusters. \ nodegroup_templates.workflows.create as create_flow import sahara_dashboard.content.data_processing.clusters. \ nodegroup_templates.workflows.edit as edit_flow import sahara_dashboard.content.data_processing.clusters. \ nodegroup_templates.forms.import_forms as import_forms class NodegroupTemplateDetailsView(tabs.TabView): tab_group_class = _tabs.NodegroupTemplateDetailsTabs template_name = 'horizon/common/_detail.html' page_title = "{{ template.name|default:template.id }}" @memoized.memoized_method def get_object(self): ngt_id = self.kwargs["template_id"] try: return saharaclient.nodegroup_template_get(self.request, ngt_id) except Exception: msg = _('Unable to retrieve details for ' 'node group template "%s".') % ngt_id redirect = self.get_redirect_url() exceptions.handle(self.request, msg, redirect=redirect) def get_context_data(self, **kwargs): context = super( NodegroupTemplateDetailsView, self).get_context_data(**kwargs) node_group_template = self.get_object() context['template'] = node_group_template context['url'] = self.get_redirect_url() context['actions'] = self._get_actions(node_group_template) return context def _get_actions(self, node_group_template): table = _tables.NodegroupTemplatesTable(self.request) return table.render_row_actions(node_group_template) @staticmethod def get_redirect_url(): return reverse("horizon:project:data_processing." "clusters:index") class CreateNodegroupTemplateView(workflows.WorkflowView): workflow_class = create_flow.CreateNodegroupTemplate success_url = ( "horizon:project:data_processing.clusters:" "create-nodegroup-template") classes = ("ajax-modal",) template_name = "nodegroup_templates/create.html" page_title = _("Create Node Group Template") class ConfigureNodegroupTemplateView(workflows.WorkflowView): workflow_class = create_flow.ConfigureNodegroupTemplate success_url = ("horizon:project:" "data_processing.clusters:index") template_name = "nodegroup_templates/configure.html" page_title = _("Create Node Group Template") def get_initial(self): initial = super(ConfigureNodegroupTemplateView, self).get_initial() initial.update(self.kwargs) return initial class CopyNodegroupTemplateView(workflows.WorkflowView): workflow_class = copy_flow.CopyNodegroupTemplate success_url = ("horizon:project:" "data_processing.clusters:index") template_name = "nodegroup_templates/configure.html" def get_context_data(self, **kwargs): context = super( CopyNodegroupTemplateView, self).get_context_data(**kwargs) context["template_id"] = kwargs["template_id"] return context def get_object(self, *args, **kwargs): if not hasattr(self, "_object"): template_id = self.kwargs['template_id'] try: template = saharaclient.nodegroup_template_get(self.request, template_id) except Exception: template = None exceptions.handle(self.request, _("Unable to fetch template object.")) self._object = template return self._object def get_initial(self): initial = super(CopyNodegroupTemplateView, self).get_initial() initial['template_id'] = self.kwargs['template_id'] return initial class EditNodegroupTemplateView(CopyNodegroupTemplateView): workflow_class = edit_flow.EditNodegroupTemplate success_url = ("horizon:project:" "data_processing.clusters:index") template_name = "nodegroup_templates/configure.html" class ImportNodegroupTemplateFileView(forms.ModalFormView): template_name = "nodegroup_templates/import.html" form_class = import_forms.ImportNodegroupTemplateFileForm submit_label = _("Next") submit_url = reverse_lazy("horizon:project:data_processing." "clusters:import-nodegroup-template-file") success_url = reverse_lazy("horizon:project:data_processing." "clusters:import-nodegroup-template-details") page_title = _("Import Node Group Template") def get_form_kwargs(self): kwargs = super( ImportNodegroupTemplateFileView, self).get_form_kwargs() kwargs['next_view'] = ImportNodegroupTemplateDetailsView return kwargs class ImportNodegroupTemplateDetailsView(forms.ModalFormView): template_name = "nodegroup_templates/import.html" form_class = import_forms.ImportNodegroupTemplateDetailsForm submit_label = _("Import") submit_url = reverse_lazy("horizon:project:data_processing." "clusters:import-nodegroup-template-details") success_url = reverse_lazy("horizon:project:data_processing." "clusters:index") page_title = _("Import Node Group Template") def get_form_kwargs(self): kwargs = super( ImportNodegroupTemplateDetailsView, self).get_form_kwargs() if 'template_upload' in self.kwargs: kwargs['template_upload'] = self.kwargs['template_upload'] return kwargs ././@PaxHeader0000000000000000000000000000021600000000000011454 xustar0000000000000000114 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/workflows/ 28 mtime=1648641572.5600717 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/workfl0000775000175000017500000000000000000000000034243 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022300000000000011452 xustar0000000000000000125 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/workflows/__init__.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/workfl0000664000175000017500000000000000000000000034233 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021700000000000011455 xustar0000000000000000121 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/workflows/copy.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/workfl0000664000175000017500000001417200000000000034252 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing.clusters. \ nodegroup_templates.workflows.create as create_flow class CopyNodegroupTemplate(create_flow.ConfigureNodegroupTemplate): success_message = _("Node Group Template copy %s created") def __init__(self, request, context_seed, entry_point, *args, **kwargs): self.template_id = context_seed["template_id"] self.template = saharaclient.nodegroup_template_get(request, self.template_id) self._set_configs_to_copy(self.template.node_configs) plugin = self.template.plugin_name if saharaclient.VERSIONS.active == '2': version_attr = 'plugin_version' else: version_attr = 'hadoop_version' hadoop_version = getattr(self.template, version_attr) request.GET = request.GET.copy() request.GET.update( {"plugin_name": plugin, version_attr: hadoop_version}) super(CopyNodegroupTemplate, self).__init__(request, context_seed, entry_point, *args, **kwargs) g_fields = None snp_fields = None s_fields = None share_fields = None for step in self.steps: if isinstance(step, create_flow.GeneralConfig): g_fields = step.action.fields if isinstance(step, create_flow.SecurityConfig): s_fields = step.action.fields if isinstance(step, create_flow.SelectNodeProcesses): snp_fields = step.action.fields if isinstance(step, create_flow.SelectNodeGroupShares): share_fields = step.action.fields g_fields["nodegroup_name"].initial = self.template.name + "-copy" g_fields["description"].initial = self.template.description g_fields["flavor"].initial = self.template.flavor_id if hasattr(self.template, "availability_zone"): g_fields["availability_zone"].initial = ( self.template.availability_zone) if hasattr(self.template, "volumes_availability_zone"): g_fields["volumes_availability_zone"].initial = \ self.template.volumes_availability_zone storage = "cinder_volume" if self.template.volumes_per_node > 0 \ else "ephemeral_drive" volumes_per_node = self.template.volumes_per_node volumes_size = self.template.volumes_size volume_type = self.template.volume_type volume_local_to_instance = self.template.volume_local_to_instance g_fields["storage"].initial = storage g_fields["volumes_per_node"].initial = volumes_per_node g_fields["volumes_size"].initial = volumes_size g_fields["volumes_availability_zone"].initial = \ self.template.volumes_availability_zone g_fields['volume_type'].initial = volume_type g_fields['volume_local_to_instance'].initial = volume_local_to_instance g_fields["proxygateway"].initial = self.template.is_proxy_gateway g_fields["use_autoconfig"].initial = self.template.use_autoconfig g_fields["is_public"].initial = self.template.is_public g_fields['is_protected'].initial = self.template.is_protected g_fields["image"].initial = self.template.image_id if self.template.floating_ip_pool: g_fields['floating_ip_pool'].initial = ( self.template.floating_ip_pool) s_fields["security_autogroup"].initial = ( self.template.auto_security_group) if self.template.security_groups: s_fields["security_groups"].initial = dict( [(sg, sg) for sg in self.template.security_groups]) processes_dict = dict() try: plugin_details = saharaclient.plugin_get_version_details( request, plugin, hadoop_version) plugin_node_processes = plugin_details.node_processes except Exception: plugin_node_processes = dict() exceptions.handle(request, _("Unable to fetch plugin details.")) for process in self.template.node_processes: # need to know the service _service = None for service, processes in plugin_node_processes.items(): if process in processes: _service = service break processes_dict["%s:%s" % (_service, process)] = process snp_fields["processes"].initial = processes_dict if share_fields: share_fields["shares"].initial = ( self._get_share_defaults(share_fields)) def _get_share_defaults(self, share_fields): values = dict() choices = share_fields['shares'].choices for i, choice in enumerate(choices): share_id = choice[0] s = [s for s in self.template.shares if s['id'] == share_id] if len(s) > 0: path = s[0].get('path', '') values["share_id_{0}".format(i)] = { "id": s[0]["id"], "path": path, "access_level": s[0]["access_level"] } else: values["share_id_{0}".format(i)] = { "id": None, "path": None, "access_level": None } return values ././@PaxHeader0000000000000000000000000000022100000000000011450 xustar0000000000000000123 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/workflows/create.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/workfl0000664000175000017500000007015200000000000034252 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import itertools from django.utils import encoding from django.utils import html from django.utils import safestring from django.utils.translation import ugettext_lazy as _ from oslo_log import log as logging from oslo_utils import uuidutils from saharaclient.api import base as api_base from horizon import exceptions from horizon import forms from horizon import workflows from openstack_dashboard.api import cinder from openstack_dashboard.api import neutron from openstack_dashboard.api import nova from openstack_dashboard.dashboards.project.instances \ import utils as nova_utils from sahara_dashboard.api import manila as manilaclient from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.utils \ import acl as acl_utils from sahara_dashboard.content.data_processing.utils \ import helpers from sahara_dashboard.content.data_processing.utils \ import workflow_helpers LOG = logging.getLogger(__name__) BASE_IMAGE_URL = "horizon:project:data_processing.clusters:register" def is_cinder_enabled(request): for service in ['volumev3', 'volumev2', 'volume']: if saharaclient.base.is_service_enabled(request, service): return True return False def storage_choices(request): choices = [("ephemeral_drive", _("Ephemeral Drive")), ] if is_cinder_enabled(request): choices.append(("cinder_volume", _("Cinder Volume"))) else: LOG.warning(_("Cinder service is unavailable now")) return choices def volume_availability_zone_list(request): """Utility method to retrieve a list of volume availability zones.""" try: if cinder.extension_supported(request, 'AvailabilityZones'): return cinder.availability_zone_list(request) return [] except Exception: exceptions.handle(request, _('Unable to retrieve volumes availability zones.')) return [] def instance_availability_zone_list(request): """Utility method to retrieve a list of instance availability zones.""" try: return nova.availability_zone_list(request) except Exception: exceptions.handle(request, _('Unable to retrieve Nova availability zones.')) return [] class GeneralConfigAction(workflows.Action): nodegroup_name = forms.CharField(label=_("Template Name")) description = forms.CharField(label=_("Description"), required=False, widget=forms.Textarea(attrs={'rows': 4})) flavor = forms.ChoiceField(label=_("OpenStack Flavor")) availability_zone = forms.ChoiceField( label=_("Availability Zone"), help_text=_("Launch instances in this availability zone."), required=False, widget=forms.Select(attrs={"class": "availability_zone_field"}) ) storage = forms.ChoiceField( label=_("Attached storage location"), help_text=_("Choose a storage location"), choices=[], widget=forms.Select(attrs={ "class": "storage_field switchable", 'data-slug': 'storage_loc' })) volumes_per_node = forms.IntegerField( label=_("Volumes per node"), required=False, initial=1, widget=forms.TextInput(attrs={ "class": "volume_per_node_field switched", "data-switch-on": "storage_loc", "data-storage_loc-cinder_volume": _('Volumes per node') }) ) volumes_size = forms.IntegerField( label=_("Volumes size (GB)"), required=False, initial=10, widget=forms.TextInput(attrs={ "class": "volume_size_field switched", "data-switch-on": "storage_loc", "data-storage_loc-cinder_volume": _('Volumes size (GB)') }) ) volume_type = forms.ChoiceField( label=_("Volumes type"), required=False, widget=forms.Select(attrs={ "class": "volume_type_field switched", "data-switch-on": "storage_loc", "data-storage_loc-cinder_volume": _('Volumes type') }) ) volume_local_to_instance = forms.BooleanField( label=_("Volume local to instance"), required=False, help_text=_("Instance and attached volumes will be created on the " "same physical host"), widget=forms.CheckboxInput(attrs={ "class": "volume_local_to_instance_field switched", "data-switch-on": "storage_loc", "data-storage_loc-cinder_volume": _('Volume local to instance') }) ) volumes_availability_zone = forms.ChoiceField( label=_("Volumes Availability Zone"), help_text=_("Create volumes in this availability zone."), required=False, widget=forms.Select(attrs={ "class": "volumes_availability_zone_field switched", "data-switch-on": "storage_loc", "data-storage_loc-cinder_volume": _('Volumes Availability Zone') }) ) image = forms.DynamicChoiceField(label=_("Base Image"), required=False, add_item_link=BASE_IMAGE_URL) hidden_configure_field = forms.CharField( required=False, widget=forms.HiddenInput(attrs={"class": "hidden_configure_field"})) def __init__(self, request, *args, **kwargs): super(GeneralConfigAction, self).__init__(request, *args, **kwargs) hlps = helpers.Helpers(request) plugin, hadoop_version = ( workflow_helpers.get_plugin_and_hadoop_version(request)) if not saharaclient.SAHARA_FLOATING_IP_DISABLED: pools = neutron.floating_ip_pools_list(request) pool_choices = [(pool.id, pool.name) for pool in pools] pool_choices.insert(0, (None, "Do not assign floating IPs")) self.fields['floating_ip_pool'] = forms.ChoiceField( label=_("Floating IP Pool"), choices=pool_choices, required=False) self.fields["use_autoconfig"] = forms.BooleanField( label=_("Auto-configure"), help_text=_("If selected, instances of a node group will be " "automatically configured during cluster " "creation. Otherwise you should manually specify " "configuration values."), required=False, widget=forms.CheckboxInput(), initial=True, ) self.fields["proxygateway"] = forms.BooleanField( label=_("Proxy Gateway"), widget=forms.CheckboxInput(), help_text=_("Sahara will use instances of this node group to " "access other cluster instances."), required=False) self.fields['is_public'] = acl_utils.get_is_public_form( _("node group template")) self.fields['is_protected'] = acl_utils.get_is_protected_form( _("node group template")) if saharaclient.VERSIONS.active == '2': self.fields['boot_storage'] = forms.ChoiceField( label=_("Boot storage location"), help_text=_("Choose a boot mode"), choices=storage_choices(request), widget=forms.Select(attrs={ "class": "boot_storage_field switchable", 'data-slug': 'boot_storage_loc' })) self.fields['boot_volume_type'] = forms.ChoiceField( label=_("Boot volume type"), required=False, widget=forms.Select(attrs={ "class": "boot_volume_type_field switched", "data-switch-on": "boot_storage_loc", "data-boot_storage_loc-cinder_volume": _('Boot volume type') }) ) self.fields['boot_volume_local_to_instance'] = forms.BooleanField( label=_("Boot volume local to instance"), required=False, help_text=_("Boot volume locality"), widget=forms.CheckboxInput(attrs={ "class": "boot_volume_local_to_instance_field switched", "data-switch-on": "boot_storage_loc", "data-boot_storage_loc-cinder_volume": _('Boot volume local to instance') }) ) self.fields['boot_volume_availability_zone'] = forms.ChoiceField( label=_("Boot volume availability Zone"), choices=self.populate_volumes_availability_zone_choices( request, None), help_text=_("Create boot volume in this availability zone."), required=False, widget=forms.Select(attrs={ "class": "boot_volume_availability_zone_field switched", "data-switch-on": "boot_storage_loc", "data-boot_storage_loc-cinder_volume": _('Boot volume availability zone') }) ) self.fields["plugin_name"] = forms.CharField( widget=forms.HiddenInput(), initial=plugin ) self.fields["hadoop_version"] = forms.CharField( widget=forms.HiddenInput(), initial=hadoop_version ) self.fields["storage"].choices = storage_choices(request) node_parameters = hlps.get_general_node_group_configs(plugin, hadoop_version) for param in node_parameters: self.fields[param.name] = workflow_helpers.build_control(param) # when we copy or edit a node group template then # request contains valuable info in both GET and POST methods req = request.GET.copy() req.update(request.POST) if req.get("guide_template_type"): self.fields["guide_template_type"] = forms.CharField( required=False, widget=forms.HiddenInput(), initial=req.get("guide_template_type")) if is_cinder_enabled(request): volume_types = cinder.volume_type_list(request) else: volume_types = [] self.fields['volume_type'].choices = [(None, _("No volume type"))] + \ [(type.name, type.name) for type in volume_types] if saharaclient.VERSIONS.active == '2': self.fields['boot_volume_type'].choices = ( self.fields['volume_type'].choices) def populate_flavor_choices(self, request, context): flavors = nova_utils.flavor_list(request) if flavors: return nova_utils.sort_flavor_list(request, flavors) return [] def populate_availability_zone_choices(self, request, context): # The default is None, i.e. not specifying any availability zone az_list = [(None, _('No availability zone specified'))] az_list.extend([(az.zoneName, az.zoneName) for az in instance_availability_zone_list(request) if az.zoneState['available']]) return az_list def populate_volumes_availability_zone_choices(self, request, context): az_list = [(None, _('No availability zone specified'))] if is_cinder_enabled(request): az_list.extend([(az.zoneName, az.zoneName) for az in volume_availability_zone_list( request) if az.zoneState['available']]) return az_list def populate_image_choices(self, request, context): return workflow_helpers.populate_image_choices(self, request, context, empty_choice=True) def get_help_text(self): extra = dict() plugin_name, hadoop_version = ( workflow_helpers.get_plugin_and_hadoop_version(self.request)) extra["plugin_name"] = plugin_name extra["hadoop_version"] = hadoop_version plugin = saharaclient.plugin_get_version_details( self.request, plugin_name, hadoop_version) extra["deprecated"] = workflow_helpers.is_version_of_plugin_deprecated( plugin, hadoop_version) return super(GeneralConfigAction, self).get_help_text(extra) class Meta(object): name = _("Configure Node Group Template") help_text_template = "nodegroup_templates/_configure_general_help.html" class SecurityConfigAction(workflows.Action): def __init__(self, request, *args, **kwargs): super(SecurityConfigAction, self).__init__(request, *args, **kwargs) self.fields["security_autogroup"] = forms.BooleanField( label=_("Auto Security Group"), widget=forms.CheckboxInput(), help_text=_("Create security group for this Node Group."), required=False, initial=True) try: groups = neutron.security_group_list(request) except Exception: exceptions.handle(request, _("Unable to get security group list.")) raise security_group_list = [(sg.id, sg.name) for sg in groups] self.fields["security_groups"] = forms.MultipleChoiceField( label=_("Security Groups"), widget=forms.CheckboxSelectMultiple(), help_text=_("Launch instances in these security groups."), choices=security_group_list, required=False) class Meta(object): name = _("Security") help_text = _("Control access to instances of the node group.") class CheckboxSelectMultiple(forms.CheckboxSelectMultiple): # TODO(shuyingya): should rewrite this class using the # new method "get_context" when Django version less than 1.11 # no longer support. def build_attrs(self, extra_attrs=None, **kwargs): "Helper function for building an attribute dictionary." attrs = dict(self.attrs, **kwargs) if extra_attrs: attrs.update(extra_attrs) return attrs def render(self, name, value, attrs=None, choices=(), renderer=None): if value is None: value = [] has_id = attrs and 'id' in attrs final_attrs = self.build_attrs(attrs, name=name) output = [] initial_service = uuidutils.generate_uuid() str_values = set([encoding.force_text(v) for v in value]) for i, (option_value, option_label) in enumerate( itertools.chain(self.choices, choices)): current_service = option_value.split(':')[0] if current_service != initial_service: if i > 0: output.append("") service_description = _("%s processes: ") % current_service service_description = html.conditional_escape( encoding.force_text(service_description)) output.append("" % service_description) initial_service = current_service output.append(encoding.force_text("
    ")) if has_id: final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i)) label_for = ' for="%s"' % final_attrs['id'] else: label_for = '' cb = forms.CheckboxInput( final_attrs, check_test=lambda value: value in str_values) option_value = encoding.force_text(option_value) rendered_cb = cb.render(name, option_value) option_label = html.conditional_escape( encoding.force_text(option_label)) output.append( '
  • %s %s
  • ' % (label_for, rendered_cb, option_label)) output.append('
') return safestring.mark_safe('\n'.join(output)) class SelectNodeProcessesAction(workflows.Action): def __init__(self, request, *args, **kwargs): super(SelectNodeProcessesAction, self).__init__( request, *args, **kwargs) plugin, hadoop_version = ( workflow_helpers.get_plugin_and_hadoop_version(request)) node_processes = {} try: version_details = saharaclient.plugin_get_version_details( request, plugin, hadoop_version) node_processes = version_details.node_processes except Exception: exceptions.handle(request, _("Unable to generate process choices.")) process_choices = [] for service, processes in node_processes.items(): for process in processes: choice_label = str(service) + ":" + str(process) process_choices.append((choice_label, process)) self.fields["processes"] = forms.MultipleChoiceField( label=_("Select Node Group Processes"), widget=CheckboxSelectMultiple(), choices=process_choices, required=True) class Meta(object): name = _("Node Processes") help_text = _("Select node processes for the node group") class SelectNodeGroupSharesAction(workflows.Action): def __init__(self, request, *args, **kwargs): super(SelectNodeGroupSharesAction, self).__init__( request, *args, **kwargs) possible_shares = self.get_possible_shares(request) self.fields["shares"] = workflow_helpers.MultipleShareChoiceField( label=_("Select Shares"), widget=workflow_helpers.ShareWidget(choices=possible_shares), required=False, choices=possible_shares ) def get_possible_shares(self, request): try: shares = manilaclient.share_list(request) choices = [(s.id, s.name) for s in shares] except Exception: exceptions.handle(request, _("Failed to get list of shares")) choices = [] return choices class Meta(object): name = _("Shares") help_text = _("Select the manila shares for this node group") class GeneralConfig(workflows.Step): action_class = GeneralConfigAction contributes = ("general_nodegroup_name", ) def contribute(self, data, context): for k, v in data.items(): if "hidden" in k: continue context["general_" + k] = v if v != "None" else None return context class SecurityConfig(workflows.Step): action_class = SecurityConfigAction contributes = ("security_autogroup", "security_groups") class SelectNodeProcesses(workflows.Step): action_class = SelectNodeProcessesAction def contribute(self, data, context): post = self.workflow.request.POST context['general_processes'] = post.getlist('processes') return context class SelectNodeGroupShares(workflows.Step): action_class = SelectNodeGroupSharesAction def contribute(self, data, context): post = self.workflow.request.POST shares_details = [] for index in range(0, len(self.action.fields['shares'].choices) * 3): if index % 3 == 0: share = post.get("shares_{0}".format(index)) if share: path = post.get("shares_{0}".format(index + 1)) permissions = post.get("shares_{0}".format(index + 2)) shares_details.append({ "id": share, "path": path, "access_level": permissions }) context['ngt_shares'] = shares_details return context class ConfigureNodegroupTemplate(workflow_helpers.ServiceParametersWorkflow, workflow_helpers.StatusFormatMixin): slug = "configure_nodegroup_template" name = _("Create Node Group Template") finalize_button_name = _("Create") success_message = _("Created Node Group Template %s") name_property = "general_nodegroup_name" success_url = ("horizon:project:data_processing.clusters:" "nodegroup-templates-tab") default_steps = (GeneralConfig, SelectNodeProcesses, SecurityConfig, ) def __init__(self, request, context_seed, entry_point, *args, **kwargs): hlps = helpers.Helpers(request) plugin, hadoop_version = ( workflow_helpers.get_plugin_and_hadoop_version(request)) general_parameters, service_parameters = \ hlps.get_general_and_service_nodegroups_parameters(plugin, hadoop_version) if saharaclient.base.is_service_enabled(request, 'share'): ConfigureNodegroupTemplate._register_step(self, SelectNodeGroupShares) self._populate_tabs(general_parameters, service_parameters) super(ConfigureNodegroupTemplate, self).__init__(request, context_seed, entry_point, *args, **kwargs) def is_valid(self): missing = self.depends_on - set(self.context.keys()) if missing: raise exceptions.WorkflowValidationError( "Unable to complete the workflow. The values %s are " "required but not present." % ", ".join(missing)) checked_steps = [] if "general_processes" in self.context: checked_steps = self.context["general_processes"] enabled_services = set([]) for process_name in checked_steps: enabled_services.add(str(process_name).split(":")[0]) steps_valid = True for step in self.steps: process_name = str(getattr(step, "process_name", None)) if process_name not in enabled_services and \ not isinstance(step, GeneralConfig): continue if not step.action.is_valid(): steps_valid = False step.has_errors = True if not steps_valid: return steps_valid return self.validate(self.context) def handle(self, request, context): try: processes = [] for service_process in context["general_processes"]: processes.append(str(service_process).split(":")[1]) configs_dict = ( workflow_helpers.parse_configs_from_context( context, self.defaults)) plugin, hadoop_version = ( workflow_helpers.get_plugin_and_hadoop_version(request)) volumes_per_node = None volumes_size = None volumes_availability_zone = None volume_type = None volume_local_to_instance = False if context["general_storage"] == "cinder_volume": volumes_per_node = context["general_volumes_per_node"] volumes_size = context["general_volumes_size"] volumes_availability_zone = \ context["general_volumes_availability_zone"] volume_type = context["general_volume_type"] volume_local_to_instance = \ context["general_volume_local_to_instance"] ngt_shares = context.get('ngt_shares', []) image_id = context["general_image"] or None if (saharaclient.VERSIONS.active == '2' and context["general_boot_storage"] == "cinder_volume"): boot_from_volume = True boot_volume_type = ( context["general_boot_volume_type"] or None ) boot_volume_availability_zone = ( context["general_boot_volume_availability_zone"] or None ) boot_volume_local_to_instance = ( context["general_boot_volume_local_to_instance"] ) else: boot_from_volume = None boot_volume_type = None boot_volume_availability_zone = None boot_volume_local_to_instance = None ngt = saharaclient.nodegroup_template_create( request, name=context["general_nodegroup_name"], plugin_name=plugin, hadoop_version=hadoop_version, description=context["general_description"], flavor_id=context["general_flavor"], volumes_per_node=volumes_per_node, volumes_size=volumes_size, volumes_availability_zone=volumes_availability_zone, volume_type=volume_type, volume_local_to_instance=volume_local_to_instance, node_processes=processes, node_configs=configs_dict, floating_ip_pool=context.get("general_floating_ip_pool"), security_groups=context["security_groups"], auto_security_group=context["security_autogroup"], is_proxy_gateway=context["general_proxygateway"], availability_zone=context["general_availability_zone"], use_autoconfig=context['general_use_autoconfig'], shares=ngt_shares, is_public=context['general_is_public'], is_protected=context['general_is_protected'], boot_from_volume=boot_from_volume, boot_volume_type=boot_volume_type, boot_volume_availability_zone=boot_volume_availability_zone, boot_volume_local_to_instance=boot_volume_local_to_instance, image_id=image_id) hlps = helpers.Helpers(request) if hlps.is_from_guide(): guide_type = context["general_guide_template_type"] request.session[guide_type + "_name"] = ( context["general_nodegroup_name"]) request.session[guide_type + "_id"] = ngt.id self.success_url = ( "horizon:project:data_processing.clusters:cluster_guide") return True except api_base.APIException as e: self.error_description = str(e) return False except Exception: exceptions.handle(request) class SelectPluginAction(workflows.Action, workflow_helpers.PluginAndVersionMixin): hidden_create_field = forms.CharField( required=False, widget=forms.HiddenInput(attrs={"class": "hidden_create_field"})) def __init__(self, request, *args, **kwargs): super(SelectPluginAction, self).__init__(request, *args, **kwargs) sahara = saharaclient.client(request) self._generate_plugin_version_fields(sahara) class Meta(object): name = _("Select plugin and hadoop version") help_text_template = "nodegroup_templates/_create_general_help.html" class SelectPlugin(workflows.Step): action_class = SelectPluginAction contributes = ("plugin_name", "hadoop_version") def contribute(self, data, context): context = super(SelectPlugin, self).contribute(data, context) context["plugin_name"] = data.get('plugin_name', None) context["hadoop_version"] = \ data.get(context["plugin_name"] + "_version", None) return context class CreateNodegroupTemplate(workflows.Workflow): slug = "create_nodegroup_template" name = _("Create Node Group Template") finalize_button_name = _("Next") success_message = _("Created") failure_message = _("Could not create") success_url = ("horizon:project:data_processing.clusters:" "nodegroup-templates-tab") default_steps = (SelectPlugin,) ././@PaxHeader0000000000000000000000000000021700000000000011455 xustar0000000000000000121 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/workflows/edit.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/nodegroup_templates/workfl0000664000175000017500000001237200000000000034252 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ from saharaclient.api import base as api_base from horizon import exceptions from horizon import forms from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing.clusters. \ nodegroup_templates.workflows.create as create_flow import sahara_dashboard.content.data_processing.clusters. \ nodegroup_templates.workflows.copy as copy_flow from sahara_dashboard.content.data_processing.utils \ import workflow_helpers class EditNodegroupTemplate(copy_flow.CopyNodegroupTemplate): success_message = _("Node Group Template %s updated") finalize_button_name = _("Update") name = _("Edit Node Group Template") def __init__(self, request, context_seed, entry_point, *args, **kwargs): super(EditNodegroupTemplate, self).__init__(request, context_seed, entry_point, *args, **kwargs) for step in self.steps: if not isinstance(step, create_flow.GeneralConfig): continue fields = step.action.fields fields["nodegroup_name"].initial = self.template.name fields["template_id"] = forms.CharField( widget=forms.HiddenInput(), initial=self.template_id ) def handle(self, request, context): try: processes = [] for service_process in context["general_processes"]: processes.append(str(service_process).split(":")[1]) configs_dict = ( workflow_helpers.parse_configs_from_context( context, self.defaults)) plugin, hadoop_version = ( workflow_helpers.get_plugin_and_hadoop_version(request)) volumes_per_node = 0 volumes_size = None volumes_availability_zone = None volume_type = None volume_local_to_instance = False if context["general_storage"] == "cinder_volume": volumes_per_node = context["general_volumes_per_node"] volumes_size = context["general_volumes_size"] volume_type = context["general_volume_type"] volume_local_to_instance = \ context["general_volume_local_to_instance"] volumes_availability_zone = \ context["general_volumes_availability_zone"] ngt_shares = context.get('ngt_shares', []) image_id = context["general_image"] or None args_dict = dict( request=request, ngt_id=self.template_id, name=context["general_nodegroup_name"], plugin_name=plugin, hadoop_version=hadoop_version, flavor_id=context["general_flavor"], description=context["general_description"], volumes_per_node=volumes_per_node, volumes_size=volumes_size, volume_type=volume_type, volume_local_to_instance=volume_local_to_instance, volumes_availability_zone=volumes_availability_zone, node_processes=processes, node_configs=configs_dict, floating_ip_pool=context.get("general_floating_ip_pool"), security_groups=context["security_groups"], auto_security_group=context["security_autogroup"], availability_zone=context["general_availability_zone"], use_autoconfig=context['general_use_autoconfig'], is_proxy_gateway=context["general_proxygateway"], shares=ngt_shares, is_public=context['general_is_public'], is_protected=context['general_is_protected'], image_id=image_id) if (saharaclient.VERSIONS.active == '2' and context["general_boot_storage"] == "cinder_volume"): args_dict['boot_from_volume'] = True args_dict['boot_volume_type'] = ( context["general_boot_volume_type"] or None ) args_dict['boot_volume_availability_zone'] = ( context["general_boot_volume_availability_zone"] or None ) args_dict['boot_volume_local_to_instance'] = ( context["general_boot_volume_local_to_instance"] ) saharaclient.nodegroup_template_update(**args_dict) return True except api_base.APIException as e: self.error_description = str(e.message) return False except Exception: exceptions.handle(request) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/panel.py0000664000175000017500000000165600000000000030417 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ import horizon from openstack_dashboard.dashboards.project import dashboard class ClustersPanel(horizon.Panel): name = _("Clusters") slug = 'data_processing.clusters' permissions = (('openstack.services.data-processing', 'openstack.services.data_processing'),) dashboard.Project.register(ClustersPanel) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5320704 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/0000775000175000017500000000000000000000000030734 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021300000000000011451 xustar0000000000000000112 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/ 27 mtime=1648641572.564072 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000775000175000017500000000000000000000000034231 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000025400000000000011456 xustar0000000000000000150 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_cluster_template_configs_details.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000000337300000000000034241 0ustar00zuulzuul00000000000000{% load i18n sizeformat %}

{% trans "Cluster Template Configuration Overview" %}

{% if template.cluster_configs %}
{% for service, service_conf in template.cluster_configs.items %}

{{ service }}

{% if service_conf %}
    {% for conf_name, conf_value in service_conf.items %}
  • {% blocktrans %}{{ conf_name }}: {{ conf_value }}{% endblocktrans %}
  • {% endfor %}
{% else %}
{% trans "No configurations" %}
{% endif %} {% endfor %}
{% else %}
{% trans "Cluster configurations are not specified" %}
{% endif %}

{% trans "Node Groups Configuration Overview" %}

{% for node_group in template.node_groups %}

{% blocktrans with node_group_name=node_group.name %}Node Group Name: {{ node_group_name }}{% endblocktrans %}

{% if node_group.node_configs %}
{% for service, service_conf in node_group.node_configs.items %}

{{ service }}

{% if service_conf %}
    {% for conf_name, conf_value in service_conf.items %}
  • {% blocktrans %}{{ conf_name }}: {{ conf_value }}{% endblocktrans %}
  • {% endfor %}
{% else %}
{% trans "No configurations" %}
{% endif %} {% endfor %}
{% else %}
{% trans "Node group configurations are not specified" %}
{% endif %}
{% endfor %}
././@PaxHeader0000000000000000000000000000024400000000000011455 xustar0000000000000000142 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_config_domain_names_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000000065300000000000034237 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans %}Select the domain name for internal and external hostname resolution.{% endblocktrans %}

{% blocktrans trimmed %}Selected domain name should already exist in the Designate. You can check it in "DNS" tab on the left menu or by executing "designate domain-list" on the controller node.{% endblocktrans %}

././@PaxHeader0000000000000000000000000000024200000000000011453 xustar0000000000000000140 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_configure_general_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000000263500000000000034241 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans %}This Cluster Template will be created for:{% endblocktrans %}
{% blocktrans %}Plugin{% endblocktrans %}: {{ plugin_name }}
{% blocktrans %}Version{% endblocktrans %}: {{ hadoop_version }}

{% if deprecated %}

{% blocktrans %}Warning!{% endblocktrans %}

{% blocktrans trimmed %} Version: {{ hadoop_version }} of plugin {{ plugin_name }} is now deprecated. {% endblocktrans %}

{% endif %}

{% blocktrans trimmed %}The Cluster Template object should specify Node Group Templates that will be used to build a Cluster. You can add Node Groups using Node Group Templates on a "Node Groups" tab.{% endblocktrans %}

{% blocktrans %}You may set cluster scoped configurations on corresponding tabs.{% endblocktrans %}

{% blocktrans trimmed %}The Cluster Template object may specify a list of processes in anti-affinity group. That means these processes may not be launched more than once on a single host.{% endblocktrans %}

././@PaxHeader0000000000000000000000000000023700000000000011457 xustar0000000000000000137 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_create_general_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000000021500000000000034231 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans %}Select a plugin and version for a new Cluster template.{% endblocktrans %}

././@PaxHeader0000000000000000000000000000022300000000000011452 xustar0000000000000000125 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_details.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000000302700000000000034235 0ustar00zuulzuul00000000000000{% load i18n sizeformat %}
{% trans "Name" %}
{{ template.name }}
{% trans "Project ID" %}
{% if template.tenant_id %}
{{ template.tenant_id }}
{% else %}
{{ template.project_id }}
{% endif %}
{% trans "ID" %}
{{ template.id }}
{% trans "Description" %}
{{ template.description|default:_("None") }}
{% trans "Plugin" %}
{{ template.plugin_name }}
{% trans "Version" %}
{{ template.hadoop_version }}
{% trans "Use auto-configuration" %}
{{ template.use_autoconfig }}
{% trans "Public" %}
{{ template.is_public|yesno }}
{% trans "Protected" %}
{{ template.is_protected|yesno }}
{% if template.domain_name %}
{% trans "Domain name" %}
{{ template.domain_name }}
{% endif %}
{% trans "Anti-affinity enabled for" %}
{% if template.anti_affinity %}
    {% for process in template.anti_affinity %}
  • {{ process }}
  • {% endfor %}
{% else %}
{% trans "no processes" %}
{% endif %}
././@PaxHeader0000000000000000000000000000022200000000000011451 xustar0000000000000000124 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_import.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000000137000000000000034234 0ustar00zuulzuul00000000000000{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block form_id %}import-cluster-template{% endblock %} {% block form_action %}{{ submit_url }}{% endblock %} {% block form_attrs %}enctype="multipart/form-data"{% endblock %} {% block modal-header %}{{ page_title }}{% endblock %} {% block modal-body %}
{% include "horizon/common/_form_fields.html" %}
{% endblock %} {% block modal-footer %} {% trans "Cancel" %} {% endblock %} ././@PaxHeader0000000000000000000000000000023500000000000011455 xustar0000000000000000135 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_import_nodegroups.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000000147300000000000034240 0ustar00zuulzuul00000000000000{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block form_id %}import-cluster-template{% endblock %} {% block form_action %}{{ submit_url }}{% endblock %} {% block form_attrs %}enctype="multipart/form-data"{% endblock %} {% block modal-header %}{{ page_title }}{% endblock %} {% block modal-body %}
{% include "horizon/common/_form_fields.html" %} {% include "cluster_templates/cluster_node_groups_template.html" %}
{% endblock %} {% block modal-footer %} {% trans "Cancel" %} {% endblock %} ././@PaxHeader0000000000000000000000000000023600000000000011456 xustar0000000000000000136 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_nodegroups_details.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000000617200000000000034241 0ustar00zuulzuul00000000000000{% load i18n sizeformat %}
{% for node_group in template.node_groups %}

{% blocktrans with node_group_name=node_group.name %}Node Group: {{ node_group_name }}{% endblocktrans %}

{% trans "Nodes Count" %}
{{ node_group.count }}
{% trans "Flavor" %}
{{ node_group.flavor_id|default:_("Flavor is not specified") }}
{% trans "Template" %}
{% if node_group.node_group_template_id %}
{{ node_group.node_group_template.name }}
{% else %}
{% trans "Template not specified" %}
{% endif %} {% if node_group.availability_zone %}
{% trans "Availability Zone" %}
{{ node_group.availability_zone }}
{% endif %}
{% trans "Use auto-configuration" %}
{{ node_group.use_autoconfig }}
{% trans "Proxy Gateway" %}
{{ node_group.is_proxy_gateway|yesno }}
{% trans "Auto Security Group" %}
{{ node_group.auto_security_group|yesno }}
{% trans "Security Groups" %}
    {% for group in node_group.security_groups_full %} {% if group.id %}
  • {{ group.name }}
  • {% else %}
  • {{ group.name }}
  • {% endif %} {% endfor %}
{% trans "Node Processes" %}
{% if node_group.node_processes %}
    {% for process in node_group.node_processes %}
  • {{ process }}
  • {% endfor %}
{% else %}
{% trans "Node processes are not specified" %}
{% endif %}

{% trans "HDFS placement" %}

{% if node_group.volumes_per_node %}
{% trans "Volumes per node" %}
{{ node_group.volumes_per_node }}
{% trans "Volumes size" %}
{{ node_group.volumes_size }}
{% trans "Volumes type" %}
{{ node_group.volume_type }}
{% trans "Volumes local to instance" %}
{{ node_group.volume_local_to_instance }}
{% else %}
{% trans "Drive type" %}
{% trans "Ephemeral drive" %}
{% endif %}
{% endfor %}
././@PaxHeader0000000000000000000000000000022700000000000011456 xustar0000000000000000129 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_upload_file.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000000145300000000000034236 0ustar00zuulzuul00000000000000{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block form_id %}upload_file{% endblock %} {% block form_action %}{% url 'horizon:project:data_processing.clusters:upload_file' %}{% endblock %} {% block form_attrs %}enctype="multipart/form-data"{% endblock %} {% block modal-header %}{% trans "Upload Template" %}{% endblock %} {% block modal-body %}
{% include "horizon/common/_form_fields.html" %}
{% endblock %} {% block modal-footer %} {% trans "Cancel" %} {% endblock %} ././@PaxHeader0000000000000000000000000000024700000000000011460 xustar0000000000000000145 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/cluster_node_groups_template.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000001463200000000000034241 0ustar00zuulzuul00000000000000{% load i18n %}
././@PaxHeader0000000000000000000000000000022400000000000011453 xustar0000000000000000126 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/configure.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000000030200000000000034226 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Create Cluster Template" %}{% endblock %} {% block main %} {% include 'horizon/common/_workflow.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000022100000000000011450 xustar0000000000000000123 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/create.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000000044000000000000034231 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{{ name }}{% endblock %} {% block page_header %} {% include "horizon/common/_page_header.html" with title=name %} {% endblock page_header %} {% block main %} {% include 'horizon/common/_workflow.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000022100000000000011450 xustar0000000000000000123 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/import.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000000030300000000000034227 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Import Cluster Template" %}{% endblock %} {% block main %} {% include 'cluster_templates/_import.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000023400000000000011454 xustar0000000000000000134 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/import_nodegroups.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000000030300000000000034227 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Import Cluster Template" %}{% endblock %} {% block main %} {% include 'cluster_templates/_import.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000022600000000000011455 xustar0000000000000000128 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/upload_file.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_template0000664000175000017500000000030000000000000034224 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Upload Template" %}{% endblock %} {% block main %} {% include 'cluster_templates/_upload_file.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.564072 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/0000775000175000017500000000000000000000000033775 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022300000000000011452 xustar0000000000000000125 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/_ngt_select.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/_0000664000175000017500000000164700000000000034146 0ustar00zuulzuul00000000000000{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block form_id %}create-job-binary{% endblock %} {% block form_action %} {% url 'horizon:project:data_processing.clusters:ngt_select' %} {% endblock %} {% block form_attrs %}enctype="multipart/form-data"{% endblock %} {% block modal-header %}{% trans "Choose node group template" %}{% endblock %} {% block modal-body %}
{% include "horizon/common/_form_fields.html" %}
{{ form.get_help_text }}
{% endblock %} {% block modal-footer %} {% trans "Cancel" %} {% endblock %} ././@PaxHeader0000000000000000000000000000023000000000000011450 xustar0000000000000000130 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/_ngt_select_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/_0000664000175000017500000000020200000000000034130 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans %}Select an existing node group template. {% endblocktrans %}

././@PaxHeader0000000000000000000000000000022600000000000011455 xustar0000000000000000128 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/_plugin_select.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/_0000664000175000017500000000165400000000000034144 0ustar00zuulzuul00000000000000{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block form_id %}create-job-binary{% endblock %} {% block form_action %} {% url 'horizon:project:data_processing.clusters:plugin_select' %} {% endblock %} {% block form_attrs %}enctype="multipart/form-data"{% endblock %} {% block modal-header %}{% trans "Choose plugin and version" %}{% endblock %} {% block modal-body %}
{% include "horizon/common/_form_fields.html" %}
{{ form.get_help_text }}
{% endblock %} {% block modal-footer %} {% trans "Cancel" %} {% endblock %} ././@PaxHeader0000000000000000000000000000023300000000000011453 xustar0000000000000000133 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/_plugin_select_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/_0000664000175000017500000000025600000000000034141 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans trimmed %}Select which plugin and version that you want to use to create your cluster.{% endblocktrans %}

././@PaxHeader0000000000000000000000000000022500000000000011454 xustar0000000000000000127 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/cluster_guide.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/c0000664000175000017500000002752200000000000034152 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Data Processing" %}{% endblock %} {% block main %}
  1. {% blocktrans trimmed %}The first step is to determine which type of cluster you want to run. You may have several choices available depending on the configuration of your system. Click on "choose plugin" to bring up the list of data processing plugins. There you will be able to choose the data processing plugin along with the version number. Choosing this up front will allow the rest of the cluster creation steps to focus only on options that are pertinent to your desired cluster type.{% endblocktrans %}
    {% trans "Choose plugin" %}
    {% trans "Current choice:" %} {% if request.session.plugin_name and request.session.plugin_version %} {% trans "Plugin:" %} {{ request.session.plugin_name }} {% trans "Version:" %} {{ request.session.plugin_version }} {% else %} {% trans "No plugin chosen" %} {% endif %}

  2. {% blocktrans trimmed %}You need to register an image to launch instances of your cluster. Skip this step if you already have a registered image for your plugin, otherwise click the link below. In the form you will need to choose the image, input the username and add tags for the chosen plugin. {% endblocktrans %}

  3. {% blocktrans trimmed %}Next, you need to define the different types of machines in your cluster. This is done by defining a Node Group Template for each type of machine. A very common case is where you need to have one or more machines running a "master" set of processes while another set of machines need to be running the "worker" processes. Here, you will define the Node Group Template for your "master" node(s). {% endblocktrans %}
    {% trans "Current choice:" %} {% if request.session.master_name %} {% trans "Master Node Group Template:" %} {{ request.session.master_name }} {% else %} {% trans "No Master Node Group Template Created" %} {% endif %}

  4. {% blocktrans trimmed %}Repeat the Node Group Template creation process, but this time you are creating your "worker" Node Group Template.{% endblocktrans %}
    {% trans "Current choice:" %} {% if request.session.worker_name %} {% trans "Worker Node Group Template:" %} {{ request.session.worker_name }} {% else %} {% trans "No Worker Node Group Template Created" %} {% endif %}

  5. {% blocktrans trimmed %}Now you need to set the layout of your cluster. By creating a Cluster Template, you will be choosing the number of instances of each Node Group Template that will appear in your cluster. Additionally, you will have a chance to set any cluster-specific configuration items in the additional tabs on the create Cluster Template form.{% endblocktrans %}
    {% trans "Current choice:" %} {% if request.session.guide_cluster_template_name %} {% trans "Worker Node Group Template:" %} {{ request.session.guide_cluster_template_name }} {% else %} {% trans "No Cluster Template Created" %} {% endif %}

  6. {% blocktrans trimmed %}You are now ready to launch your cluster. When you click on the link below, you will need to give your cluster a name, choose the Cluster Template to use and choose which image to use to build your instances. After you click on "Create", your instances will begin to spawn. Your cluster should be operational in a few minutes.{% endblocktrans %}
{% endblock %} ././@PaxHeader0000000000000000000000000000022200000000000011451 xustar0000000000000000124 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/ngt_select.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/n0000664000175000017500000000030700000000000034155 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Choose node group template" %}{% endblock %} {% block main %} {% include 'cluster_wizard/_ngt_select.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000022500000000000011454 xustar0000000000000000127 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/plugin_select.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/p0000664000175000017500000000031100000000000034152 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Choose plugin and version" %}{% endblock %} {% block main %} {% include 'cluster_wizard/_plugin_select.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.568072 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/0000775000175000017500000000000000000000000032600 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000023200000000000011452 xustar0000000000000000132 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_cluster_configs_details.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_cluste0000664000175000017500000000336200000000000034165 0ustar00zuulzuul00000000000000{% load i18n sizeformat %}

{% trans "Cluster Configuration Overview" %}

{% if cluster.cluster_configs %}
{% for service, service_conf in cluster.cluster_configs.items %}

{{ service }}

{% if service_conf %}
    {% for conf_name, conf_value in service_conf.items %}
  • {% blocktrans %}{{ conf_name }}: {{ conf_value }}{% endblocktrans %}
  • {% endfor %}
{% else %}
{% trans "No configurations" %}
{% endif %} {% endfor %}
{% else %}
{% trans "Cluster configurations are not specified" %}
{% endif %}

{% trans "Node Groups Configuration Overview" %}

{% for node_group in cluster.node_groups %}

{% blocktrans with node_group_name=node_group.name %}Node Group Name: {{ node_group_name }}{% endblocktrans %}

{% if node_group.node_configs %}
{% for service, service_conf in node_group.node_configs.items %}

{{ service }}

{% if service_conf %}
    {% for conf_name, conf_value in service_conf.items %}
  • {% blocktrans %}{{ conf_name }}: {{ conf_value }}{% endblocktrans %}
  • {% endfor %}
{% else %}
{% trans "No configurations" %}
{% endif %} {% endfor %}
{% else %}
{% trans "Node group configurations are not specified" %}
{% endif %}
{% endfor %}
././@PaxHeader0000000000000000000000000000023100000000000011451 xustar0000000000000000131 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_configure_general_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_config0000664000175000017500000000122700000000000034131 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans %}This Cluster will be started with:{% endblocktrans %}
{% blocktrans %}Plugin{% endblocktrans %}: {{ plugin_name }}
{% blocktrans %}Version{% endblocktrans %}: {{ hadoop_version }}

{% blocktrans %}Cluster can be launched using existing Cluster Templates.{% endblocktrans %}

{% blocktrans %}The Cluster object should specify OpenStack Image to boot instances for Cluster.{% endblocktrans %}

{% blocktrans %}User has to choose a keypair to have access to clusters instances.{% endblocktrans %}

././@PaxHeader0000000000000000000000000000022100000000000011450 xustar0000000000000000123 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_create_cluster.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_create0000664000175000017500000000135500000000000034131 0ustar00zuulzuul00000000000000{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block form_id %}create_cluster_form{% endblock %} {% block form_action %}{% url 'horizon:project:data_processing.clusters:create' %}{% endblock %} {% block modal-header %}{% trans "Launch Cluster" %}{% endblock %} {% block modal-body %}
{% include "horizon/common/_form_fields.html" %}
{% endblock %} {% block modal-footer %} {% trans "Cancel" %} {% endblock %} ././@PaxHeader0000000000000000000000000000022600000000000011455 xustar0000000000000000128 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_create_general_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_create0000664000175000017500000000014700000000000034127 0ustar00zuulzuul00000000000000{% load i18n %}

{% trans "Select a plugin and version for a new Cluster." %}

././@PaxHeader0000000000000000000000000000021200000000000011450 xustar0000000000000000116 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_details.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_detail0000664000175000017500000000556100000000000034133 0ustar00zuulzuul00000000000000{% load i18n sizeformat %}
{% trans "Name" %}
{{ cluster.name }}
{% trans "Project ID" %}
{% if cluster.tenant_id %}
{{ cluster.tenant_id }}
{% else %}
{{ cluster.project_id }}
{% endif %}
{% trans "ID" %}
{{ cluster.id }}
{% trans "Description" %}
{{ cluster.description|default:_("None") }}
{% trans "Status" %}
{{ cluster.status }}
{% trans "Status description" %}
{% if cluster.status_description %}
{{ cluster.status_description }}
{% else %}
{% trans "No description" %}
{% endif %}
{% if cluster.error_description %}

{% trans "Error Details" %}

{{ cluster.error_description }}

{% endif %}
{% trans "Plugin" %}
{{ cluster.plugin_name }}
{% trans "Version" %}
{{ cluster.hadoop_version }}
{% trans "Template" %}
{% if cluster_template %}
{{ cluster_template.name }}
{% else %}
{% trans "Template not specified" %}
{% endif %} {% if base_image.id %}
{% trans "Base Image" %}
{{ base_image.name }}
{% endif %} {% if network %}
{% trans "Neutron Management Network" %}
{{ network }}
{% endif %}
{% trans "Keypair" %}
{{ cluster.user_keypair_id }}
{% trans "Use auto-configuration" %}
{{ cluster.use_autoconfig }}
{% trans "Public" %}
{{ cluster.is_public|yesno }}
{% trans "Protected" %}
{{ cluster.is_protected|yesno }}
{% trans "Anti-affinity enabled for" %}
{% if cluster.anti_affinity %}
    {% for process in cluster.anti_affinity %}
  • {{ process }}
  • {% endfor %}
{% else %}
{% trans "no processes" %}
{% endif %}
{% for info_key, info_val in cluster.info.items %}
{{ info_key }}
{% for key, val in info_val.items %}
{% autoescape off %}{% blocktrans %}{{ key }}: {{ val }}{% endblocktrans %}{% endautoescape %}
{% endfor %} {% endfor %}
././@PaxHeader0000000000000000000000000000021400000000000011452 xustar0000000000000000118 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_event_log.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_event_0000664000175000017500000000417100000000000034145 0ustar00zuulzuul00000000000000{% load i18n %}

{% trans "Cluster provision steps" %}

{% trans "Step Description" %} {% trans "Started at" %} {% trans "Duration" %} {% trans "Progress" %} {% trans "Status" %}
././@PaxHeader0000000000000000000000000000022600000000000011455 xustar0000000000000000128 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_health_checks_table.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_health0000664000175000017500000000127400000000000034133 0ustar00zuulzuul00000000000000{% load i18n %}

{% trans "Cluster health checks" %}

{% trans "Status" %} {% trans "Name" %} {% trans "Duration" %} {% trans "Description" %}
././@PaxHeader0000000000000000000000000000022000000000000011447 xustar0000000000000000122 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_health_status.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_health0000664000175000017500000000007300000000000034127 0ustar00zuulzuul00000000000000{{ status }} ././@PaxHeader0000000000000000000000000000021600000000000011454 xustar0000000000000000120 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_in_progress.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_in_pro0000664000175000017500000000027200000000000034151 0ustar00zuulzuul00000000000000
{{ status }}
././@PaxHeader0000000000000000000000000000022400000000000011453 xustar0000000000000000126 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_instances_details.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_instan0000664000175000017500000000014000000000000034151 0ustar00zuulzuul00000000000000{% load i18n sizeformat %}
{{ cluster_instances_table.render }}
././@PaxHeader0000000000000000000000000000022500000000000011454 xustar0000000000000000127 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_nodegroups_details.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_nodegr0000664000175000017500000000637400000000000034152 0ustar00zuulzuul00000000000000 {% load i18n sizeformat %}
{% for node_group in cluster.node_groups %}

{% blocktrans with node_group_name=node_group.name %}Name: {{ node_group_name }}{% endblocktrans %}

{% trans "Number of Nodes" %}
{{ node_group.count }}
{% trans "Flavor" %}
{{ node_group.flavor_name|default:_("Flavor is not specified") }}
{% if node_group.floating_ip_pool %}
{% trans "Floating IP Pool" %}
{{ node_group.floating_ip_pool_name }}
{% endif %}
{% trans "Template" %}
{% if node_group.node_group_template_id %}
{{ node_group.node_group_template.name }}
{% else %}
{% trans "Template not specified" %}
{% endif %}
{% trans "Use auto-configuration" %}
{{ node_group.use_autoconfig }}
{% trans "Proxy Gateway" %}
{{ node_group.is_proxy_gateway|yesno }}
{% trans "Auto Security Group" %}
{{ node_group.auto_security_group|yesno }}
{% trans "Security Groups" %}
    {% for group in node_group.security_groups_full %} {% if group.id %}
  • {{ group.name }}
  • {% else %}
  • {{ group.name }}
  • {% endif %} {% endfor %}
{% trans "Node Processes" %}
{% if node_group.node_processes %}
    {% for process in node_group.node_processes %}
  • {{ process }}
  • {% endfor %}
{% else %}
{% trans "Node processes are not specified" %}
{% endif %}

{% trans "HDFS placement" %}

{% if node_group.volumes_per_node %}
{% trans "Volumes per node" %}
{{ node_group.volumes_per_node }}
{% trans "Volumes size" %}
{{ node_group.volumes_size }}
{% trans "Volumes type" %}
{{ node_group.volume_type }}
{% trans "Volumes local to instance" %}
{{ node_group.volume_local_to_instance }}
{% else %}
{% trans "Drive type" %}
{% trans "Ephemeral drive" %}
{% endif %}
{% endfor %}
././@PaxHeader0000000000000000000000000000021600000000000011454 xustar0000000000000000120 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_rich_status.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/_rich_s0000664000175000017500000000025500000000000034133 0ustar00zuulzuul00000000000000{{ status }}  ././@PaxHeader0000000000000000000000000000021300000000000011451 xustar0000000000000000117 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/configure.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/configu0000664000175000017500000000027100000000000034155 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Launch Cluster" %}{% endblock %} {% block main %} {% include 'horizon/common/_workflow.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000021000000000000011446 xustar0000000000000000114 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/create.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/create.0000664000175000017500000000027100000000000034044 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Launch Cluster" %}{% endblock %} {% block main %} {% include 'horizon/common/_workflow.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000022000000000000011447 xustar0000000000000000122 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/create_cluster.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/create_0000664000175000017500000000026700000000000034132 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Launch Cluster" %}{% endblock %} {% block main %} {% include 'clusters/_create_cluster.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000020700000000000011454 xustar0000000000000000113 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/index.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/index.h0000664000175000017500000001632200000000000034064 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Clusters" %}{% endblock %} {% block main %}
{{ tab_group.render }}
{% endblock %} ././@PaxHeader0000000000000000000000000000020700000000000011454 xustar0000000000000000113 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/scale.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/scale.h0000664000175000017500000000027000000000000034037 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Scale Cluster" %}{% endblock %} {% block main %} {% include 'horizon/common/_workflow.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000021000000000000011446 xustar0000000000000000114 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/update.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/clusters/update.0000664000175000017500000000027700000000000034071 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Update Cluster Shares" %}{% endblock %} {% block main %} {% include 'horizon/common/_workflow.html' %} {% endblock %}././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.568072 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/0000775000175000017500000000000000000000000033746 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022200000000000011451 xustar0000000000000000124 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/_edit_tags.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/_0000664000175000017500000000160100000000000034105 0ustar00zuulzuul00000000000000{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block form_id %}edit_tags_form{% endblock %} {% block form_action %}{% url 'horizon:project:data_processing.clusters:edit_tags' image.id %}{% endblock %} {% block modal-header %}{% trans "Edit Image Tags" %}{% endblock %} {% block modal-body %}
{% include "horizon/common/_form_fields.html" %}
{% include 'image_registry/_tag_form.html' %}
{% include 'image_registry/_help.html' %}
{% endblock %} {% block modal-footer %} {% trans "Cancel" %} {% endblock %} ././@PaxHeader0000000000000000000000000000021500000000000011453 xustar0000000000000000119 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/_0000664000175000017500000000272000000000000034110 0ustar00zuulzuul00000000000000{% load i18n %}

{% blocktrans %}Image Registry tool:{% endblocktrans %}


{% blocktrans %}Image Registry is used to provide additional information about images for Data Processing.{% endblocktrans %}

{% blocktrans %}Specified User Name will be used by Data Processing to apply configs and manage processes on instances.{% endblocktrans %}

{% blocktrans %}Warning!{% endblocktrans %}

{% blocktrans trimmed %} Input correct User Name for image. For Ubuntu images input 'ubuntu', 'fedora' for Fedora images, 'cloud-user' for CentOS 6.x images and 'centos' for CentOS 7.x images.{% endblocktrans %}

{% blocktrans trimmed %}Tags are used for filtering images suitable for each plugin and each Data Processing version. To add required tags, select a plugin and a Data Processing version and click the "Add" button.{% endblocktrans %}

{% blocktrans %}You may also add any custom tag.{% endblocktrans %}

{% blocktrans %}Unnecessary tags may be removed by clicking a cross near tag's name.{% endblocktrans %}

././@PaxHeader0000000000000000000000000000022200000000000011451 xustar0000000000000000124 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/_list_tags.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/_0000664000175000017500000000024200000000000034105 0ustar00zuulzuul00000000000000
    {% for tag in image.tags %}
  • {{ tag }}
  • {% endfor %}
././@PaxHeader0000000000000000000000000000022700000000000011456 xustar0000000000000000129 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/_register_image.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/_0000664000175000017500000000152400000000000034111 0ustar00zuulzuul00000000000000{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block form_id %}register_image_form{% endblock %} {% block form_action %}{% url action_url %}{% endblock %} {% block modal-header %}{% trans "Register Image" %}{% endblock %} {% block modal-body %}
{% include "horizon/common/_form_fields.html" %} {% include 'image_registry/_tag_form.html' %}
{% include 'image_registry/_help.html' %}
{% endblock %} {% block modal-footer %} {% trans "Cancel" %} {% endblock %} ././@PaxHeader0000000000000000000000000000022100000000000011450 xustar0000000000000000123 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/_tag_form.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/_0000664000175000017500000001017700000000000034115 0ustar00zuulzuul00000000000000{% load i18n %}
{% for plugin, version_dict in plugins.items %}
{% endfor %}
././@PaxHeader0000000000000000000000000000022100000000000011450 xustar0000000000000000123 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/edit_tags.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/e0000664000175000017500000000027300000000000034117 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Edit Image Tags" %}{% endblock %} {% block main %} {% include 'image_registry/_edit_tags.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000022600000000000011455 xustar0000000000000000128 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/register_image.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/image_registry/r0000664000175000017500000000027700000000000034140 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Register Image" %}{% endblock %} {% block main %} {% include 'image_registry/_register_image.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000021600000000000011454 xustar0000000000000000114 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/ 28 mtime=1648641572.5720723 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templa0000775000175000017500000000000000000000000034221 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000024400000000000011455 xustar0000000000000000142 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/_configure_general_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templa0000664000175000017500000000271700000000000034232 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans %}This Node Group Template will be created for:{% endblocktrans %}
{% blocktrans %}Plugin{% endblocktrans %}: {{ plugin_name }}
{% blocktrans %}Version{% endblocktrans %}: {{ hadoop_version }}
{% if deprecated %}

{% blocktrans %}Warning!{% endblocktrans %}

{% blocktrans trimmed %} Version: {{ hadoop_version }} of plugin {{ plugin_name }} is now deprecated. {% endblocktrans %}

{% endif %}

{% blocktrans trimmed %}The Node Group Template object specifies the processes that will be launched on each instance. Check one or more processes. When processes are selected, you may set node scoped configurations on corresponding tabs.{% endblocktrans %}

{% blocktrans %}You must choose a flavor to determine the size (VCPUs, memory and storage) of all launched VMs.{% endblocktrans %}

{% blocktrans %}Data Processing provides different storage location options. You may choose Ephemeral Drive or a Cinder Volume to be attached to instances.{% endblocktrans %}

././@PaxHeader0000000000000000000000000000024100000000000011452 xustar0000000000000000139 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/_create_general_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templa0000664000175000017500000000022200000000000034217 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans %}Select a plugin and version for the new Node Group template.{% endblocktrans %}

././@PaxHeader0000000000000000000000000000022500000000000011454 xustar0000000000000000127 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/_details.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templa0000664000175000017500000001037700000000000034233 0ustar00zuulzuul00000000000000{% load i18n sizeformat %}
{% trans "Name" %}
{{ template.name }}
{% trans "Project ID" %}
{% if template.tenant_id %}
{{ template.tenant_id }}
{% else %}
{{ template.project_id }}
{% endif %}
{% trans "ID" %}
{{ template.id }}
{% trans "Description" %}
{{ template.description|default:_("None") }}
{% trans "Public" %}
{{ template.is_public|yesno }}
{% trans "Protected" %}
{{ template.is_protected|yesno }}
{% trans "Base Image" %}
{% if template.image_id and base_image_name %}
{{ base_image_name }}
{% else %}
{% trans "No image specified" %}
{% endif %}
{% trans "Flavor" %}
{{ flavor.name }}
{% if template.availability_zone %}
{% trans "Availability Zone" %}
{{ template.availability_zone }}
{% endif %} {% if template.floating_ip_pool %}
{% trans "Floating IP Pool" %}
{{ floating_ip_pool_name }}
{% endif %}
{% trans "Plugin" %}
{{ template.plugin_name }}
{% trans "Version" %}
{{ template.hadoop_version }}
{% trans "Use auto-configuration" %}
{{ template.use_autoconfig }}
{% trans "Proxy Gateway" %}
{{ template.is_proxy_gateway }}
{% trans "Auto Security Group" %}
{{ template.auto_security_group }}
{% if show_bfv %}
{% trans "Boot from Volume" %}
{{ template.boot_from_volume }}
{% if template.boot_from_volume %}
{% trans "Boot Volume type" %}
{{ template.boot_volume_type }}
{% trans "Boot Volume AZ" %}
{{ template.boot_volume_availability_zone }}
{% trans "Boot Volume locality" %}
{{ template.boot_volume_local_to_instance }}
{% endif %} {% endif %}
{% trans "Security Groups" %}
    {% for group in security_groups %} {% if group.id %}
  • {{ group.name }}
  • {% else %}
  • {{ group.name }}
  • {% endif %} {% endfor %}
{% trans "Node Processes" %}
    {% for process in template.node_processes %}
  • {{ process }}
  • {% endfor %}

{% trans "HDFS placement" %}

{% if template.volumes_per_node %}
{% trans "Cinder volumes" %}
{% trans "Volumes per node" %}
{{ template.volumes_per_node }}
{% trans "Volumes size" %}
{{ template.volumes_size }}
{% trans "Volumes type" %}
{{ template.volume_type }}
{% trans "Volumes local to instance" %}
{{ template.volume_local_to_instance }}
{% if template.volumes_availability_zone %}
{% trans "Volumes Availability Zone" %}
{{ template.volumes_availability_zone }}
{% endif %} {% else %}
{% trans "Ephemeral drive" %}
{% endif %}
././@PaxHeader0000000000000000000000000000023100000000000011451 xustar0000000000000000131 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/_fields_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templa0000664000175000017500000000473500000000000034234 0ustar00zuulzuul00000000000000{% load i18n %}
././@PaxHeader0000000000000000000000000000022400000000000011453 xustar0000000000000000126 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/_import.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templa0000664000175000017500000000137200000000000034226 0ustar00zuulzuul00000000000000{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block form_id %}import-nodegroup-template{% endblock %} {% block form_action %}{{ submit_url }}{% endblock %} {% block form_attrs %}enctype="multipart/form-data"{% endblock %} {% block modal-header %}{{ page_title }}{% endblock %} {% block modal-body %}
{% include "horizon/common/_form_fields.html" %}
{% endblock %} {% block modal-footer %} {% trans "Cancel" %} {% endblock %} ././@PaxHeader0000000000000000000000000000023300000000000011453 xustar0000000000000000133 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/_service_confs.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templa0000664000175000017500000000126200000000000034224 0ustar00zuulzuul00000000000000{% load i18n sizeformat %}

{% trans "Service Configurations" %}

{% for service, config in template.node_configs.items %}
{{ service }}
{% if config %}
    {% for conf_name, conf_val in config.items %}
  • {% blocktrans %}{{ conf_name }}: {{ conf_val }}{% endblocktrans %}
  • {% endfor %}
{% else %}
{% trans "No configurations" %}
{% endif %}
{% endfor %}
././@PaxHeader0000000000000000000000000000022600000000000011455 xustar0000000000000000128 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/configure.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templa0000664000175000017500000000030500000000000034221 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Create Node Group Template" %}{% endblock %} {% block main %} {% include 'horizon/common/_workflow.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000022300000000000011452 xustar0000000000000000125 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/create.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templa0000664000175000017500000000044000000000000034221 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{{ name }}{% endblock %} {% block page_header %} {% include "horizon/common/_page_header.html" with title=name %} {% endblock page_header %} {% block main %} {% include 'horizon/common/_workflow.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000022300000000000011452 xustar0000000000000000125 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/import.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templa0000664000175000017500000000031000000000000034215 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Import Node Group Template" %}{% endblock %} {% block main %} {% include 'nodegroup_templates/_import.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/urls.py0000664000175000017500000001453300000000000030303 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.conf.urls import url import sahara_dashboard.content.data_processing.clusters.views as views import sahara_dashboard.content.data_processing.clusters.image_registry. \ views as image_views import sahara_dashboard.content.data_processing.clusters.nodegroup_templates. \ views as ngt_views import sahara_dashboard.content.data_processing.clusters.cluster_templates. \ views as ct_views import sahara_dashboard.content.data_processing.clusters.clusters. \ views as cluster_views import sahara_dashboard.content.data_processing.clusters.wizard. \ views as cluster_guide_views urlpatterns = [url(r'^$', views.IndexView.as_view(), name='index'), url(r'^\?tab=cluster_tabs__image_registry_tab$', views.IndexView.as_view(), name='image-registry-tab'), url(r'^\?tab=cluster_tabs__node_group_templates_tab$', views.IndexView.as_view(), name='nodegroup-templates-tab'), url(r'^\?tab=cluster_tabs__clusters_templates_tab$', views.IndexView.as_view(), name='cluster-templates-tab'), url(r'^\?tab=cluster_tabs__clusters_tab$', views.IndexView.as_view(), name='clusters-tab'), url(r'^create-cluster-template$', ct_views.CreateClusterTemplateView.as_view(), name='create-cluster-template'), url(r'^create-nodegroup-template$', ngt_views.CreateNodegroupTemplateView.as_view(), name='create-nodegroup-template'), url(r'^configure-cluster-template$', ct_views.ConfigureClusterTemplateView.as_view(), name='configure-cluster-template'), url(r'^import-cluster-template-file$', ct_views.ImportClusterTemplateFileView.as_view(), name='import-cluster-template-file'), url(r'^import-cluster-template-name$', ct_views.ImportClusterTemplateNameView.as_view(), name='import-cluster-template-name'), url(r'^import-cluster-template-nodegroups$', ct_views.ImportClusterTemplateNodegroupsView.as_view(), name='import-cluster-template-nodegroups'), url(r'^configure-nodegroup-template$', ngt_views.ConfigureNodegroupTemplateView.as_view(), name='configure-nodegroup-template'), url(r'^import-nodegroup-template-file$', ngt_views.ImportNodegroupTemplateFileView.as_view(), name='import-nodegroup-template-file'), url(r'^import-nodegroup-template-details$', ngt_views.ImportNodegroupTemplateDetailsView.as_view(), name='import-nodegroup-template-details'), url(r'^cluster-template/(?P[^/]+)$', ct_views.ClusterTemplateDetailsView.as_view(), name='ct-details'), url(r'^node-group-template/(?P[^/]+)$', ngt_views.NodegroupTemplateDetailsView.as_view(), name='details'), url(r'^cluster-template/(?P[^/]+)/copy$', ct_views.CopyClusterTemplateView.as_view(), name='ct-copy'), url(r'^cluster-template/(?P[^/]+)/edit$', ct_views.EditClusterTemplateView.as_view(), name='ct-edit'), url(r'^node-group-template/(?P[^/]+)/copy$', ngt_views.CopyNodegroupTemplateView.as_view(), name='copy'), url(r'^node-group-template/(?P[^/]+)/edit$', ngt_views.EditNodegroupTemplateView.as_view(), name='edit'), url(r'^create-cluster$', cluster_views.CreateClusterView.as_view(), name='create-cluster'), url(r'^configure-cluster$', cluster_views.ConfigureClusterView.as_view(), name='configure-cluster'), url(r'^cluster/(?P[^/]+)$', cluster_views.ClusterDetailsView.as_view(), name='cluster-details'), url(r'^cluster/(?P[^/]+)/events$', cluster_views.ClusterEventsView.as_view(), name='events'), url(r'^cluster/(?P[^/]+)/scale$', cluster_views.ScaleClusterView.as_view(), name='scale'), url(r'^cluster/(?P[^/]+)/verifications$', cluster_views.ClusterHealthChecksView.as_view(), name='verifications'), url(r'^cluster/(?P[^/]+)/update_shares$', cluster_views.UpdateClusterSharesView.as_view(), name='update-shares'), url(r'^edit_tags/(?P[^/]+)/$', image_views.EditTagsView.as_view(), name='edit_tags'), url(r'^register/$', image_views.RegisterImageView.as_view(), name='register'), url(r'^cluster_guide$', cluster_guide_views.ClusterGuideView.as_view(), name='cluster_guide'), url(r'^cluster_guide/(?P[^/]+)/$', cluster_guide_views.ResetClusterGuideView.as_view(), name='reset_cluster_guide'), url(r'^image_register/$', cluster_guide_views.ImageRegisterView.as_view(), name='image_register'), url(r'^plugin_select$', cluster_guide_views.PluginSelectView.as_view(), name='plugin_select'), url(r'^ngt_select$', cluster_guide_views.NodeGroupSelectView.as_view(), name='ngt_select'), ] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/views.py0000664000175000017500000000312100000000000030442 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ from horizon import tabs from sahara_dashboard.content.data_processing.clusters.cluster_templates \ import tabs as cluster_templates_tabs from sahara_dashboard.content.data_processing.clusters.clusters \ import tabs as clusters_tabs from sahara_dashboard.content.data_processing.clusters.image_registry \ import tabs as image_registry_tabs from sahara_dashboard.content.data_processing.clusters.nodegroup_templates \ import tabs as node_group_templates_tabs from sahara_dashboard.content.data_processing.tabs \ import PaginationFriendlyTabGroup class ClusterTabs(PaginationFriendlyTabGroup): slug = "cluster_tabs" tabs = (clusters_tabs.ClustersTab, cluster_templates_tabs.ClusterTemplatesTab, node_group_templates_tabs.NodeGroupTemplatesTab, image_registry_tabs.ImageRegistryTab,) sticky = True class IndexView(tabs.TabbedTableView): tab_group_class = ClusterTabs template_name = "clusters/index.html" page_title = _("Clusters") ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5720723 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/wizard/0000775000175000017500000000000000000000000030236 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/wizard/__init__.py0000664000175000017500000000000000000000000032335 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/wizard/forms.py0000664000175000017500000001370100000000000031740 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django import template from django.template import defaultfilters from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import forms from horizon import messages from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.utils \ import helpers from sahara_dashboard import utils class ChoosePluginForm(forms.SelfHandlingForm): def __init__(self, request, *args, **kwargs): super(ChoosePluginForm, self).__init__(request, *args, **kwargs) self._generate_plugin_version_fields(request) self.help_text_template = ("cluster_wizard/" "_plugin_select_help.html") def handle(self, request, context): try: hlps = helpers.Helpers(request) hlps.reset_guide() plugin_name = context["plugin_name"] request.session["plugin_name"] = plugin_name request.session["plugin_version"] = ( context[plugin_name + "_version"]) messages.success(request, _("Cluster type chosen")) return True except Exception: exceptions.handle(request, _("Unable to set cluster type")) return False def _generate_plugin_version_fields(self, request): sahara = saharaclient.client(request) plugins = sahara.plugins.list() plugin_choices = [(plugin.name, plugin.title) for plugin in plugins] self.fields["plugin_name"] = forms.ChoiceField( label=_("Plugin Name"), choices=plugin_choices, widget=forms.Select(attrs={"class": "switchable", "data-slug": "plugin"})) for plugin in plugins: field_name = plugin.name + "_version" version_choices = (sorted( [(version, version) for version in plugin.versions], reverse=True, key=lambda v: utils.smart_sort_helper(v[0])) ) choice_field = forms.ChoiceField( label=_("Version"), required=False, choices=version_choices, widget=forms.Select( attrs={"class": "switched", "data-switch-on": "plugin", "data-plugin-" + plugin.name: plugin.title}) ) self.fields[field_name] = choice_field def get_help_text(self, extra_context=None): text = "" extra_context = extra_context or {} if self.help_text_template: tmpl = template.loader.get_template(self.help_text_template) text += tmpl.render(extra_context, self.request) else: text += defaultfilters.linebreaks(force_text(self.help_text)) return defaultfilters.safe(text) class Meta(object): name = _("Choose plugin type and version") class ChooseTemplateForm(forms.SelfHandlingForm): guide_ngt = forms.ChoiceField( label=_("Node Group Template"), widget=forms.Select()) def __init__(self, request, *args, **kwargs): super(ChooseTemplateForm, self).__init__(request, *args, **kwargs) self.help_text_template = ("cluster_wizard/" "_ngt_select_help.html") self.fields["guide_ngt"].choices = \ self.populate_guide_ngt_choices() template_type = getattr( self.request, self.request.method).get("guide_template_type") if template_type: self.fields["guide_template_type"] = forms.CharField( required=False, widget=forms.HiddenInput(), initial=template_type) plugin_name = getattr( self.request, self.request.method).get("plugin_name") if plugin_name: self.fields["plugin_name"] = forms.CharField( required=False, widget=forms.HiddenInput(), initial=plugin_name) plugin_version = getattr( self.request, self.request.method).get("hadoop_version") if plugin_version: self.fields["hadoop_version"] = forms.CharField( required=False, widget=forms.HiddenInput(), initial=plugin_version) def populate_guide_ngt_choices(self): plugin = getattr(self.request, self.request.method).get("plugin_name") version = getattr( self.request, self.request.method).get("hadoop_version") data = saharaclient.nodegroup_template_find(self.request, plugin_name=plugin, hadoop_version=version) choices = [("%s|%s" % (ngt.name, ngt.id), ngt.name) for ngt in data] return choices def handle(self, request, context): try: name_key = context["guide_template_type"] + "_name" id_key = context["guide_template_type"] + "_id" (name, id) = context["guide_ngt"].split("|") request.session[name_key] = name request.session[id_key] = id messages.success(request, _("Job type chosen")) return True except Exception: exceptions.handle(request, _("Unable to set node group template")) return False ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/wizard/tests.py0000664000175000017500000000266300000000000031761 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.urls import reverse from sahara_dashboard import api from sahara_dashboard.test import helpers as test CLUSTER_GUIDE_URL = reverse( 'horizon:project:data_processing.clusters:cluster_guide') CLUSTER_GUIDE_RESET_URL = reverse( 'horizon:project:data_processing.clusters:reset_cluster_guide', kwargs={"reset_cluster_guide": "true"}) class DataProcessingClusterGuideTests(test.TestCase): @test.create_mocks({api.sahara: ('nodegroup_template_find',)}) def test_cluster_guide(self): res = self.client.get(CLUSTER_GUIDE_URL) self.assertTemplateUsed( res, 'cluster_wizard/cluster_guide.html') self.assertContains(res, 'Guided Cluster Creation') self.assertContains(res, 'Current choice') def test_cluster_guide_reset(self): res = self.client.get(CLUSTER_GUIDE_RESET_URL) self.assertRedirectsNoFollow(res, CLUSTER_GUIDE_URL) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/clusters/wizard/views.py0000664000175000017500000000610400000000000031746 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django import http from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ from django.views import generic from horizon import forms from horizon import views as horizon_views from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.utils \ import helpers import sahara_dashboard.content. \ data_processing.clusters.image_registry.views as imgviews import sahara_dashboard.content.data_processing.clusters.wizard \ .forms as wizforms class ClusterGuideView(horizon_views.APIView): template_name = 'cluster_wizard/cluster_guide.html' page_title = _("Guided Cluster Creation") def show_existing_templates(self): try: plugin = self.request.session.get("plugin_name", None) version = self.request.session.get("plugin_version", None) data = saharaclient.nodegroup_template_find( self.request, plugin_name=plugin, hadoop_version=version) if len(data) < 1: return False return True except Exception: return True class ResetClusterGuideView(generic.RedirectView): pattern_name = 'horizon:project:data_processing.clusters:cluster_guide' permanent = True def get(self, request, *args, **kwargs): if kwargs["reset_cluster_guide"]: hlps = helpers.Helpers(request) hlps.reset_guide() return http.HttpResponseRedirect(reverse_lazy(self.pattern_name)) class ImageRegisterView(imgviews.RegisterImageView): success_url = reverse_lazy( 'horizon:project:data_processing.clusters:cluster_guide') def get_context_data(self, **kwargs): context = super(ImageRegisterView, self).get_context_data(**kwargs) context['action_url'] = ('horizon:project' ':data_processing.clusters:image_register') return context class PluginSelectView(forms.ModalFormView): form_class = wizforms.ChoosePluginForm success_url = reverse_lazy( 'horizon:project:data_processing.clusters:cluster_guide') classes = ("ajax-modal") template_name = "cluster_wizard/plugin_select.html" page_title = _("Choose plugin and version") class NodeGroupSelectView(forms.ModalFormView): form_class = wizforms.ChooseTemplateForm success_url = reverse_lazy( 'horizon:project:data_processing.clusters:cluster_guide') classes = ("ajax-modal") template_name = "cluster_wizard/ngt_select.html" page_title = _("Choose node group template") ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5720723 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/0000775000175000017500000000000000000000000027544 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/__init__.py0000664000175000017500000000000000000000000031643 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/panel.py0000664000175000017500000000165700000000000031226 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ import horizon from openstack_dashboard.dashboards.project import dashboard class PluginsPanel(horizon.Panel): name = _("Plugins") slug = 'data_processing.data_plugins' permissions = (('openstack.services.data-processing', 'openstack.services.data_processing'),) dashboard.Project.register(PluginsPanel) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/tables.py0000664000175000017500000000344700000000000031400 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.template import loader from django.utils.translation import ugettext_lazy as _ from horizon import tables from sahara_dashboard.content.data_processing.utils \ import workflow_helpers as w_helpers class UpdatePluginAction(tables.LinkAction): name = "update_plugin" verbose_name = _("Update Plugin") url = "horizon:project:data_processing.data_plugins:update" classes = ("ajax-modal", "btn-edit") def versions_to_string(plugin): template_name = 'data_plugins/_list_versions.html' versions = w_helpers.get_enabled_versions(plugin) context = {"versions": versions} return loader.render_to_string(template_name, context) class PluginsTable(tables.DataTable): title = tables.Column("title", verbose_name=_("Title"), link=("horizon:project:data_processing." "data_plugins:plugin-details")) versions = tables.Column(versions_to_string, verbose_name=_("Enabled Versions")) description = tables.Column("description", verbose_name=_("Description")) class Meta(object): name = "plugins" verbose_name = _("Plugins") row_actions = (UpdatePluginAction,) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/tabs.py0000664000175000017500000000764200000000000031060 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from oslo_log import log as logging from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import tabs from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.data_plugins \ import tables as plugin_tables from sahara_dashboard.content.data_processing \ import tabs as sahara_tabs LOG = logging.getLogger(__name__) class PluginsTab(sahara_tabs.SaharaTableTab): table_classes = (plugin_tables.PluginsTable, ) name = _("Plugins") slug = "plugins_tab" template_name = "horizon/common/_detail_table.html" def get_plugins_data(self): try: plugins = saharaclient.plugin_list(self.request) except Exception: plugins = [] exceptions.handle(self.request, _("Unable to fetch plugin list")) return plugins class DetailsTab(tabs.Tab): name = _("Details") slug = "plugin_details_tab" template_name = "data_plugins/_details.html" def _generate_context(self, plugin): if not plugin: return {'plugin': plugin} def get_context_data(self, request): plugin_id = self.tab_group.kwargs['plugin_id'] plugin = None try: plugin = saharaclient.plugin_get(request, plugin_id) except Exception as e: LOG.error("Unable to get plugin with plugin_id %s (%s)" % (plugin_id, str(e))) exceptions.handle(self.tab_group.request, _('Unable to retrieve plugin.')) return {"plugin": plugin} class LabelsTab(tabs.Tab): name = _("Label details") slug = "label_details_tab" template_name = "data_plugins/_label_details.html" def _label_color(self, label): color = 'info' if label == 'deprecated': color = 'danger' elif label == 'stable': color = 'success' return color def get_context_data(self, request, **kwargs): plugin_id = self.tab_group.kwargs['plugin_id'] plugin = None try: plugin = saharaclient.plugin_get(request, plugin_id) except Exception as e: LOG.error("Unable to get plugin with plugin_id %s (%s)" % (plugin_id, str(e))) exceptions.handle(self.tab_group.request, _('Unable to retrieve plugin.')) labels = [] for label, data in plugin.plugin_labels.items(): labels.append( {'name': label, 'color': self._label_color(label), 'description': data.get('description', _("No description")), 'scope': _("Plugin"), 'status': data.get('status', False)}) for version, version_data in plugin.version_labels.items(): for label, data in version_data.items(): labels.append( {'name': label, 'color': self._label_color(label), 'description': data.get('description', _("No description")), 'scope': _("Plugin version %s") % version, 'status': data.get('status', False)}) return {"labels": labels} class PluginDetailsTabs(tabs.TabGroup): slug = "cluster_details" tabs = (DetailsTab, LabelsTab) sticky = True ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5320704 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/templates/0000775000175000017500000000000000000000000031542 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021300000000000011451 xustar0000000000000000111 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins/ 28 mtime=1648641572.5760722 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins0000775000175000017500000000000000000000000034135 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022200000000000011451 xustar0000000000000000124 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins/_details.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins0000664000175000017500000000075600000000000034147 0ustar00zuulzuul00000000000000{% load i18n %}
{% trans "Name" %}
{{ plugin.name }}
{% trans "Title" %}
{{ plugin.title }}
{% trans "Description" %}
{{ plugin.description }}
{% trans "Supported Versions" %}
    {% for version in plugin.versions %}
  • {{ version }}
  • {% endfor %}
././@PaxHeader0000000000000000000000000000023000000000000011450 xustar0000000000000000130 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins/_label_details.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins0000664000175000017500000000146600000000000034146 0ustar00zuulzuul00000000000000{% load i18n %}

{% trans "Cluster health checks" %}

{% for label in labels %} {% endfor %}
{% trans "Label" %} {% trans "Scope" %} {% trans "Checked?" %} {% trans "Description" %}
{{ label.name }} {{ label.scope }} {{ label.status|yesno }} {{ label.description }}
././@PaxHeader0000000000000000000000000000023000000000000011450 xustar0000000000000000130 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins/_list_versions.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins0000664000175000017500000000044700000000000034144 0ustar00zuulzuul00000000000000{% load i18n %}
    {% if versions %} {% for version in versions %}
  • {{ version }}
  • {% endfor %} {% else %} {% trans "No enabled versions" %} {% endif %}
././@PaxHeader0000000000000000000000000000022100000000000011450 xustar0000000000000000123 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins/plugins.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins0000664000175000017500000000030600000000000034136 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Data Processing" %}{% endblock %} {% block main %}
{{ plugins_table.render }}
{% endblock %} ././@PaxHeader0000000000000000000000000000022000000000000011447 xustar0000000000000000122 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins/update.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins0000664000175000017500000000026700000000000034144 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Update Plugin" %}{% endblock %} {% block main %} {% include 'horizon/common/_workflow.html' %} {% endblock %}././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/tests.py0000664000175000017500000000361500000000000031265 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from unittest import mock from django.urls import reverse from sahara_dashboard import api from sahara_dashboard.test import helpers as test from sahara_dashboard.test.helpers import IsHttpRequest INDEX_URL = reverse( 'horizon:project:data_processing.data_plugins:index') DETAILS_URL = reverse( 'horizon:project:data_processing.data_plugins:plugin-details', args=['id']) class DataProcessingPluginsTests(test.TestCase): @test.create_mocks({api.sahara: ('plugin_list',)}) def test_index(self): self.mock_plugin_list.return_value = self.plugins.list() res = self.client.get(INDEX_URL) self.mock_plugin_list.assert_called_once_with(IsHttpRequest()) self.assertTemplateUsed(res, 'data_plugins/plugins.html') self.assertContains(res, 'vanilla') self.assertContains(res, 'plugin') @test.create_mocks({api.sahara: ('plugin_get',)}) def test_details(self): self.mock_plugin_get.return_value = self.plugins.list()[0] res = self.client.get(DETAILS_URL) self.assert_mock_multiple_calls_with_same_arguments( self.mock_plugin_get, 2, mock.call(test.IsHttpRequest(), test.IsA(str))) self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertContains(res, 'vanilla') self.assertContains(res, 'plugin') ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/urls.py0000664000175000017500000000165600000000000031113 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.conf.urls import url from sahara_dashboard.content.data_processing.data_plugins import views urlpatterns = [ url(r'^$', views.PluginsView.as_view(), name='index'), url(r'^(?P[^/]+)$', views.PluginDetailsView.as_view(), name='plugin-details'), url(r'^(?P[^/]+)/update', views.UpdatePluginView.as_view(), name='update'), ] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/views.py0000664000175000017500000000534000000000000031255 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import tables from horizon import tabs from horizon import workflows from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing.data_plugins. \ tables as p_tables import sahara_dashboard.content.data_processing.data_plugins. \ tabs as p_tabs from sahara_dashboard.content.data_processing.data_plugins.workflows \ import update class PluginsView(tables.DataTableView): table_class = p_tables.PluginsTable template_name = 'data_plugins/plugins.html' page_title = _("Data Processing Plugins") def get_data(self): try: plugins = saharaclient.plugin_list(self.request) except Exception: plugins = [] msg = _('Unable to retrieve data processing plugins.') exceptions.handle(self.request, msg) return plugins class PluginDetailsView(tabs.TabView): tab_group_class = p_tabs.PluginDetailsTabs template_name = 'horizon/common/_detail.html' page_title = _("Data Processing Plugin Details") class UpdatePluginView(workflows.WorkflowView): workflow_class = update.UpdatePlugin success_url = "horizon:project:data_processing.data_plugins" classes = ("ajax-modal",) template_name = "data_plugins/update.html" page_title = _("Update Plugin") def get_context_data(self, **kwargs): context = super(UpdatePluginView, self) \ .get_context_data(**kwargs) context["plugin_name"] = kwargs["plugin_name"] return context def get_object(self, *args, **kwargs): if not hasattr(self, "_object"): plugin_name = self.kwargs['plugin_name'] try: plugin = saharaclient.plugin_get(self.request, plugin_name) except Exception: exceptions.handle(self.request, _("Unable to fetch plugin object.")) self._object = plugin return self._object def get_initial(self): initial = super(UpdatePluginView, self).get_initial() initial['plugin_name'] = self.kwargs['plugin_name'] return initial ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5760722 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/workflows/0000775000175000017500000000000000000000000031601 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/workflows/__init__.py0000664000175000017500000000000000000000000033700 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/data_plugins/workflows/update.py0000664000175000017500000001014100000000000033432 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ from saharaclient.api import base as api_base from horizon import exceptions from horizon import forms from horizon import workflows from sahara_dashboard.api import sahara as saharaclient class UpdateLabelsAction(workflows.Action): def __init__(self, request, *args, **kwargs): super(UpdateLabelsAction, self).__init__(request, *args, **kwargs) plugin_name = [ x['plugin_name'] for x in args if 'plugin_name' in x][0] plugin = saharaclient.plugin_get(request, plugin_name) self._serialize_labels( 'plugin_', _("Plugin label"), plugin.plugin_labels) vers_labels = plugin.version_labels for version in vers_labels.keys(): field_label = _("Plugin version %(version)s label") % { 'version': version} self._serialize_labels( 'version_%s_' % version, field_label, vers_labels[version]) self.fields["plugin_name"] = forms.CharField( widget=forms.HiddenInput(), initial=plugin_name) def _serialize_labels(self, prefix, prefix_trans, labels): for name, label in labels.items(): if not label['mutable']: continue res_name_translated = "%s: %s" % (prefix_trans, name) res_name = "label_%s%s" % (prefix, name) self.fields[res_name] = forms.BooleanField( label=res_name_translated, help_text=label['description'], widget=forms.CheckboxInput(), initial=label['status'], required=False, ) class Meta(object): name = _("Plugin") help_text = _("Update the plugin labels") class UpdatePluginStep(workflows.Step): action_class = UpdateLabelsAction depends_on = ('plugin_name', ) def contribute(self, data, context): for name, item in data.items(): context[name] = item return context class UpdatePlugin(workflows.Workflow): slug = "update_plugin" name = _("Update Plugin") success_message = _("Updated") failure_message = _("Could not update plugin") success_url = "horizon:project:data_processing.data_plugins:index" default_steps = (UpdatePluginStep,) def __init__(self, request, context_seed, entry_point, *args, **kwargs): super(UpdatePlugin, self).__init__( request, context_seed, entry_point, *args, **kwargs) def _get_update_values(self, context): values = {'plugin_labels': {}, 'version_labels': {}} for item, item_value in context.items(): if not item.startswith('label_'): continue name = item.split('_')[1:] if name[0] == 'plugin': values['plugin_labels'][name[1]] = {'status': item_value} else: if name[1] not in values['version_labels']: values['version_labels'][name[1]] = {} values['version_labels'][ name[1]][name[2]] = {'status': item_value} return values def handle(self, request, context): try: update_values = self._get_update_values(context) saharaclient.plugin_update( request, context['plugin_name'], update_values) return True except api_base.APIException as e: self.error_description = str(e) return False except Exception: exceptions.handle(request, _("Plugin update failed.")) return False ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5760722 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/0000775000175000017500000000000000000000000026027 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/__init__.py0000664000175000017500000000000000000000000030126 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5760722 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/data_sources/0000775000175000017500000000000000000000000030503 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/data_sources/__init__.py0000664000175000017500000000000000000000000032602 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/data_sources/tables.py0000664000175000017500000000735300000000000032337 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ungettext_lazy from horizon import tables from horizon.tabs import base as tabs_base from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing \ import tables as sahara_table from sahara_dashboard.content.data_processing.utils \ import acl as acl_utils class CreateDataSource(tables.LinkAction): name = "create data source" verbose_name = _("Create Data Source") url = "horizon:project:data_processing.jobs:create-data-source" classes = ("ajax-modal",) icon = "plus" class DeleteDataSource(tables.DeleteAction): @staticmethod def action_present(count): return ungettext_lazy( u"Delete Data Source", u"Delete Data Sources", count ) @staticmethod def action_past(count): return ungettext_lazy( u"Deleted Data Source", u"Deleted Data Sources", count ) def delete(self, request, obj_id): saharaclient.data_source_delete(request, obj_id) class EditDataSource(tables.LinkAction): name = "edit data source" verbose_name = _("Edit Data Source") url = "horizon:project:data_processing.jobs:edit-data-source" classes = ("ajax-modal",) class MakePublic(acl_utils.MakePublic): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.data_source_update( request, datum_id, update_kwargs) class MakePrivate(acl_utils.MakePrivate): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.data_source_update( request, datum_id, update_kwargs) class MakeProtected(acl_utils.MakeProtected): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.data_source_update( request, datum_id, update_kwargs) class MakeUnProtected(acl_utils.MakeUnProtected): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.data_source_update( request, datum_id, update_kwargs) class DataSourcesTable(sahara_table.SaharaPaginateTabbedTable): tab_name = 'job_tabs%sdata_sources_tab' % tabs_base.SEPARATOR name = tables.Column("name", verbose_name=_("Name"), link=("horizon:project:data_processing." "jobs:ds-details")) type = tables.Column("type", verbose_name=_("Type")) description = tables.Column("description", verbose_name=_("Description")) class Meta(object): name = "data_sources" verbose_name = _("Data Sources") table_actions = (CreateDataSource, DeleteDataSource) table_actions_menu = (MakePublic, MakePrivate, MakeProtected, MakeUnProtected) row_actions = (DeleteDataSource, EditDataSource, MakePublic, MakePrivate, MakeProtected, MakeUnProtected) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/data_sources/tabs.py0000664000175000017500000000416500000000000032014 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from oslo_log import log as logging from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import tabs from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.jobs.data_sources \ import tables as data_source_tables from sahara_dashboard.content.data_processing \ import tabs as sahara_tabs LOG = logging.getLogger(__name__) class DataSourcesTab(sahara_tabs.SaharaTableTab): table_classes = (data_source_tables.DataSourcesTable, ) name = _("Data Sources") slug = "data_sources_tab" template_name = "horizon/common/_detail_table.html" def get_data_sources_data(self): try: data_sources = saharaclient.data_source_list(self.request) except Exception: data_sources = [] exceptions.handle(self.request, _("Unable to fetch data source list")) return data_sources class GeneralTab(tabs.Tab): name = _("General Info") slug = "data_source_details_tab" template_name = "data_sources/_details.html" def get_context_data(self, request): data_source_id = self.tab_group.kwargs['data_source_id'] try: data_source = saharaclient.data_source_get(request, data_source_id) except Exception as e: data_source = {} LOG.error("Unable to fetch data source details: %s" % str(e)) return {"data_source": data_source} class DataSourceDetailsTabs(tabs.TabGroup): slug = "data_source_details" tabs = (GeneralTab,) sticky = True ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/data_sources/tests.py0000664000175000017500000001717100000000000032226 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from unittest import mock from django.urls import reverse from sahara_dashboard import api from sahara_dashboard.test import helpers as test from sahara_dashboard.test.helpers import IsA from sahara_dashboard.test.helpers import IsHttpRequest INDEX_URL = reverse('horizon:project:data_processing.jobs:index') DETAILS_URL = reverse( 'horizon:project:data_processing.jobs:ds-details', args=['id']) CREATE_URL = reverse( 'horizon:project:data_processing.jobs:create-data-source') EDIT_URL = reverse( 'horizon:project:data_processing.jobs:edit-data-source', args=['id']) class DataProcessingDataSourceTests(test.TestCase): @test.create_mocks({api.sahara: ('job_execution_list', 'plugin_list', 'job_binary_list', 'data_source_list', 'job_list')}) def test_index(self): self.mock_data_source_list.return_value = self.data_sources.list() res = self.client.get(INDEX_URL) self.mock_data_source_list.assert_called_once_with( IsHttpRequest()) self.assertTemplateUsed(res, 'jobs/index.html') self.assertContains(res, 'Data Sources') self.assertContains(res, 'Name') self.assertContains(res, 'sampleOutput') self.assertContains(res, 'sampleOutput2') @test.create_mocks({api.sahara: ('data_source_get',)}) def test_details(self): self.mock_data_source_get.return_value = self.data_sources.first() res = self.client.get(DETAILS_URL) self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertContains(res, 'sampleOutput') @test.create_mocks({api.sahara: ('data_source_list', 'data_source_delete')}) def test_delete(self): data_source = self.data_sources.first() self.mock_data_source_list.return_value = self.data_sources.list() self.mock_data_source_delete.return_value = None form_data = {'action': 'data_sources__delete__%s' % data_source.id} res = self.client.post(INDEX_URL, form_data) self.mock_data_source_list.assert_called_once_with( IsHttpRequest()) self.mock_data_source_delete.assert_called_once_with( IsHttpRequest(), data_source.id) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, INDEX_URL) self.assertMessageCount(success=1) @test.create_mocks({api.sahara: ('data_source_create',)}) def test_create(self): data_source = self.data_sources.first() self.mock_data_source_create.return_value = \ self.data_sources.first() form_data = { 'data_source_url': data_source.url, 'data_source_name': data_source.name, 'data_source_description': data_source.description, 'data_source_type': data_source.type, 'is_public': False, 'is_protected': False, } res = self.client.post(CREATE_URL, form_data) self.mock_data_source_create.assert_called_once_with( IsHttpRequest(), data_source.name, data_source.description, data_source.type, data_source.url, '', '', is_public=False, is_protected=False, s3_credentials=None) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, INDEX_URL) self.assertMessageCount(success=1) @test.create_mocks({api.sahara: ('data_source_update', 'data_source_get',)}) def test_edit(self): data_source = self.data_sources.first() api_data = { 'url': data_source.url, 'credentials': {'user': '', 'password': ''}, 'type': data_source.type, 'name': data_source.name, 'description': data_source.description, 'is_public': False, 'is_protected': False, } self.mock_data_source_get.return_value = self.data_sources.first() self.mock_data_source_update.return_value = self.data_sources.first() form_data = { 'data_source_url': data_source.url, 'data_source_name': data_source.name, 'data_source_description': data_source.description, 'data_source_type': data_source.type, } res = self.client.post(EDIT_URL, form_data) self.mock_data_source_get.assert_called_once_with( IsHttpRequest(), IsA(str)) self.mock_data_source_update.assert_called_once_with( IsHttpRequest(), IsA(str), api_data) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, INDEX_URL) self.assertMessageCount(success=1) @test.create_mocks({api.manila: ('share_list', ), api.sahara: ('data_source_create', ), api.sahara.base: ('is_service_enabled', )}) def test_create_manila(self): share = mock.Mock() share.return_value = { 'id': 'tuvwxy56-1234-abcd-abcd-defabcdaedcb', 'name': 'Test Share' } shares = [share] self.mock_is_service_enabled.return_value = True self.mock_data_source_create.return_value = True self.mock_share_list.return_value = shares form_data = { "data_source_type": "manila", "data_source_manila_share": share.id, "data_source_url": "/testfile.bin", "data_source_name": "testmanila", "data_source_description": "Test manila description", } res = self.client.post(CREATE_URL, form_data) self.mock_is_service_enabled.assert_called_once_with( IsHttpRequest(), IsA(str)) self.mock_data_source_create.assert_called_once_with( IsHttpRequest(), IsA(str), IsA(str), IsA(str), IsA(str), '', '', is_public=False, is_protected=False, s3_credentials=None) self.mock_share_list.assert_called_once_with(IsHttpRequest()) self.assertNoFormErrors(res) @test.create_mocks({api.sahara: ('data_source_create',)}) def test_create_s3(self): form_data = { "data_source_type": "s3", "data_source_url": "s3a://a/b", "data_source_credential_accesskey": "acc", "data_source_credential_secretkey": "sec", "data_source_credential_endpoint": "pointy.end", "data_source_credential_s3_bucket_in_url": False, "data_source_credential_s3_ssl": True, "data_source_name": "tests3", "data_source_description": "Test s3 description" } res = self.client.post(CREATE_URL, form_data) self.mock_data_source_create.return_value = True self.mock_data_source_create.assert_called_once_with( IsHttpRequest(), IsA(str), IsA(str), IsA(str), IsA(str), IsA(str), IsA(str), is_public=False, is_protected=False, s3_credentials=IsA(dict)) self.assertNoFormErrors(res) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/data_sources/views.py0000664000175000017500000000630300000000000032214 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.urls import reverse from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import tabs from horizon.utils import memoized from horizon import workflows from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing.jobs. \ data_sources.tables as ds_tables import sahara_dashboard.content.data_processing.jobs. \ data_sources.tabs as _tabs import sahara_dashboard.content.data_processing.jobs. \ data_sources.workflows.create as create_flow import sahara_dashboard.content.data_processing.jobs. \ data_sources.workflows.edit as edit_flow class CreateDataSourceView(workflows.WorkflowView): workflow_class = create_flow.CreateDataSource success_url = \ "horizon:project:data_processing.jobs:create-data-source" classes = ("ajax-modal",) template_name = "data_sources/create.html" page_title = _("Create Data Source") class EditDataSourceView(CreateDataSourceView): workflow_class = edit_flow.EditDataSource page_title = _("Edit Data Source") def get_context_data(self, **kwargs): context = super(EditDataSourceView, self) \ .get_context_data(**kwargs) context["data_source_id"] = kwargs["data_source_id"] return context def get_initial(self): initial = super(EditDataSourceView, self).get_initial() initial['data_source_id'] = self.kwargs['data_source_id'] return initial class DataSourceDetailsView(tabs.TabView): tab_group_class = _tabs.DataSourceDetailsTabs template_name = 'horizon/common/_detail.html' page_title = "{{ data_source.name|default:data_source.id }}" @memoized.memoized_method def get_object(self): ds_id = self.kwargs["data_source_id"] try: return saharaclient.data_source_get(self.request, ds_id) except Exception: msg = _('Unable to retrieve details for data source "%s".') % ds_id redirect = self.get_redirect_url() exceptions.handle(self.request, msg, redirect=redirect) def get_context_data(self, **kwargs): context = super(DataSourceDetailsView, self).get_context_data(**kwargs) data_source = self.get_object() context['data_source'] = data_source context['url'] = self.get_redirect_url() context['actions'] = self._get_actions(data_source) return context def _get_actions(self, data_source): table = ds_tables.DataSourcesTable(self.request) return table.render_row_actions(data_source) @staticmethod def get_redirect_url(): return reverse("horizon:project:data_processing.jobs:index") ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5760722 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/data_sources/workflows/0000775000175000017500000000000000000000000032540 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021000000000000011446 xustar0000000000000000114 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/data_sources/workflows/__init__.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/data_sources/workflows/__init_0000664000175000017500000000000000000000000034051 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020600000000000011453 xustar0000000000000000112 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/data_sources/workflows/create.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/data_sources/workflows/create.0000664000175000017500000002150600000000000034010 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import forms from horizon import workflows from sahara_dashboard.api import manila as manilaclient from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.utils \ import acl as acl_utils from sahara_dashboard.content.data_processing \ .utils import helpers class GeneralConfigAction(workflows.Action): data_source_name = forms.CharField(label=_("Name")) data_source_type = forms.ChoiceField( label=_("Data Source Type"), widget=forms.Select(attrs={ "class": "switchable", "data-slug": "ds_type" })) data_source_manila_share = forms.ChoiceField( label=_("Manila share"), required=False, widget=forms.Select(attrs={ "class": "switched", "data-switch-on": "ds_type", "data-ds_type-manila": _("Manila share") })) data_source_url = forms.CharField( label=_("URL"), widget=forms.TextInput(attrs={ "class": "switched", "data-switch-on": "ds_type", "data-ds_type-manila": _("Path on share"), "data-ds_type-swift": _("URL"), "data-ds_type-hdfs": _("URL"), "data-ds_type-maprfs": _("URL"), "data-ds_type-s3": _("URL"), })) data_source_credential_user = forms.CharField( label=_("Source username"), required=False, widget=forms.TextInput(attrs={ "class": "switched", "data-switch-on": "ds_type", "data-ds_type-swift": _("Source username") })) data_source_credential_pass = forms.CharField( widget=forms.PasswordInput(attrs={ 'class': 'switched', 'data-switch-on': 'ds_type', 'data-ds_type-swift': _("Source password"), 'autocomplete': 'off' }), label=_("Source password"), required=False) data_source_credential_accesskey = forms.CharField( label=_("S3 accsss key"), required=False, widget=forms.TextInput(attrs={ "class": "switched", "data-switch-on": "ds_type", "data-ds_type-s3": _("S3 access key") })) data_source_credential_secretkey = forms.CharField( widget=forms.PasswordInput(attrs={ 'class': 'switched', 'data-switch-on': 'ds_type', 'data-ds_type-s3': _("S3 secret key"), 'autocomplete': 'off' }), label=_("S3 secret key"), required=False) data_source_credential_endpoint = forms.CharField( label=_("S3 endpoint"), required=False, help_text=_("Endpoint should be specified without protocol"), widget=forms.TextInput(attrs={ "class": "switched", "data-switch-on": "ds_type", "data-ds_type-s3": _("S3 endpoint") })) data_source_credential_s3_ssl = forms.BooleanField( label=_("Use SSL"), required=False, initial=False, widget=forms.CheckboxInput(attrs={ "class": "switched", "data-switch-on": "ds_type", "data-ds_type-s3": _("Use SSL") })) data_source_credential_s3_bucket_in_path = forms.BooleanField( label=_("Use bucket in path"), required=False, initial=True, help_text=_("If checked, bucket will be in path instead of host"), widget=forms.CheckboxInput(attrs={ "class": "switched", "data-switch-on": "ds_type", "data-ds_type-s3": _("Use bucket in path") })) data_source_description = forms.CharField( label=_("Description"), required=False, widget=forms.Textarea(attrs={'rows': 4})) is_public = acl_utils.get_is_public_form(_("data source")) is_protected = acl_utils.get_is_protected_form(_("data source")) def __init__(self, request, *args, **kwargs): super(GeneralConfigAction, self).__init__(request, *args, **kwargs) self.fields["data_source_type"].choices = [("swift", "Swift"), ("hdfs", "HDFS"), ("maprfs", "MapR FS"), ("s3", "S3")] # If Manila is running, enable it as a choice for a data source if saharaclient.base.is_service_enabled(request, 'share'): self.fields["data_source_type"].choices.append( ("manila", "Manila")) self.fields["data_source_manila_share"].choices = ( self.populate_manila_share_choices(request) ) def populate_manila_share_choices(self, request): try: shares = manilaclient.share_list(request) choices = [(s.id, s.name) for s in shares] except Exception: exceptions.handle(request, _("Failed to get list of shares")) choices = [] return choices class Meta(object): name = _("Create Data Source") help_text_template = "data_sources/_create_data_source_help.html" class GeneralConfig(workflows.Step): action_class = GeneralConfigAction def contribute(self, data, context): for k, v in data.items(): context["general_" + k] = v context["source_url"] = context["general_data_source_url"] ds_type = context["general_data_source_type"] if ds_type == "swift": if not context["general_data_source_url"].startswith("swift://"): context["source_url"] = "swift://{0}".format( context["general_data_source_url"]) elif ds_type == "manila": context["source_url"] = "{0}://{1}{2}".format( ds_type, context["general_data_source_manila_share"], context["general_data_source_url"]) return context class CreateDataSource(workflows.Workflow): slug = "create_data_source" name = _("Create Data Source") finalize_button_name = _("Create") success_message = _("Data source created") failure_message = _("Could not create data source") success_url = "horizon:project:data_processing.jobs:index" default_steps = (GeneralConfig, ) def handle(self, request, context): s3_credentials = {} if context["general_data_source_type"] == "s3": if context.get("general_data_source_credential_accesskey", None): s3_credentials["accesskey"] = context[ "general_data_source_credential_accesskey"] if context.get("general_data_source_credential_secretkey", None): s3_credentials["secretkey"] = context[ "general_data_source_credential_secretkey"] if context.get("general_data_source_credential_endpoint", None): s3_credentials["endpoint"] = context[ "general_data_source_credential_endpoint"] s3_credentials["bucket_in_path"] = context[ "general_data_source_credential_s3_bucket_in_path"] s3_credentials["ssl"] = context[ "general_data_source_credential_s3_ssl"] s3_credentials = s3_credentials or None try: self.object = saharaclient.data_source_create( request, context["general_data_source_name"], context["general_data_source_description"], context["general_data_source_type"], context["source_url"], context.get("general_data_source_credential_user", None), context.get("general_data_source_credential_pass", None), is_public=context['general_is_public'], is_protected=context['general_is_protected'], s3_credentials=s3_credentials ) hlps = helpers.Helpers(request) if hlps.is_from_guide(): request.session["guide_datasource_id"] = self.object.id request.session["guide_datasource_name"] = self.object.name self.success_url = ( "horizon:project:data_processing.wizard:jobex_guide") return True except Exception: exceptions.handle(request) return False ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/data_sources/workflows/edit.py0000664000175000017500000001236100000000000034042 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from urllib import parse from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.jobs \ .data_sources.workflows import create class EditDataSource(create.CreateDataSource): slug = "edit_data_source" name = _("Edit Data Source") finalize_button_name = _("Update") success_message = _("Data source updated") failure_message = _("Could not update data source") success_url = "horizon:project:data_processing.jobs:index" default_steps = (create.GeneralConfig,) FIELD_MAP = { "data_source_name": "name", "data_source_type": "type", "data_source_description": "description", "data_source_url": "url", "data_source_credential_user": None, "data_source_credential_pass": None, "data_source_credential_accesskey": None, "data_source_credential_secretkey": None, "data_source_credential_endpoint": None, "data_source_credential_s3_ssl": None, "data_source_credential_s3_bucket_in_path": None, "data_source_manila_share": None, 'is_public': "is_public", 'is_protected': "is_protected" } def __init__(self, request, context_seed, entry_point, *args, **kwargs): self.data_source_id = context_seed["data_source_id"] data_source = saharaclient.data_source_get(request, self.data_source_id) super(EditDataSource, self).__init__(request, context_seed, entry_point, *args, **kwargs) for step in self.steps: if isinstance(step, create.GeneralConfig): fields = step.action.fields for field in fields: if self.FIELD_MAP[field]: if (field == "data_source_url" and data_source.type == "manila"): fields[field].initial = parse.urlparse( data_source.url).path elif (field == "data_source_manila_share" and data_source.type == "manila"): fields[field].initial = parse.urlparse( data_source.url).netloc else: fields[field].initial = ( getattr(data_source, self.FIELD_MAP[field], None)) def handle(self, request, context): try: credentials = {} if context["general_data_source_type"] == "swift": credentials["user"] = context.get( "general_data_source_credential_user", None) credentials["password"] = context.get( "general_data_source_credential_pass", None) elif context["general_data_source_type"] == "s3": if context.get("general_data_source_credential_accesskey", None): credentials["accesskey"] = context[ "general_data_source_credential_accesskey"] if context.get("general_data_source_credential_secretkey", None): credentials["secretkey"] = context[ "general_data_source_credential_secretkey"] if context.get("general_data_source_credential_endpoint", None ): credentials["endpoint"] = context[ "general_data_source_credential_endpoint"] credentials["bucket_in_path"] = context[ "general_data_source_credential_s3_bucket_in_path"] credentials["ssl"] = context[ "general_data_source_credential_s3_ssl"] credentials = credentials or None update_data = { "name": context["general_data_source_name"], "description": context["general_data_source_description"], "type": context["general_data_source_type"], "url": context["source_url"], "credentials": credentials, "is_public": context['general_is_public'], "is_protected": context['general_is_protected'] } return saharaclient.data_source_update(request, self.data_source_id, update_data) except Exception: exceptions.handle(request) return False ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5800724 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_binaries/0000775000175000017500000000000000000000000030455 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_binaries/__init__.py0000664000175000017500000000000000000000000032554 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_binaries/forms.py0000664000175000017500000004246500000000000032170 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from urllib import parse import uuid from django.forms import widgets from django import template from django.template import defaultfilters from django.utils.encoding import force_text from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import forms from horizon import messages from sahara_dashboard.api import manila as manilaclient from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.utils \ import acl as acl_utils from saharaclient.api import base class LabeledInput(widgets.TextInput): def __init__(self, jb_type, *args, **kwargs): self.jb_type = jb_type super(LabeledInput, self).__init__(*args, **kwargs) def render(self, name, value, attrs=None): input = super(LabeledInput, self).render(name, value, attrs) label = "%s" %\ ("id_%s_label" % name, "%s://" % self.jb_type) result = "%s%s" % (label, input) return mark_safe(result) class JobBinaryCreateForm(forms.SelfHandlingForm): NEW_SCRIPT = "newscript" UPLOAD_BIN = "uploadfile" action_url = ('horizon:project:data_processing.' 'jobs:create-job-binary') def __init__(self, request, *args, **kwargs): super(JobBinaryCreateForm, self).__init__(request, *args, **kwargs) self.help_text_template = "job_binaries/_create_job_binary_help.html" self.fields["job_binary_name"] = forms.CharField(label=_("Name")) self.fields["job_binary_type"] = forms.ChoiceField( label=_("Storage type"), widget=forms.Select( attrs={ 'class': 'switchable', 'data-slug': 'jb_type' })) self.fields["job_binary_url"] = forms.CharField( label=_("URL"), required=False, widget=LabeledInput( "swift", attrs={ 'class': 'switched', 'data-switch-on': 'jb_type', 'data-jb_type-swift': _('URL') })) self.fields["job_binary_manila_share"] = forms.ChoiceField( label=_("Share"), required=False, widget=forms.Select( attrs={ 'class': 'switched', 'data-switch-on': 'jb_type', 'data-jb_type-manila': _('Share') })) self.fields["job_binary_manila_path"] = forms.CharField( label=_("Path"), required=False, widget=forms.TextInput( attrs={ 'class': 'switched', 'data-switch-on': 'jb_type', 'data-jb_type-manila': _('Path') })) self.fields["job_binary_internal"] = forms.ChoiceField( label=_("Internal binary"), required=False, widget=forms.Select( attrs={ 'class': 'switched switchable', 'data-slug': 'jb_internal', 'data-switch-on': 'jb_type', 'data-jb_type-internal-db': _('Internal Binary') })) self.fields["job_binary_file"] = forms.FileField( label=_("Upload File"), required=False, widget=forms.ClearableFileInput( attrs={ 'class': 'switched', 'data-switch-on': 'jb_internal', 'data-jb_internal-uploadfile': _("Upload File") })) self.fields["job_binary_script_name"] = forms.CharField( label=_("Script name"), required=False, widget=forms.TextInput( attrs={ 'class': 'switched', 'data-switch-on': 'jb_internal', 'data-jb_internal-newscript': _("Script name") })) self.fields["job_binary_script"] = forms.CharField( label=_("Script text"), required=False, widget=forms.Textarea( attrs={ 'rows': 4, 'class': 'switched', 'data-switch-on': 'jb_internal', 'data-jb_internal-newscript': _("Script text") })) self.fields["job_binary_username"] = forms.CharField( label=_("Username"), required=False, widget=forms.TextInput( attrs={ 'class': 'switched', 'data-switch-on': 'jb_type', 'data-jb_type-swift': _('Username') })) self.fields["job_binary_password"] = forms.CharField( label=_("Password"), required=False, widget=forms.PasswordInput( attrs={ 'autocomplete': 'off', 'class': 'switched', 'data-switch-on': 'jb_type', 'data-jb_type-swift': _('Password') })) self.fields["job_binary_s3_url"] = forms.CharField( label=_("URL"), required=False, widget=LabeledInput( "s3", attrs={ 'class': 'switched', 'data-switch-on': 'jb_type', 'data-jb_type-s3': _('URL') })) self.fields["job_binary_s3_endpoint"] = forms.CharField( label=_("S3 Endpoint"), required=False, widget=forms.TextInput( attrs={ 'class': 'switched', 'data-switch-on': 'jb_type', 'data-jb_type-s3': _('S3 Endpoint') })) self.fields["job_binary_access_key"] = forms.CharField( label=_("Access Key"), required=False, widget=forms.TextInput( attrs={ 'class': 'switched', 'data-switch-on': 'jb_type', 'data-jb_type-s3': _('Access Key') })) self.fields["job_binary_secret_key"] = forms.CharField( label=_("Secret Key"), required=False, widget=forms.PasswordInput( attrs={ 'autocomplete': 'off', 'class': 'switched', 'data-switch-on': 'jb_type', 'data-jb_type-s3': _('Secret Key') })) self.fields["job_binary_description"] = ( forms.CharField(label=_("Description"), required=False, widget=forms.Textarea())) self.fields["is_public"] = acl_utils.get_is_public_form( _("job binary")) self.fields["is_protected"] = acl_utils.get_is_protected_form( _("job binary")) self.fields["job_binary_type"].choices =\ [("swift", "Swift"), ("s3", "S3")] if saharaclient.VERSIONS.active == '1.1': self.fields["job_binary_type"].choices.append( ("internal-db", "Internal database") ) self.fields["job_binary_internal"].choices =\ self.populate_job_binary_internal_choices(request) if saharaclient.base.is_service_enabled(request, 'share'): self.fields["job_binary_type"].choices.append(("manila", "Manila")) self.fields["job_binary_manila_share"].choices = ( self.populate_job_binary_manila_share_choices(request)) self.load_form_values() def load_form_values(self): if "job_binary" in self.initial: jb = self.initial["job_binary"] for field in self.fields: if self.FIELD_MAP[field]: if field in ["job_binary_url", "job_binary_s3_url"]: url = getattr(jb, self.FIELD_MAP[field], None) self.set_initial_values_by_type(url) else: self.fields[field].initial = ( getattr(jb, self.FIELD_MAP[field], None)) def set_initial_values_by_type(self, url): parsed = parse.urlparse(url) self.fields["job_binary_type"].initial = parsed.scheme if parsed.scheme == "manila": self.fields["job_binary_manila_share"].initial = parsed.netloc self.fields["job_binary_manila_path"].initial = parsed.path elif parsed.scheme == "swift": self.fields["job_binary_url"].initial = ( "{0}{1}".format(parsed.netloc, parsed.path)) elif parsed.scheme == "s3": self.fields["job_binary_s3_url"].initial = ( "{0}{1}".format(parsed.netloc, parsed.path)) else: self.fields["job_binary_url"].initial = "{0}".format(parsed.netloc) def populate_job_binary_manila_share_choices(self, request): try: shares = manilaclient.share_list(request) choices = [(s.id, s.name) for s in shares] except Exception: exceptions.handle(request, _("Failed to get list of shares")) choices = [] return choices def populate_job_binary_internal_choices(self, request): try: job_binaries = saharaclient.job_binary_internal_list(request) except Exception: exceptions.handle(request, _("Failed to get list of internal binaries.")) job_binaries = [] choices = [(job_binary.id, job_binary.name) for job_binary in job_binaries] choices.insert(0, (self.NEW_SCRIPT, '*Create a script')) choices.insert(0, (self.UPLOAD_BIN, '*Upload a new file')) return choices def handle(self, request, context): try: extra = {} jb_type = context.get("job_binary_type") if jb_type != "s3": bin_url = "%s://%s" % (context["job_binary_type"], context["job_binary_url"]) else: bin_url = "%s://%s" % (context["job_binary_type"], context["job_binary_s3_url"]) if(jb_type == "internal-db"): bin_url = self.handle_internal(request, context) elif(jb_type == "swift"): extra = self.handle_swift(request, context) elif(jb_type == "s3"): extra = self.handle_s3(request, context) elif(jb_type == "manila"): bin_url = "%s://%s%s" % (context["job_binary_type"], context["job_binary_manila_share"], context["job_binary_manila_path"]) bin_object = saharaclient.job_binary_create( request, context["job_binary_name"], bin_url, context["job_binary_description"], extra, is_public=context['is_public'], is_protected=context['is_protected'] ) messages.success(request, "Successfully created job binary") return bin_object except base.APIException as ex: exceptions.handle(request, _("Unable to create job binary: %s") % ex.error_message) return False except Exception: exceptions.handle(request, _("Unable to create job binary")) return False def get_help_text(self, extra_context=None): text = "" extra_context = extra_context or {} if self.help_text_template: tmpl = template.loader.get_template(self.help_text_template) text += tmpl.render(extra_context, self.request) else: text += defaultfilters.linebreaks(force_text(self.help_text)) return defaultfilters.safe(text) class Meta(object): name = _("Create Job Binary") help_text_template = "job_binaries/_create_job_binary_help.html" def handle_internal(self, request, context): result = "" bin_id = context["job_binary_internal"] if(bin_id == self.UPLOAD_BIN): try: result = saharaclient.job_binary_internal_create( request, self.get_unique_binary_name( request, request.FILES["job_binary_file"].name), request.FILES["job_binary_file"].read()) bin_id = result.id except Exception: exceptions.handle(request, _("Unable to upload job binary")) return None elif(bin_id == self.NEW_SCRIPT): try: result = saharaclient.job_binary_internal_create( request, self.get_unique_binary_name( request, context["job_binary_script_name"]), context["job_binary_script"]) bin_id = result.id except base.APIException as ex: exceptions.handle( request, _("Unable to create job binary: %s") % ex.error_message) return None except Exception: exceptions.handle(request, _("Unable to create job binary")) return None return "internal-db://%s" % bin_id def handle_swift(self, request, context): username = context["job_binary_username"] password = context["job_binary_password"] extra = { "user": username, "password": password } return extra def handle_s3(self, request, context): accesskey = context['job_binary_access_key'] secretkey = context['job_binary_secret_key'] endpoint = context['job_binary_s3_endpoint'] extra = {} if accesskey != "": extra["accesskey"] = accesskey if secretkey != "": extra["secretkey"] = secretkey if endpoint != "": extra["endpoint"] = endpoint return extra def get_unique_binary_name(self, request, base_name): try: internals = saharaclient.job_binary_internal_list(request) except Exception: internals = [] exceptions.handle(request, _("Failed to fetch internal binary list")) names = [internal.name for internal in internals] if base_name in names: return "%s_%s" % (base_name, uuid.uuid1()) return base_name class JobBinaryEditForm(JobBinaryCreateForm): FIELD_MAP = { 'job_binary_description': 'description', 'job_binary_file': None, 'job_binary_internal': None, 'job_binary_name': 'name', 'job_binary_password': None, 'job_binary_script': None, 'job_binary_script_name': None, 'job_binary_type': None, 'job_binary_url': 'url', 'job_binary_s3_url': 'url', 'job_binary_username': None, 'job_binary_manila_share': None, 'job_binary_manila_path': None, 'job_binary_access_key': None, 'job_binary_secret_key': None, 'job_binary_s3_endpoint': None, 'is_public': 'is_public', 'is_protected': 'is_protected', } def handle(self, request, context): try: extra = {} if context["job_binary_type"] != "s3": bin_url = "%s://%s" % (context["job_binary_type"], context["job_binary_url"]) else: bin_url = "%s://%s" % (context["job_binary_type"], context["job_binary_s3_url"]) if (context["job_binary_type"] == "swift"): extra = self.handle_swift(request, context) if (context["job_binary_type"] == "s3"): extra = self.handle_s3(request, context) update_data = { "name": context["job_binary_name"], "description": context["job_binary_description"], "extra": extra, "url": bin_url, 'is_public': context['is_public'], 'is_protected': context['is_protected'] } bin_object = saharaclient.job_binary_update( request, self.initial["job_binary"].id, update_data) messages.success(request, "Successfully updated job binary") return bin_object except base.APIException as ex: exceptions.handle(request, _("Unable to update job binary: %s") % ex.error_message) return False except Exception: exceptions.handle(request, _("Unable to update job binary")) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_binaries/tables.py0000664000175000017500000001056600000000000032311 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ungettext_lazy from saharaclient.api import base as api_base from horizon import tables from horizon.tabs import base as tabs_base from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing \ import tables as sahara_table from sahara_dashboard.content.data_processing.utils \ import acl as acl_utils class CreateJobBinary(tables.LinkAction): name = "create" verbose_name = _("Create Job Binary") url = "horizon:project:data_processing.jobs:create-job-binary" classes = ("ajax-modal",) icon = "plus" class DeleteJobBinary(tables.DeleteAction): @staticmethod def action_present(count): return ungettext_lazy( u"Delete Job Binary", u"Delete Job Binaries", count ) @staticmethod def action_past(count): return ungettext_lazy( u"Deleted Job Binary", u"Deleted Job Binaries", count ) def delete(self, request, obj_id): jb = saharaclient.job_binary_get(request, obj_id) url_parts = jb.url.split("://") jb_type = url_parts[0] jb_internal_id = url_parts[len(url_parts) - 1] if jb_type == "internal-db" and saharaclient.VERSIONS.active == '1.1': try: saharaclient.job_binary_internal_delete(request, jb_internal_id) except api_base.APIException: # nothing to do for job-binary-internal if # it does not exist. pass saharaclient.job_binary_delete(request, obj_id) class DownloadJobBinary(tables.LinkAction): name = "download_job_binary" verbose_name = _("Download Job Binary") url = "horizon:project:data_processing.jobs:download" classes = ("btn-edit",) class EditJobBinary(tables.LinkAction): name = "edit_job_binary" verbose_name = _("Edit Job Binary") url = "horizon:project:data_processing.jobs:edit-job-binary" classes = ("btn-edit", "ajax-modal",) class MakePublic(acl_utils.MakePublic): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.job_binary_update(request, datum_id, update_kwargs) class MakePrivate(acl_utils.MakePrivate): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.job_binary_update(request, datum_id, update_kwargs) class MakeProtected(acl_utils.MakeProtected): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.job_binary_update(request, datum_id, update_kwargs) class MakeUnProtected(acl_utils.MakeUnProtected): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.job_binary_update(request, datum_id, update_kwargs) class JobBinariesTable(sahara_table.SaharaPaginateTabbedTable): tab_name = 'job_tabs%sjob_binaries_tab' % tabs_base.SEPARATOR name = tables.Column( "name", verbose_name=_("Name"), link="horizon:project:data_processing.jobs:jb-details") type = tables.Column("url", verbose_name=_("Url")) description = tables.Column("description", verbose_name=_("Description")) class Meta(object): name = "job_binaries" verbose_name = _("Job Binaries") table_actions = (CreateJobBinary, DeleteJobBinary,) table_actions_menu = (MakePublic, MakePrivate, MakeProtected, MakeUnProtected) row_actions = (DeleteJobBinary, DownloadJobBinary, EditJobBinary, MakePublic, MakePrivate, MakeProtected, MakeUnProtected) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_binaries/tabs.py0000664000175000017500000000417000000000000031762 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from oslo_log import log as logging from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import tabs from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.jobs.job_binaries \ import tables as job_binary_tables from sahara_dashboard.content.data_processing \ import tabs as sahara_tabs LOG = logging.getLogger(__name__) class JobBinariesTab(sahara_tabs.SaharaTableTab): table_classes = (job_binary_tables.JobBinariesTable, ) name = _("Job Binaries") slug = "job_binaries_tab" template_name = "horizon/common/_detail_table.html" def get_job_binaries_data(self): try: job_binaries = saharaclient.job_binary_list(self.request) except Exception: job_binaries = [] exceptions.handle(self.request, _("Unable to fetch job binary list")) return job_binaries class JobBinaryDetailsTab(tabs.Tab): name = _("General Info") slug = "job_binaries_details_tab" template_name = "job_binaries/_details.html" def get_context_data(self, request): job_binary_id = self.tab_group.kwargs['job_binary_id'] try: job_binary = saharaclient.job_binary_get(request, job_binary_id) except Exception as e: job_binary = {} LOG.error("Unable to fetch job binary details: %s" % str(e)) return {"job_binary": job_binary} class JobBinaryDetailsTabs(tabs.TabGroup): slug = "job_binary_details" tabs = (JobBinaryDetailsTab,) sticky = True ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_binaries/tests.py0000664000175000017500000001752500000000000032203 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from unittest import mock from django.urls import reverse from sahara_dashboard import api from sahara_dashboard.test import helpers as test INDEX_URL = reverse('horizon:project:data_processing.jobs:index') DETAILS_URL = reverse( 'horizon:project:data_processing.jobs:jb-details', args=['id']) EDIT_URL = reverse('horizon:project:data_processing.jobs' ':edit-job-binary', args=['id']) CREATE_URL = reverse( 'horizon:project:data_processing.jobs:create-job-binary') class DataProcessingJobBinaryTests(test.TestCase): @test.create_mocks({api.sahara: ('job_execution_list', 'plugin_list', 'job_binary_list', 'data_source_list', 'job_list')}) def test_index(self): self.mock_job_binary_list.return_value = \ self.job_binaries.list() res = self.client.get(INDEX_URL) self.assertTemplateUsed(res, 'jobs/index.html') self.assertContains(res, 'Job Binaries') self.assertContains(res, 'Name') self.assertContains(res, 'example.pig') self.mock_job_binary_list.assert_called_once_with( test.IsHttpRequest()) @test.create_mocks({api.sahara: ('job_binary_get',)}) def test_details(self): self.mock_job_binary_get.return_value = self.job_binaries.first() res = self.client.get(DETAILS_URL) self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assert_mock_multiple_calls_with_same_arguments( self.mock_job_binary_get, 2, mock.call(test.IsHttpRequest(), test.IsA(str))) @test.create_mocks({api.sahara: ('job_binary_list', 'job_binary_get', 'job_binary_internal_delete', 'job_binary_delete',)}) def test_delete(self): jb_list = self.mock_job_binary_list.return_value = \ self.job_binaries.list() self.mock_job_binary_get.return_value = self.job_binaries.list()[0] self.mock_job_binary_delete.return_value = None int_id = jb_list[0].url.split("//")[1] self.mock_job_binary_internal_delete.return_value = None form_data = {"action": "job_binaries__delete__%s" % jb_list[0].id} res = self.client.post(INDEX_URL, form_data) self.assertRedirectsNoFollow(res, INDEX_URL) self.mock_job_binary_list.assert_called_once_with( test.IsHttpRequest()) self.mock_job_binary_get.assert_called_once_with( test.IsHttpRequest(), test.IsA(str)) self.mock_job_binary_delete.assert_called_once_with( test.IsHttpRequest(), jb_list[0].id) self.mock_job_binary_internal_delete.assert_called_once_with( test.IsHttpRequest(), int_id) @test.create_mocks({api.sahara: ('job_binary_get', 'job_binary_get_file')}) def test_download(self): jb = self.mock_job_binary_get.return_value = \ self.job_binaries.list()[0] self.mock_job_binary_get_file.return_value = \ "TEST FILE CONTENT" context = {'job_binary_id': jb.id} url = reverse('horizon:project:data_processing.jobs:download', kwargs={'job_binary_id': jb.id}) res = self.client.get(url, context) self.assertTrue(res.has_header('content-disposition')) self.mock_job_binary_get.assert_called_once_with( test.IsHttpRequest(), test.IsA(str)) self.mock_job_binary_get_file.assert_called_once_with( test.IsHttpRequest(), jb.id) @test.create_mocks({api.sahara: ('job_binary_get', 'job_binary_get_file')}) def test_download_with_spaces(self): jb = self.mock_job_binary_get.return_value = \ self.job_binaries.list()[1] self.mock_job_binary_get_file.return_value = \ "MORE TEST FILE CONTENT" context = {'job_binary_id': jb.id} url = reverse('horizon:project:data_processing.jobs:download', kwargs={'job_binary_id': jb.id}) res = self.client.get(url, context) self.assertEqual( res.get('Content-Disposition'), 'attachment; filename="%s"' % jb.name ) self.mock_job_binary_get.assert_called_once_with( test.IsHttpRequest(), test.IsA(str)) self.mock_job_binary_get_file.assert_called_once_with( test.IsHttpRequest(), jb.id) @test.create_mocks({api.sahara: ('job_binary_get', 'job_binary_update', 'job_binary_internal_list')}) def test_update(self): jb = self.mock_job_binary_get.return_value = \ self.job_binaries.first() self.mock_job_binary_update.return_value = \ self.job_binaries.first() form_data = { 'job_binary_url': jb.url, 'job_binary_name': jb.name, 'job_binary_description': jb.description, 'job_binary_type': "internal-db", 'job_binary_internal': "", 'job_binary_file': "", 'job_binary_password': "", 'job_binary_username': "", 'job_binary_script': "", 'job_binary_script_name': "" } res = self.client.post(EDIT_URL, form_data) self.assertNoFormErrors(res) self.mock_job_binary_get.assert_called_once_with( test.IsHttpRequest(), test.IsA(str)) self.mock_job_binary_update.assert_called_once_with( test.IsHttpRequest(), test.IsA(str), test.IsA(dict)) @test.create_mocks({api.manila: ('share_list', ), api.sahara: ('job_binary_create', 'job_binary_internal_list'), api.sahara.base: ('is_service_enabled', )}) def test_create_manila(self): share = mock.Mock() share.return_value = {"id": "tuvwxy56-1234-abcd-abcd-defabcdaedcb", "name": "Test share"} shares = [share] self.mock_is_service_enabled.return_value = True self.mock_share_list.return_value = shares form_data = { "job_binary_type": "manila", "job_binary_manila_share": share.id, "job_binary_manila_path": "/testfile.bin", "job_binary_name": "testmanila", "job_binary_description": "Test manila description" } res = self.client.post(CREATE_URL, form_data) self.assertNoFormErrors(res) self.assert_mock_multiple_calls_with_same_arguments( self.mock_is_service_enabled, 1, mock.call(test.IsHttpRequest(), test.IsA(str))) @test.create_mocks({api.sahara: ('job_binary_create', 'job_binary_internal_list')}) def test_create_s3(self): form_data = { "job_binary_type": "s3", "job_binary_s3_url": "s3://a/b", "job_binary_access_key": "acc", "job_binary_secret_key": "sec", "job_binary_s3_endpoint": "http://pointy.end", "job_binary_name": "tests3", "job_binary_description": "Test s3 description" } res = self.client.post(CREATE_URL, form_data) self.assertNoFormErrors(res) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_binaries/views.py0000664000175000017500000001202100000000000032160 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django import http from django.urls import reverse from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ import django.views from horizon import exceptions from horizon import forms from horizon import tabs from horizon.utils import memoized from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.utils \ import helpers from sahara_dashboard.content.data_processing.jobs. \ job_binaries import forms as job_binary_forms from sahara_dashboard.content.data_processing.jobs. \ job_binaries import tabs as _tabs from sahara_dashboard.content.data_processing.jobs.job_binaries \ import tables as jb_tables class CreateJobBinaryView(forms.ModalFormView): form_class = job_binary_forms.JobBinaryCreateForm success_url = reverse_lazy( 'horizon:project:data_processing.jobs:index') classes = ("ajax-modal",) template_name = "job_binaries/create.html" page_title = _("Create Job Binary") submit_url = ('horizon:project:data_processing.' 'jobs:create-job-binary') submit_label = _("Create") def get_success_url(self): hlps = helpers.Helpers(self.request) if hlps.is_from_guide(): self.success_url = reverse_lazy( "horizon:project:data_processing.wizard:jobex_guide") return self.success_url def get_context_data(self, **kwargs): context = super(CreateJobBinaryView, self).get_context_data(**kwargs) context['submit_url'] = reverse(self.submit_url, kwargs=self.kwargs) return context class EditJobBinaryView(CreateJobBinaryView): form_class = job_binary_forms.JobBinaryEditForm page_title = _("Edit Job Binary") submit_url = ('horizon:project:data_processing.' 'jobs:edit-job-binary') submit_label = _("Update") @memoized.memoized_method def get_object(self): jb_id = self.kwargs["job_binary_id"] try: return saharaclient.job_binary_get(self.request, jb_id) except Exception: msg = _('Unable to retrieve job binary "%s".') % jb_id redirect = reverse( "horizon:project:data_processing.jobs:job-binaries") exceptions.handle(self.request, msg, redirect=redirect) def get_initial(self): initial = super(EditJobBinaryView, self).get_initial() initial['job_binary_id'] = self.kwargs['job_binary_id'] initial['job_binary'] = self.get_object() return initial class JobBinaryDetailsView(tabs.TabView): tab_group_class = _tabs.JobBinaryDetailsTabs template_name = 'horizon/common/_detail.html' page_title = "{{ job_binary.name|default:job_binary.id }}" @memoized.memoized_method def get_object(self): jb_id = self.kwargs["job_binary_id"] try: return saharaclient.job_binary_get(self.request, jb_id) except Exception: msg = _('Unable to retrieve details for job binary "%s".') % jb_id redirect = self.get_redirect_url() exceptions.handle(self.request, msg, redirect=redirect) def get_context_data(self, **kwargs): context = super(JobBinaryDetailsView, self).get_context_data(**kwargs) job_binary = self.get_object() context['job_binary'] = job_binary context['url'] = self.get_redirect_url() context['actions'] = self._get_actions(job_binary) return context def _get_actions(self, job_binary): table = jb_tables.JobBinariesTable(self.request) return table.render_row_actions(job_binary) @staticmethod def get_redirect_url(): return reverse("horizon:project:data_processing.jobs:index") class DownloadJobBinaryView(django.views.generic.View): def get(self, request, job_binary_id=None): try: jb = saharaclient.job_binary_get(request, job_binary_id) data = saharaclient.job_binary_get_file(request, job_binary_id) except Exception: redirect = reverse( 'horizon:project:data_processing.jobs:index') exceptions.handle(self.request, _('Unable to fetch job binary: %(exc)s'), redirect=redirect) response = http.HttpResponse(content_type='application/binary') response['Content-Disposition'] = ( 'attachment; filename="%s"' % jb.name) response.write(data) response['Content-Length'] = str(len(data)) return response ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5800724 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_templates/0000775000175000017500000000000000000000000030657 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_templates/__init__.py0000664000175000017500000000000000000000000032756 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_templates/tables.py0000664000175000017500000001145300000000000032507 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django import urls from django.utils import http from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ungettext_lazy from horizon import tables from horizon.tabs import base as tabs_base from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing \ import tables as sahara_table from sahara_dashboard.content.data_processing.utils \ import acl as acl_utils class JobsFilterAction(tables.FilterAction): filter_type = "server" filter_choices = (('name', _("Name"), True), ('type', _("Type"), True), ('description', _("Description"), True)) class CreateJob(tables.LinkAction): name = "create job" verbose_name = _("Create Job Template") url = "horizon:project:data_processing.jobs:create-job" classes = ("ajax-modal", "create_job_class") icon = "plus" class DeleteJob(tables.DeleteAction): @staticmethod def action_present(count): return ungettext_lazy( u"Delete Job Template", u"Delete Job Templates", count ) @staticmethod def action_past(count): return ungettext_lazy( u"Deleted Job Template", u"Deleted Jobs Templates", count ) def delete(self, request, obj_id): saharaclient.job_delete(request, obj_id) class LaunchJobExistingCluster(tables.LinkAction): name = "launch-job-existing" verbose_name = _("Launch On Existing Cluster") url = "horizon:project:data_processing.jobs:launch-job" classes = ('ajax-modal', 'btn-launch') def get_link_url(self, datum): base_url = urls.reverse(self.url) params = http.urlencode({"job_id": datum.id}) return "?".join([base_url, params]) class LaunchJobNewCluster(tables.LinkAction): name = "launch-job-new" verbose_name = _("Launch On New Cluster") url = "horizon:project:data_processing.jobs:launch-job-new-cluster" classes = ('ajax-modal', 'btn-launch') def get_link_url(self, datum): base_url = urls.reverse(self.url) params = http.urlencode({"job_id": datum.id}) return "?".join([base_url, params]) class ChoosePlugin(tables.LinkAction): name = "launch-job-new" verbose_name = _("Launch On New Cluster") url = "horizon:project:data_processing.jobs:choose-plugin" classes = ('ajax-modal', 'btn-launch') def get_link_url(self, datum): base_url = urls.reverse(self.url) params = http.urlencode({"job_id": datum.id}) return "?".join([base_url, params]) class MakePublic(acl_utils.MakePublic): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.job_update(request, datum_id, **update_kwargs) class MakePrivate(acl_utils.MakePrivate): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.job_update(request, datum_id, **update_kwargs) class MakeProtected(acl_utils.MakeProtected): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.job_update(request, datum_id, **update_kwargs) class MakeUnProtected(acl_utils.MakeUnProtected): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.job_update(request, datum_id, **update_kwargs) class JobTemplatesTable(sahara_table.SaharaPaginateTabbedTable): tab_name = 'job_tabs%sjob_templates_tab' % tabs_base.SEPARATOR name = tables.Column("name", verbose_name=_("Name"), link="horizon:project:data_processing.jobs:" "jt-details") type = tables.Column("type", verbose_name=_("Type")) description = tables.Column("description", verbose_name=_("Description")) class Meta(object): name = "job_templates" verbose_name = _("Job Templates") table_actions = (CreateJob, DeleteJob, JobsFilterAction,) table_actions_menu = [MakePublic, MakePrivate, MakeProtected, MakeUnProtected] row_actions = (LaunchJobExistingCluster, ChoosePlugin, DeleteJob, MakePublic, MakePrivate, MakeProtected, MakeUnProtected) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_templates/tabs.py0000664000175000017500000000447600000000000032175 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from oslo_log import log as logging from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import tabs from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing \ import tabs as sahara_tabs from sahara_dashboard.content.data_processing.jobs \ .job_templates import tables as job_templates_tables LOG = logging.getLogger(__name__) class JobTemplatesTab(sahara_tabs.SaharaTableTab): table_classes = (job_templates_tables.JobTemplatesTable, ) name = _("Job Templates") slug = "job_templates_tab" template_name = "horizon/common/_detail_table.html" def get_job_templates_data(self): try: table = self._tables['job_templates'] search_opts = {} filter = self.get_server_filter_info(table.request, table) if filter['value'] and filter['field']: search_opts = {filter['field']: filter['value']} job_templates = saharaclient.job_list(self.request, search_opts) except Exception: job_templates = [] exceptions.handle(self.request, _("Unable to fetch job template list")) return job_templates class GeneralTab(tabs.Tab): name = _("General Info") slug = "job_details_tab" template_name = "job_templates/_details.html" def get_context_data(self, request): job_id = self.tab_group.kwargs['job_id'] try: job = saharaclient.job_get(request, job_id) except Exception as e: job = {} LOG.error("Unable to fetch job template details: %s" % str(e)) return {"job": job} class JobDetailsTabs(tabs.TabGroup): slug = "job_details" tabs = (GeneralTab,) sticky = True ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_templates/tests.py0000664000175000017500000002276000000000000032402 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from unittest import mock from django.urls import reverse from sahara_dashboard import api from sahara_dashboard.test import helpers as test INDEX_URL = reverse('horizon:project:data_processing.jobs:index') DETAILS_URL = reverse( 'horizon:project:data_processing.jobs:jt-details', args=['id']) class DataProcessingJobTemplateTests(test.TestCase): @test.create_mocks({api.sahara: ('job_execution_list', 'plugin_list', 'job_binary_list', 'data_source_list', 'job_list')}) def test_index(self): self.mock_job_list.return_value = self.jobs.list() res = self.client.get(INDEX_URL) self.mock_job_list.assert_called_once_with( test.IsHttpRequest(), {}) self.assertTemplateUsed(res, 'jobs/index.html') self.assertContains(res, 'Job Templates') self.assertContains(res, 'Name') self.assertContains(res, 'pigjob') @test.create_mocks({api.sahara: ('job_get',)}) def test_details(self): self.mock_job_get.return_value = self.jobs.first() res = self.client.get(DETAILS_URL) self.mock_job_get.assert_called_with( test.IsHttpRequest(), 'id') self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertContains(res, 'pigjob') self.assertContains(res, 'example.pig') self.assertContains(res, 'udf.jar') @test.create_mocks({api.sahara: ('job_binary_list', 'job_create', 'job_types_list')}) def test_create(self): self.mock_job_binary_list.return_value = [] self.mock_job_types_list.return_value = self.job_types.list() form_data = {'job_name': 'test', 'job_type': 'pig', 'lib_binaries': [], 'lib_ids': '[]', 'job_description': 'test create', 'hidden_arguments_field': [], 'argument_ids': '[]'} url = reverse('horizon:project:data_processing.jobs:create-job') res = self.client.post(url, form_data) self.assertNoFormErrors(res) self.assert_mock_multiple_calls_with_same_arguments( self.mock_job_binary_list, 2, mock.call(test.IsHttpRequest())) self.mock_job_types_list.assert_called_once_with( test.IsHttpRequest()) self.mock_job_create.assert_called_once_with( test.IsHttpRequest(), 'test', 'Pig', [], [], 'test create', interface=[], is_public=False, is_protected=False) @test.create_mocks({api.sahara: ('job_binary_list', 'job_create', 'job_types_list')}) def test_create_with_interface(self): self.mock_job_binary_list.return_value = [] self.mock_job_types_list.return_value = self.job_types.list() form_data = {'job_name': 'test_interface', 'job_type': 'pig', 'lib_binaries': [], 'lib_ids': '[]', 'job_description': 'test create', 'hidden_arguments_field': [], 'argument_ids': '["0", "1"]', 'argument_id_0': '0', 'argument_name_0': 'argument', 'argument_description_0': '', 'argument_mapping_type_0': 'args', 'argument_location_0': '0', 'argument_value_type_0': 'number', 'argument_required_0': True, 'argument_default_value_0': '', 'argument_id_1': '1', 'argument_name_1': 'config', 'argument_description_1': 'Really great config', 'argument_mapping_type_1': 'configs', 'argument_location_1': 'edp.important.config', 'argument_value_type_1': 'string', 'argument_default_value_1': 'A value'} url = reverse('horizon:project:data_processing.jobs:create-job') res = self.client.post(url, form_data) self.assertNoFormErrors(res) self.assert_mock_multiple_calls_with_same_arguments( self.mock_job_binary_list, 2, mock.call(test.IsHttpRequest())) self.mock_job_types_list.assert_called_once_with( test.IsHttpRequest()) self.mock_job_create.assert_called_once_with( test.IsHttpRequest(), 'test_interface', 'Pig', [], [], 'test create', interface=[ { "name": "argument", "description": None, "mapping_type": "args", "location": "0", "value_type": "number", "required": True, "default": None }, { "name": "config", "description": "Really great config", "mapping_type": "configs", "location": "edp.important.config", "value_type": "string", "required": False, "default": "A value" }], is_public=False, is_protected=False) @test.create_mocks({api.sahara: ('job_list', 'job_delete')}) def test_delete(self): job = self.jobs.first() self.mock_job_list.return_value = self.jobs.list() form_data = {'action': 'job_templates__delete__%s' % job.id} res = self.client.post(INDEX_URL, form_data) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, INDEX_URL) self.assertMessageCount(success=1) self.mock_job_list.assert_called_once_with( test.IsHttpRequest(), {}) self.mock_job_delete.assert_called_once_with( test.IsHttpRequest(), job.id) @test.create_mocks({api.sahara: ('job_execution_create', 'job_get', 'job_get_configs', 'job_list', 'cluster_list', 'data_source_list')}) def test_launch(self): job = self.jobs.first() job_execution = self.job_executions.first() cluster = self.clusters.first() input_ds = self.data_sources.first() output_ds = self.data_sources.first() self.mock_job_get.return_value = job self.mock_job_get_configs.return_value = job self.mock_cluster_list.return_value = self.clusters.list() self.mock_data_source_list.return_value = self.data_sources.list() self.mock_job_list.return_value = self.jobs.list() self.mock_job_get.return_value = job self.mock_job_execution_create.return_value = job_execution url = reverse('horizon:project:data_processing.jobs:launch-job') form_data = { 'job': self.jobs.first().id, 'cluster': cluster.id, 'job_input': input_ds.id, 'job_output': output_ds.id, 'config': {}, 'argument_ids': '{}', 'adapt_oozie': 'on', 'adapt_swift_spark': 'on', 'hbase_common_lib': 'on', 'hbase_common_lib': 'on', 'datasource_substitute': 'on', 'java_opts': '', 'job_args_array': [[], []], 'job_configs': [{}, {}], 'job_params': [{}, {}], 'job_type': 'Pig', 'streaming_mapper': '', 'streaming_reducer': '' } res = self.client.post(url, form_data) # there seem not to be an easy way to check the order # of the calls; check only if they happened self.assertNoFormErrors(res) self.assert_mock_multiple_calls_with_same_arguments( self.mock_job_get, 2, mock.call(test.IsHttpRequest(), job.id)) self.mock_job_get_configs.assert_called_once_with( test.IsHttpRequest(), job.type) self.assert_mock_multiple_calls_with_same_arguments( self.mock_cluster_list, 2, mock.call(test.IsHttpRequest())) self.mock_data_source_list.assert_called_with( test.IsHttpRequest()) self.mock_job_list.assert_called_once_with( test.IsHttpRequest()) self.mock_job_execution_create.assert_called_once_with( test.IsHttpRequest(), job.id, cluster.id, input_ds.id, output_ds.id, { 'params': {}, 'args': [], 'configs': { 'edp.substitute_data_source_for_name': True, 'edp.substitute_data_source_for_uuid': True} }, {}, is_public=False, is_protected=False) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_templates/views.py0000664000175000017500000001206700000000000032374 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import json from django import http from django.urls import reverse from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import tabs from horizon.utils import memoized from horizon import workflows from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing.jobs.job_templates.tables \ as jt_tables import sahara_dashboard.content.data_processing.jobs.job_templates.tabs \ as _tabs import sahara_dashboard.content.data_processing.jobs.job_templates \ .workflows.create as create_flow import sahara_dashboard.content.data_processing.jobs.job_templates \ .workflows.launch as launch_flow from sahara_dashboard.content.data_processing.utils import helpers class CreateJobView(workflows.WorkflowView): workflow_class = create_flow.CreateJob success_url = "horizon:project:data_processing.jobs:create-job" classes = ("ajax-modal",) template_name = "job_templates/create.html" page_title = _("Create Job Template") class JobTemplateDetailsView(tabs.TabView): tab_group_class = _tabs.JobDetailsTabs template_name = 'horizon/common/_detail.html' page_title = "{{ job.name|default:job.id }}" @memoized.memoized_method def get_object(self): j_id = self.kwargs["job_id"] try: return saharaclient.job_get(self.request, j_id) except Exception: msg = _('Unable to retrieve details for job template "%s".') % j_id redirect = self.get_redirect_url() exceptions.handle(self.request, msg, redirect=redirect) def get_context_data(self, **kwargs): context = super(JobTemplateDetailsView, self).\ get_context_data(**kwargs) job_template = self.get_object() context['job'] = job_template context['url'] = self.get_redirect_url() context['actions'] = self._get_actions(job_template) return context def _get_actions(self, job_template): table = jt_tables.JobTemplatesTable(self.request) return table.render_row_actions(job_template) @staticmethod def get_redirect_url(): return reverse("horizon:project:data_processing.jobs:jobs") class LaunchJobView(workflows.WorkflowView): workflow_class = launch_flow.LaunchJob success_url = "horizon:project:data_processing.jobs" classes = ("ajax-modal",) ajax_template_name = "job_templates/launch_ajax.html" template_name = "job_templates/launch.html" page_title = _("Launch Job") def get(self, request, *args, **kwargs): if request.is_ajax(): if request.GET.get("json", None): job_id = request.GET.get("job_id") job_type = saharaclient.job_get(request, job_id).type return http.HttpResponse(json.dumps({"job_type": job_type}), content_type='application/json') return super(LaunchJobView, self).get(request, args, kwargs) def get_context_data(self, **kwargs): context = super(LaunchJobView, self).get_context_data(**kwargs) context["cl_name_state_map"] = self.get_cluster_choices(self.request) context["status_message_map"] = json.dumps(helpers.STATUS_MESSAGE_MAP) return context def get_cluster_choices(self, request): choices = [] try: clusters = saharaclient.cluster_list(request) choices = [ ("%s %s" % (cl.name, helpers.ALLOWED_STATUSES.get(cl.status)), cl.status) for cl in clusters if (cl.status in helpers.ALLOWED_STATUSES)] except Exception: exceptions.handle(request, _("Unable to fetch clusters.")) return choices class LaunchJobNewClusterView(workflows.WorkflowView): workflow_class = launch_flow.LaunchJobNewCluster success_url = "horizon:project:data_processing.jobs" classes = ("ajax-modal",) template_name = "job_templates/launch.html" page_title = _("Launch Job") def get_context_data(self, **kwargs): context = super(LaunchJobNewClusterView, self).\ get_context_data(**kwargs) return context class ChoosePluginView(workflows.WorkflowView): workflow_class = launch_flow.ChosePluginVersion success_url = "horizon:project:data_processing.jobs" classes = ("ajax-modal",) template_name = "job_templates/launch.html" page_title = _("Launch Job") def get_context_data(self, **kwargs): context = super(ChoosePluginView, self).get_context_data(**kwargs) return context ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5800724 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_templates/workflows/0000775000175000017500000000000000000000000032714 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021100000000000011447 xustar0000000000000000115 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_templates/workflows/__init__.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_templates/workflows/__init0000664000175000017500000000000000000000000034066 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020700000000000011454 xustar0000000000000000113 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_templates/workflows/create.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_templates/workflows/create0000664000175000017500000002475600000000000034120 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import json from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import forms from horizon.forms import fields from horizon import workflows from sahara_dashboard.content.data_processing \ .utils import helpers from sahara_dashboard.content.data_processing.utils \ import acl as acl_utils import sahara_dashboard.content.data_processing \ .utils.workflow_helpers as whelpers from sahara_dashboard.api import sahara as saharaclient JOB_BINARY_CREATE_URL = ("horizon:project:data_processing.jobs" ":create-job-binary") class AdditionalLibsAction(workflows.Action): lib_binaries = forms.DynamicChoiceField( label=_("Choose libraries"), required=False, add_item_link=JOB_BINARY_CREATE_URL, widget=forms.Select( attrs={ 'class': 'switched', 'data-switch-on': 'jobtype', 'data-jobtype-pig': _("Choose libraries"), 'data-jobtype-hive': _("Choose libraries"), 'data-jobtype-shell': _("Choose additional files"), 'data-jobtype-spark': _("Choose libraries"), 'data-jobtype-java': _("Choose libraries"), 'data-jobtype-mapreduce': _("Choose libraries"), 'data-jobtype-mapreduce.streaming': _("Choose libraries") })) lib_ids = forms.CharField( required=False, widget=forms.HiddenInput()) def populate_lib_binaries_choices(self, request, context): job_binaries = saharaclient.job_binary_list(request) choices = [(job_binary.id, job_binary.name) for job_binary in job_binaries] choices.insert(0, ('', _("-- not selected --"))) return choices class Meta(object): name = _("Libs") help_text_template = "job_templates/_create_job_libs_help.html" class GeneralConfigAction(workflows.Action): job_name = forms.CharField(label=_("Name")) job_type = forms.ChoiceField(label=_("Job Type"), widget=forms.Select(attrs={ 'class': 'switchable', 'data-slug': 'jobtype' })) main_binary = forms.DynamicChoiceField( label=_("Choose a main binary"), required=False, help_text=_("Choose the binary which " "should be used in this Job."), add_item_link=JOB_BINARY_CREATE_URL, widget=fields.DynamicSelectWidget( attrs={ 'class': 'switched', 'data-switch-on': 'jobtype', 'data-jobtype-pig': _("Choose a main binary"), 'data-jobtype-hive': _("Choose a main binary"), 'data-jobtype-shell': _("Choose a shell script"), 'data-jobtype-spark': _("Choose a main binary"), 'data-jobtype-storm': _("Choose a main binary"), 'data-jobtype-storm.pyleus': _("Choose a main binary"), 'data-jobtype-mapreduce.streaming': _("Choose a main binary") })) job_description = forms.CharField(label=_("Description"), required=False, widget=forms.Textarea(attrs={'rows': 4})) is_public = acl_utils.get_is_public_form(_("job")) is_protected = acl_utils.get_is_protected_form(_("job")) def __init__(self, request, context, *args, **kwargs): super(GeneralConfigAction, self).__init__(request, context, *args, **kwargs) req = request.GET or request.POST if req.get("guide_job_type"): self.fields["job_type"].initial = ( req.get("guide_job_type").lower()) def populate_job_type_choices(self, request, context): choices = [] choices_list = saharaclient.job_types_list(request) for choice in choices_list: job_type = choice.name.lower() if job_type in helpers.JOB_TYPE_MAP: choices.append((job_type, helpers.JOB_TYPE_MAP[job_type][0])) return choices def populate_main_binary_choices(self, request, context): job_binaries = saharaclient.job_binary_list(request) choices = [(job_binary.id, job_binary.name) for job_binary in job_binaries] choices.insert(0, ('', _("-- not selected --"))) return choices def clean(self): cleaned_data = super(workflows.Action, self).clean() job_type = cleaned_data.get("job_type", "") if job_type in ["Java", "MapReduce"]: cleaned_data['main_binary'] = None return cleaned_data class Meta(object): name = _("Create Job Template") help_text_template = "job_templates/_create_job_help.html" class ConfigureInterfaceArgumentsAction(workflows.Action): hidden_arguments_field = forms.CharField( required=False, widget=forms.HiddenInput(attrs={"class": "hidden_arguments_field"})) argument_ids = forms.CharField( required=False, widget=forms.HiddenInput()) def __init__(self, request, *args, **kwargs): super(ConfigureInterfaceArgumentsAction, self).__init__( request, *args, **kwargs) req = request.GET or request.POST if 'argument_ids' in req: self.arguments = [] for id in json.loads(req['argument_ids']): fields = { "name": "argument_name_" + str(id), "description": "argument_description_" + str(id), "mapping_type": "argument_mapping_type_" + str(id), "location": "argument_location_" + str(id), "value_type": "argument_value_type_" + str(id), "default_value": "argument_default_value_" + str(id)} argument = {k: req[v] for k, v in fields.items()} required_field = "argument_required_" + str(id) fields.update({"required": required_field}) argument.update( {"required": required_field in req}) self.arguments.append(argument) whelpers.build_interface_argument_fields(self, **fields) def clean(self): cleaned_data = super(ConfigureInterfaceArgumentsAction, self).clean() return cleaned_data class Meta(object): name = _("Interface Arguments") class ConfigureArguments(workflows.Step): action_class = ConfigureInterfaceArgumentsAction contributes = ("hidden_arguments_field", ) template_name = "job_templates/job_interface_arguments_template.html" def contribute(self, data, context): for k, v in data.items(): context[k] = v return context class GeneralConfig(workflows.Step): action_class = GeneralConfigAction contributes = ("job_name", "job_type", "job_description", "main_binary") def contribute(self, data, context): for k, v in data.items(): if k == "job_type": context[k] = helpers.JOB_TYPE_MAP[v][1] else: context[k] = v return context class ConfigureLibs(workflows.Step): action_class = AdditionalLibsAction template_name = "job_templates/library_template.html" def contribute(self, data, context): chosen_libs = json.loads(data.get("lib_ids", '[]')) for index, library in enumerate(chosen_libs): context["lib_%s" % index] = library return context class CreateJob(workflows.Workflow): slug = "create_job" name = _("Create Job Template") finalize_button_name = _("Create") success_message = _("Job created") failure_message = _("Could not create job template") success_url = "horizon:project:data_processing.jobs:index" default_steps = (GeneralConfig, ConfigureLibs, ConfigureArguments) def handle(self, request, context): main_locations = [] lib_locations = [] for k in context.keys(): if k.startswith('lib_'): lib_locations.append(context.get(k)) if context.get("main_binary", None): job_type = context.get("job_type", None) if job_type not in ["Java", "MapReduce"]: main_locations.append(context["main_binary"]) argument_ids = json.loads(context['argument_ids']) interface = [ { "name": context['argument_name_' + str(arg_id)], "description": (context['argument_description_' + str(arg_id)] or None), "mapping_type": context['argument_mapping_type_' + str(arg_id)], "location": context['argument_location_' + str(arg_id)], "value_type": context['argument_value_type_' + str(arg_id)], "required": context['argument_required_' + str(arg_id)], "default": (context['argument_default_value_' + str(arg_id)] or None) } for arg_id in argument_ids ] try: job = saharaclient.job_create( request, context["job_name"], context["job_type"], main_locations, lib_locations, context["job_description"], interface=interface, is_public=context['is_public'], is_protected=context['is_protected'] ) hlps = helpers.Helpers(request) if hlps.is_from_guide(): request.session["guide_job_id"] = job.id request.session["guide_job_type"] = context["job_type"] request.session["guide_job_name"] = context["job_name"] self.success_url = ( "horizon:project:data_processing.wizard:jobex_guide") return True except Exception: exceptions.handle(request) return False ././@PaxHeader0000000000000000000000000000020700000000000011454 xustar0000000000000000113 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_templates/workflows/launch.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/job_templates/workflows/launch0000664000175000017500000006275300000000000034126 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import json from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import forms from horizon import workflows from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing.clusters. \ cluster_templates.workflows.create as t_flows import sahara_dashboard.content.data_processing. \ clusters.clusters.workflows.create as c_flow from sahara_dashboard.content.data_processing.utils \ import acl as acl_utils from sahara_dashboard.content.data_processing.utils import helpers import sahara_dashboard.content.data_processing. \ utils.workflow_helpers as whelpers DATA_SOURCE_CREATE_URL = ("horizon:project:data_processing.jobs" ":create-data-source") class JobExecutionGeneralConfigAction(workflows.Action): job_input = forms.DynamicChoiceField( label=_("Input"), initial=(None, "None"), add_item_link=DATA_SOURCE_CREATE_URL, required=False) job_output = forms.DynamicChoiceField( label=_("Output"), initial=(None, "None"), add_item_link=DATA_SOURCE_CREATE_URL, required=False) is_public = acl_utils.get_is_public_form(_("job")) is_protected = acl_utils.get_is_protected_form(_("job")) def __init__(self, request, *args, **kwargs): super(JobExecutionGeneralConfigAction, self).__init__(request, *args, **kwargs) req = request.GET or request.POST if req.get("job_id", None) is None: self.fields["job"] = forms.ChoiceField( label=_("Job")) self.fields["job"].choices = self.populate_job_choices(request) else: self.fields["job"] = forms.CharField( widget=forms.HiddenInput(), initial=req.get("job_id", None)) def populate_job_input_choices(self, request, context): return self.get_data_source_choices(request, context) def populate_job_output_choices(self, request, context): return self.get_data_source_choices(request, context) def get_data_source_choices(self, request, context): try: data_sources = saharaclient.data_source_list(request) except Exception: data_sources = [] exceptions.handle(request, _("Unable to fetch data sources.")) choices = [(data_source.id, data_source.name) for data_source in data_sources] choices.insert(0, (None, 'None')) return choices def populate_job_choices(self, request): try: jobs = saharaclient.job_list(request) except Exception: jobs = [] exceptions.handle(request, _("Unable to fetch jobs.")) choices = [(job.id, job.name) for job in jobs] return choices class Meta(object): name = _("Job") help_text_template = "job_templates/_launch_job_help.html" class JobExecutionExistingGeneralConfigAction(JobExecutionGeneralConfigAction): cluster = forms.ChoiceField( label=_("Cluster"), initial=(None, "None"), widget=forms.Select(attrs={"class": "cluster_choice"})) is_public = acl_utils.get_is_public_form(_("job")) is_protected = acl_utils.get_is_protected_form(_("job")) def populate_cluster_choices(self, request, context): try: clusters = saharaclient.cluster_list(request) except Exception: clusters = [] exceptions.handle(request, _("Unable to fetch clusters.")) choices = [(cl.id, "%s %s" % (cl.name, helpers.ALLOWED_STATUSES.get(cl.status))) for cl in clusters if cl.status in helpers.ALLOWED_STATUSES] if not choices: choices = [(None, _("No clusters available"))] return choices class Meta(object): name = _("Job") help_text_template = "job_templates/_launch_job_help.html" def _merge_interface_with_configs(interface, job_configs): interface_by_mapping = {(arg['mapping_type'], arg['location']): arg for arg in interface} mapped_types = ("configs", "params") mapped_configs = { (mapping_type, key): value for mapping_type in mapped_types for key, value in job_configs.get(mapping_type, {}).items() } for index, arg in enumerate(job_configs.get('args', [])): mapped_configs['args', str(index)] = arg free_arguments, interface_arguments = {}, {} for mapping, value in mapped_configs.items(): if mapping in interface_by_mapping: arg = interface_by_mapping[mapping] interface_arguments[arg['id']] = value else: free_arguments[mapping] = value configs = {"configs": {}, "params": {}, "args": {}} for mapping, value in free_arguments.items(): mapping_type, location = mapping configs[mapping_type][location] = value configs["args"] = [ value for key, value in sorted(configs["args"].items(), key=lambda x: int(x[0]))] return configs, interface_arguments class JobConfigAction(workflows.Action): MAIN_CLASS = "edp.java.main_class" STORM_PYLEUS_TOPOLOGY_NAME = "topology_name" JAVA_OPTS = "edp.java.java_opts" EDP_MAPPER = "edp.streaming.mapper" EDP_REDUCER = "edp.streaming.reducer" EDP_PREFIX = "edp." EDP_HBASE_COMMON_LIB = "edp.hbase_common_lib" EDP_ADAPT_FOR_OOZIE = "edp.java.adapt_for_oozie" EDP_ADAPT_SPARK_SWIFT = "edp.spark.adapt_for_swift" EDP_SUBST_DATASOURCE_NAME = "edp.substitute_data_source_for_name" EDP_SUBST_DATASOURCE_UUID = "edp.substitute_data_source_for_uuid" property_name = forms.ChoiceField( required=False, ) job_configs = forms.CharField( required=False, widget=forms.HiddenInput()) job_params = forms.CharField( required=False, widget=forms.HiddenInput()) job_args_array = forms.CharField( required=False, widget=forms.HiddenInput()) job_type = forms.CharField( required=False, widget=forms.HiddenInput()) main_class = forms.CharField(label=_("Main Class"), required=False) topology_name = forms.CharField( label=_("Topology Name"), help_text=_("Use the same topology name as defined in your " ".yaml file"), required=False) java_opts = forms.CharField(label=_("Java Opts"), required=False) streaming_mapper = forms.CharField(label=_("Mapper"), required=False) streaming_reducer = forms.CharField(label=_("Reducer"), required=False) hbase_common_lib = forms.BooleanField( label=_("Use HBase Common library"), help_text=_("Run HBase EDP Jobs with common HBase library on HDFS"), required=False, initial=True) adapt_oozie = forms.BooleanField( label=_("Adapt For Oozie"), help_text=_("Automatically modify the Hadoop configuration" " so that job config values are set and so that" " Oozie will handle exit codes correctly."), required=False, initial=True) adapt_spark_swift = forms.BooleanField( label=_("Enable Swift Paths"), help_text=_("Modify the configuration so that swift URLs can " "be dereferenced through HDFS at runtime."), required=False, initial=True) datasource_substitute = forms.BooleanField( label=_("Use Data Source Substitution for Names and UUIDs"), help_text=_("Substitute data source objects for URLs of " "the form datasource://name or uuid."), required=False, initial=True) def __init__(self, request, *args, **kwargs): super(JobConfigAction, self).__init__(request, *args, **kwargs) req = request.GET or request.POST job_ex_id = req.get("job_execution_id") if job_ex_id is not None: job_ex = saharaclient.job_execution_get(request, job_ex_id) try: jt_id = job_ex.job_template_id # typical APIv2 except AttributeError: jt_id = job_ex.job_id # APIv1.1, older APIv2 job = saharaclient.job_get(request, jt_id) job_configs, interface_args = _merge_interface_with_configs( job.interface, job_ex.job_configs) edp_configs = {} if 'configs' in job_configs: configs, edp_configs = ( self.clean_edp_configs(job_configs['configs'])) self.fields['job_configs'].initial = ( json.dumps(configs)) if 'params' in job_configs: self.fields['job_params'].initial = ( json.dumps(job_configs['params'])) if 'args' in job_configs: self.fields['job_args_array'].initial = ( json.dumps(job_configs['args'])) if self.MAIN_CLASS in edp_configs: self.fields['main_class'].initial = ( edp_configs[self.MAIN_CLASS]) if self.STORM_PYLEUS_TOPOLOGY_NAME in edp_configs: self.fields['topology_name'].initial = ( edp_configs[self.STORM_PYLEUS_TOPOLOGY_NAME]) if self.JAVA_OPTS in edp_configs: self.fields['java_opts'].initial = ( edp_configs[self.JAVA_OPTS]) if self.EDP_MAPPER in edp_configs: self.fields['streaming_mapper'].initial = ( edp_configs[self.EDP_MAPPER]) if self.EDP_REDUCER in edp_configs: self.fields['streaming_reducer'].initial = ( edp_configs[self.EDP_REDUCER]) if self.EDP_HBASE_COMMON_LIB in edp_configs: self.fields['hbase_common_lib'].initial = ( edp_configs[self.EDP_HBASE_COMMON_LIB]) if self.EDP_ADAPT_FOR_OOZIE in edp_configs: self.fields['adapt_oozie'].initial = ( edp_configs[self.EDP_ADAPT_FOR_OOZIE]) if self.EDP_ADAPT_SPARK_SWIFT in edp_configs: self.fields['adapt_spark_swift'].initial = ( edp_configs[self.EDP_ADAPT_SPARK_SWIFT]) if (self.EDP_SUBST_DATASOURCE_NAME in edp_configs or self.EDP_SUBST_DATASOURCE_UUID in edp_configs): self.fields['datasource_substitute'].initial = ( edp_configs.get(self.EDP_SUBST_DATASOURCE_UUID, True) or edp_configs.get(self.EDP_SUBST_DATASOURCE_NAME, True)) def clean(self): cleaned_data = super(workflows.Action, self).clean() job_type = cleaned_data.get("job_type", None) if job_type != "MapReduce.Streaming": if "streaming_mapper" in self._errors: del self._errors["streaming_mapper"] if "streaming_reducer" in self._errors: del self._errors["streaming_reducer"] return cleaned_data def populate_property_name_choices(self, request, context): req = request.GET or request.POST job_id = req.get("job_id") or req.get("job") job_type = saharaclient.job_get(request, job_id).type job_configs = ( saharaclient.job_get_configs(request, job_type).job_config) choices = [(param['value'], param['name']) for param in job_configs['configs']] return choices def clean_edp_configs(self, configs): edp_configs = {} for key, value in configs.items(): if key.startswith(self.EDP_PREFIX): edp_configs[key] = value for rmkey in edp_configs.keys(): # remove all configs handled via other controls # so they do not show up in the free entry inputs if rmkey in [self.EDP_HBASE_COMMON_LIB, self.EDP_MAPPER, self.EDP_REDUCER, self.MAIN_CLASS, self.STORM_PYLEUS_TOPOLOGY_NAME, self.JAVA_OPTS, self.EDP_ADAPT_FOR_OOZIE, self.EDP_ADAPT_SPARK_SWIFT, self.EDP_SUBST_DATASOURCE_UUID, self.EDP_SUBST_DATASOURCE_NAME, ]: del configs[rmkey] return (configs, edp_configs) class Meta(object): name = _("Configure") help_text_template = "job_templates/_launch_job_configure_help.html" class JobExecutionGeneralConfig(workflows.Step): action_class = JobExecutionGeneralConfigAction def contribute(self, data, context): for k, v in data.items(): if k in ["job_input", "job_output"]: context["job_general_" + k] = None if (v in [None, ""]) else v else: context["job_general_" + k] = v return context class JobExecutionExistingGeneralConfig(workflows.Step): action_class = JobExecutionExistingGeneralConfigAction def contribute(self, data, context): for k, v in data.items(): if k in ["job_input", "job_output"]: context["job_general_" + k] = None if (v in [None, ""]) else v else: context["job_general_" + k] = v return context class JobConfig(workflows.Step): action_class = JobConfigAction template_name = 'job_templates/config_template.html' def contribute(self, data, context): job_config = self.clean_configs( json.loads(data.get("job_configs", '{}'))) job_params = self.clean_configs( json.loads(data.get("job_params", '{}'))) job_args_array = self.clean_configs( json.loads(data.get("job_args_array", '[]'))) job_type = data.get("job_type", '') context["job_type"] = job_type context["job_config"] = {"configs": job_config} context["job_config"]["args"] = job_args_array context["job_config"]["configs"][ JobConfigAction.EDP_SUBST_DATASOURCE_UUID] = ( data.get("datasource_substitute", True)) context["job_config"]["configs"][ JobConfigAction.EDP_SUBST_DATASOURCE_NAME] = ( data.get("datasource_substitute", True)) if job_type in ["Java", "Spark", "Storm"]: context["job_config"]["configs"][JobConfigAction.MAIN_CLASS] = ( data.get("main_class", "")) context["job_config"]["configs"][JobConfigAction.JAVA_OPTS] = ( data.get("java_opts", "")) context["job_config"]["configs"][ JobConfigAction.EDP_HBASE_COMMON_LIB] = ( data.get("hbase_common_lib", True)) if job_type == "Java": context["job_config"]["configs"][ JobConfigAction.EDP_ADAPT_FOR_OOZIE] = ( data.get("adapt_oozie", True)) if job_type == "Spark": context["job_config"]["configs"][ JobConfigAction.EDP_ADAPT_SPARK_SWIFT] = ( data.get("adapt_spark_swift", True)) elif job_type == "Storm.Pyleus": context["job_config"]["configs"][ JobConfigAction.STORM_PYLEUS_TOPOLOGY_NAME] = ( data.get("topology_name", "")) elif job_type == "MapReduce.Streaming": context["job_config"]["configs"][JobConfigAction.EDP_MAPPER] = ( data.get("streaming_mapper", "")) context["job_config"]["configs"][JobConfigAction.EDP_REDUCER] = ( data.get("streaming_reducer", "")) else: context["job_config"]["params"] = job_params return context @staticmethod def clean_configs(configs): cleaned_conf = None if isinstance(configs, dict): cleaned_conf = dict([(k.strip(), v.strip()) for k, v in configs.items() if len(v.strip()) > 0 and len(k.strip()) > 0]) elif isinstance(configs, list): cleaned_conf = list([v.strip() for v in configs if len(v.strip()) > 0]) return cleaned_conf class NewClusterConfigAction(c_flow.GeneralConfigAction): persist_cluster = forms.BooleanField( label=_("Persist cluster after job exit"), required=False) class Meta(object): name = _("Configure Cluster") help_text_template = "clusters/_configure_general_help.html" class ClusterGeneralConfig(workflows.Step): action_class = NewClusterConfigAction contributes = ("hidden_configure_field", ) def contribute(self, data, context): for k, v in data.items(): context["cluster_general_" + k] = v return context class JobExecutionInterfaceConfigAction(workflows.Action): def __init__(self, request, *args, **kwargs): super(JobExecutionInterfaceConfigAction, self).__init__( request, *args, **kwargs) job_id = (request.GET.get("job_id") or request.POST.get("job")) job = saharaclient.job_get(request, job_id) interface = job.interface or [] interface_args = {} req = request.GET or request.POST job_ex_id = req.get("job_execution_id") if job_ex_id is not None: job_ex = saharaclient.job_execution_get(request, job_ex_id) try: jt_id = job_ex.job_template_id # typical APIv2 except AttributeError: jt_id = job_ex.job_id # APIv1.1, older APIv2 job = saharaclient.job_get(request, jt_id) job_configs, interface_args = _merge_interface_with_configs( job.interface, job_ex.job_configs) for argument in interface: field = forms.CharField( required=argument.get('required'), label=argument['name'], initial=(interface_args.get(argument['id']) or argument.get('default')), help_text=argument.get('description'), widget=forms.TextInput() ) self.fields['argument_%s' % argument['id']] = field self.fields['argument_ids'] = forms.CharField( initial=json.dumps({argument['id']: argument['name'] for argument in interface}), widget=forms.HiddenInput() ) def clean(self): cleaned_data = super(JobExecutionInterfaceConfigAction, self).clean() return cleaned_data class Meta(object): name = _("Interface Arguments") class JobExecutionInterfaceConfig(workflows.Step): action_class = JobExecutionInterfaceConfigAction def contribute(self, data, context): for k, v in data.items(): context[k] = v return context class LaunchJob(workflows.Workflow): slug = "launch_job" name = _("Launch Job") finalize_button_name = _("Launch") success_message = _("Job launched") failure_message = _("Could not launch job") success_url = "horizon:project:data_processing.jobs:jobs-tab" default_steps = (JobExecutionExistingGeneralConfig, JobConfig, JobExecutionInterfaceConfig) def handle(self, request, context): argument_ids = json.loads(context['argument_ids']) interface = {name: context["argument_" + str(arg_id)] for arg_id, name in argument_ids.items()} saharaclient.job_execution_create( request, context["job_general_job"], context["job_general_cluster"], context["job_general_job_input"], context["job_general_job_output"], context["job_config"], interface, is_public=context['job_general_is_public'], is_protected=context['job_general_is_protected'] ) return True class SelectPluginForJobLaunchAction(t_flows.SelectPluginAction): def __init__(self, request, *args, **kwargs): super(SelectPluginForJobLaunchAction, self).__init__(request, *args, **kwargs) self.fields["job_id"] = forms.ChoiceField( label=_("Plugin name"), initial=request.GET.get("job_id") or request.POST.get("job_id"), widget=forms.HiddenInput(attrs={"class": "hidden_create_field"})) self.fields["job_configs"] = forms.ChoiceField( label=_("Job configs"), widget=forms.HiddenInput(attrs={"class": "hidden_create_field"})) self.fields["job_args"] = forms.ChoiceField( label=_("Job args"), widget=forms.HiddenInput(attrs={"class": "hidden_create_field"})) self.fields["job_params"] = forms.ChoiceField( label=_("Job params"), widget=forms.HiddenInput(attrs={"class": "hidden_create_field"})) req = request.GET or request.POST job_ex_id = req.get("job_execution_id") if job_ex_id is not None: self.fields["job_execution_id"] = forms.ChoiceField( label=_("Job Execution ID"), initial=job_ex_id, widget=forms.HiddenInput( attrs={"class": "hidden_create_field"})) job_configs = ( saharaclient.job_execution_get(request, job_ex_id).job_configs) if "configs" in job_configs: self.fields["job_configs"].initial = ( json.dumps(job_configs["configs"])) if "params" in job_configs: self.fields["job_params"].initial = ( json.dumps(job_configs["params"])) if "args" in job_configs: self.fields["job_args"].initial = ( json.dumps(job_configs["args"])) class Meta(object): name = _("Select plugin and hadoop version for cluster") help_text_template = "clusters/_create_general_help.html" class SelectHadoopPlugin(workflows.Step): action_class = SelectPluginForJobLaunchAction class ChosePluginVersion(workflows.Workflow): slug = "launch_job" name = _("Launch Job") finalize_button_name = _("Create") success_message = _("Created") failure_message = _("Could not create") success_url = "horizon:project:data_processing.cluster_templates:index" default_steps = (SelectHadoopPlugin,) class LaunchJobNewCluster(workflows.Workflow): slug = "launch_job" name = _("Launch Job") finalize_button_name = _("Launch") success_message = _("Job launched") failure_message = _("Could not launch job") success_url = "horizon:project:data_processing.jobs:index" default_steps = (ClusterGeneralConfig, JobExecutionGeneralConfig, JobConfig, JobExecutionInterfaceConfig) def handle(self, request, context): node_groups = None plugin, hadoop_version = ( whelpers.get_plugin_and_hadoop_version(request)) ct_id = context["cluster_general_cluster_template"] or None user_keypair = context["cluster_general_keypair"] or None argument_ids = json.loads(context['argument_ids']) interface = {name: context["argument_" + str(arg_id)] for arg_id, name in argument_ids.items()} try: cluster = saharaclient.cluster_create( request, context["cluster_general_cluster_name"], plugin, hadoop_version, cluster_template_id=ct_id, default_image_id=context["cluster_general_image"], description=context["cluster_general_description"], node_groups=node_groups, user_keypair_id=user_keypair, is_transient=not(context["cluster_general_persist_cluster"]), net_id=context.get( "cluster_general_neutron_management_network", None)) except Exception: exceptions.handle(request, _("Unable to create new cluster for job.")) return False try: saharaclient.job_execution_create( request, context["job_general_job"], cluster.id, context["job_general_job_input"], context["job_general_job_output"], context["job_config"], interface, is_public=context['job_general_is_public'], is_protected=context['job_general_is_protected'] ) except Exception: exceptions.handle(request, _("Unable to launch job.")) return False return True ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5800724 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/jobs/0000775000175000017500000000000000000000000026764 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/jobs/__init__.py0000664000175000017500000000000000000000000031063 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/jobs/tables.py0000664000175000017500000002204300000000000030611 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.http import Http404 # noqa from django.urls import reverse from django.utils import http from django.utils.translation import pgettext_lazy from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ungettext_lazy from saharaclient.api import base as api_base from horizon import messages from horizon import tables from horizon.tabs import base as tabs_base from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.jobs.job_templates \ import tables as j_t from sahara_dashboard.content.data_processing \ import tables as sahara_table from sahara_dashboard.content.data_processing.utils \ import acl as acl_utils from sahara_dashboard.content.data_processing.utils import helpers class JobsFilterAction(tables.FilterAction): filter_type = "server" filter_choices = (('id', _("ID"), True), ('job', _("Job"), True), ('cluster', _("Cluster"), True), ('status', _("Status"), True)) class JobExecutionGuide(tables.LinkAction): name = "jobex_guide" verbose_name = _("Job Guide") url = "horizon:project:data_processing.jobs:jobex_guide" class DeleteJob(tables.DeleteAction): @staticmethod def action_present(count): return ungettext_lazy( u"Delete Job", u"Delete Jobs", count ) @staticmethod def action_past(count): return ungettext_lazy( u"Deleted Job", u"Deleted Jobs", count ) def delete(self, request, obj_id): saharaclient.job_execution_delete(request, obj_id) class ReLaunchJobExistingCluster(j_t.ChoosePlugin): @staticmethod def action_present(count): return ungettext_lazy( u"Launch Job", u"Launch Jobs", count ) @staticmethod def action_past(count): return ungettext_lazy( u"Launched Job", u"Launched Jobs", count ) name = "relaunch-job-existing" verbose_name = _("Relaunch On Existing Cluster") url = "horizon:project:data_processing.jobs:launch-job" classes = ('ajax-modal', 'btn-launch') def get_link_url(self, datum): base_url = reverse(self.url) try: job_template_id = datum.job_template_id # typical APIv2 except AttributeError: job_template_id = datum.job_id # APIv1.1, older APIv2 params = http.urlencode({'job_id': job_template_id, 'job_execution_id': datum.id}) return "?".join([base_url, params]) class ReLaunchJobNewCluster(ReLaunchJobExistingCluster): @staticmethod def action_present(count): return ungettext_lazy( u"Launch Job", u"Launch Jobs", count ) @staticmethod def action_past(count): return ungettext_lazy( u"Launched Job", u"Launched Jobs", count ) name = "relaunch-job-new" verbose_name = _("Relaunch On New Cluster") url = "horizon:project:data_processing.jobs:choose-plugin" classes = ('ajax-modal', 'btn-launch') class UpdateRow(tables.Row): ajax = True def get_data(self, request, job_execution_id): try: return saharaclient.job_execution_get(request, job_execution_id) except api_base.APIException as e: if e.error_code == 404: raise Http404 else: messages.error(request, _("Unable to update row")) class MakePublic(acl_utils.MakePublic): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.job_execution_update(request, datum_id, **update_kwargs) class MakePrivate(acl_utils.MakePrivate): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.job_execution_update(request, datum_id, **update_kwargs) class MakeProtected(acl_utils.MakeProtected): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.job_execution_update(request, datum_id, **update_kwargs) class MakeUnProtected(acl_utils.MakeUnProtected): def change_rule_method(self, request, datum_id, **update_kwargs): saharaclient.job_execution_update(request, datum_id, **update_kwargs) class JobsTable(sahara_table.SaharaPaginateTabbedTable): tab_name = 'job_tabs%sjobs_tab' % tabs_base.SEPARATOR class StatusColumn(tables.Column): def get_raw_data(self, datum): return datum.info['status'] class JobNameColumn(tables.Column): @staticmethod def link(job_execution): if job_execution.job_name: try: # typical APIv2 job_template_id = job_execution.job_template_id except AttributeError: # APIv1.1, older APIv2 job_template_id = job_execution.job_id return reverse("horizon:project:data_processing." "jobs:jt-details", args=(http.urlquote(job_template_id),)) else: # No link should be generated for a deleted Job. return None def get_data(self, job_execution): return job_execution.job_name or _("Not available") class ClusterNameColumn(tables.Column): @staticmethod def link(job_execution): if job_execution.cluster_name: return reverse( "horizon:project:data_processing.clusters:cluster-details", args=(http.urlquote(job_execution.cluster_id),)) else: # No link should be generated for a deleted Cluster. return None def get_data(self, job_execution): return job_execution.cluster_name or _("Not available") class DurationColumn(tables.Column): def get_data(self, job_execution): status = job_execution.info["status"] end_time = None if status in [k for k, v in JobsTable.STATUS_CHOICES]: end_time = job_execution.updated_at return helpers.Helpers(None).get_duration(job_execution.created_at, end_time) STATUS_CHOICES = ( ("DONEWITHERROR", False), ("FAILED", False), ("KILLED", False), ("SUCCEEDED", True), ) STATUS_DISPLAY_CHOICES = ( ("DONEWITHERROR", pgettext_lazy("Current status of a Job", u"Done with Error")), ("FAILED", pgettext_lazy("Current status of a Job", u"Failed")), ("KILLED", pgettext_lazy("Current status of a Job", u"Killed")), ("SUCCEEDED", pgettext_lazy("Current status of a Job", u"Succeeded")), ) name = tables.Column("id", verbose_name=_("ID"), display_choices=(("id", "ID"), ("name", pgettext_lazy("Name")),), link=("horizon:project:data_processing." "jobs:details")) job_name = JobNameColumn( "job_name", verbose_name=_("Job Template"), link=JobNameColumn.link) cluster_name = ClusterNameColumn( "cluster_name", verbose_name=_("Cluster"), link=ClusterNameColumn.link) status = StatusColumn("info", status=True, status_choices=STATUS_CHOICES, display_choices=STATUS_DISPLAY_CHOICES, verbose_name=_("Status")) duration = DurationColumn("duration", verbose_name=_("Duration")) def get_object_display(self, datum): return datum.id class Meta(object): name = "jobs" row_class = UpdateRow status_columns = ["status"] verbose_name = _("Jobs") table_actions = [JobExecutionGuide, DeleteJob, JobsFilterAction] table_actions_menu = [MakePublic, MakePrivate, MakeProtected, MakeUnProtected] row_actions = [DeleteJob, ReLaunchJobExistingCluster, ReLaunchJobNewCluster, MakePublic, MakePrivate, MakeProtected, MakeUnProtected] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/jobs/tabs.py0000664000175000017500000001276400000000000030301 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from oslo_log import log as logging from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import tabs from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing \ import tabs as sahara_tabs from sahara_dashboard.content.data_processing \ .jobs.jobs import tables as jobs_tables LOG = logging.getLogger(__name__) class JobsTab(sahara_tabs.SaharaTableTab): table_classes = (jobs_tables.JobsTable, ) name = _("Jobs") slug = "jobs_tab" template_name = "horizon/common/_detail_table.html" SEARCH_MAPPING = {"cluster": "cluster.name", "job": "job.name"} def get_jobs_data(self): try: table = self._tables['jobs'] search_opts = {} filter = self.get_server_filter_info(table.request, table) if filter['value'] and filter['field']: if filter['field'] in self.SEARCH_MAPPING: # Handle special cases for cluster and job # since they are in different database tables. search_opts = { self.SEARCH_MAPPING[filter['field']]: filter['value']} else: search_opts = {filter['field']: filter['value']} jobs = saharaclient.job_execution_list(self.request, search_opts) except Exception: jobs = [] exceptions.handle(self.request, _("Unable to fetch job list")) return jobs class GeneralTab(tabs.Tab): name = _("General Info") slug = "job_execution_tab" template_name = "jobs/_details.html" def get_context_data(self, request): jex_id = self.tab_group.kwargs['job_execution_id'] try: job_execution = saharaclient.job_execution_get(request, jex_id) except Exception as e: job_execution = {} LOG.error("Unable to fetch job details: %s" % str(e)) return {"job_execution": job_execution} object_names = self.get_object_names(job_execution, request) try: object_names['input_url'] = job_execution.data_source_urls.get( job_execution.input_id) except Exception as e: LOG.error("Unable to fetch input url: %s", e) object_names["input_url"] = "None" try: object_names['output_url'] = job_execution.data_source_urls.get( job_execution.output_id) except Exception as e: LOG.error("Unable to fetch output url: %s", e) object_names["output_url"] = "None" if saharaclient.VERSIONS.active == '2': job_execution_engine_job_attr = "engine_job_id" job_execution_engine_job_attr_pretty = _("Engine Job ID") else: job_execution_engine_job_attr = "oozie_job_id" job_execution_engine_job_attr_pretty = _("Oozie Job ID") job_execution_engine_job_id = getattr(job_execution, job_execution_engine_job_attr) return {"job_execution": job_execution, "object_names": object_names, "job_execution_engine_job_id": job_execution_engine_job_id, "job_execution_engine_job_attr_pretty": job_execution_engine_job_attr_pretty} def get_object_names(self, job_ex, request): object_names = {} try: job_template_id = job_ex.job_template_id # typical APIv2 except AttributeError: job_template_id = job_ex.job_id # APIv1.1, older APIv2 obj_names_map = {'input_name': {'obj': 'data_source_get', 'obj_id': job_ex.input_id}, 'output_name': {'obj': 'data_source_get', 'obj_id': job_ex.output_id}, 'cluster_name': {'obj': 'cluster_get', 'obj_id': job_ex.cluster_id}, 'job_name': {'obj': 'job_get', 'obj_id': job_template_id}} for item in obj_names_map: object_names[item] = ( self.get_object_name(obj_names_map[item]['obj_id'], obj_names_map[item]['obj'], request)) return object_names def get_object_name(self, obj_id, sahara_obj, request): object_name = None try: s_func = getattr(saharaclient, sahara_obj) obj = s_func(request, obj_id) object_name = obj.name except Exception as e: LOG.warning("Unable to get name for %s with object_id %s (%s)" % (sahara_obj, obj_id, str(e))) return object_name class JobExecutionDetailsTabs(tabs.TabGroup): slug = "job_details" tabs = (GeneralTab,) sticky = True ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/jobs/tests.py0000664000175000017500000000601200000000000030477 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.urls import reverse from sahara_dashboard import api from sahara_dashboard.test import helpers as test from sahara_dashboard.test.helpers import IsHttpRequest INDEX_URL = reverse('horizon:project:data_processing.jobs:index') DETAILS_URL = reverse( 'horizon:project:data_processing.jobs:details', args=['id']) class DataProcessingJobTests(test.TestCase): @test.create_mocks({api.sahara: ('job_execution_list', 'plugin_list', 'job_binary_list', 'data_source_list', 'job_list')}) def test_index(self): self.mock_job_execution_list.return_value = \ self.job_executions.list() res = self.client.get(INDEX_URL) self.mock_job_execution_list.assert_called_once_with( IsHttpRequest(), {}) self.assertEqual( "cluster-1", (res.context_data["tab_group"]._tabs["jobs_tab"]. _tables["jobs"].data[0].cluster_name)) self.assertEqual( "job-1", (res.context_data["tab_group"]._tabs["jobs_tab"]. _tables["jobs"].data[0].job_name)) self.assertTemplateUsed(res, 'jobs/index.html') self.assertContains(res, 'Jobs') @test.create_mocks({api.sahara: ('job_execution_get', 'cluster_get', 'job_get', 'data_source_get')}) def test_details(self): self.mock_job_execution_get.return_value = ( self.job_executions.first()) res = self.client.get(DETAILS_URL) self.assertTemplateUsed(res, 'horizon/common/_detail.html') self.assertContains(res, 'RUNNING') @test.create_mocks({api.sahara: ('job_execution_list', 'job_execution_delete')}) def test_delete(self): job_exec = self.job_executions.first() self.mock_job_execution_list.return_value = self.job_executions.list() self.mock_job_execution_delete.return_value = None form_data = {'action': 'jobs__delete__%s' % job_exec.id} res = self.client.post(INDEX_URL, form_data) self.mock_job_execution_list.assert_called_once_with( IsHttpRequest(), {}) self.mock_job_execution_delete.assert_called_once_with( IsHttpRequest(), job_exec.id) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, INDEX_URL) self.assertMessageCount(success=1) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/jobs/views.py0000664000175000017500000000421400000000000030474 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.urls import reverse from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import tabs from horizon.utils import memoized from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.jobs.jobs \ import tables as je_tables import sahara_dashboard.content.data_processing \ .jobs.jobs.tabs as _tabs class JobDetailsView(tabs.TabView): tab_group_class = _tabs.JobExecutionDetailsTabs template_name = 'horizon/common/_detail.html' page_title = "{{ job_execution.name|default:job_execution.id }}" @memoized.memoized_method def get_object(self): jex_id = self.kwargs["job_execution_id"] try: return saharaclient.job_execution_get(self.request, jex_id) except Exception: msg = _('Unable to retrieve details for job "%s".') % jex_id redirect = self.get_redirect_url() exceptions.handle(self.request, msg, redirect=redirect) def get_context_data(self, **kwargs): context = super(JobDetailsView, self)\ .get_context_data(**kwargs) job_execution = self.get_object() context['job_execution'] = job_execution context['url'] = self.get_redirect_url() context['actions'] = self._get_actions(job_execution) return context def _get_actions(self, job_execution): table = je_tables.JobsTable(self.request) return table.render_row_actions(job_execution) @staticmethod def get_redirect_url(): return reverse("horizon:project:data_processing.jobs:jobs-tab") ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/panel.py0000664000175000017500000000163600000000000027506 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ import horizon from openstack_dashboard.dashboards.project import dashboard class JobsPanel(horizon.Panel): name = _("Jobs") slug = 'data_processing.jobs' permissions = (('openstack.services.data-processing', 'openstack.services.data_processing'),) dashboard.Project.register(JobsPanel) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/0000775000175000017500000000000000000000000030025 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5800724 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/data_sources/0000775000175000017500000000000000000000000032501 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000023200000000000011452 xustar0000000000000000132 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/data_sources/_create_data_source_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/data_sources/_create0000664000175000017500000000156300000000000034033 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans %}Create a Data Source with a specified name.{% endblocktrans %}

{% blocktrans %}Select the type of your Data Source.{% endblocktrans %}

{% blocktrans %}You may need to enter the username and password for your Data Source.{% endblocktrans %}

{% blocktrans %}For Data Sources on a Manila share, choose the share and enter the path relative to the share (example: /outputdir/myinputfile.txt){% endblocktrans %}

{% blocktrans %}For Data Sources in S3 storage, the URL should be specified in the format s3a://bucket/path. Also, each of the access properties may be optional if you have configured that property on your cluster manually.{% endblocktrans %}

{% blocktrans %}You may also enter an optional description for your Data Source.{% endblocktrans %}

././@PaxHeader0000000000000000000000000000021200000000000011450 xustar0000000000000000116 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/data_sources/_details.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/data_sources/_detail0000664000175000017500000000161500000000000034030 0ustar00zuulzuul00000000000000{% load i18n sizeformat %}
{% trans "Name" %}
{{ data_source.name }}
{% trans "Project ID" %}
{% if data_source.tenant_id %}
{{ data_source.tenant_id }}
{% else %}
{{ data_source.project_id }}
{% endif %}
{% trans "ID" %}
{{ data_source.id }}
{% trans "Type" %}
{{ data_source.type }}
{% trans "URL" %}
{{ data_source.url }}
{% trans "Description" %}
{{ data_source.description|default:_("None") }}
{% trans "Public" %}
{{ data_source.is_public|yesno }}
{% trans "Protected" %}
{{ data_source.is_protected|yesno }}
{% trans "Create time" %}
{{ data_source.created_at|parse_isotime }}
././@PaxHeader0000000000000000000000000000021000000000000011446 xustar0000000000000000114 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/data_sources/create.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/data_sources/create.0000664000175000017500000000027500000000000033751 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Create Data Source" %}{% endblock %} {% block main %} {% include 'horizon/common/_workflow.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5800724 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_binaries/0000775000175000017500000000000000000000000032453 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021100000000000011447 xustar0000000000000000115 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_binaries/_create.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_binaries/_create0000664000175000017500000000147600000000000034010 0ustar00zuulzuul00000000000000{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block form_id %}create-job-binary{% endblock %} {% block form_action %}{{ submit_url }}{% endblock %} {% block form_attrs %}enctype="multipart/form-data"{% endblock %} {% block modal-header %}{{ page_title }}{% endblock %} {% block modal-body %}
{% include "horizon/common/_form_fields.html" %}
{{ form.get_help_text }}
{% endblock %} {% block modal-footer %} {% trans "Cancel" %} {% endblock %} ././@PaxHeader0000000000000000000000000000023100000000000011451 xustar0000000000000000131 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_binaries/_create_job_binary_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_binaries/_create0000664000175000017500000000345100000000000034003 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans trimmed %}Important: The name that you give your job binary will be the name used in your job execution. If your binary requires a particular name or extension (ie: ".jar"), be sure to include it here.{% endblocktrans %}

{% blocktrans %}Select the storage type for your job binary.{% endblocktrans %}

  • {% blocktrans %}Data Processing internal database{% endblocktrans %}
  • {% blocktrans %}Swift{% endblocktrans %}
  • {% blocktrans %}S3{% endblocktrans %}

{% blocktrans %}For Data Processing internal job binaries, you may choose from the following:{% endblocktrans %}

  • {% blocktrans %}Choose an existing file{% endblocktrans %}
  • {% blocktrans %}Upload a new file{% endblocktrans %}
  • {% blocktrans %}Create a script to be uploaded dynamically{% endblocktrans %}

{% blocktrans %}For Object Store job binaries, you must:{% endblocktrans %}

  • {% blocktrans %}Enter the URL for the file{% endblocktrans %}
  • {% blocktrans %}Enter the username and password required to access that file{% endblocktrans %}

{% blocktrans %}For S3 job binaries, you must:{% endblocktrans %}

  • {% blocktrans %}Enter the URL for the file{% endblocktrans %}
  • {% blocktrans %}Enter the access key and secret key required to access that file{% endblocktrans %}
  • {% blocktrans %}Enter the endpoint of the S3 service where the file is stored{% endblocktrans %}

{% blocktrans %}You may also enter an optional description for your job binary.{% endblocktrans %}

././@PaxHeader0000000000000000000000000000021200000000000011450 xustar0000000000000000116 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_binaries/_details.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_binaries/_detail0000664000175000017500000000165600000000000034007 0ustar00zuulzuul00000000000000{% load i18n %}
{% trans "Name" %}
{{ job_binary.name }}
{% trans "Project ID" %}
{% if job_binary.tenant_id %}
{{ job_binary.tenant_id }}
{% else %}
{{ job_binary.project_id }}
{% endif %}
{% trans "ID" %}
{{ job_binary.id }}
{% trans "URL" %}
{{ job_binary.url }}
{% trans "Description" %}
{{ job_binary.description|default:_("None") }}
{% trans "Public" %}
{{ job_binary.is_public|yesno }}
{% trans "Protected" %}
{{ job_binary.is_protected|yesno }}
{% trans "Create time" %}
{{ job_binary.created_at|parse_isotime }}
{% trans "Download job binary" %}
././@PaxHeader0000000000000000000000000000021000000000000011446 xustar0000000000000000114 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_binaries/create.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_binaries/create.0000664000175000017500000000027000000000000033716 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Create Job Binary" %}{% endblock %} {% block main %} {% include 'job_binaries/_create.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5840726 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/0000775000175000017500000000000000000000000032655 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022300000000000011452 xustar0000000000000000125 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/_create_job_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/_creat0000664000175000017500000000236600000000000034044 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans %}Create a job template with a specified name.{% endblocktrans %}

{% blocktrans %}Select the type of your job:{% endblocktrans %}

  • {% blocktrans %}Pig{% endblocktrans %}
  • {% blocktrans %}Hive{% endblocktrans %}
  • {% blocktrans %}Spark{% endblocktrans %}
  • {% blocktrans %}Storm{% endblocktrans %}
  • {% blocktrans %}Storm Pyleus{% endblocktrans %}
  • {% blocktrans %}MapReduce{% endblocktrans %}
  • {% blocktrans %}Java Action{% endblocktrans %}
  • {% blocktrans %}Shell Action{% endblocktrans %}

{% blocktrans %}Choose or create your main binary. Additional libraries can be added from the "Libs" tab.{% endblocktrans %}

{% blocktrans %}For Storm, Storm Pyleus, Spark and Shell jobs, only a main is required,"libs" are optional.{% endblocktrans %}

{% blocktrans trimmed %}For MapReduce or Java Action jobs, "mains" are not applicable. You are required to add one or more "libs" for these jobs.{% endblocktrans %}

{% blocktrans %}You may also enter an optional description for your job template.{% endblocktrans %}

././@PaxHeader0000000000000000000000000000023000000000000011450 xustar0000000000000000130 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/_create_job_libs_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/_creat0000664000175000017500000000071200000000000034035 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans %}Add libraries to your job template.{% endblocktrans %}

{% blocktrans %}Choose from the list of binaries and click "choose" to add the library to your job template. This can be repeated for additional libraries.{% endblocktrans %}

{% blocktrans %}For Shell Action jobs, any required files beyond the main script may be added as "libraries".{% endblocktrans %}

././@PaxHeader0000000000000000000000000000021300000000000011451 xustar0000000000000000117 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/_details.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/_detai0000664000175000017500000000262200000000000034027 0ustar00zuulzuul00000000000000{% load i18n sizeformat %}
{% trans "Name" %}
{{ job.name }}
{% trans "Project ID" %}
{% if job.tenant_id %}
{{ job.tenant_id }}
{% else %}
{{ job.project_id }}
{% endif %}
{% trans "ID" %}
{{ job.id }}
{% trans "Type" %}
{{ job.type }}
{% trans "Description" %}
{{ job.description|default:_("None") }}
{% trans "Public" %}
{{ job.is_public|yesno }}
{% trans "Protected" %}
{{ job.is_protected|yesno }}
{% trans "Mains" %}
{% for main in job.mains %}
{{ main.name }}
{% empty %}
{% trans "None" %}
{% endfor %}
{% trans "Libs" %}
{% for lib in job.libs %}
{{ lib.name }}
{% empty %}
{% trans "None" %}
{% endfor %}
{% trans "Created time" %}
{{ job.created_at|parse_isotime }}
{% trans "Updated time" %}
{{ job.updated_at|parse_isotime|default:_("Never") }}
././@PaxHeader0000000000000000000000000000023500000000000011455 xustar0000000000000000135 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/_launch_job_configure_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/_launc0000664000175000017500000000024100000000000034036 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans %}Enter any custom configuration required for your job's execution.{% endblocktrans %}

././@PaxHeader0000000000000000000000000000022300000000000011452 xustar0000000000000000125 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/_launch_job_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/_launc0000664000175000017500000000066500000000000034050 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans %}Launch the given job template on a cluster.{% endblocktrans %}

{% blocktrans %}Choose the cluster to use for the job.{% endblocktrans %}

{% blocktrans %}Choose the Input Data Source (n/a for Java and Shell jobs).{% endblocktrans %}

{% blocktrans %}Choose the Output Data Source (n/a for Java and Shell jobs).{% endblocktrans %}

././@PaxHeader0000000000000000000000000000022200000000000011451 xustar0000000000000000124 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/config_template.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/config0000664000175000017500000002202300000000000034044 0ustar00zuulzuul00000000000000{% load i18n %} {% include "horizon/common/_form_fields.html" %}
././@PaxHeader0000000000000000000000000000021100000000000011447 xustar0000000000000000115 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/create.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/create0000664000175000017500000000027600000000000034050 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Create Job Template" %}{% endblock %} {% block main %} {% include 'horizon/common/_workflow.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000024300000000000011454 xustar0000000000000000141 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/job_interface_arguments_template.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/job_in0000664000175000017500000000336300000000000034045 0ustar00zuulzuul00000000000000{% load i18n %}
././@PaxHeader0000000000000000000000000000021100000000000011447 xustar0000000000000000115 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/launch.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/launch0000664000175000017500000000026500000000000034055 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Launch Job" %}{% endblock %} {% block main %} {% include 'horizon/common/_workflow.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000021600000000000011454 xustar0000000000000000120 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/launch_ajax.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/launch0000664000175000017500000000121600000000000034052 0ustar00zuulzuul00000000000000{% load i18n %} {% include 'horizon/common/_workflow.html' %} ././@PaxHeader0000000000000000000000000000022300000000000011452 xustar0000000000000000125 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/library_template.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_templates/librar0000664000175000017500000000626700000000000034066 0ustar00zuulzuul00000000000000{% load i18n %}
{% include "horizon/common/_form_fields.html" %}
{{ step.get_help_text }}

././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5840726 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_wizard/0000775000175000017500000000000000000000000032157 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022000000000000011447 xustar0000000000000000122 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_wizard/_job_type_select.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_wizard/_job_type0000664000175000017500000000163200000000000034056 0ustar00zuulzuul00000000000000{% extends "horizon/common/_modal_form.html" %} {% load i18n %} {% block form_id %}create-job-binary{% endblock %} {% block form_action %} {% url 'horizon:project:data_processing.jobs:job_type_select' %} {% endblock %} {% block form_attrs %}enctype="multipart/form-data"{% endblock %} {% block modal-header %}{% trans "Choose job type" %}{% endblock %} {% block modal-body %}
{% include "horizon/common/_form_fields.html" %}
{{ form.get_help_text }}
{% endblock %} {% block modal-footer %} {% trans "Cancel" %} {% endblock %} ././@PaxHeader0000000000000000000000000000022500000000000011454 xustar0000000000000000127 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_wizard/_job_type_select_help.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_wizard/_job_type0000664000175000017500000000036100000000000034054 0ustar00zuulzuul00000000000000{% load i18n horizon %}

{% blocktrans trimmed %}Select which type of job that you want to run. This choice will dictate which steps are required to successfully execute your job. {% endblocktrans %}

././@PaxHeader0000000000000000000000000000021700000000000011455 xustar0000000000000000121 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_wizard/job_type_select.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_wizard/job_type_0000664000175000017500000000027500000000000034060 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Choose job type" %}{% endblock %} {% block main %} {% include 'job_wizard/_job_type_select.html' %} {% endblock %} ././@PaxHeader0000000000000000000000000000021300000000000011451 xustar0000000000000000117 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_wizard/jobex_guide.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/job_wizard/jobex_gui0000664000175000017500000001250100000000000034054 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Data Processing" %}{% endblock %} {% block main %}
  1. {% blocktrans trimmed %}First, select which type of job that you want to run. This choice will determine which other steps are required {% endblocktrans %}
    {% trans "Current type:" %} {% if request.session.guide_job_type %} {{ request.session.guide_job_type}} {% else %} {% trans "No type chosen" %} {% endif %}

  2. {% if request.session.guide_job_type %} {% if view.show_data_sources %}
  3. {% blocktrans trimmed %}Data Sources are what your job uses for input and output. Depending on the type of job you will be running, you may need to define one or more data sources. You can create multiple data sources by repeating this step. {% endblocktrans %}

  4. {% endif %}
  5. {% blocktrans trimmed %}Define your Job Template. This is where you choose the type of job that you want to run (Pig, Java Action, Spark, etc) and choose or upload the files necessary to run it. The inputs and outputs will be defined later. {% endblocktrans %}
    {% trans "Job template:" %} {% if request.session.guide_job_name %} {{ request.session.guide_job_name }} {% else %} {% trans "No job template created" %} {% endif %}

  6. {% blocktrans trimmed %}Launch your job. When launching, you may need to choose your input and output data sources. This is where you would also add any special configuration values, parameters, or arguments that you need to pass along to your job. {% endblocktrans %}
  7. {% endif %}
{% endblock %} ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5840726 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/jobs/0000775000175000017500000000000000000000000030762 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/jobs/_details.html0000664000175000017500000000544200000000000033441 0ustar00zuulzuul00000000000000{% load i18n sizeformat %}
{% trans "Status" %}
{{ job_execution.info.status }}
{% trans "ID" %}
{{ job_execution.id }}
{% trans "Project ID" %}
{% if job_execution.tenant_id %}
{{ job_execution.tenant_id }}
{% else %}
{{ job_execution.project_id }}
{% endif %}
{% trans "Job Template" %}
{% if job_execution.job_id %} {% else %} {% endif %} {{ object_names.job_name }}
{% trans "Public" %}
{{ job_execution.is_public|yesno }}
{% trans "Protected" %}
{{ job_execution.is_protected|yesno }}
{% if job_execution.input_id %}
{% trans "Input Data Source" %}
{{ object_names.input_name }} ({{ object_names.input_url }})
{% endif %} {% if job_execution.output_id %}
{% trans "Output Data Source" %}
{{ object_names.output_name }} ({{ object_names.output_url }})
{% endif %}
{% trans "Cluster" %}
{{ object_names.cluster_name }}
{% trans "Last Updated" %}
{{ job_execution.updated_at|parse_isotime }}
{% trans "Started" context "Start time" %}
{{ job_execution.start_time|parse_isotime }}
{% trans "Ended" context "End time" %}
{{ job_execution.end_time|parse_isotime }}
{% trans "Return Code" %}
{{ job_execution.return_code }}
{{ job_execution_engine_job_attr_pretty }}
{{ job_execution_engine_job_id }}
{% trans "Created" context "Created time" %}
{{ job_execution.created_at|parse_isotime }}
{% trans "Job Configuration" %}
{% for group, vals in job_execution.job_configs.iteritems %}
  • {% blocktrans %}{{ group }}:{% endblocktrans %} {% if group == "args" %}
      {% for val in vals %}
    • {{ val }}
    • {% endfor %}
    {% else %}
      {% for key, val in vals.iteritems %}
    • {{ key }} = {{ val }}
    • {% endfor %}
    {% endif %}
{% endfor %}
././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/jobs/index.html0000664000175000017500000000546400000000000032770 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Jobs" %}{% endblock %} {% block main %}
{{ tab_group.render }}
{% endblock %} ././@PaxHeader0000000000000000000000000000021000000000000011446 xustar0000000000000000114 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/jobs/job_executions.html 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templates/jobs/job_executions.0000664000175000017500000000476000000000000034012 0ustar00zuulzuul00000000000000{% extends 'base.html' %} {% load i18n %} {% block title %}{% trans "Data Processing" %}{% endblock %} {% block main %}
{{ job_executions_table.render }}
{% endblock %} ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5840726 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templatetags/0000775000175000017500000000000000000000000030521 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/templatetags/__init__.py0000664000175000017500000000116100000000000032631 0ustar00zuulzuul00000000000000# Copyright (c) 2016 Mirantis Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from horizon.utils import filters # noqa ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/urls.py0000664000175000017500000000761000000000000027372 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.conf.urls import url import sahara_dashboard.content.data_processing. \ jobs.views as views import sahara_dashboard.content.data_processing. \ jobs.job_binaries.views as job_binary_views import sahara_dashboard.content.data_processing. \ jobs.data_sources.views as data_source_views import sahara_dashboard.content.data_processing. \ jobs.job_templates.views as job_templates_views import sahara_dashboard.content.data_processing. \ jobs.wizard.views as job_wizard_views import sahara_dashboard.content.data_processing. \ jobs.jobs.views as jobs_views urlpatterns = [url(r'^$', views.IndexView.as_view(), name='index'), url(r'^$', views.IndexView.as_view(), name='jobs'), url(r'^\?tab=job_tabs__jobs_tab$', views.IndexView.as_view(), name='jobs-tab'), url(r'^create-job$', job_templates_views.CreateJobView.as_view(), name='create-job'), url(r'^launch-job$', job_templates_views.LaunchJobView.as_view(), name='launch-job'), url(r'^launch-job-new-cluster$', job_templates_views. LaunchJobNewClusterView.as_view(), name='launch-job-new-cluster'), url(r'^choose-plugin$', job_templates_views.ChoosePluginView.as_view(), name='choose-plugin'), url(r'^job-template/(?P[^/]+)$', job_templates_views. JobTemplateDetailsView.as_view(), name='jt-details'), url(r'^job-execution/(?P[^/]+)$', jobs_views.JobDetailsView.as_view(), name='details'), url(r'^create-job-binary$', job_binary_views.CreateJobBinaryView.as_view(), name='create-job-binary'), url(r'^job-binary/(?P[^/]+)$', job_binary_views.JobBinaryDetailsView.as_view(), name='jb-details'), url(r'^job-binary/(?P[^/]+)/edit$', job_binary_views.EditJobBinaryView.as_view(), name='edit-job-binary'), url(r'^job-binary/(?P[^/]+)/download/$', job_binary_views.DownloadJobBinaryView.as_view(), name='download'), url(r'^create-data-source$', data_source_views.CreateDataSourceView.as_view(), name='create-data-source'), url(r'^data-source/(?P[^/]+)/edit$', data_source_views.EditDataSourceView.as_view(), name='edit-data-source'), url(r'^data-source/(?P[^/]+)$', data_source_views.DataSourceDetailsView.as_view(), name='ds-details'), url(r'^jobex_guide$', job_wizard_views.JobExecutionGuideView.as_view(), name='jobex_guide'), url(r'^jobex_guide/(?P[^/]+)/$', job_wizard_views.ResetJobExGuideView.as_view(), name='reset_jobex_guide'), url(r'^job_type_select$', job_wizard_views.JobTypeSelectView.as_view(), name='job_type_select'), ] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/views.py0000664000175000017500000000303000000000000027532 0ustar00zuulzuul00000000000000# Copyright 2016 Rec Hat Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.utils.translation import ugettext_lazy as _ from horizon import tabs from sahara_dashboard.content.data_processing.jobs.data_sources \ import tabs as data_source_tabs from sahara_dashboard.content.data_processing.jobs.job_binaries \ import tabs as job_binary_tabs from sahara_dashboard.content.data_processing.jobs.job_templates \ import tabs as job_template_tabs from sahara_dashboard.content.data_processing.jobs.jobs \ import tabs as job_tabs from sahara_dashboard.content.data_processing.tabs \ import PaginationFriendlyTabGroup class JobTabs(PaginationFriendlyTabGroup): slug = "job_tabs" tabs = (job_tabs.JobsTab, job_template_tabs.JobTemplatesTab, data_source_tabs.DataSourcesTab, job_binary_tabs.JobBinariesTab,) sticky = True class IndexView(tabs.TabbedTableView): tab_group_class = JobTabs template_name = "jobs/index.html" page_title = _("Jobs") ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5880728 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/wizard/0000775000175000017500000000000000000000000027327 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/wizard/__init__.py0000664000175000017500000000000000000000000031426 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/wizard/forms.py0000664000175000017500000001112600000000000031030 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django import template from django.template import defaultfilters from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import forms from horizon import messages from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard.content.data_processing.utils \ import helpers class ChoosePluginForm(forms.SelfHandlingForm): def __init__(self, request, *args, **kwargs): super(ChoosePluginForm, self).__init__(request, *args, **kwargs) self._generate_plugin_version_fields(request) self.help_text_template = ("job_wizard/" "_plugin_select_help.html") def handle(self, request, context): try: hlps = helpers.Helpers(request) hlps.reset_guide() plugin_name = context["plugin_name"] request.session["plugin_name"] = plugin_name request.session["plugin_version"] = ( context[plugin_name + "_version"]) messages.success(request, _("Cluster type chosen")) return True except Exception: exceptions.handle(request, _("Unable to set cluster type")) return False def _generate_plugin_version_fields(self, request): sahara = saharaclient.client(request) plugins = sahara.plugins.list() plugin_choices = [(plugin.name, plugin.title) for plugin in plugins] self.fields["plugin_name"] = forms.ChoiceField( label=_("Plugin Name"), choices=plugin_choices, widget=forms.Select(attrs={"class": "switchable", "data-slug": "plugin"})) for plugin in plugins: field_name = plugin.name + "_version" choice_field = forms.ChoiceField( label=_("Version"), required=False, choices=[(version, version) for version in plugin.versions], widget=forms.Select( attrs={"class": "switched", "data-switch-on": "plugin", "data-plugin-" + plugin.name: plugin.title}) ) self.fields[field_name] = choice_field def get_help_text(self, extra_context=None): text = "" extra_context = extra_context or {} if self.help_text_template: tmpl = template.loader.get_template(self.help_text_template) text += tmpl.render(extra_context, self.request) else: text += defaultfilters.linebreaks(force_text(self.help_text)) return defaultfilters.safe(text) class Meta(object): name = _("Choose plugin type and version") class ChooseJobTypeForm(forms.SelfHandlingForm): guide_job_type = forms.ChoiceField( label=_("Job Type"), widget=forms.Select()) def __init__(self, request, *args, **kwargs): super(ChooseJobTypeForm, self).__init__(request, *args, **kwargs) self.help_text_template = ("job_wizard/" "_job_type_select_help.html") self.fields["guide_job_type"].choices = \ self.populate_guide_job_type_choices() def populate_guide_job_type_choices(self): choices = [(x, helpers.JOB_TYPE_MAP[x][0]) for x in helpers.JOB_TYPE_MAP] return choices def handle(self, request, context): try: hlps = helpers.Helpers(request) job_type = context["guide_job_type"] if force_text(request.session.get("guide_job_type")) != ( force_text(helpers.JOB_TYPE_MAP[job_type][0])): hlps.reset_job_guide() request.session["guide_job_type"] = ( helpers.JOB_TYPE_MAP[job_type][0]) messages.success(request, _("Job type chosen")) return True except Exception: exceptions.handle(request, _("Unable to set job type")) return False ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/wizard/tests.py0000664000175000017500000000235400000000000031047 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.urls import reverse from sahara_dashboard.test import helpers as test JOB_GUIDE_URL = reverse( 'horizon:project:data_processing.jobs:jobex_guide') JOB_GUIDE_RESET_URL = reverse( 'horizon:project:data_processing.jobs:reset_jobex_guide', kwargs={"reset_jobex_guide": "true"}) class DataProcessingClusterGuideTests(test.TestCase): def test_jobex_guide(self): res = self.client.get(JOB_GUIDE_URL) self.assertTemplateUsed( res, 'job_wizard/jobex_guide.html') self.assertContains(res, 'Guided Job Execution') def test_jobex_guide_reset(self): res = self.client.get(JOB_GUIDE_RESET_URL) self.assertRedirectsNoFollow(res, JOB_GUIDE_URL) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/jobs/wizard/views.py0000664000175000017500000000410200000000000031033 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django import http from django.urls import reverse_lazy from django.utils.translation import ugettext_lazy as _ from django.views import generic from horizon import forms from horizon import views as horizon_views import sahara_dashboard.content.data_processing.jobs.wizard.forms as wizforms from sahara_dashboard.content.data_processing.utils \ import helpers class JobExecutionGuideView(horizon_views.APIView): template_name = 'job_wizard/jobex_guide.html' page_title = _("Guided Job Execution") def show_data_sources(self): try: if self.request.session["guide_job_type"] in ["Spark", "Storm", "Storm.Pyleus" "Java"]: return False return True except Exception: return True class ResetJobExGuideView(generic.RedirectView): pattern_name = 'horizon:project:data_processing.jobs:jobex_guide' permanent = True def get(self, request, *args, **kwargs): if kwargs["reset_jobex_guide"]: hlps = helpers.Helpers(request) hlps.reset_job_guide() return http.HttpResponseRedirect(reverse_lazy(self.pattern_name)) class JobTypeSelectView(forms.ModalFormView): form_class = wizforms.ChooseJobTypeForm success_url = reverse_lazy( 'horizon:project:data_processing.jobs:jobex_guide') classes = ("ajax-modal") template_name = "job_wizard/job_type_select.html" page_title = _("Choose job type") ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/0000775000175000017500000000000000000000000026361 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/0000775000175000017500000000000000000000000030310 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/0000775000175000017500000000000000000000000031756 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022000000000000011447 xustar0000000000000000116 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/ 28 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_proce0000775000175000017500000000000000000000000034000 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022400000000000011453 xustar0000000000000000120 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/css/ 28 mtime=1648641572.5880728 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_proce0000775000175000017500000000000000000000000034000 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000023300000000000011453 xustar0000000000000000133 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/css/clusters.scss 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_proce0000664000175000017500000000024000000000000033776 0ustar00zuulzuul00000000000000#image-tag { float: left; display: block; margin: 2px; } #cluster-progress-bar { width: 100%; } #sahara-bullet-list { margin-left: 20px; }././@PaxHeader0000000000000000000000000000022700000000000011456 xustar0000000000000000129 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/css/jobs.scss 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_proce0000664000175000017500000000022300000000000033777 0ustar00zuulzuul00000000000000#lib-name { padding-right: 15px; } #btn-remove-lib { float: left; padding-right: 5px; } #lib-name-hidden { padding-right: 15px; }././@PaxHeader0000000000000000000000000000022300000000000011452 xustar0000000000000000119 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/js/ 28 mtime=1648641572.5880728 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_proce0000775000175000017500000000000000000000000034000 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000025100000000000011453 xustar0000000000000000147 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/js/data_processing.event_log.js 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_proce0000664000175000017500000001155200000000000034006 0ustar00zuulzuul00000000000000horizon.event_log = { cluster_id: null, data_update_url: null, cached_data: null, modal_step_id: null, fetch_update_events: function() { var url = this.data_update_url + "/events"; $.get(url).done(function (data) { horizon.event_log.cached_data = data; horizon.event_log.update_view(data); horizon.event_log.schedule_next_update(data); }).fail(function() { // Event log is not available for some reason. horizon.alert("error", gettext("Event log is not available.")); }); }, update_view: function (data) { this.update_step_rows(data.provision_steps); this.update_events_rows(data); }, update_step_rows: function (steps) { // Clear steps $("#steps_body").find("tr").remove(); $(steps).each(function (i, step) { horizon.event_log.create_step_row(step); }); }, create_step_row: function (step) { var step_row_template = "" + "" + "%step_descr%" + "%started_at%" + "%duration%" + "%progress%" + "%result% " + "" + gettext('(show events)') + "" + "" + ""; var started_at = step.started_at; var progress = "" + step.completed + " / " + step.total; var description = step.step_type + "
" + step.step_name; var row = step_row_template .replace(/%step_id%/g, step.id) .replace(/%step_descr%/g, description) .replace(/%started_at%/g, started_at) .replace(/%duration%/g, step.duration) .replace(/%progress%/g, progress) .replace(/%result%/g, step.result); $("#steps_body").append(row); $("#" + step.id + "_show_events_btn").css('cursor', 'pointer'); if (step.successful === true) { $("#" + step.id + "_show_events_btn").hide(); } if (step.successful === true) { $("#" + step.id).find('td.step-result-cell').css('color', 'green'); } else if (step.successful === false) { $("#" + step.id).find('td.step-result-cell').css('color', 'red'); } }, update_events_rows: function(data) { if (!this.modal_step_id) { return; } var current_step = null; $(data.provision_steps).each(function (i, step) { if (step.id === horizon.event_log.modal_step_id) { current_step = step; } }); var header = current_step.step_type + "
" + current_step.step_name; $("#events_modal_header").html(header); // Clear events this.clear_events(); this.clear_modal_status(); if (current_step.successful === true) { this.mark_modal_as_successful(); return; } var events = current_step.events; $(events).each(function (i, event) { event.step_name = current_step.step_name; }); $(events).each(function (i, event) { horizon.event_log.create_event_row(event); }); }, clear_events: function() { $("#events_body").find("tr").remove(); }, clear_modal_status: function() { $("#modal_status_marker").text(""); }, mark_modal_as_successful: function() { $("#modal_status_marker").text(gettext( "The step has completed successfully. No events to display.")); }, create_event_row: function(event) { var step_row_template = "" + "" + "%node_group_name%" + "%instance%" + "%time%" + "%info%" + "%result%" + ""; var event_time = new Date(event.created_at).toString(); var row = step_row_template .replace(/%event_id%/g, event.id) .replace(/%node_group_name%/g, event.node_group_name) .replace(/%instance%/g, event.instance_name) .replace(/%time%/g, event_time) .replace(/%info%/g, event.event_info) .replace(/%result%/g, event.result); $("#events_body").append(row); }, schedule_next_update: function(data) { // 2-3 sec delay so that if there are multiple tabs polling the backed // the requests are spread in time var delay = 2000 + Math.floor((Math.random() * 1000) + 1); if (data.need_update) { setTimeout(function () { horizon.event_log.fetch_update_events(); }, delay); } } }; ././@PaxHeader0000000000000000000000000000026700000000000011462 xustar0000000000000000161 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/js/data_processing.job_interface_arguments.js 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_proce0000664000175000017500000002172600000000000034012 0ustar00zuulzuul00000000000000horizon.job_interface_arguments = { argument_template: '' + '
' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '' + '' + '' + '' + '' + '' + '
' + '' + '' + '' + '
' + '' + '' + '' + '' + '' + '' + '
' + '' + '' + '' + '' + '' + '' + '
' + '' + '' + '' + '
' + '' + '' + '' + '
' + '' + '' + '' + '' + '' + '' + '
' + '
', job_interface: null, argument_ids: null, value_type: null, add_argument_button: null, value_type_default: null, current_value_type: function() { return this.value_type.find("option:selected").html(); }, mark_argument_element_as_wrong: function(id) { $("#" + id).addClass("error"); }, get_next_argument_id: function() { var max = -1; $(".argument-form").each(function () { max = Math.max(max, parseInt($(this).attr("id_attr"))); }); return max + 1; }, set_argument_ids: function() { var ids = []; $(".argument-form").each(function () { var id = parseInt($(this).attr("id_attr")); if (!isNaN(id)) { ids.push(id); } }); this.argument_ids.val(JSON.stringify(ids)); }, add_argument_node: function(id, name, description, mapping_type, location, value_type, required, default_value) { var tmp = this.argument_template. replace(/\$id/g, id). replace(/\$name/g, name). replace(/\$description/g, description). replace(/\$mapping_type/g, mapping_type). replace(/\$location/g, location). replace(/\$value_type/g, value_type). replace(/\$required/g, required). replace(/\$default_value/g, default_value); this.job_interface.find("div:last").after(tmp); $("#argument_value_type_" + id).val(value_type.toLowerCase().replace(" ", "_")); this.job_interface.show(); this.set_argument_ids(); }, add_interface_argument: function() { var value_type = this.current_value_type(); if (value_type === this.value_type_default) { return; } this.add_argument_node(this.get_next_argument_id(), "", "", "args", "", value_type, true, ""); $(".count-field").change(); }, delete_interface_argument: function(el) { $(el).closest("div").remove(); var id = this.get_next_argument_id(); if (id === 0) { this.job_interface.hide(); } this.set_argument_ids(); }, init_arguments: function() { // This line enables tooltips on this tab to properly display their help text. $("body").tooltip({selector: ".help-icon"}); this.job_interface = $("#job_interface_arguments"); this.argument_ids = $("#argument_ids"); this.value_type = $("#value_type"); this.add_argument_button = $("#add_argument_button"); this.value_type_default = this.current_value_type(); this.value_type.change(function () { if (horizon.job_interface_arguments.current_value_type() === this.value_type_default) { horizon.job_interface_arguments.add_argument_button.addClass("disabled"); } else { horizon.job_interface_arguments.add_argument_button.removeClass("disabled"); } }); this.job_interface.hide(); } }; ././@PaxHeader0000000000000000000000000000025500000000000011457 xustar0000000000000000151 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/js/data_processing.job_launching.js 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_proce0000664000175000017500000000165700000000000034013 0ustar00zuulzuul00000000000000horizon.job_launching_warning = { show_warning: function(cl_name_status_map, status_message_map) { var cl_choice_elem = $('.cluster_choice').parent(); var current_cl_name = $('.cluster_choice option:selected').text(); var current_cl_status = cl_name_status_map[current_cl_name]; var warning_msg = status_message_map[current_cl_status]; var warning_elem = "
" + "

" + gettext("Warning!") + "

" + "

" + warning_msg + "

" + "
"; if ($.isEmptyObject(cl_name_status_map) || current_cl_status === 'Active') { $('.not_active_state_warning').remove(); } else { cl_choice_elem.append(warning_elem); $('.not_active_state_warning').css('margin-top', '5px'); } } }; ././@PaxHeader0000000000000000000000000000025500000000000011457 xustar0000000000000000151 path=sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/js/data_processing.verifications.js 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/static/dashboard/project/data_proce0000664000175000017500000000374300000000000034011 0ustar00zuulzuul00000000000000horizon.verifications = { data_update_url: null, update_health_checks: function() { var url = this.data_update_url + "/verifications"; $.get(url).done(function(data) { horizon.verifications.update_health_checks_view(data.checks); horizon.verifications.schedule_next_update(data); }).fail(function() { horizon.alert("error", gettext("Verification is not available.")); }); }, update_health_checks_view: function(checks) { // Clear health checks $("#sahara_health_checks_body").find("tr").remove(); $(checks).each(function (i, check) { horizon.verifications.create_check_row(check); }); }, create_check_row: function(check) { var check_row_template = "" + "" + "%status%" + "%name%" + "%duration%" + "%description%" + ""; var status_template = "" + "%status_text%"; var status = status_template .replace(/%label_type%/g, check.label) .replace(/%status_text%/g, check.status); var row = check_row_template .replace(/%check_id%/g, check.id) .replace(/%name%/g, check.name) .replace(/%duration%/g, check.duration) .replace(/%status%/g, status) .replace(/%description%/g, check.description); $("#sahara_health_checks_body").append(row); }, schedule_next_update: function(data) { // 2-3 sec delay so that if there are multiple tabs polling the // backend the requests are spread in time var delay = 2000 + Math.floor((Math.random() * 1000) + 1); if (data.need_update) { setTimeout(function() { horizon.verifications.update_health_checks(); }, delay); } } }; ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/tables.py0000664000175000017500000000326600000000000026725 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from horizon import tables import sahara_dashboard.api.sahara as saharaclient class SaharaPaginateTabbedTable(tables.DataTable): def get_pagination_string(self): return "tab=%s&limit=%s&marker=%s" % ( self.tab_name, saharaclient.get_page_size(self.request), self.data.next ) def get_prev_pagination_string(self): if self.data.prev is None: return "tab=%s&limit=%s" % ( self.tab_name, saharaclient.get_page_size(self.request) ) return "tab=%s&limit=%s&marker=%s" % ( self.tab_name, saharaclient.get_page_size(self.request), self.data.prev ) def has_more_data(self): return hasattr(self.data, 'next') and self.data.next is not None def has_prev_data(self): if hasattr(self.data, 'prev'): if 'tab' in self.request.GET: if self.tab_name == self.request.GET['tab']: if 'marker' not in self.request.GET: return False else: return True return False ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/tabs.py0000664000175000017500000000615000000000000026377 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from horizon import exceptions from horizon import tabs from horizon.tabs import base from sahara_dashboard import utils as u class SaharaTableTab(tabs.TableTab): def get_server_filter_info(self, request, table): filter_action = table._meta._filter_action if filter_action is None or filter_action.filter_type != 'server': return None param_name = filter_action.get_param_name() filter_string = request.POST.get(param_name) filter_string_session = request.session.get(param_name, "") changed = (filter_string is not None and filter_string != filter_string_session) if filter_string is None: filter_string = filter_string_session filter_field_param = param_name + '_field' filter_field = request.POST.get(filter_field_param) filter_field_session = request.session.get(filter_field_param) if filter_field is None and filter_field_session is not None: filter_field = filter_field_session setattr(table.base_actions["filter"], "filter_string", filter_string) setattr(table.base_actions["filter"], "filter_field", filter_field) filter_info = { 'action': filter_action, 'value_param': param_name, 'value': filter_string, 'field_param': filter_field_param, 'field': filter_field, 'changed': changed } return filter_info class PaginationFriendlyTabGroup(tabs.TabGroup): def load_tab_data(self): """Preload all data that for the tabs that will be displayed.""" request_without_marker = u.delete_pagination_params_from_request( self.request, save_limit=True) for tab in self._tabs.values(): current_tab_id = tab.slug tab_request = self.request.GET.get('tab') request_tab_id = None if tab_request: request_tab_id = tab_request.split(base.SEPARATOR)[1] if request_tab_id and current_tab_id != request_tab_id: try: tab.request = request_without_marker tab._data = tab.get_context_data(request_without_marker) except Exception: tab._data = False exceptions.handle(request_without_marker) if tab.load and not tab.data_loaded: try: tab._data = tab.get_context_data(self.request) except Exception: tab._data = False exceptions.handle(self.request) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5880728 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/utils/0000775000175000017500000000000000000000000026232 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/utils/__init__.py0000664000175000017500000000000000000000000030331 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/utils/acl.py0000664000175000017500000000747500000000000027360 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import abc import functools from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ungettext_lazy from horizon import exceptions from horizon import forms from horizon import tables MESSAGE_MAPPING_PRESENT = { 'public': functools.partial( ungettext_lazy, u"Make public", u"Make public"), 'private': functools.partial( ungettext_lazy, u"Make private", u"Make private"), 'protected': functools.partial( ungettext_lazy, u"Make protected", u"Make protected"), 'unprotected': functools.partial( ungettext_lazy, u"Make unprotected", u"Make unprotected"), } MESSAGE_MAPPING_PAST = { 'public': functools.partial( ungettext_lazy, u"Made public", u"Made public"), 'private': functools.partial( ungettext_lazy, u"Made private", u"Made private"), 'protected': functools.partial( ungettext_lazy, u"Made protected", u"Made protected"), 'unprotected': functools.partial( ungettext_lazy, u"Made unprotected", u"Made unprotected"), } class RuleChangeAction(tables.BatchAction): rule = "no-rule" def action_present(self, count): return MESSAGE_MAPPING_PRESENT[self.rule](count) def action_past(self, count): return MESSAGE_MAPPING_PAST[self.rule](count) def action(self, request, datum_id): try: update_kwargs = {} if self.rule in ['public', 'private']: update_kwargs['is_public'] = self.rule == "public" if self.rule in ["protected", "unprotected"]: update_kwargs['is_protected'] = self.rule == "protected" self.change_rule_method(request, datum_id, **update_kwargs) except Exception as e: exceptions.handle(request, e) raise class MakePublic(RuleChangeAction): name = "make_public" rule = "public" @abc.abstractmethod def change_rule_method(self, request, datum_id, **update_kwargs): pass class MakePrivate(RuleChangeAction): name = "make_private" rule = "private" @abc.abstractmethod def change_rule_method(self, request, datum_id, **update_kwargs): pass class MakeProtected(RuleChangeAction): name = "make_protected" rule = "protected" @abc.abstractmethod def change_rule_method(self, request, datum_id, **update_kwargs): pass class MakeUnProtected(RuleChangeAction): name = "make_unprotected" rule = "unprotected" @abc.abstractmethod def change_rule_method(self, request, datum_id, **update_kwargs): pass def get_is_public_form(object_type): return forms.BooleanField( label=_("Public"), help_text=_("If selected, %s will be shared across the " "tenants") % object_type, required=False, widget=forms.CheckboxInput(), initial=False, ) def get_is_protected_form(object_type): return forms.BooleanField( label=_("Protected"), help_text=_("If selected, %s will be protected from modifications " "until this will be unselected") % object_type, required=False, widget=forms.CheckboxInput(), initial=False) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/utils/anti_affinity.py0000664000175000017500000000431700000000000031435 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import forms from sahara_dashboard.api import sahara as saharaclient import sahara_dashboard.content.data_processing. \ utils.workflow_helpers as whelpers def anti_affinity_field(): return forms.MultipleChoiceField( label=_("Use anti-affinity groups for: "), required=False, help_text=_("Use anti-affinity groups for processes"), widget=forms.CheckboxSelectMultiple() ) def populate_anti_affinity_choices(self, request, context): try: sahara = saharaclient.client(request) plugin, version = whelpers.get_plugin_and_hadoop_version(request) version_details = sahara.plugins.get_version_details(plugin, version) process_choices = [] for processes in version_details.node_processes.values(): for process in processes: process_choices.append((process, process)) cluster_template_id = request.GET.get("cluster_template_id", None) if cluster_template_id is None: selected_processes = request.GET.get("aa_groups", []) else: cluster_template = ( sahara.cluster_templates.get(cluster_template_id)) selected_processes = cluster_template.anti_affinity checked_dict = dict() for process in selected_processes: checked_dict[process] = process self.fields['anti_affinity'].initial = checked_dict except Exception: process_choices = [] exceptions.handle(request, _("Unable to populate anti-affinity processes.")) return process_choices ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/utils/helpers.py0000664000175000017500000002014000000000000030243 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from pytz import timezone as ptz from django.template import defaultfilters as filters from django.utils import timezone from django.utils.translation import ugettext from django.utils.translation import ugettext_lazy as _ from oslo_utils import timeutils import sahara_dashboard.content.data_processing. \ utils.workflow_helpers as work_helpers from sahara_dashboard.api import sahara as saharaclient class Helpers(object): def __init__(self, request): self.request = request def _get_node_processes(self, plugin): processes = [] for proc_lst in plugin.node_processes.values(): processes += proc_lst return [(proc_name, proc_name) for proc_name in processes] def get_node_processes(self, plugin_name, hadoop_version): plugin = saharaclient.plugin_get_version_details(self.request, plugin_name, hadoop_version) return self._get_node_processes(plugin) def _extract_parameters(self, configs, scope, applicable_target): parameters = [] for config in configs: if (config['scope'] == scope and config['applicable_target'] == applicable_target): parameters.append(work_helpers.Parameter(config)) return parameters def get_cluster_general_configs(self, plugin_name, hadoop_version): plugin = saharaclient.plugin_get_version_details(self.request, plugin_name, hadoop_version) return self._extract_parameters(plugin.configs, 'cluster', "general") def get_general_node_group_configs(self, plugin_name, hadoop_version): plugin = saharaclient.plugin_get_version_details(self.request, plugin_name, hadoop_version) return self._extract_parameters(plugin.configs, 'node', 'general') def get_general_and_service_nodegroups_parameters(self, plugin_name, hadoop_version): plugin = saharaclient.plugin_get_version_details( self.request, plugin_name, hadoop_version) general_parameters = self._extract_parameters( plugin.configs, 'node', 'general') service_parameters = {} for service in plugin.node_processes.keys(): service_parameters[service] = self._extract_parameters( plugin.configs, 'node', service) return general_parameters, service_parameters def get_targeted_cluster_configs(self, plugin_name, hadoop_version): plugin = saharaclient.plugin_get_version_details(self.request, plugin_name, hadoop_version) parameters = {} for service in plugin.node_processes.keys(): parameters[service] = self._extract_parameters(plugin.configs, 'cluster', service) return parameters def is_from_guide(self): referer = self.request.environ.get("HTTP_REFERER") if referer and ("/cluster_guide" in referer or "/jobex_guide" in referer): return True return False def reset_guide(self): try: self.request.session.update( {"plugin_name": None, "plugin_version": None, "master_name": None, "master_id": None, "worker_name": None, "worker_id": None, "guide_cluster_template_name": None}) except Exception: return False return True def reset_job_guide(self): try: self.request.session.update( {"guide_job_type": None, "guide_job_name": None, "guide_job_id": None, "guide_datasource_id": None, "guide_datasource_name": None, }) except Exception: return False return True def get_duration(self, start_time, end_time=None): """Calculates time delta between start and end timestamps Calculates the delta between given timestamps. The arguments should be provided as strings. The format should match %Y-%m-%dT%H:%M:%S which is returned by default from Sahara API. The end time may be skipped. In this case datetime.now() will be used. :param start_time: Start timestamp. :param end_time: (optional) End timestamp. :return: The delta between timestamps. """ start_datetime = timeutils.parse_isotime(start_time) if end_time: end_datetime = timeutils.parse_isotime(end_time) else: end_datetime = timeutils.utcnow(True) end_datetime = end_datetime.replace(microsecond=0) return str(end_datetime - start_datetime) def to_time_zone(self, datetime, tzone=None, input_fmt=None, localize=False): """Changes given datetime string into given timezone :param datetime: datetime string :param tzone: (optional) timezone as a string (e.g. "Europe/Paris"), by default it's the current django timezone :param input_fmt: (optional) format of datetime param, if None then the default Sahara API format (%Y-%m-%dT%H:%M:%S) will be used :param localize: (optional) if True then format of datetime will be localized according to current timezone else it will be in the default Sahara API format (%Y-%m-%dT%H:%M:%S) :return datetime string in the current django timezone """ default_fmt = '%Y-%m-%dT%H:%M:%S' if tzone is None: tzone = self.request.session.get('django_timezone', 'UTC') if input_fmt is None: input_fmt = default_fmt dt_in_utc = timezone.utc.localize( timeutils.parse_strtime(datetime, input_fmt)) dt_in_zone = dt_in_utc.astimezone(ptz(tzone)) if localize: return filters.date(dt_in_zone, "DATETIME_FORMAT") else: return dt_in_zone.strftime(default_fmt) # Map needed because switchable fields need lower case # and our server is expecting upper case. We will be # using the 0 index as the display name and the 1 index # as the value to pass to the server. JOB_TYPE_MAP = {"pig": [_("Pig"), "Pig"], "hive": [_("Hive"), "Hive"], "spark": [_("Spark"), "Spark"], "storm": [_("Storm"), "Storm"], "storm.pyleus": [_("Storm Pyleus"), "Storm.Pyleus"], "mapreduce": [_("MapReduce"), "MapReduce"], "mapreduce.streaming": [_("Streaming MapReduce"), "MapReduce.Streaming"], "java": [_("Java"), "Java"], "shell": [_("Shell"), "Shell"]} # Statuses of clusters that we can choose for job execution and # suitable messages that will be displayed next to the cluster name ALLOWED_STATUSES = { "Active": "", "Error": "(in error state)", } # Cluster status and suitable warning message that will be displayed # in the Job Launch form STATUS_MESSAGE_MAP = { "Error": ugettext("You\'ve chosen a cluster that is in \'Error\' state. " "Appropriate execution of the job can't be guaranteed."), } ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/utils/neutron_support.py0000664000175000017500000000225000000000000032071 0ustar00zuulzuul00000000000000# Copyright (c) 2013 Mirantis Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from openstack_dashboard.api import neutron def populate_neutron_management_network_choices(self, request, context): try: tenant_id = self.request.user.tenant_id networks = neutron.network_list_for_tenant(request, tenant_id) network_list = [(network.id, network.name_or_id) for network in networks] except Exception: network_list = [] exceptions.handle(request, _('Unable to retrieve networks.')) return network_list ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/content/data_processing/utils/workflow_helpers.py0000664000175000017500000003770100000000000032210 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from oslo_log import log as logging from django.core.exceptions import ValidationError from django.utils import safestring from django.utils.translation import ugettext_lazy as _ from horizon import exceptions from horizon import forms from horizon import workflows from openstack_dashboard.api import neutron from sahara_dashboard.api import sahara as saharaclient from sahara_dashboard import utils LOG = logging.getLogger(__name__) class Parameter(object): def __init__(self, config): self.name = config['name'] self.description = config.get('description', "No description") self.required = not config['is_optional'] self.default_value = config.get('default_value', None) self.initial_value = self.default_value self.param_type = config['config_type'] self.priority = int(config.get('priority', 2)) self.choices = config.get('config_values', None) def build_control(parameter): attrs = {"priority": parameter.priority, "placeholder": parameter.default_value} if parameter.param_type == "string": return forms.CharField( widget=forms.TextInput(attrs=attrs), label=parameter.name, required=(parameter.required and parameter.default_value is None), help_text=parameter.description, initial=parameter.initial_value) if parameter.param_type == "int": return forms.IntegerField( widget=forms.TextInput(attrs=attrs), label=parameter.name, required=parameter.required, help_text=parameter.description, initial=parameter.initial_value) elif parameter.param_type == "bool": return forms.BooleanField( widget=forms.CheckboxInput(attrs=attrs), label=parameter.name, required=False, initial=parameter.initial_value, help_text=parameter.description) elif parameter.param_type == "dropdown": return forms.ChoiceField( widget=forms.Select(attrs=attrs), label=parameter.name, required=parameter.required, choices=parameter.choices, help_text=parameter.description) def _create_step_action(name, title, parameters, advanced_fields=None, service=None): class_fields = {} contributes_field = () for param in parameters: field_name = "CONF:" + service + ":" + param.name contributes_field += (field_name,) class_fields[field_name] = build_control(param) if advanced_fields is not None: for ad_field_name, ad_field_value in advanced_fields: class_fields[ad_field_name] = ad_field_value action_meta = type('Meta', (object, ), dict(help_text_template=("nodegroup_templates/" "_fields_help.html"))) class_fields['Meta'] = action_meta action = type(str(title), (workflows.Action,), class_fields) step_meta = type('Meta', (object,), dict(name=title)) step = type(str(name), (workflows.Step, ), dict(name=name, process_name=name, action_class=action, contributes=contributes_field, Meta=step_meta)) return step def build_node_group_fields(action, name, template, count, serialized=None): action.fields[name] = forms.CharField( label=_("Name"), widget=forms.TextInput()) action.fields[template] = forms.CharField( label=_("Node group cluster"), widget=forms.HiddenInput()) action.fields[count] = forms.IntegerField( label=_("Count"), min_value=0, widget=forms.HiddenInput()) action.fields[serialized] = forms.CharField( widget=forms.HiddenInput()) def build_interface_argument_fields( action, name, description, mapping_type, location, value_type, required, default_value): action.fields[name] = forms.CharField( label=_("Name"), widget=forms.TextInput(), required=True) action.fields[description] = forms.CharField( label=_("Description"), widget=forms.TextInput(), required=False) action.fields[mapping_type] = forms.ChoiceField( label=_("Mapping Type"), widget=forms.Select(), required=True, choices=[("args", _("Positional Argument")), ("configs", _("Configuration Value")), ("params", _("Named Parameter"))]) action.fields[location] = forms.CharField( label=_("Location"), widget=forms.TextInput(), required=True) action.fields[value_type] = forms.ChoiceField( label=_("Value Type"), widget=forms.Select(), required=True, choices=[("string", _("String")), ("number", _("Number")), ("data_source", _("Data Source"))]) action.fields[required] = forms.BooleanField( widget=forms.CheckboxInput(), label=_("Required"), required=False, initial=True) action.fields[default_value] = forms.CharField( label=_("Default Value"), widget=forms.TextInput(), required=False) def parse_configs_from_context(context, defaults): configs_dict = dict() for key, val in context.items(): if str(key).startswith("CONF"): key_split = str(key).split(":") service = key_split[1] config = key_split[2] if service not in configs_dict: configs_dict[service] = dict() if val is None: continue if str(defaults[service][config]) == str(val): continue configs_dict[service][config] = val return configs_dict def get_security_groups(request, security_group_ids): security_groups = [] for group in security_group_ids or []: try: security_groups.append(neutron.security_group_get( request, group)) except Exception: LOG.info(_('Unable to retrieve security group %(group)s.') % {'group': group}) security_groups.append({'name': group}) return security_groups def get_plugin_and_hadoop_version(request): plugin_name = None hadoop_version = None # In some cases request contains valuable info in both GET and POST methods req = request.GET.copy() req.update(request.POST) if req.get("plugin_name"): plugin_name = req["plugin_name"] hadoop_version = ( req.get("plugin_version", None) or req["hadoop_version"] ) return plugin_name, hadoop_version def clean_node_group(node_group): node_group_copy = dict((key, value) for key, value in node_group.items() if value) for key in ["id", "created_at", "updated_at"]: if key in node_group_copy: node_group_copy.pop(key) return node_group_copy def populate_image_choices(self, request, context, empty_choice=False): try: all_images = saharaclient.image_list(request) plugin, hadoop_version = get_plugin_and_hadoop_version(request) details = saharaclient.plugin_get_version_details(request, plugin, hadoop_version) choices = [(image.id, image.name) for image in all_images if (set(details.required_image_tags). issubset(set(image.tags)))] except Exception: exceptions.handle(request, _("Unable to fetch image choices.")) choices = [] if empty_choice: choices = [(None, _('No image specified'))] + choices if not choices: choices.append(("", _("No Images Available"))) return choices class PluginAndVersionMixin(object): def _generate_plugin_version_fields(self, sahara): plugins = [p for p in sahara.plugins.list() if is_plugin_not_hidden_for_user(p)] plugin_choices = [(plugin.name, plugin.title) for plugin in plugins] self.fields["plugin_name"] = forms.ChoiceField( label=_("Plugin Name"), choices=plugin_choices, widget=forms.Select( attrs={"class": "plugin_name_choice switchable", 'data-slug': 'pluginname'})) for plugin in plugins: versions = [(version, version) for version in get_enabled_versions(plugin)] version_choices = sorted( versions, reverse=True, key=lambda v: utils.smart_sort_helper(v[0])) field_name = plugin.name + "_version" choice_field = forms.ChoiceField( label=_("Version"), choices=version_choices, widget=forms.Select( attrs={"class": "plugin_version_choice switched " + field_name + "_choice", "data-switch-on": "pluginname", "data-pluginname-%s" % plugin.name: _("Version")}) ) self.fields[field_name] = choice_field class PatchedDynamicWorkflow(workflows.Workflow): """Overrides Workflow to fix its issues.""" def _ensure_dynamic_exist(self): if not hasattr(self, 'dynamic_steps'): self.dynamic_steps = list() def _register_step(self, step): # Use that method instead of 'register' to register step. # Note that a step could be registered in descendant class constructor # only before this class constructor is invoked. self._ensure_dynamic_exist() self.dynamic_steps.append(step) def _order_steps(self): # overrides method of Workflow # crutch to fix https://bugs.launchpad.net/horizon/+bug/1196717 # and another not filed issue that dynamic creation of tabs is # not thread safe self._ensure_dynamic_exist() self._registry = dict([(step, step(self)) for step in self.dynamic_steps]) return list(self.default_steps) + self.dynamic_steps class ServiceParametersWorkflow(PatchedDynamicWorkflow): """Base class for Workflows having services tabs with parameters.""" def _populate_tabs(self, general_parameters, service_parameters): # Populates tabs for 'general' and service parameters # Also populates defaults and initial values self.defaults = dict() self._init_step('general', 'General Parameters', general_parameters) for service, parameters in service_parameters.items(): self._init_step(service, service + ' Parameters', parameters) def _init_step(self, service, title, parameters): if not parameters: return self._populate_initial_values(service, parameters) step = _create_step_action(service, title=title, parameters=parameters, service=service) self.defaults[service] = dict() for param in parameters: self.defaults[service][param.name] = param.default_value self._register_step(step) def _set_configs_to_copy(self, configs): self.configs_to_copy = configs def _populate_initial_values(self, service, parameters): if not hasattr(self, 'configs_to_copy'): return configs = self.configs_to_copy for param in parameters: if (service in configs and param.name in configs[service]): param.initial_value = configs[service][param.name] class StatusFormatMixin(workflows.Workflow): def __init__(self, request, context_seed, entry_point, *args, **kwargs): super(StatusFormatMixin, self).__init__(request, context_seed, entry_point, *args, **kwargs) def format_status_message(self, message): error_description = getattr(self, 'error_description', None) if error_description: return error_description else: return message % self.context[self.name_property] class ShareWidget(forms.MultiWidget): def __init__(self, choices=()): widgets = [] for choice in choices: widgets.append(forms.CheckboxInput( attrs={ "label": choice[1], "value": choice[0], })) widgets.append(forms.TextInput()) widgets.append(forms.Select( choices=(("rw", _("Read/Write")), ("ro", _("Read only"))))) super(ShareWidget, self).__init__(widgets) def decompress(self, value): if value: values = [] for share in value: values.append(value[share]["id"]) values.append(value[share]["path"]) values.append(value[share]["access_level"]) return values return [None] * len(self.widgets) def format_output(self, rendered_widgets): output = [] output.append("") output.append("" "") for i, widget in enumerate(rendered_widgets): item_widget_index = i % 3 if item_widget_index == 0: output.append("") output.append( "" % self.widgets[i].attrs["label"]) # The last 2 form field td need get a larger size if item_widget_index in [1, 2]: size = 4 else: size = 2 output.append("") if item_widget_index == 2: output.append("") output.append("
ShareEnabledPathPermissions
%s" % size + widget + "
") return safestring.mark_safe('\n'.join(output)) class MultipleShareChoiceField(forms.MultipleChoiceField): def validate(self, value): if self.required and not value: raise ValidationError( self.error_messages['required'], code='required') if not isinstance(value, list): raise ValidationError( _("The value of shares must be a list of values") ) def is_plugin_not_hidden_for_user(plugin): hidden_lbl = plugin.plugin_labels.get('hidden') if hidden_lbl and hidden_lbl['status']: return False if get_enabled_versions(plugin): return True return False def get_enabled_versions(plugin): lbs = plugin.version_labels versions = [] for version, data in lbs.items(): if data.get('enabled', {'status': True}).get('status', True): versions.append(version) if not plugin.plugin_labels.get( 'enabled', {'status': True}).get('status', True): versions = [] return versions def is_version_of_plugin_deprecated(plugin, version): lbs = plugin.version_labels for iter_version, data in lbs.items(): if iter_version == version: if data.get('deprecated', {'status': False}).get('status', False): return True else: return False ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5880728 sahara-dashboard-16.0.0/sahara_dashboard/enabled/0000775000175000017500000000000000000000000021645 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/enabled/_1810_data_processing_panel_group.py0000664000175000017500000000166700000000000030601 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.utils.translation import ugettext_lazy as _ # The slug of the panel group to be added to HORIZON_CONFIG. Required. PANEL_GROUP = 'data_processing' # The display name of the PANEL_GROUP. Required. PANEL_GROUP_NAME = _('Data Processing') # The slug of the dashboard the PANEL_GROUP associated with. Required. PANEL_GROUP_DASHBOARD = 'project' ADD_INSTALLED_APPS = ['sahara_dashboard'] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/enabled/_1820_data_processing_clusters_panel.py0000664000175000017500000000267000000000000031305 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from sahara_dashboard import exceptions # The slug of the panel to be added to HORIZON_CONFIG. Required. PANEL = 'data_processing.clusters' # The slug of the dashboard the PANEL associated with. Required. PANEL_DASHBOARD = 'project' # The slug of the panel group the PANEL is associated with. PANEL_GROUP = 'data_processing' # Python panel class of the PANEL to be added. ADD_PANEL = \ ('sahara_dashboard.' 'content.data_processing.clusters.panel.ClustersPanel') ADD_INSTALLED_APPS = \ ["sahara_dashboard.content.data_processing", "sahara_dashboard.content.data_processing.clusters", ] ADD_JS_FILES = [ 'dashboard/project/data_processing/js/data_processing.event_log.js', 'dashboard/project/data_processing/js/data_processing.verifications.js' ] ADD_SCSS_FILES = [ 'dashboard/project/data_processing/css/clusters.scss' ] ADD_EXCEPTIONS = { 'recoverable': exceptions.RECOVERABLE } ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/enabled/_1830_data_processing_plugins_panel.py0000664000175000017500000000223100000000000031114 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from sahara_dashboard import exceptions # The slug of the panel to be added to HORIZON_CONFIG. Required. PANEL = 'data_processing.data_plugins' # The slug of the dashboard the PANEL associated with. Required. PANEL_DASHBOARD = 'project' # The slug of the panel group the PANEL is associated with. PANEL_GROUP = 'data_processing' # Python panel class of the PANEL to be added. ADD_PANEL = \ ('sahara_dashboard.' 'content.data_processing.data_plugins.panel.PluginsPanel') ADD_INSTALLED_APPS = \ ["sahara_dashboard.content.data_processing.data_plugins", ] ADD_EXCEPTIONS = { 'recoverable': exceptions.RECOVERABLE } ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/enabled/_1840_data_processing_jobs_panel.py0000664000175000017500000000257200000000000030401 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from sahara_dashboard import exceptions # The slug of the panel to be added to HORIZON_CONFIG. Required. PANEL = 'data_processing.jobs' # The slug of the dashboard the PANEL associated with. Required. PANEL_DASHBOARD = 'project' # The slug of the panel group the PANEL is associated with. PANEL_GROUP = 'data_processing' ADD_INSTALLED_APPS = \ ["sahara_dashboard.content.data_processing.jobs", ] # Python panel class of the PANEL to be added. ADD_PANEL = ('sahara_dashboard.content.data_processing.jobs.panel.JobsPanel') ADD_JS_FILES = [ 'dashboard/project/data_processing/js/' 'data_processing.job_interface_arguments.js', 'dashboard/project/data_processing/js/data_processing.job_launching.js' ] ADD_SCSS_FILES = [ 'dashboard/project/data_processing/css/jobs.scss' ] ADD_EXCEPTIONS = { 'recoverable': exceptions.RECOVERABLE } ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/enabled/__init__.py0000664000175000017500000000000000000000000023744 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/exceptions.py0000664000175000017500000000124300000000000023006 0ustar00zuulzuul00000000000000# # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from saharaclient.api import base as saharaclient RECOVERABLE = ( saharaclient.APIException, ) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5880728 sahara-dashboard-16.0.0/sahara_dashboard/local_settings.d/0000775000175000017500000000000000000000000023507 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000020500000000000011452 xustar0000000000000000111 path=sahara-dashboard-16.0.0/sahara_dashboard/local_settings.d/_12_toggle_data_upload_max_number_fields.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/local_settings.d/_12_toggle_data_upload_max_number_fields.p0000664000175000017500000000011400000000000033706 0ustar00zuulzuul00000000000000# toggle DATA_UPLOAD_MAX_NUMBER_FIELDS DATA_UPLOAD_MAX_NUMBER_FIELDS = 2600 ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/locale/0000775000175000017500000000000000000000000021512 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/locale/cs/0000775000175000017500000000000000000000000022117 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5880728 sahara-dashboard-16.0.0/sahara_dashboard/locale/cs/LC_MESSAGES/0000775000175000017500000000000000000000000023704 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/cs/LC_MESSAGES/django.po0000664000175000017500000011717400000000000025521 0ustar00zuulzuul00000000000000# Lenka Husáková , 2016. #zanata # Stanislav Ulrych , 2016. #zanata # Zbyněk Schwarz , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-22 11:41+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-11-17 08:42+0000\n" "Last-Translator: Zbyněk Schwarz \n" "Language-Team: Czech\n" "Language: cs\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" msgid " Done" msgstr "Hotovo" msgid " or " msgstr "nebo" #, python-format msgid "%(conf_name)s: %(conf_val)s" msgstr "%(conf_name)s: %(conf_val)s" #, python-format msgid "%(conf_name)s: %(conf_value)s" msgstr "%(conf_name)s: %(conf_value)s" #, python-format msgid "%(group)s:" msgstr "%(group)s:" #, python-format msgid "%(key)s: %(val)s" msgstr "%(key)s: %(val)s" #, python-format msgid "%s processes: " msgstr "%s procesů: " msgid "-- not selected --" msgstr "-- nevybráno --" msgid "Adapt For Oozie" msgstr "Přizpůsobit pro Oozie" msgid "Add" msgstr "Přidat" msgid "Add Node Group" msgstr "Přidat skupiny uzlu" msgid "Add libraries to your job template." msgstr "Přidat knihovny k vaší šabloně úkolu." msgid "Anti-affinity enabled for" msgstr "Proti slučivost povolena pro" msgid "Arguments" msgstr "Argumenty" msgid "Auto Security Group" msgstr "Skupina automatické bezpečnosti" msgid "Auto-configure" msgstr "Nastavit automaticky" msgid "" "Automatically modify the Hadoop configuration so that job config values are " "set and so that Oozie will handle exit codes correctly." msgstr "" "Automaticky upravit nastavení Hadoop tak, aby hodnoty nastavení úlohy byly " "zadány a aby Oozie správně zpracovával návratové kódy." msgid "Availability Zone" msgstr "Zóna dostupnosti" msgid "Base Image" msgstr "Základní obraz" msgid "Cancel" msgstr "Zrušit" msgid "Checking" msgstr "Kontrolování" msgid "Choose" msgstr "Zvolit" msgid "Choose a main binary" msgstr "Zvolte hlavní binární soubor" msgid "Choose a shell script" msgstr "Zvolte skript shellu" msgid "Choose a storage location" msgstr "Zvolte umístění úložiště" msgid "Choose additional files" msgstr "Zvolte další soubory" msgid "Choose an existing Master Node Group Template" msgstr "Vyberte existující šablonu skupinu hlavního uzlu" msgid "Choose an existing Worker Node Group Template" msgstr "Vyberte existující šablonu skupinu pracovního uzlu" msgid "Choose an existing file" msgstr "Zvolit existující soubor" msgid "" "Choose from the list of binaries and click \"choose\" to add the library to " "your job template. This can be repeated for additional libraries." msgstr "" "Vyberte si ze seznamu binárních souborů a klikněte na \"zvolit\" pro přidání " "knihovny k vaší šabloně úkolu. Toto můžete zopakovat pro další knihovny." msgid "Choose job type" msgstr "Zvolte typ úkolu" msgid "Choose libraries" msgstr "Zvolte knihovny" msgid "Choose node group template" msgstr "Vybrat šablonu skupiny uzlů" msgid "" "Choose or create your main binary. Additional libraries can be added from " "the \"Libs\" tab." msgstr "" "Zvolte nebo vytvořte hlavní binární soubor. Další knihovny mohou být přidány " "z karty \"Knihovny\"." msgid "Choose plugin" msgstr "Zvolte zásuvný modul" msgid "Choose plugin and version" msgstr "Vyberte zásuvný modul a verzi" msgid "Choose plugin type and version" msgstr "Vyberte zásuvný modul a verzi" msgid "Choose the Input Data Source (n/a for Java and Shell jobs)." msgstr "Zvolte zdroj vstupních dat (toto neplatí pro úkoly Java a Shell)." msgid "Choose the Output Data Source (n/a for Java and Shell jobs)." msgstr "Zvolte zdroj výstupních dat (toto neplatí pro úkoly Java a Shell)." msgid "Choose the binary which should be used in this Job." msgstr "Zvolte binární soubor, který má být použit v tomto úkolu." msgid "Choose the cluster to use for the job." msgstr "Zvolte cluster, který bude použit pro úkol." msgid "Chosen Libraries" msgstr "Zvolené knihovny" msgid "Cinder volumes" msgstr "Svazky Cinder" msgid "Cluster" msgstr "Cluster" msgid "Cluster Configuration Overview" msgstr "Přehled nastavení clusteru" msgid "Cluster Count" msgstr "Počet clusterů" msgid "Cluster Creation Guide" msgstr "Průvodce vytvořením clusteru" msgid "Cluster Events" msgstr "Události clusteru" msgid "Cluster Instances" msgstr "Instance clusteru" msgid "Cluster Name" msgstr "Název clusteru" msgid "Cluster Template" msgstr "Šablona clusteru" #, python-format msgid "Cluster Template %s updated" msgstr "Šablona clusteru %s aktualizována" msgid "Cluster Template Configuration Overview" msgstr "Přehled konfigurace šablony clusteru" #, python-format msgid "Cluster Template copy %s created" msgstr "Kopie šablony clusteru %s vytvořena" msgid "Cluster Templates" msgstr "Šablony clusterů" msgid "Cluster can be launched using existing Cluster Templates." msgstr "Cluster může být spuštěn pomocí existujících šablon." msgid "Cluster configurations are not specified" msgstr "Nastavení clusteru nejsou zadány" msgid "Cluster health checks" msgstr "Kontroly funkčnosti clusteru" msgid "Cluster provision steps" msgstr "Kroky k poskytnutí clusteru" msgid "Cluster share update failed." msgstr "Aktualizace sdílení clusteru selhala." msgid "Cluster template creation failed" msgstr "Vytvoření šablony clusteru selhalo" msgid "Cluster template update failed" msgstr "Aktualizace šablony clusteru selhala" msgid "Cluster type chosen" msgstr "Typ clusteru zvolen" msgid "Clusters" msgstr "Clustery" msgid "Completed Successfully" msgstr "Úspěšně dokončeno" msgid "Configuration" msgstr "Konfigurace" msgid "Configuration Details" msgstr "Podrobnosti nastavení" msgid "Configuration Value" msgstr "Hodnota nastavení" msgid "Configure" msgstr "Nastavit" msgid "Configure Cluster" msgstr "Nastavit cluster" msgid "Configure Cluster Template" msgstr "Nastavit šablonu clusteru" msgid "Configure Node Group Template" msgstr "Nastavit šablonu skupiny uzlu" msgid "Configure Template" msgstr "Nastavit šablonu" msgid "Control access to instances of the node group." msgstr "Řízení přístupu k instancím ze skupiny uzlu." msgid "Copy Cluster Template" msgstr "Kopírovat šablonu clusteru" msgid "Copy Template" msgstr "Zkopírovat šablonu" msgid "Could not create" msgstr "Nelze vytvořit" msgid "Could not create data source" msgstr "Nelze vytvořit zdroj dat" msgid "Could not create job template" msgstr "Nelze vytvořit šablonu úkolu" msgid "Could not launch job" msgstr "Úkol nelze spustit" msgid "Could not update cluster shares" msgstr "Nelze aktualizovat sdílení clusteru" msgid "Could not update data source" msgstr "Nelze aktualizovat zdroj dat" msgid "Could not update plugin" msgstr "Zásuvný modul nelze aktualizovat" msgid "Count" msgstr "Počet" msgid "Create" msgstr "Vytvořit" msgid "Create Cluster Template" msgstr "Vytvořit šablonu clusteru" msgid "Create Data Source" msgstr "Vytvořit zdroj dat" msgid "Create Job Binary" msgstr "Vytvořit binární soubor úkolu" msgid "Create Job Template" msgstr "Vytvořit šablonu úkolu" msgid "Create Node Group Template" msgstr "Vytvořit šablonu skupiny uzlu" msgid "Create Template" msgstr "Vytvořit šablonu" msgid "Create a Cluster Template" msgstr "Vytvořit šablonu clusteru" msgid "Create a Data Source with a specified name." msgstr "Vytvořit datový zdroj se zadaným názvem." msgid "Create a Master Node Group Template" msgstr "Vytvořit šablonu skupiny hlavního uzlu" msgid "Create a Worker Node Group Template" msgstr "Vytvořit šablonu skupiny pracovního uzlu" msgid "Create a data source" msgstr "Vytvořit datový zdroj" msgid "Create a job template" msgstr "Vytvořit šablonu úkolu" msgid "Create a job template with a specified name." msgstr "Vytvořit šablonu úkolu se zadaným názvem." msgid "Create a script to be uploaded dynamically" msgstr "Vytvořit skript, který bude dynamicky nahráván" msgid "Create security group for this Node Group." msgstr "Vytvořit bezpečnostní skupinu pro tuto skupinu uzlu." msgid "Create time" msgstr "Čas vytvoření" msgid "Create volumes in this availability zone." msgstr "Vytvořit svazky v této zóně dostupnosti." msgid "Created" msgstr "Vytvořeno" msgctxt "Created time" msgid "Created" msgstr "Vytvořeno" #, python-format msgid "Created Cluster Template %s" msgstr "Šablona clusteru %s vytvořena" #, python-format msgid "Created Node Group Template %s" msgstr "Šablona skupiny uzlu %s vytvořena" msgid "Created time" msgstr "Vytvořeno" msgid "Current choice:" msgstr "Současná volba:" msgid "Current type:" msgstr "Současný typ:" msgid "Custom Tag" msgstr "Vlastní tag" msgid "DNS Domain Names" msgstr "Názvy domény DNS" msgid "Data Processing" msgstr "Zpracování dat" msgid "Data Processing Plugin Details" msgstr "Podrobnosti zásuvného modulu zpracování dat" msgid "Data Processing Plugins" msgstr "Zásuvné moduly zpracování dat" msgid "Data Processing internal database" msgstr "Vnitřní databáze Zpracování dat" msgid "" "Data Processing provides different storage location options. You may choose " "Ephemeral Drive or a Cinder Volume to be attached to instances." msgstr "" "Zpracování dat poskytuje různé možnosti umístění úložiště. Můžete zvolit " "Efemerní disk nebo svazek Cinder, které budou připojeny k instancím." msgid "Data Source" msgstr "Datový zdroj" msgid "Data Source Type" msgstr "Typ zdroje dat" msgid "Data Sources" msgstr "Zdroje dat" msgid "Data source created" msgstr "Zdroj dat vytvořen" msgid "Data source updated" msgstr "Zdroj dat aktualizován" msgid "Default Value" msgstr "Výchozí hodnota" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Smazat cluster" msgstr[1] "Smazat clustery" msgstr[2] "Smazat clustery" msgid "Delete Data Source" msgid_plural "Delete Data Sources" msgstr[0] "Smazat zdroj dat" msgstr[1] "Smazat zdroje dat" msgstr[2] "Smazat zdroje dat" msgid "Delete Job" msgid_plural "Delete Jobs" msgstr[0] "Smazat úkol" msgstr[1] "Smazat úkoly" msgstr[2] "Smazat úkolů" msgid "Delete Job Binary" msgid_plural "Delete Job Binaries" msgstr[0] "Smazat binární soubor úkolu" msgstr[1] "Smazat binární soubory úkolu" msgstr[2] "Smazat binární soubory úkolu" msgid "Delete Job Template" msgid_plural "Delete Job Templates" msgstr[0] "Smazat šablonu úkolu" msgstr[1] "Smazat šablony úkolu" msgstr[2] "Smazat šablon úkolu" msgid "Delete Template" msgid_plural "Delete Templates" msgstr[0] "Smazat šablonu" msgstr[1] "Smazat šablony" msgstr[2] "Smazat šablony" msgid "Deleted Cluster" msgid_plural "Deleted Clusters" msgstr[0] "Cluster smazán" msgstr[1] "Clustery smazány" msgstr[2] "Clustery smazány" msgid "Deleted Data Source" msgid_plural "Deleted Data Sources" msgstr[0] "Zdroj dat smazán" msgstr[1] "Zdroje dat smazány" msgstr[2] "Zdroje dat smazány" msgid "Deleted Job" msgid_plural "Deleted Jobs" msgstr[0] "Úkol smazán" msgstr[1] "Úkoly smazány" msgstr[2] "Úkoly smazány" msgid "Deleted Job Binary" msgid_plural "Deleted Job Binaries" msgstr[0] "Binární soubory úkolu smazán" msgstr[1] "Binární soubory úkolu smazány" msgstr[2] "Binární soubory úkolu smazány" msgid "Deleted Job Template" msgid_plural "Deleted Jobs Templates" msgstr[0] "Šablona úkolu smazána" msgstr[1] "Šablony úkolu smazány" msgstr[2] "Šablon úkolu smazáno" msgid "Deleted Template" msgid_plural "Deleted Templates" msgstr[0] "Šablona smazána" msgstr[1] "Šablony smazány" msgstr[2] "Šablony smazány" msgid "Description" msgstr "Popis" msgid "Details" msgstr "Podrobnosti" msgid "Domain Name" msgstr "Název domény" msgid "Domain name" msgstr "Název domény" msgid "Done" msgstr "Hotovo" msgctxt "Current status of a Job" msgid "Done with Error" msgstr "Dokončeno s chybou" msgid "Download Job Binary" msgstr "Stáhnout binární soubor úkolu" msgid "Download job binary" msgstr "Stáhnout binární soubor úkolu" msgid "Drive type" msgstr "Typ ovladače" msgid "Duration" msgstr "Doba trvání" msgid "Edit Cluster Template" msgstr "Upravit šablonu clusteru" msgid "Edit Data Source" msgstr "Upravit zdroj dat" msgid "Edit Image Tags" msgstr "Upravit značky obrazu" msgid "Edit Job Binary" msgstr "Upravit binární soubor úkolu" msgid "Edit Node Group Template" msgstr "Upravit šablonu skupiny uzlu" msgid "Edit Tags" msgstr "Upravit značky" msgid "Edit Template" msgstr "Upravit šablonu" msgid "Enable Swift Paths" msgstr "Povolit cesty Swift" msgid "Enabled Versions" msgstr "Povolené verze" msgctxt "End time" msgid "Ended" msgstr "Ukončeno" msgid "Enter any custom configuration required for your job's execution." msgstr "Zadejte jakékoli vlastni nastavení potřebné pro spuštění vašeho úkolu." msgid "Enter the URL for the file" msgstr "Zadat URL odkazující na soubor" msgid "Enter the username and password required to access that file" msgstr "Zadat uživatelské jméno a heslo nutné pro přístup k tomuto souboru" msgid "Ephemeral drive" msgstr "Efemérní disk" msgid "Error Details" msgstr "Podrobnosti chyby" msgid "Event time" msgstr "Čas události" msgid "Failed" msgstr "Selhalo" msgctxt "Current status of a Job" msgid "Failed" msgstr "Selhalo" msgid "Failed to fetch internal binary list" msgstr "Nelze získat seznam interních binárních souborů" msgid "Failed to get list of internal binaries." msgstr "Nelze získat seznam interních binárních souborů." msgid "Failed to get list of shares" msgstr "Nelze získat seznam sdílení" msgid "Failed to update image." msgstr "Aktualizace obrazu selhala." msgid "Filter" msgstr "Filtrovat" msgid "Flavor" msgstr "Typ" msgid "Flavor is not specified" msgstr "Typ není zadán" msgid "Floating IP Pool" msgstr "Zásoba plovoucích IP" msgid "" "For Data Processing internal job binaries, you may choose from the following:" msgstr "" "Pro interní binární soubory úkolu Zpracování dat můžete provést jedno z " "následujících:" msgid "For Object Store job binaries, you must:" msgstr "Pro binární soubory úkolu v Úložišti objektů musíte:" msgid "" "For Shell Action jobs, any required files beyond the main script may be " "added as \"libraries\"." msgstr "" "Pro úkoly Činnosti Shell lze dodatečné soubory, mimo hlavní skript, přidat " "jako \"knihovny\"." msgid "General Info" msgstr "Obecné informace" msgid "Guided Cluster Creation" msgstr "Vytvoření clusteru s průvodcem" msgid "Guided Job Execution" msgstr "Spuštění úlohy s průvodcem" msgid "HDFS placement" msgstr "Umístění HDFS" msgid "Health" msgstr "Funkčnost" msgid "Hide full configuration" msgstr "Skrýt úplnou konfiguraci" msgid "Hive" msgstr "Hive" msgid "ID" msgstr "ID" #, python-format msgid "" "If selected, %s will be protected from modifications until this will be " "unselected" msgstr "" "Pokud je vybráno, %s bude chráněno proti změnám dokud nebude výběr zrušen." #, python-format msgid "If selected, %s will be shared across the tenants" msgstr "Pokud je vybráno, %s bude nasdíleno napříč tenanty." msgid "" "If selected, instances of a cluster will be automatically configured during " "creation. Otherwise you should manually specify configuration values" msgstr "" "Při zvolení jsou instance clusteru během vytváření automaticky nastaveny. V " "opačném případě musíte hodnoty nastavení zadat ručně." msgid "" "If selected, instances of a node group will be automatically configured " "during cluster creation. Otherwise you should manually specify configuration " "values." msgstr "" "Při zvolení jsou instance skupiny uzlu automaticky nastaveny během " "vytváření. V opačném případě musíte hodnoty nastavení zadat ručně." msgid "Image" msgstr "Obraz" msgid "Image Registry" msgstr "Registr obrazů" msgid "" "Image Registry is used to provide additional information about images for " "Data Processing." msgstr "" "Registr obrazů poskytuje dodatečné informace o obrazech určených pro " "zpracování dat." msgid "Image Registry tool:" msgstr "Nástroj registru obrazů:" msgid "In progress" msgstr "Probíhá" msgid "Info" msgstr "Informace" msgid "Input" msgstr "Vstup" msgid "Input Data Source" msgstr "Zdroj vstupních dat" msgid "Instance" msgstr "Instance" msgid "Instance and attached volumes will be created on the same physical host" msgstr "" "Instance a připojené svazky budou vytvořeny na stejném fyzickém hostiteli" msgid "Instances" msgstr "Instance" msgid "Instances Count" msgstr "Počet instancí" msgid "Interface Arguments" msgstr "Argumenty rozhraní" msgid "Internal Binary" msgstr "Interní binární soubor" msgid "Internal IP" msgstr "Vnitřní IP adresa" msgid "Internal binary" msgstr "Interní binární soubor" msgid "Java" msgstr "Java" msgid "Java Action" msgstr "Akce Java" msgid "Java Opts" msgstr "Operace Java" msgid "Job" msgstr "Úkol" msgid "Job Binaries" msgstr "Binární soubory úkolu" msgid "Job Configuration" msgstr "Konfigurace úkolu" msgid "Job Execution ID" msgstr "ID spuštění úkolu" msgid "Job Guide" msgstr "Průvodce úkolem" msgid "Job Template" msgstr "Šablona úkolu" msgid "Job Templates" msgstr "Šablony úkolu" msgid "Job Type" msgstr "Typ úkolu" msgid "Job args" msgstr "Argumenty úkolu" msgid "Job configs" msgstr "Nastavení úkolu" msgid "Job created" msgstr "Úkol vytvořen" msgid "Job launched" msgstr "Úkol spuštěn" msgid "Job params" msgstr "Parametry úkolu" msgid "Job template:" msgstr "Šablona úkolu:" msgid "Job type chosen" msgstr "Zvolen typ úkolu" msgid "Jobs" msgstr "Úkoly" msgid "Keypair" msgstr "Pár klíčů" msgctxt "Current status of a Job" msgid "Killed" msgstr "Killed" msgid "Label" msgstr "Štítek" msgid "Label details" msgstr "Podrobnosti štítku" msgid "Last Updated" msgstr "Naposledy aktualizováno" msgid "Launch" msgstr "Spustit" msgid "Launch Cluster" msgstr "Spustit cluster" msgid "Launch Job" msgid_plural "Launch Jobs" msgstr[0] "Spustit úkol" msgstr[1] "Spustit úkoly" msgstr[2] "Spustit úkoly" msgid "Launch On Existing Cluster" msgstr "Spustit na existujícím clusteru" msgid "Launch On New Cluster" msgstr "Spustit na novém clusteru" msgid "Launch a Cluster" msgstr "Spustit cluster" msgid "Launch instances in these security groups." msgstr "Spustit instance v těchto bezpečnostních skupinách." msgid "Launch instances in this availability zone." msgstr "Spustit instance v této zóně dostupnosti." msgid "Launch job" msgstr "Spustit úkol" msgid "Launch the given job template on a cluster." msgstr "Spustit zadanou šablonu úkolu v clusteru." #, python-format msgid "Launched Cluster %s" msgstr "Cluster %s spuštěn" msgid "Launched Job" msgid_plural "Launched Jobs" msgstr[0] "Úkol spuštěny" msgstr[1] "Úkoly spuštěny" msgstr[2] "Úkoly spuštěny" msgid "Libs" msgstr "Knihovny" msgid "Location" msgstr "Umístění" msgid "Main Class" msgstr "Hlavní třída" msgid "Mains" msgstr "Hlavní komponenta" msgid "Management IP" msgstr "IP adresa pro správu" msgid "MapReduce" msgstr "MapReduce" msgid "Mapper" msgstr "Mapovač" msgid "Mapping Type" msgstr "Typ mapování" msgid "Master Node Group Template:" msgstr "Šablona skupiny hlavního uzlu:" msgid "" "Modify the configuration so that swift URLs can be dereferenced through HDFS " "at runtime." msgstr "" "Změnit nastavení tak, aby URL swift mohly být dereferencovány pomocí HDFS " "při spuštění." msgid "Name" msgstr "Název" #, python-format msgid "Name: %(node_group_name)s" msgstr "Název: %(node_group_name)s" msgid "Named Parameter" msgstr "Pojmenovaný parametr" msgid "Neutron Management Network" msgstr "Správní síť Neutron" msgid "Never" msgstr "Nikdy" msgid "Next" msgstr "Další" msgid "No Cluster Template Created" msgstr "Šablona clusteru nevytvořena" msgid "No Images Available" msgstr "Žádné obrazy nejsou dostupné" msgid "No Master Node Group Template Created" msgstr "Nebyla vytvořena žádná šablona skupiny hlavního uzlu" msgid "No Templates Available" msgstr "Žádné šablony nejsou dostupné" msgid "No Worker Node Group Template Created" msgstr "Nebyla vytvořena žádná šablona skupiny pracovního uzlu" msgid "No availability zone specified" msgstr "Nezadána zóna dostupnosti" msgid "No clusters available" msgstr "Clustery nejsou dostupné" msgid "No configurations" msgstr "Žádná nastavení" msgid "No description" msgstr "Žádný popis" msgid "No domain is specified" msgstr "Nebyla zadána žádná doména" msgid "No enabled versions" msgstr "Žádné povolené verze" msgid "No image specified" msgstr "Žádné obrazy nezadány" msgid "No images available." msgstr "Žádné obrazy nejsou dostupné." msgid "No info available" msgstr "Nejsou dostupné žádné informace" msgid "No job template created" msgstr "Nevytvořena žádná šablona úkolu" msgid "No keypair" msgstr "Žádný pár klíčů." msgid "No plugin chosen" msgstr "Nezvolen žádný zásuvný modul" msgid "No type chosen" msgstr "Nezvolen žádný typ" msgid "No volume type" msgstr "Žádný typ svazku" msgid "Node Group" msgstr "Skupina uzlu" #, python-format msgid "Node Group Name: %(node_group_name)s" msgstr "Název skupiny uzlů: %(node_group_name)s" msgid "Node Group Template" msgstr "Šablona skupiny uzlu" #, python-format msgid "Node Group Template %s updated" msgstr "Šablona skupiny uzlu %s byla aktualizována" #, python-format msgid "Node Group Template copy %s created" msgstr "Kopie šablony skupiny uzlu %s vytvořena" msgid "Node Group Templates" msgstr "Šablony skupiny uzlu" #, python-format msgid "Node Group: %(node_group_name)s" msgstr "Skupina uzlu: %(node_group_name)s" msgid "Node Groups" msgstr "Skupiny uzlů" msgid "Node Groups Configuration Overview" msgstr "Přehled konfigurace skupiny uzlů" msgid "Node Processes" msgstr "Procesy uzlu" msgid "Node group cluster" msgstr "Cluster skupiny uzlů" msgid "Node group configurations are not specified" msgstr "Konfigurace skupiny uzlů nezadána" msgid "Node processes are not specified" msgstr "Procesy uzlu nezadány" msgid "Nodes Count" msgstr "Počet uzlů" msgid "None" msgstr "Žádný" msgid "Not available" msgstr "Není dostupné" msgid "Number" msgstr "Číslo" msgid "Number of Nodes" msgstr "Počet uzlů" msgid "Number of clusters to launch." msgstr "Počet clusterů ke spuštění." msgid "Oozie Job ID" msgstr "ID úkolu Oozie" msgid "OpenStack Flavor" msgstr "OpenStack typ" msgid "Output" msgstr "Výstup" msgid "Output Data Source" msgstr "Zdroj výstupních dat" msgid "Parameters" msgstr "Parametry" msgid "Password" msgstr "Heslo" msgid "Path" msgstr "Cesta" msgid "Persist cluster after job exit" msgstr "Cluster nebude zrušen po dokončení úkolu" msgid "Pig" msgstr "Pig" msgid "Plugin" msgstr "Zásuvný modul" msgid "Plugin Name" msgstr "Název zásuvného modulu" msgid "Plugin label" msgstr "Štítek zásuvného modulu" msgid "Plugin name" msgstr "Název zásuvného modulu" msgid "Plugin update failed." msgstr "Aktualizace zásuvného modulu selhala." #, python-format msgid "Plugin version %s" msgstr "Zásuvný modul verze %s" msgid "Plugin:" msgstr "Zásuvný modul:" msgid "Plugins" msgstr "Zásuvné moduly" msgid "Positional Argument" msgstr "Poziční argument" msgid "Progress" msgstr "Probíhá" msgid "Project ID" msgstr "ID projektu" msgid "Protected" msgstr "Chráněno" msgid "Proxy Gateway" msgstr "Brána proxy" msgid "Public" msgstr "Veřejné" msgid "Read only" msgstr "Pouze pro čtení" msgid "Read/Write" msgstr "Čtení/Zápis" msgid "Reducer" msgstr "Reduktor" msgid "Register Image" msgstr "Registrovat obraz" msgid "Relaunch On Existing Cluster" msgstr "Znovu spustit na existujícím clusteru" msgid "Relaunch On New Cluster" msgstr "Znovu spustit na novém clusteru" msgid "Remove" msgstr "Odstranit" msgid "Required" msgstr "Vyžadováno" msgid "Reset Cluster Creation Guide" msgstr "Resetovat průvodce vytvořením clusteru" msgid "Reset Cluster Guide" msgstr "Resetovat průvodce clusterem" msgid "Reset Job Execution Guide" msgstr "Resetovat průvodce spuštěním úkolu" msgid "Return Code" msgstr "Návratový kód" msgid "Run HBase EDP Jobs with common HBase library on HDFS" msgstr "Spouštět úkoly HBase EDP pomocí knihovny Common HBase na HDFS" msgid "" "Sahara will use instances of this node group to access other cluster " "instances." msgstr "" "Sahara použije instance této skupiny uzlů pro přístup k ostatním instancím " "clusteru." msgid "Scale" msgstr "Škálovat" msgid "Scale Cluster" msgstr "Škálovat cluster" msgid "Scale cluster operation failed" msgstr "Operace škálování clusteru selhala" msgid "Scaled cluster successfully started." msgstr "Škálovaný cluster úspěšně spuštěn." msgid "Scope" msgstr "Rozsah" msgid "Script name" msgstr "Název skriptu" msgid "Script text" msgstr "Text skriptu" msgid "Security" msgstr "Bezpečnost" msgid "Security Groups" msgstr "Bezpečnostní skupiny" msgid "Select" msgstr "Vybrat" msgid "Select Image" msgstr "Vyberte obraz" msgid "Select Node Group Processes" msgstr "Vyberte procesy skupiny uzlu" msgid "Select Shares" msgstr "Zvolit sdílení" msgid "Select a Node Group Template to add:" msgstr "Vyberte šablonu skupiny uzlu pro přidání:" msgid "Select a Value Type for your next argument:" msgstr "Vyberte typ hodnoty pro další argument:" msgid "Select a plugin and version for a new Cluster template." msgstr "Vyberte zásuvný modul a verzi pro novou šablonu clusteru." msgid "Select a plugin and version for a new Cluster." msgstr "Vyberte zásuvný modul a verzi pro nový cluster." msgid "Select a plugin and version for the new Node Group template." msgstr "Vyberte zásuvný modul a verzi pro novou šablonu uzlu." msgid "" "Select an existing node group template.\n" " " msgstr "" "Zvolte existující šablonu skupiny uzlů.\n" " " msgid "Select node processes for the node group" msgstr "Vyberte procesy uzlu pro jeho skupinu" msgid "Select plugin and hadoop version" msgstr "Vyberte zásuvný modul a verzi hadoop" msgid "Select plugin and hadoop version for cluster" msgstr "Vyberte zásuvný modul a verzi hadoop pro cluster" msgid "Select plugin and hadoop version for cluster template" msgstr "Vyberte zásuvný modul a verzi Hadoop pro šablonu clusteru" msgid "Select property name" msgstr "Vyberte název vlastnosti" msgid "Select the storage type for your job binary." msgstr "Vyberte typ úložiště vašeho binárního souboru úkolu." msgid "Select the type of your Data Source." msgstr "Vyberte typ svého datového zdroje." msgid "Select the type of your job:" msgstr "Vyberte typ svého úkolu:" msgid "Select type" msgstr "Vyberte typ" msgid "Service Configurations" msgstr "Nastavení služby" msgid "Share" msgstr "Sdílet" msgid "Shares" msgstr "Sdílení" msgid "Shell" msgstr "Shell" msgid "Shell Action" msgstr "Akce shell" msgid "Show full configuration" msgstr "Zobrazit úplnou konfiguraci" msgid "Source password" msgstr "Heslo zdroje" msgid "Source username" msgstr "Uživatelské jméno zdroje" msgid "Spark" msgstr "Spark" msgid "" "Specified User Name will be used by Data Processing to apply configs and " "manage processes on instances." msgstr "" "Zadané jméno uživatele bude použito ve Zpracování dat k použití nastavení a " "pro správu procesů na instancích." msgid "Start Verification" msgid_plural "Start Verifications" msgstr[0] "Spustit ověření" msgstr[1] "Spustit ověření" msgstr[2] "Spustit ověření" msgctxt "Start time" msgid "Started" msgstr "Spuštěno" msgid "Started Verification" msgid_plural "Started Verifications" msgstr[0] "Ověření spuštěno" msgstr[1] "Ověření spuštěna" msgstr[2] "Ověření spuštěna" msgid "Started at" msgstr "Zahájeno" msgid "Status" msgstr "Stav" msgid "Status description" msgstr "Popis stavu" msgid "Step Description" msgstr "Popis kroku" msgid "Storage type" msgstr "Typ úložiště" msgid "Storm" msgstr "Storm" msgid "Storm Pyleus" msgstr "Storm Pyleus" msgid "Streaming MapReduce" msgstr "Streamované Mapreduce" msgid "String" msgstr "Řetězec" msgid "" "Substitute data source objects for URLs of the form datasource://name or " "uuid." msgstr "" "Nahrazuje objekty zdrojových dat pro URL ve tvaru zdrojových dat: //název " "nebo uuid." msgctxt "Current status of a Job" msgid "Succeeded" msgstr "Úspěšně provedeno" msgid "Successfully updated image." msgstr "Obraz úspěšně aktualizován." msgid "Supported Versions" msgstr "Podporované verze" msgid "Swift" msgstr "Swift" msgid "Tags" msgstr "Značky" msgid "Template" msgstr "Šablona" msgid "Template Name" msgstr "Název šablony" msgid "Template not specified" msgstr "Šablona nezadána" msgid "" "The Cluster object should specify OpenStack Image to boot instances for " "Cluster." msgstr "" "Objekt clusteru by měl udávat obraz Openstack sloužící k zavedení instancí " "pro cluster." msgid "The value of shares must be a list of values" msgstr "shares musí být seznam hodnot" msgid "This Cluster Template will be created for:" msgstr "Tato šablona clusteru bude vytvořena pro:" msgid "This Cluster will be started with:" msgstr "Tento cluster bude spuštěn takto:" msgid "This Node Group Template will be created for:" msgstr "Tato šablona skupiny uzlu bude vytvořena pro:" msgid "Title" msgstr "Název" msgid "Topology Name" msgstr "Název topologie" msgid "Type" msgstr "Typ" msgid "URL" msgstr "URL" msgid "Unable to create job binary" msgstr "Nelze vytvořit binární soubor úkolu" #, python-format msgid "Unable to create job binary: %s" msgstr "Nelze vytvořit binární soubor úlohy: %s" msgid "Unable to create new cluster for job." msgstr "Nelze vytvořit nový cluster pro úkol." msgid "Unable to create the cluster" msgstr "Nelze vytvořit cluster" #, python-format msgid "Unable to fetch Base Image with id: %s." msgstr "Nelze získat základní obraz s id: %s." msgid "Unable to fetch available images." msgstr "Nelze získat dostupné obrazy." msgid "Unable to fetch base image details" msgstr "Nelze získat podrobnosti základního obrazu." msgid "Unable to fetch cluster list" msgstr "Nelze získat seznam clusterů" msgid "Unable to fetch cluster template list" msgstr "Nelze získat seznam šablon clusterů" msgid "Unable to fetch cluster template." msgstr "Nelze získat šablonu clusteru." msgid "Unable to fetch cluster to scale" msgstr "Nelze získat cluster pro škálování" msgid "Unable to fetch cluster to scale." msgstr "Nelze získat cluster pro škálování." msgid "Unable to fetch cluster." msgstr "Nelze získat cluster." msgid "Unable to fetch clusters." msgstr "Nelze získat clustery." msgid "Unable to fetch data source list" msgstr "Nelze získat seznam zdrojů dat" msgid "Unable to fetch data sources." msgstr "Nelze získat zdroje dat." msgid "Unable to fetch flavor for template." msgstr "Nelze získat typ pro šablonu." msgid "Unable to fetch floating ip pools." msgstr "Nelze získat zásoby plovoucích ip adres." msgid "Unable to fetch image choices." msgstr "Nelze získat seznam obrazů." msgid "Unable to fetch instance details." msgstr "Nelze získat podrobnosti instance." msgid "Unable to fetch job binary list" msgstr "Nelze získat seznam binárních souborů úkolu" #, python-format msgid "Unable to fetch job binary: %(exc)s" msgstr "Nelze získat binární soubor úkolu: %(exc)s" msgid "Unable to fetch job list" msgstr "Nelze získat seznam úkolů" msgid "Unable to fetch job template list" msgstr "Nelze získat seznam šablon úkolu" msgid "Unable to fetch jobs." msgstr "Nelze získat úkoly." msgid "Unable to fetch keypair choices." msgstr "Nelze získat výběr páru klíčů." msgid "Unable to fetch network details" msgstr "Nelze získat podrobnosti sítě." msgid "Unable to fetch node group details." msgstr "Nelze získat podrobnosti skupiny uzlů." msgid "Unable to fetch node group template list" msgstr "Nelze získat seznam šablon skupiny uzlu." msgid "Unable to fetch plugin details." msgstr "Nelze získat podrobnosti zásuvného modulu." msgid "Unable to fetch plugin list" msgstr "Nelze získat seznam zásuvných modulů." msgid "Unable to fetch plugin object." msgstr "Nelze získat objekt zásuvného modulu." msgid "Unable to fetch template object." msgstr "Nelze získat objekt šablony." msgid "Unable to fetch template to copy." msgstr "Nelze získat šablonu ke zkopírování." msgid "Unable to fetch template to edit." msgstr "Nelze získat šablonu k úpravě." msgid "Unable to fetch the image details" msgstr "Nelze získat podrobnosti obrazu" msgid "Unable to generate process choices." msgstr "Nelze vytvořit volby procesu." msgid "Unable to get node group details." msgstr "Nelze získat podrobnosti skupiny uzlů." msgid "Unable to get security group list." msgstr "Nelze získat seznam bezpečnostních skupin." msgid "Unable to launch job." msgstr "Nelze spustit úkol." msgid "Unable to populate anti-affinity processes." msgstr "Nelze zaplnit procesy proti slučivosti." msgid "Unable to process plugin tags" msgstr "Nelze zpracovat značky zásuvného modulu" msgid "Unable to retrieve data processing plugins." msgstr "Nelze získat zásuvné moduly zpracování dat." #, python-format msgid "Unable to retrieve details for cluster \"%s\"." msgstr "Nelze získat podrobnosti clusteru \"%s\"." #, python-format msgid "Unable to retrieve details for cluster template \"%s\"." msgstr "Nelze získat podrobnosti šablony clusteru \"%s\"." #, python-format msgid "Unable to retrieve details for data source \"%s\"." msgstr "Nelze získat podrobnosti zdroje dat \"%s\"." #, python-format msgid "Unable to retrieve details for job \"%s\"." msgstr "Nelze získat podrobnosti úkolu \"%s\"." #, python-format msgid "Unable to retrieve details for job binary \"%s\"." msgstr "Nelze získat podrobnosti binárního souboru úkolu \"%s\"." #, python-format msgid "Unable to retrieve details for job template \"%s\"." msgstr "Nelze získat podrobnosti šablony úkolu \"%s\"." #, python-format msgid "Unable to retrieve details for node group template \"%s\"." msgstr "Nelze získat podrobnosti šablony skupiny uzlu \"%s\"." msgid "Unable to retrieve image list" msgstr "Nele získat seznam obrazů" #, python-format msgid "Unable to retrieve images with filter %s." msgstr "Nelze získat obrazy pomocí filtru %s." #, python-format msgid "Unable to retrieve job binary \"%s\"." msgstr "Nelze získat binární soubor úkolu \"%s\"." msgid "Unable to retrieve networks." msgstr "Nelze získat sítě." msgid "Unable to retrieve plugin." msgstr "Nelze získat zásuvný modul." #, python-format msgid "Unable to retrieve security group %(group)s." msgstr "Nelze získat bezpečnostní skupinu %(group)s." msgid "Unable to set cluster type" msgstr "Nelze nastavit typ clusteru" msgid "Unable to set job type" msgstr "Nelze nastavit typ úkolu" msgid "Unable to set node group template" msgstr "Nelze nastavit šablonu skupiny uzlu" msgid "Unable to update job binary" msgstr "Nelze aktualizovat binární soubor úkolu" #, python-format msgid "Unable to update job binary: %s" msgstr "Nelze aktualizovat binární soubor úlohy: %s" msgid "Unable to update row" msgstr "Nelze aktualizovat řádek" msgid "Unable to upload job binary" msgstr "Nelze nahrát binární soubor úkolu" msgid "Unknown" msgstr "Neznámý" msgid "Unnecessary tags may be removed by clicking a cross near tag's name." msgstr "" "Nepotřebné značky mohou být odstraněny kliknutím na křížek u jejich jména." msgid "Unregister Image" msgid_plural "Unregister Images" msgstr[0] "Zrušit registraci obrazu" msgstr[1] "Zrušit registrace obrazů" msgstr[2] "Zrušit registrace obrazů" msgid "Unregistered Image" msgid_plural "Unregistered Images" msgstr[0] "Registrace obrazu zrušena" msgstr[1] "Registrace obrazů zrušena" msgstr[2] "Registrace obrazů zrušena" msgid "Update" msgstr "Aktualizovat" msgid "Update Cluster Shares" msgstr "Aktualizovat sdílení clusteru" msgid "Update Plugin" msgstr "Aktualizovat zásuvný modul" msgid "Update Shares" msgstr "Aktualizovat sdílení" msgid "Update the plugin labels" msgstr "Aktualizovat štítky zásuvného modulu" msgid "Updated" msgstr "Aktualizováno" msgid "Updated time" msgstr "Aktualizováno" msgid "Upload" msgstr "Nahrát" msgid "Upload File" msgstr "Nahrát soubor" msgid "Upload Template" msgstr "Nahrát šablonu" msgid "Upload a new file" msgstr "Nahrát nový soubor" msgid "Uptime" msgstr "Doba provozu" msgid "Url" msgstr "Url" msgid "Use Data Source Substitution for Names and UUIDs" msgstr "Pro název a UUID použít substituci datového zdroje" msgid "Use HBase Common library" msgstr "Použít knihovnu Common HBase" msgid "Use anti-affinity groups for processes" msgstr "Použít skupiny proti slučivosti pro procesy" msgid "Use anti-affinity groups for: " msgstr "Použít skupiny proti slučivosti pro:" msgid "Use auto-configuration" msgstr "Použít automatické nastavení" msgid "Use the same topology name as defined in your .yaml file" msgstr "Použijte stejný název topologie, který byl zadán v .yaml souboru" msgid "User" msgstr "Uživatel" msgid "User Name" msgstr "Uživatelské jméno" msgid "User has to choose a keypair to have access to clusters instances." msgstr "Uživatel si musí zvolit pár klíčů pro přístup k instancím clusteru." msgid "Username" msgstr "Uživatelské jméno" msgid "Value" msgstr "Hodnota" msgid "Value Type" msgstr "Typ hodnoty" msgid "Version" msgstr "Verze" msgid "Version:" msgstr "Verze:" msgid "Volume local to instance" msgstr "Lokální svazek k instanci" msgid "Volumes Availability Zone" msgstr "Zóna dostupnosti svazků" msgid "Volumes local to instance" msgstr "Svazky místní k instanci" msgid "Volumes per node" msgstr "Svazky v uzlu" msgid "Volumes size" msgstr "Velikost svazků" msgid "Volumes size (GB)" msgstr "Velikost svazků (GB)" msgid "Volumes type" msgstr "Typy svazků" msgid "Which keypair to use for authentication." msgstr "Který pár klíčů má být použit pro ověření." msgid "Worker Node Group Template:" msgstr "Šablona skupiny pracovního uzlu" msgid "You may also add any custom tag." msgstr "Můžete také přidat jakékoli vlastní značky." msgid "You may also enter an optional description for your Data Source." msgstr "Můžete také zadat dodatečný popis pro váš datový zdroj." msgid "You may also enter an optional description for your job binary." msgstr "Můžete také zadat jeho dodatečný popis." msgid "You may also enter an optional description for your job template." msgstr "Můžete také zadat její dodatečný popis." msgid "You may need to enter the username and password for your Data Source." msgstr "" "Je možné, že váš datový zdroj bude vyžadovat uživatelské jméno a heslo." msgid "You may set cluster scoped configurations on corresponding tabs." msgstr "" "Konfigurace zaměřené na clustery můžete nastavit v odpovídajících " "kartách." msgid "" "You must choose a flavor to determine the size (VCPUs, memory and storage) " "of all launched VMs." msgstr "" "Pro zjištění velikosti všech spuštěných virtuálních strojů musíte zvolit " "konfiguraci (VCPU, paměť a úložiště)." msgid "" "You've chosen a cluster that is in 'Error' state. Appropriate execution of " "the job can't be guaranteed." msgstr "" "Vybrali jste clusteru, který je v chybovém stavu. Nelze zaručit řádný výkon " "úlohy." msgid "cluster" msgstr "cluster" msgid "cluster template" msgstr "šablona clusteru" msgid "data source" msgstr "zdroj dat" msgid "job" msgstr "Úkol" msgid "job binary" msgstr "binární soubor úkolu" msgid "no processes" msgstr "žádné procesy" msgid "node group template" msgstr "šablona skupiny uzlu" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/cs/LC_MESSAGES/djangojs.po0000664000175000017500000000377500000000000026057 0ustar00zuulzuul00000000000000# Stanislav Ulrych , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard 7.0.0.0rc2.dev21\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2017-10-13 23:21+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-06-09 12:18+0000\n" "Last-Translator: Lenka Husáková \n" "Language-Team: Czech\n" "Language: cs\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" msgid "(show events)" msgstr "(zobrazit události)" msgid "Configuration Value" msgstr "Hodnota nastavení" msgid "Data Source" msgstr "Datový zdroj" msgid "Default Value" msgstr "Výchozí hodnota" msgid "Description" msgstr "Popis" msgid "Event log is not available." msgstr "Log událostí není dostupný." msgid "" "For configs and params, type the key name; for args, type the index as an " "integer, starting from 0." msgstr "" "Pro nastavení a parametry zadejte název klíče; pro argumenty zadejte index " "jako celé číslo počínaje od 0." msgid "" "For data sources, use a data source UUID or a path (as per data source " "creation.)" msgstr "" "Pro datový zdroj použijte UUID zdroje nebo cestu (podle vytvoření data " "zdroje.)" msgid "Location" msgstr "Umístění" msgid "Mapping Type" msgstr "Typ mapování" msgid "Name" msgstr "Název" msgid "Named Parameter" msgstr "Pojmenovaný parametr" msgid "Number" msgstr "Číslo" msgid "Positional Argument" msgstr "Poziční argument" msgid "Remove" msgstr "Odstranit" msgid "Required?" msgstr "Vyžadováno?" msgid "String" msgstr "Řetězec" msgid "The step has completed successfully. No events to display." msgstr "Krok byl úspěšně dokončen. Žádné události k zobrazení." msgid "Value Type" msgstr "Typ hodnoty" msgid "Verification is not available." msgstr "Ověření není k dispozici." msgid "Warning!" msgstr "Varování!" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/locale/de/0000775000175000017500000000000000000000000022102 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.592073 sahara-dashboard-16.0.0/sahara_dashboard/locale/de/LC_MESSAGES/0000775000175000017500000000000000000000000023667 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/de/LC_MESSAGES/django.po0000664000175000017500000016106400000000000025501 0ustar00zuulzuul00000000000000# Frank Kloeker , 2016. #zanata # Frank Kloeker , 2017. #zanata # Robert Simai , 2017. #zanata # Frank Kloeker , 2018. #zanata # Robert Simai , 2018. #zanata # Robert Simai , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-07-23 15:37+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-07-26 12:01+0000\n" "Last-Translator: Robert Simai \n" "Language-Team: German\n" "Language: de\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid " Done" msgstr "Fertig" msgid " or " msgstr "oder" #, python-format msgid "%(conf_name)s: %(conf_val)s" msgstr "%(conf_name)s: %(conf_val)s" #, python-format msgid "%(conf_name)s: %(conf_value)s" msgstr "%(conf_name)s: %(conf_value)s" #, python-format msgid "%(group)s:" msgstr "%(group)s:" #, python-format msgid "%(key)s: %(val)s" msgstr "%(key)s: %(val)s" #, python-format msgid "%s processes: " msgstr "%s Prozesse:" msgid "-- not selected --" msgstr "-- nicht ausgewählt --" msgid "" "Important: The name that you give your job binary will be the name " "used in your job execution. If your binary requires a particular name or " "extension (ie: \".jar\"), be sure to include it here." msgstr "" "Wichtig: Der Name, den Sie ihrem Aufgaben-Binärprogramm geben, wird " "für die Ausführung des Jobs genutzt. Falls ihr Binärprogramm einen " "speziellen Namen oder Erweiterung benötigt (z.B. \".jar\"), muss das hier " "angegeben werden." msgid "Access Key" msgstr "Zugriffsschlüssel" msgid "Adapt For Oozie" msgstr "Angepasst für Oozie" msgid "Add" msgstr "Hinzufügen" msgid "Add Node Group" msgstr "Knoten-Gruppe hinzufügen" msgid "Add libraries to your job template." msgstr "Fügen Sie Bibliotheken zu Ihrer Aufgabenvorlage hinzu." msgid "Anti-affinity enabled for" msgstr "Anti-Affinität erlaubt für" msgid "Arguments" msgstr "Argumente" msgid "Attached storage location" msgstr "Eingebundener Speicherort" msgid "Auto Security Group" msgstr "Auto Sicherheitsgruppe" msgid "Auto-configure" msgstr "Auto-Konfigurieren" msgid "" "Automatically modify the Hadoop configuration so that job config values are " "set and so that Oozie will handle exit codes correctly." msgstr "" "Automatisches Modifizieren der Hadoop Konfiguration, so das Werte der Job-" "Konfiguration gesetzt werden und Oozie Exit-Codes korrekt behandelt." msgid "Availability Zone" msgstr "Verfügbarkeitszone" msgid "Base Image" msgstr "Basis-Abbild" msgid "Boot Volume AZ" msgstr "Boot-Datenträger AZ" msgid "Boot Volume locality" msgstr "Boot-Datenträger Ort" msgid "Boot Volume type" msgstr "Boot-Datenträger Typ" msgid "Boot from Volume" msgstr "Von Datenträger starten" msgid "Boot storage location" msgstr "Boot Speicherort" msgid "Boot volume availability Zone" msgstr "Boot-Datenträger Verfügbarkeitszone" msgid "Boot volume availability zone" msgstr "Boot-Datenträger Verfügbarkeitszone" msgid "Boot volume local to instance" msgstr "Lokalen Datenträger zur Instanz starten" msgid "Boot volume locality" msgstr "Boot-Datenträger Ort" msgid "Boot volume type" msgstr "Boot-Datenträger Typ" msgid "Cancel" msgstr "Abbrechen" msgid "Checked?" msgstr "Überprüft?" msgid "Checking" msgstr "Prüfe" msgid "Choose" msgstr "Auswählen" msgid "Choose a boot mode" msgstr "Boot-Modus auswählen" msgid "Choose a main binary" msgstr "Wählen Sie ein Haupt-Binärprogramm" msgid "Choose a shell script" msgstr "Wählen Sie ein Shell-Skript aus" msgid "Choose a storage location" msgstr "Storage Lokation auswählen" msgid "Choose additional files" msgstr "Wählen Sie zusätzliche Dateien aus" msgid "Choose an existing Master Node Group Template" msgstr "Wählen Sie eine bestehende Master Knoten-Gruppenvorlage." msgid "Choose an existing Worker Node Group Template" msgstr "Wählen Sie eine bestehende Knoten-Gruppenvorlage." msgid "Choose an existing file" msgstr "Wählen Sie eine vorhandene Datei aus" msgid "" "Choose from the list of binaries and click \"choose\" to add the library to " "your job template. This can be repeated for additional libraries." msgstr "" "Wählen Sie aus der Liste von Binärprogrammen und klicken Sie \"auswählen\", " "um die Bibliothek Ihrer Aufgabenvorlage hinzuzufügen. Wiederholen Sie diesen " "Schritt für weitere Bibliotheken." msgid "Choose job type" msgstr "Wähle Aufgabentyp" msgid "Choose libraries" msgstr "Bibliotheken wählen" msgid "Choose node group template" msgstr "Knoten-Gruppenvorlage wählen" msgid "" "Choose or create your main binary. Additional libraries can be added from " "the \"Libs\" tab." msgstr "" "Wählen oder erstellen Sie Ihr Hauptbinärprogamm. Zusätzliche Bibliotheken " "können unter dem \"Libs\" Reiter hinzugefügt werden." msgid "Choose plugin" msgstr "Plugin auswählen" msgid "Choose plugin and version" msgstr "Plugin und Version auswählen" msgid "Choose plugin type and version" msgstr "Wählen Sie Plugin-Typ und Version" msgid "Choose the Input Data Source (n/a for Java and Shell jobs)." msgstr "Wähle die Eingangsdatenquelle (n/a für Java und Shell Aufgaben)." msgid "Choose the Output Data Source (n/a for Java and Shell jobs)." msgstr "Wähle die Ausgangsdatenquelle (n/a für Java und Shell Aufgaben)." msgid "Choose the binary which should be used in this Job." msgstr "" "Wählen Sie ein Binärprogramm, welches für diese Aufgabe benutzt werden soll." msgid "Choose the cluster to use for the job." msgstr "Wählen Sie den zu verwendenden Cluster für die Aufgabe." msgid "Chosen Libraries" msgstr "Bibliotheken wählen" msgid "Cinder Volume" msgstr "Cinder Datenträger" msgid "Cinder service is unavailable now" msgstr "Cinder Dienst ist gerade nicht verfügbar" msgid "Cinder volumes" msgstr "Cinder Datenträger" msgid "Cluster" msgstr "Cluster" msgid "Cluster Configuration Overview" msgstr "Cluster Konfigurationsübersicht" msgid "Cluster Count" msgstr "Anzahl Cluster" msgid "Cluster Creation Guide" msgstr "Clustererstellungsassistent" msgid "Cluster Events" msgstr "Cluster-Ereignisse" msgid "Cluster Instances" msgstr "Cluster Instanzen" msgid "Cluster Name" msgstr "Clustername" msgid "Cluster Template" msgstr "Clustervorlage" #, python-format msgid "Cluster Template %s updated" msgstr "Clustervorlage %s aktualisiert" msgid "Cluster Template Configuration Overview" msgstr "Konfigurationsübersicht Clustervorlage" #, python-format msgid "Cluster Template copy %s created" msgstr "Clustervorlagenkopie %s erstellt" msgid "Cluster Templates" msgstr "Clustervorlagen" msgid "Cluster can be launched using existing Cluster Templates." msgstr "" "Der Cluster kann mit Hilfe der existierenden Clustervorlagen gestartet " "werden." msgid "Cluster configurations are not specified" msgstr "Clusterkonfigurationen wurden nicht angegeben." msgid "Cluster health checks" msgstr "Cluster Gesundheits-Checks" msgid "Cluster provision steps" msgstr "Cluster Provisionierungsschritte" msgid "Cluster share update failed." msgstr "Aktualisieren der Cluster-Freigabe fehlgeschlagen." msgid "Cluster template creation failed" msgstr "Clustervorlagenerstellung fehlgeschlagen" msgid "Cluster template update failed" msgstr "Aktualisieren der Clustervorlage fehlgeschlagen" msgid "Cluster type chosen" msgstr "Ausgewählter Clustertyp" msgid "Clusters" msgstr "Cluster" msgid "Completed Successfully" msgstr "Erfolgreich abgeschlossen" msgid "Configuration" msgstr "Konfiguration" msgid "Configuration Details" msgstr "Konfigurationsdetails" msgid "Configuration Value" msgstr "Konfigurationswert" msgid "Configure" msgstr "Konfigurieren" msgid "Configure Cluster" msgstr "Cluster Konfigurieren" msgid "Configure Cluster Template" msgstr "Clustervorlage konfigurieren" msgid "Configure Node Group Template" msgstr "Knoten-Gruppenvorlage konfigurieren" msgid "Configure Template" msgstr "Vorlage konfigurieren" msgid "Control access to instances of the node group." msgstr "Zugriff auf Instanzen der Knoten-Gruppe verwalten." msgid "Copy Cluster Template" msgstr "Clustervorlage kopieren" msgid "Copy Template" msgstr "Vorlage kopieren" msgid "Could not create" msgstr "Erstellen nicht möglich" msgid "Could not create data source" msgstr "Kann Datenquelle nicht erstellen" msgid "Could not create job template" msgstr "Aufgabenvorlage konnte nicht erstellt werden" msgid "Could not launch job" msgstr "Aufgabe konnte nicht gestartet werden" msgid "Could not parse template" msgstr "Vorlage konnte nicht analysiert werden" msgid "Could not update cluster shares" msgstr "Cluster-Freigaben konnten nicht aktualisiert werden" msgid "Could not update data source" msgstr "Datenquelle konnte nicht aktualisiert werden" msgid "Could not update plugin" msgstr "Konnte Plugin Beschreibung nicht akualisieren" msgid "Count" msgstr "Anzahl" msgid "Create" msgstr "Erstellen" msgid "Create Cluster Template" msgstr "Clustervorlage erstellen" msgid "Create Data Source" msgstr "Datenquelle erstellen" msgid "Create Job Binary" msgstr "Aufgaben-Binärprogramm erzeugen" msgid "Create Job Template" msgstr "Aufgabenvorlage erstellen" msgid "Create Node Group Template" msgstr "Knoten-Gruppenvorlage erstellen" msgid "Create Template" msgstr "Vorlage erzeugen" msgid "Create a Cluster Template" msgstr "Erstellen einer Clustervorlage" msgid "Create a Data Source with a specified name." msgstr "Datenquelle mit spezifischem Namen erzeugen." msgid "Create a Master Node Group Template" msgstr "Erstellen einer Master-Knoten Gruppenvorlage" msgid "Create a Worker Node Group Template" msgstr "Erstellen einer Worker Knoten-Gruppenvorlage" msgid "Create a data source" msgstr "Erzeugen einer Datenquelle" msgid "Create a job template" msgstr "Aufgabenvorlage erstellen" msgid "Create a job template with a specified name." msgstr "Aufgabenvorlage mit angegebenem Namen erstellen." msgid "Create a script to be uploaded dynamically" msgstr "Erzeugen Sie ein Skript für das dynamische Hochladen" msgid "Create boot volume in this availability zone." msgstr "Erstelle Boot-Datenträger in dieser Verfügbarkeitszone." msgid "Create security group for this Node Group." msgstr "Sicherheitsgruppe für diese Knoten-Gruppe erstellen." msgid "Create time" msgstr "Erstellungszeit" msgid "Create volumes in this availability zone." msgstr "Datenträger in dieser Verfügbarkeitszone erstellen." msgid "Created" msgstr "Erstellt" msgctxt "Created time" msgid "Created" msgstr "Erstellt" #, python-format msgid "Created Cluster Template %s" msgstr "Clustervorlage %s erstellt" #, python-format msgid "Created Node Group Template %s" msgstr "Knoten-Gruppenvorlagen %s erstellt" msgid "Created time" msgstr "Erstellungszeit" msgid "Current choice:" msgstr "Im Moment gewählt:" msgid "Current type:" msgstr "Aktueller Typ:" msgid "Custom Tag" msgstr "Benutzerspezifische Schlagwörter" msgid "DNS Domain Names" msgstr "DNS-Domänenname" msgid "Data Processing" msgstr "Datenverarbeitung" msgid "Data Processing Plugin Details" msgstr "Datenverarbeitungsplugins Details" msgid "Data Processing Plugins" msgstr "Datenverarbeitungsplugins" msgid "Data Processing internal database" msgstr "Datenverarbeitung interne Datenbank" msgid "" "Data Processing provides different storage location options. You may choose " "Ephemeral Drive or a Cinder Volume to be attached to instances." msgstr "" "Die Datenverarbeitung bietet Optionen für verschiedene Speicherorte an. Sie " "können ein Flüchtiges Laufwerk oder einen Cinder-Datenträger mit Instanzen " "verbinden." msgid "Data Source" msgstr "Datenquelle" msgid "Data Source Type" msgstr "Datenquellentyp" msgid "Data Sources" msgstr "Datenquellen" msgid "" "Data Sources are what your job uses for input and output. Depending on the " "type of job you will be running, you may need to define one or more data " "sources. You can create multiple data sources by repeating this step." msgstr "" "Datenquellen werden von Ihren Aufgaben zur Ein- und Ausgabe verwendet. " "Abhängig vom Aufgabentyp müssen Sie eine oder mehrere Datenquellen " "definieren. Sie können weitere Datenquellen erzeugen, in dem Sie diesen " "Schritt wiederholen.\n" " " msgid "Data source created" msgstr "Datenquelle erstellt" msgid "Data source updated" msgstr "Datenquelle aktualisiert" msgid "Default Value" msgstr "Voreingestellter Wert" msgid "" "Define your Job Template. This is where you choose the type of job that you " "want to run (Pig, Java Action, Spark, etc) and choose or upload the files " "necessary to run it. The inputs and outputs will be defined later." msgstr "" "Definieren Sie Ihre Aufgabenvorlage. Hier wählen Sie, welche Art von Aufgabe " "Sie ausführen wollen (Pig, Java Action, Spark u.s.w.) \n" "und laden die zur Ausführung nötigen Daten hoch oder wählen sie aus. " "Eingaben und Ausgaben werden später festgelegt.\n" " " msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Cluster löschen" msgstr[1] "Cluster löschen" msgid "Delete Data Source" msgid_plural "Delete Data Sources" msgstr[0] "Datenquelle löschen" msgstr[1] "Datenquellen löschen" msgid "Delete Job" msgid_plural "Delete Jobs" msgstr[0] "Aufgabe löschen" msgstr[1] "Aufgaben löschen" msgid "Delete Job Binary" msgid_plural "Delete Job Binaries" msgstr[0] "Aufgaben-Binärprogramm löschen" msgstr[1] "Aufgaben-Binärprogramme löschen" msgid "Delete Job Template" msgid_plural "Delete Job Templates" msgstr[0] "Aufgabenvorlage löschen" msgstr[1] "Aufgabenvorlagen löschen" msgid "Delete Template" msgid_plural "Delete Templates" msgstr[0] "Vorlage löschen" msgstr[1] "Vorlagen löschen" msgid "Deleted Cluster" msgid_plural "Deleted Clusters" msgstr[0] "Gelöschte Cluster" msgstr[1] "Gelöschte Cluster" msgid "Deleted Data Source" msgid_plural "Deleted Data Sources" msgstr[0] "Gelöschte Datenquelle" msgstr[1] "Gelöschte Datenquellen" msgid "Deleted Job" msgid_plural "Deleted Jobs" msgstr[0] "Gelöschte Aufgabe" msgstr[1] "Gelöschte Aufgaben" msgid "Deleted Job Binary" msgid_plural "Deleted Job Binaries" msgstr[0] "Aufgaben-Binärprogramm gelöscht" msgstr[1] "Aufgaben-Binärprogramme gelöscht" msgid "Deleted Job Template" msgid_plural "Deleted Jobs Templates" msgstr[0] "Gelöschte Aufgabenvorlage" msgstr[1] "Gelöschte Aufgabenvorlagen" msgid "Deleted Template" msgid_plural "Deleted Templates" msgstr[0] "Gelöschte Vorlage" msgstr[1] "Gelöschte Vorlagen" msgid "Description" msgstr "Beschreibung" msgid "Details" msgstr "Details" msgid "Domain Name" msgstr "Domänenname" msgid "Domain name" msgstr "Domänenname" msgid "Done" msgstr "Fertig" msgctxt "Current status of a Job" msgid "Done with Error" msgstr "Mit Fehler erledigt" msgid "Download Job Binary" msgstr "Aufgaben-Binärprogramm herunterladen" msgid "Download job binary" msgstr "Aufgaben-Binärprogramm herunterladen" msgid "Drive type" msgstr "Treibertyp" msgid "Duration" msgstr "Dauer" msgid "Edit Cluster Template" msgstr "Clustervorlage bearbeiten" msgid "Edit Data Source" msgstr "Datenquelle bearbeiten" msgid "Edit Image Tags" msgstr "Abbildschlagwörter bearbeiten" msgid "Edit Job Binary" msgstr "Aufgaben-Binärprogramm bearbeiten" msgid "Edit Node Group Template" msgstr "Knoten-Gruppenvorlage bearbeiten" msgid "Edit Tags" msgstr "Schlagwörter bearbeiten" msgid "Edit Template" msgstr "Vorlage editieren" msgid "Enable Swift Paths" msgstr "Swift-Pfade aktivieren" msgid "Enabled Versions" msgstr "Aktivierte Versionen" msgctxt "End time" msgid "Ended" msgstr "Beendet" msgid "Endpoint should be specified without protocol" msgstr "Endpunkt sollte ohne Protokoll spezifiziert werden" msgid "Engine Job ID" msgstr "Engine Job ID" msgid "Enter any custom configuration required for your job's execution." msgstr "" "Geben Sie die benutzerspezifische Konfiguration an, die für die " "Aufgabenausführung erforderlich ist." msgid "Enter the URL for the file" msgstr "Geben Sie die URL für die Datei an" msgid "Enter the access key and secret key required to access that file" msgstr "" "Geben Sie den Zugriffsschlüssel und den geheimen Schlüssel ein, die für den " "Zugriff auf diese Datei erforderlich sind" msgid "Enter the endpoint of the S3 service where the file is stored" msgstr "" "Geben Sie den Entpunkt des S3 Dienstes an, an dem die Datei gespeichert wird." msgid "Enter the username and password required to access that file" msgstr "" "Geben Sie Benutzername und Passwort an, die für den Zugriff auf die Datei " "benötigt werden" msgid "Ephemeral Drive" msgstr "Flüchtiges Laufwerk" msgid "Ephemeral drive" msgstr "Flüchtiges Laufwerk" msgid "Error Details" msgstr "Fehlerdetails" msgid "Event time" msgstr "Ereigniszeit" msgid "Export Template" msgstr "Vorlage exportieren" msgid "Failed" msgstr "Fehlgeschlagen" msgctxt "Current status of a Job" msgid "Failed" msgstr "Fehlgeschlagen" msgid "Failed to fetch internal binary list" msgstr "Liste der internen Binärprogramme konnte nicht abgerufen werden." msgid "Failed to get list of internal binaries." msgstr "Liste der internen Binärprogramme konnte nicht abgerufen werden." msgid "Failed to get list of shares" msgstr "Fehler beim Abruf der Freigabenliste" msgid "Failed to update image." msgstr "Aktualisierung des Abbilds fehlgeschlagen." msgid "Filter" msgstr "Filter" msgid "" "First, select which type of job that you want to run. This choice will " "determine which other steps are required" msgstr "" "Wählen Sie zunächst welchen Aufgabentyp Sie ausführen wollen. Die Auswahl " "bestimmt die weiteren erforderlichen Schritte." msgid "Flavor" msgstr "Variante" msgid "Flavor is not specified" msgstr "Variante nicht angegeben" msgid "Floating IP Pool" msgstr "Floating IP Pool" msgid "" "For Data Processing internal job binaries, you may choose from the following:" msgstr "" "Sie können aus den folgenden internen Binärprogrammen für die " "Datenverarbeitung auswählen:" msgid "" "For Data Sources in S3 storage, the URL should be specified in the format " "s3a://bucket/path. Also, each of the access properties may be optional if " "you have configured that property on your cluster manually." msgstr "" "Für Datenquellen in S3-Speicher sollte die URL im Format s3a://bucket/path " "angegeben werden. Außerdem können alle Zugriffseigenschaften optional sein, " "wenn Sie diese Eigenschaft manuell in Ihrem Cluster konfiguriert haben." msgid "" "For Data Sources on a Manila share, choose the share and enter the path " "relative to the share (example: /outputdir/myinputfile.txt)" msgstr "" "Für Datenquellen an Manila Freigaben wählen Sie die Freigabe und geben den " "Pfad relativ zur Freigabe ein (Beispiel: /outputdir/myinputfile.txt)" msgid "" "For MapReduce or Java Action jobs, \"mains\" are not applicable. You are " "required to add one or more \"libs\" for these jobs." msgstr "" "Für MapReduce oder Java Action Aufgaben sind \"Mains\" nicht zulässig. Es " "müssen eine oder mehrere \"libs\" zu diesen Aufgaben hinzugefügt werden." msgid "For Object Store job binaries, you must:" msgstr "Für Objektspeicher Aufgaben-Binärprogramme müssen Sie:" msgid "For S3 job binaries, you must:" msgstr "Für S3 Aufgaben-Binärprogramme müssen Sie:" msgid "" "For Shell Action jobs, any required files beyond the main script may be " "added as \"libraries\"." msgstr "" "Für Shell-Aktion Aufgaben sind alle Dateien hinter dem Hauptskript " "\"Bibliotheken\"." msgid "" "For Storm, Storm Pyleus, Spark and Shell jobs, only a main is required,\"libs" "\" are optional." msgstr "" "Für Storm, Storm Pyleus, Spark und Shell jobs, nur das Hauptfeld ist " "erforderlich,\"libs\" sind optional." msgid "Force Delete Cluster" msgid_plural "Force Delete Clusters" msgstr[0] "Erzwinge Cluster löschen" msgstr[1] "Erzwinge Cluster löschen" msgid "Force Deleted Cluster" msgid_plural "Force Deleted Clusters" msgstr[0] "Erzwungene gelöschte Cluster" msgstr[1] "Erzwungene gelöschte Cluster" msgid "General Info" msgstr "Allgemeine Informationen" msgid "Guided Cluster Creation" msgstr "Clustererstellungsassistent" msgid "Guided Job Execution" msgstr "Aufgabenausführungsassistent" msgid "HDFS placement" msgstr "HDFS Platzierung" msgid "Health" msgstr "Gesundheitszustand" msgid "Hide full configuration" msgstr "Verstecke gesamte Konfiguration" msgid "Hive" msgstr "Hive" msgid "ID" msgstr "ID" msgid "If checked, bucket will be in path instead of host" msgstr "Wenn ausgewählt, wird der Bucket im Pfad anstatt des Hosts benutzt" #, python-format msgid "" "If selected, %s will be protected from modifications until this will be " "unselected" msgstr "" "Angabe, ob %s vor Veränderungen geschützt werden soll, solange es nicht " "ausgewählt ist." #, python-format msgid "If selected, %s will be shared across the tenants" msgstr "Angabe, ob %s von allen Nutzern gemeinsam verwendet werden soll." msgid "" "If selected, instances of a cluster will be automatically configured during " "creation. Otherwise you should manually specify configuration values" msgstr "" "Wenn ausgewählt, werden Instanzen eines Clusters während des Erstellens " "automatisch konfiguriert. Sonst sollte manuelle Konfiguration gewählt werden." msgid "" "If selected, instances of a node group will be automatically configured " "during cluster creation. Otherwise you should manually specify configuration " "values." msgstr "" "Wenn ausgewählt, werden Instanzen einer Knoten-Gruppe während der Cluster-" "Konfiguration automatisch konfiguriert. Andernfalls sollte manuelle " "Konfiguration gewählt werden." msgid "Image" msgstr "Abbild" msgid "Image Registry" msgstr "Abbild-Registrierung" msgid "" "Image Registry is used to provide additional information about images for " "Data Processing." msgstr "" "Die Abbild-Registrierung wird benutzt, um zusätzliche Informationen über " "Abbilder für die Datenverarbeitung bereitzustellen." msgid "Image Registry tool:" msgstr "Abbild Registrierungstool:" msgid "Import" msgstr "Importieren" msgid "Import Cluster Template" msgstr "Clustervorlage importieren" msgid "Import Node Group Template" msgstr "Knoten-Gruppenvorlage importieren" msgid "Import Template" msgstr "Vorlage importieren" msgid "In progress" msgstr "In Bearbeitung" msgid "Info" msgstr "Info" msgid "Input" msgstr "Eingabe" msgid "Input Data Source" msgstr "Eingabe Datenquelle" msgid "" "Input correct User Name for image. For Ubuntu images input 'ubuntu', " "'fedora' for Fedora images, 'cloud-user' for CentOS 6.x images and 'centos' " "for CentOS 7.x images." msgstr "" " Geben Sie den richtigen Benutzernamen für das Abbild ein. Für Ubuntu " "Abbilder geben Sie 'ubuntu' ein, 'fedora' für Fedora Abbilder, 'cloud-user' " "für CentOS 6.x Abbilder und 'centos' für CentOS 7.x Abbilder." msgid "Instance" msgstr "Instanz" msgid "Instance and attached volumes will be created on the same physical host" msgstr "" "Instanz und angehängte Datenträger werden auf demselben physikalischen Host " "erstellt." msgid "Instances" msgstr "Instanzen" msgid "Instances Count" msgstr "Instanz Anzahl" msgid "Interface Arguments" msgstr "Schnittstellenargumente" msgid "Internal Binary" msgstr "Internes Binärprogramm" msgid "Internal IP" msgstr "Interne IP" msgid "Internal binary" msgstr "Intern binar" msgid "Java" msgstr "Java" msgid "Java Action" msgstr "Java-Aktion" msgid "Java Opts" msgstr "Java Opts" msgid "Job" msgstr "Aufgabe" msgid "Job Binaries" msgstr "Aufgaben-Binärprogramme" msgid "Job Configuration" msgstr "Aufgaben Konfiguration" msgid "Job Execution ID" msgstr "Aufgaben Ausführungs-ID" msgid "Job Guide" msgstr "Aufgabenassistent" msgid "Job Template" msgstr "Aufgabenvorlage" msgid "Job Templates" msgstr "Aufgabenvorlagen" msgid "Job Type" msgstr "Aufgabentyp" msgid "Job args" msgstr "Aufgaben Argumente" msgid "Job configs" msgstr "Aufgaben Konfigurationen" msgid "Job created" msgstr "Aufgabe erstellt" msgid "Job launched" msgstr "Aufgabe gestartet" msgid "Job params" msgstr "Aufgaben Parameter" msgid "Job template:" msgstr "Aufgabenvorlage:" msgid "Job type chosen" msgstr "Ausgewählter Aufgabentyp" msgid "Jobs" msgstr "Aufgaben" msgid "Keypair" msgstr "Schlüsselpaar" msgctxt "Current status of a Job" msgid "Killed" msgstr "Beendet" msgid "Label" msgstr "Beschreibung" msgid "Label details" msgstr "Beschreibungsdetails" msgid "Last Updated" msgstr "Letzte Aktualisierung" msgid "Launch" msgstr "Start" msgid "Launch Cluster" msgstr "Cluster starten" msgid "Launch Job" msgid_plural "Launch Jobs" msgstr[0] "Aufgabe starten" msgstr[1] "Aufgaben starten" msgid "Launch On Existing Cluster" msgstr "Auf existierendem Cluster starten" msgid "Launch On New Cluster" msgstr "Auf neuem Cluster starten" msgid "Launch a Cluster" msgstr "Einen Cluster starten" msgid "Launch instances in these security groups." msgstr "Instanzen innerhalb dieser Sicherheitsgruppen starten." msgid "" "Launch instances in these security groups. Auto security group will be " "determined by the value present in the imported template." msgstr "" "Starten Sie Instanzen in diesen Sicherheitsgruppen. Die automatische " "Sicherheitsgruppe wird durch den in der importierten Vorlage vorhandenen " "Wert bestimmt." msgid "Launch instances in this availability zone." msgstr "Instanzen in dieser Verfügbarkeitszone starten" msgid "Launch job" msgstr "Aufgabe starten" msgid "Launch the given job template on a cluster." msgstr "Starte die angegebene Aufgabenvorlage in einem Cluster." msgid "" "Launch your job. When launching, you may need to choose your input and " "output data sources. This is where you would also add any special " "configuration values, parameters, or arguments that you need to pass along " "to your job." msgstr "" "Starten Sie Ihre Aufgabe. Während des Starts müssen Sie ggf. Datenquellen " "für Eingaben und Ausgaben auswählen. Hierbei würden Sie auch spezielle " "Konfigurationswerte, Parameter oder Argumente angeben, um Sie der Aufgabe zu " "übergeben.\n" " " #, python-format msgid "Launched Cluster %s" msgstr "Cluster %s gestartet" msgid "Launched Job" msgid_plural "Launched Jobs" msgstr[0] "Gestartete Aufgabe" msgstr[1] "Gestartete Aufgaben" msgid "Libs" msgstr "Libs" msgid "Location" msgstr "Ort" msgid "Main Class" msgstr "Main Class" msgid "Mains" msgstr "Mains" msgid "Management IP" msgstr "Management IP" msgid "Manila share" msgstr "Manila-Freigabe" msgid "MapReduce" msgstr "MapReduce" msgid "Mapper" msgstr "Mapper" msgid "Mapping Type" msgstr "Abbildungstyp" msgid "Master Node Group Template:" msgstr "Master Knoten-Gruppenvorlage:" msgid "" "Modify the configuration so that swift URLs can be dereferenced through HDFS " "at runtime." msgstr "" "Ändern Sie die Konfiguration, so dass die Swift URL während der Laufzeit " "durch HDFS zurückverfolgt werden kann." msgid "Name" msgstr "Name" msgid "" "Name must be provided either here or in the template. If provided in both " "places, this one will be used." msgstr "" "Der Name muss entweder hier oder in der Vorlage angegeben werden. Wenn an " "beiden Orten vorhanden, wird dieser hier verwendet." #, python-format msgid "Name: %(node_group_name)s" msgstr "Name: %(node_group_name)s" msgid "Named Parameter" msgstr "Bezeichneter Parameter" msgid "Neutron Management Network" msgstr "Neutron Verwaltungsnetzwerk" msgid "Never" msgstr "Niemals" msgid "Next" msgstr "Weiter" msgid "" "Next, you need to define the different types of machines in your cluster. " "This is done by defining a Node Group Template for each type of machine. A " "very common case is where you need to have one or more machines running a " "\"master\" set of processes while another set of machines need to be running " "the \"worker\" processes. Here, you will define the Node Group Template for " "your \"master\" node(s)." msgstr "" "Als nächstes müssen Sie die verschiedenen Typen von Maschinen in Ihrem " "Cluster definieren. Dies wird durch die Definition einer Knoten-" "Gruppenvorlage für jeden Typ von Maschine erreicht. Ein üblicher Fall ist, " "eine oder mehrere Maschinen zu haben, auf denen ein Satz von \"Master\" " "Prozessen läuft, während auf anderen Maschinen die \"Worker\" Prozesse " "laufen. Hier definieren Sie Knoten-Gruppenvorlage für Ihre Master-Knoten.\n" " \n" " " msgid "No Cluster Template Created" msgstr "Keine Clustervorlage erstellt" msgid "No Images Available" msgstr "Keine Abbilder verfügbar" msgid "No Master Node Group Template Created" msgstr "Keine Master Knoten-Gruppenvorlage erstellt" msgid "No Templates Available" msgstr "Keine Vorlagen verfügbar" msgid "No Worker Node Group Template Created" msgstr "Keine Worker Knoten-Gruppenvorlage erstellt" msgid "No availability zone specified" msgstr "Keine Verfügbarkeitszone angegeben" msgid "No clusters available" msgstr "Keine Cluster verfügbar" msgid "No configurations" msgstr "Keine Konfigurationen" msgid "No description" msgstr "Keine Beschreibung" msgid "No domain is specified" msgstr "Keine Domäne angegeben" msgid "No enabled versions" msgstr "Keine aktivierte Versionen" msgid "No image specified" msgstr "Kein Abbild angegeben" msgid "No images available." msgstr "Keine Abbilder verfügbar." msgid "No info available" msgstr "Keine Info verfügbar" msgid "No job template created" msgstr "Keine Aufgabenvorlage erstellt" msgid "No keypair" msgstr "Kein Schlüsselpaar" msgid "No plugin chosen" msgstr "Kein Plugin ausgewählt" msgid "No type chosen" msgstr "Kein Typ ausgewählt" msgid "No volume type" msgstr "Kein Datenträgertyp" msgid "Node Group" msgstr "Knoten-Gruppe" #, python-format msgid "Node Group Name: %(node_group_name)s" msgstr "Knoten-Gruppenname: %(node_group_name)s" msgid "Node Group Template" msgstr "Knoten-Gruppenvorlage" #, python-format msgid "Node Group Template %s updated" msgstr "Knoten-Gruppenvorlage %s aktualisiert" #, python-format msgid "Node Group Template copy %s created" msgstr "Kopie der Knoten-Gruppenvorlage %s erstellt" msgid "Node Group Templates" msgstr "Knoten-Gruppenvorlagen" #, python-format msgid "Node Group: %(node_group_name)s" msgstr "Knoten-Gruppe:%(node_group_name)s" msgid "Node Groups" msgstr "Knotengruppen" msgid "Node Groups Configuration Overview" msgstr "Konfigurationsübersicht Knoten-Gruppen" msgid "Node Processes" msgstr "Knotenprozesse" msgid "Node group cluster" msgstr "Knotengruppencluster" msgid "Node group configurations are not specified" msgstr "Konfigurationen der Knoten-Gruppen nicht angegeben" msgid "Node processes are not specified" msgstr "Knoten-Prozesse nicht angegeben" msgid "Nodes Count" msgstr "Knotenanzahl" msgid "None" msgstr "Keine" msgid "Not available" msgstr "Nicht verfügbar" msgid "" "Now you need to set the layout of your cluster. By creating a Cluster " "Template, you will be choosing the number of instances of each Node Group " "Template that will appear in your cluster. Additionally, you will have a " "chance to set any cluster-specific configuration items in the additional " "tabs on the create Cluster Template form." msgstr "" "Sie müssen jetzt das Layout Ihres Clusters festlegen. Durch die Erstellung " "einer Clustervorlage wählen Sie die Anzahl an Instanzen für jede Knoten-" "Gruppenvorlage, die im Cluster erscheinen. Zusätzlich haben Sie die " "Möglichkeit, clusterspezifische Konfigurationseinstellungen in den " "zusätzlichen Reitern der Clustervorlagenmaske vorzunehmen.\n" " " msgid "Number" msgstr "Zahl" msgid "Number of Nodes" msgstr "Anzahl der Knoten" msgid "Number of clusters to launch." msgstr "Anzahl der zu startenden Cluster." msgid "Oozie Job ID" msgstr "Oozie Aufgaben ID" msgid "OpenStack Flavor" msgstr "OpenStack Variante" msgid "Output" msgstr "Ausgabe" msgid "Output Data Source" msgstr "Ausgabe Datenquelle" msgid "Parameters" msgstr "Parameter" msgid "Password" msgstr "Passwort" msgid "Path" msgstr "Pfad" msgid "Path on share" msgstr "Freigabepfad" msgid "Persist cluster after job exit" msgstr "Cluster nach Beendigung der Aufgabe bestehen lassen." msgid "Pig" msgstr "Pig" msgid "Plugin" msgstr "Plugin" msgid "Plugin Name" msgstr "Pluginname" msgid "Plugin and Version Tag" msgstr "Plugin und Version Schlagwort" msgid "Plugin label" msgstr "Plugin Beschreibung" msgid "Plugin name" msgstr "Plugin Name" msgid "Plugin update failed." msgstr "Plugin Aktualisierung fehlgeschlagen." #, python-format msgid "Plugin version %(version)s label" msgstr "Plugin Version %(version)s Beschreibung" #, python-format msgid "Plugin version %s" msgstr "Plugin Version %s" msgid "Plugin:" msgstr "Plugin:" msgid "Plugins" msgstr "Plugins" msgid "Positional Argument" msgstr "Stellungsargument" msgid "Progress" msgstr "Fortschritt" msgid "Project ID" msgstr "Projekt-ID" msgid "Protected" msgstr "Geschützt" msgid "Proxy Gateway" msgstr "Proxy Gateway" msgid "Public" msgstr "Öffentlich" msgid "Read only" msgstr "Nur Lesen" msgid "Read/Write" msgstr "Lesen/Schreiben" msgid "Reducer" msgstr "Reducer" msgid "Register Image" msgstr "Abbild registrieren" msgid "Relaunch On Existing Cluster" msgstr "Auf existierendem Cluster neu starten" msgid "Relaunch On New Cluster" msgstr "Auf neuem Cluster neu starten" msgid "Remove" msgstr "Entfernen" msgid "" "Repeat the Node Group Template creation process, but this time you are " "creating your \"worker\" Node Group Template." msgstr "" "Wiederholen des Knoten-Gruppenvorlagen Erstellungsprozess, aber diesmal für " "die \"Worker\" Knoten-Gruppenvorlagen." msgid "Required" msgstr "Erforderlich" msgid "Reset Cluster Creation Guide" msgstr "Clustererstellungsassistent zurücksetzen" msgid "Reset Cluster Guide" msgstr "Clusterassistent zurücksetzen" msgid "Reset Job Execution Guide" msgstr "Aufgabenausführungsassistent zurücksetzen" msgid "Return Code" msgstr "Rückgabecode" msgid "Run HBase EDP Jobs with common HBase library on HDFS" msgstr "" "HBase EDP Aufgaben mit der allgemeinen HBase Bibliothek auf HDFS laufen " "lassen" msgid "S3" msgstr "S3" msgid "S3 Endpoint" msgstr "S3 Endpunkt" msgid "S3 access key" msgstr "S3 Zugangsschlüssel" msgid "S3 accsss key" msgstr "S3 Zugangsschlüssel" msgid "S3 endpoint" msgstr "S3 Endpunkt" msgid "S3 secret key" msgstr "S3 Geheimschlüssel" msgid "" "Sahara will use instances of this node group to access other cluster " "instances." msgstr "" "Sahara wird Instanzen dieser Knoten-Gruppe verwenden, um auf andere " "Clusterinstanzen zuzugreifen." msgid "Scale" msgstr "Skalierung" msgid "Scale Cluster" msgstr "Cluster skalieren" msgid "Scale cluster operation failed" msgstr "Cluster-Skalierungsoperation fehlgeschlagen" msgid "Scaled cluster successfully started." msgstr "Skalierter Cluster erfolgreich gestartet." msgid "Scope" msgstr "Umfang" msgid "Script name" msgstr "Skriptname" msgid "Script text" msgstr "Skripttext" msgid "Secret Key" msgstr "Geheimer Schlüssel" msgid "Security" msgstr "Sicherheit" msgid "Security Groups" msgstr "Sicherheitsgruppen" msgid "Select" msgstr "Auswählen" msgid "Select Image" msgstr "Abbild auswählen" msgid "Select Node Group Processes" msgstr "Wähle Knotengruppenprozess" msgid "Select Shares" msgstr "Freigaben auswählen" msgid "Select a Node Group Template to add:" msgstr "Knoten-Gruppenvorlage zum Hinzufügen wählen:" msgid "Select a Value Type for your next argument:" msgstr "Wählen Sie einen Werttetyp für Ihr nächstes Argument:" msgid "Select a plugin and version for a new Cluster template." msgstr "Wählen Sie ein Plugin und eine Version für eine neue Clustervorlage." msgid "Select a plugin and version for a new Cluster." msgstr "Wählen Sie ein Plugin und eine Version für einen neuen Cluster." msgid "Select a plugin and version for the new Node Group template." msgstr "" "Wählen Sie ein Plugin und eine Version für die neue Knoten-Gruppenvorlage." msgid "" "Select an existing node group template.\n" " " msgstr "" "Wählen Sie eine bestehende Knoten-Gruppenvorlage.\n" " " msgid "Select node processes for the node group" msgstr "Wähle Knotenprozess für die Knotengruppe" msgid "Select plugin and hadoop version" msgstr "Wählen Sie Plugin und Hadoop Version" msgid "Select plugin and hadoop version for cluster" msgstr "Wählen Sie die Plugin und Hadoop Version für den Cluster" msgid "Select plugin and hadoop version for cluster template" msgstr "Wählen Sie die Plugin und Hadoop Version für die Clustervorlage." msgid "Select property name" msgstr "Wähle Eigenschaft Name" msgid "Select the domain name for internal and external hostname resolution." msgstr "Wähle Domänennamen für interne und externe Hostnamen Auflösung." msgid "Select the manila shares for this cluster" msgstr "Manila-Freigaben für dieses Cluster auswählen" msgid "Select the manila shares for this node group" msgstr "Manila-Freigaben für diese Knoten-Gruppe auswählen" msgid "Select the storage type for your job binary." msgstr "Wählen Sie den Speichertyp für Ihr Aufgaben-Binärprogramm." msgid "Select the type of your Data Source." msgstr "Typ der Datenquelle auswählen." msgid "Select the type of your job:" msgstr "Wählen Sie den Typ Ihrer Aufgabe:" msgid "Select type" msgstr "Typ auswählen" msgid "" "Select which plugin and version that you want to use to create your cluster." msgstr "" "Wählen Sie Plugin und Version, womit Sie den Cluster erstellen möchten." msgid "" "Select which type of job that you want to run. This choice will dictate " "which steps are required to successfully execute your job." msgstr "" "Wählen Sie den Aufgabentyp, den Sie ausführen wollen. Diese Auswahl legt " "fest, welche Schritte erforderlich sind, um die Aufgabe erfolgreich " "auszuführen.\n" " " msgid "" "Selected domain name should already exist in the Designate. You can check it " "in "DNS" tab on the left menu or by executing "designate " "domain-list" on the controller node." msgstr "" "Ausgewählter Domänenname sollte schon in Designate existieren. Sie können " "das in "DNS" Tab im linken Menü überprüfen oder durch Ausführung " "von "designate domain-list" auf dem Controller Knoten." msgid "Service Configurations" msgstr "Dienstkonfigurationen" msgid "Share" msgstr "Freigabe" msgid "Shares" msgstr "Freigaben" msgid "Shell" msgstr "Shell" msgid "Shell Action" msgstr "Shell-Aktion" msgid "Show full configuration" msgstr "Zeige gesamte Konfiguration" msgid "Source password" msgstr "Quelle Passwort" msgid "Source username" msgstr "Quelle Benutzername" msgid "Spark" msgstr "Spark" msgid "" "Specified User Name will be used by Data Processing to apply configs and " "manage processes on instances." msgstr "" "Der angegebene Benutzername wird von der Datenverarbeitung verwendet, um " "Konfigurationen anzuwenden sowie Prozesse und Instanzen zu kontrollieren." msgid "Start Verification" msgid_plural "Start Verifications" msgstr[0] "Verifizierung starten" msgstr[1] "Verifizierungen starten" msgctxt "Start time" msgid "Started" msgstr "Gestartet" msgid "Started Verification" msgid_plural "Started Verifications" msgstr[0] "Verifizierung gestartet" msgstr[1] "Verifizierungen gestartet" msgid "Started at" msgstr "Gestartet um" msgid "Status" msgstr "Status" msgid "Status description" msgstr "Status-Beschreibung" msgid "Step Description" msgstr "Schrittbeschreibung" msgid "Storage type" msgstr "Speichertyp" msgid "Storm" msgstr "Storm" msgid "Storm Pyleus" msgstr "Storm Pyleus" msgid "Streaming MapReduce" msgstr "Streaming MapReduce" msgid "String" msgstr "Zeichenkette" msgid "" "Substitute data source objects for URLs of the form datasource://name or " "uuid." msgstr "" "Ersetzen Sie Datenquellenobjekte für URLs in der Form Datenquelle://name " "oder uuid." msgctxt "Current status of a Job" msgid "Succeeded" msgstr "erfolgreich ausgeführt" msgid "Successfully updated image." msgstr "Abbild erfolgreich aktualisiert." msgid "Supported Versions" msgstr "Unterstütze Versionen" msgid "Swift" msgstr "Swift" msgid "Tags" msgstr "Schlagwörter" msgid "" "Tags are used for filtering images suitable for each plugin and each Data " "Processing version. To add required tags, select a plugin and a Data " "Processing version and click the "Add" button." msgstr "" "Schlagwörter werden verwendet, um passende Abbilder für jedes Plugin und " "jede Datenverarbeitungsversion herauszufiltern. Um notwendige Schlagwörter " "hinzuzufügen, wählen Sie ein Plugin und eine Datenverarbeitungsversion und " "klicken Sie auf die " Hinzufügen" Schaltfläche." msgid "Template" msgstr "Vorlage" msgid "Template File" msgstr "Vorlagendatei" msgid "Template JSON contained invalid key" msgstr "Vorlagen-JSON enthielt einen ungültigen Schlüssel" msgid "Template Name" msgstr "Vorlage Name" msgid "Template not specified" msgstr "Vorlage nicht angegeben" msgid "" "The Cluster Template object may specify a list of processes in anti-affinity " "group. That means these processes may not be launched more than once on a " "single host." msgstr "" "Das Clustervorlagenobjekt kann eine Liste von Prozessen in Anti-" "Affinitätsgruppen spezifizieren. Das bedeutet, dass diese Prozesse nicht " "mehr als ein Mal pro einzelnem Host gestartet werden können." msgid "" "The Cluster Template object should specify Node Group Templates that will be " "used to build a Cluster. You can add Node Groups using Node Group Templates " "on a "Node Groups" tab." msgstr "" "Das Clustervorlagenobjekt sollte Knoten-Gruppenvorlagen enthalten, die zum " "Bau des Clusters verwendet werden. Sie können Knoten-Gruppenvorlagen unter " "dem Reiter "Knoten-Gruppen" hinzufügen." msgid "" "The Cluster object should specify OpenStack Image to boot instances for " "Cluster." msgstr "" "Das Clusterobjekt sollte das OpenStack Abbild angeben, welches zum Starten " "des Clusters verwendet wird." msgid "" "The Node Group Template object specifies the processes that will be launched " "on each instance. Check one or more processes. When processes are selected, " "you may set node scoped configurations on corresponding tabs." msgstr "" "Das Knoten-Gruppenvorlagenobjekt spezifiziert die in jeder Instanz zu " "startenden Prozesse. Wählen Sie einen oder mehrere Prozesse. Wenn Prozesse " "ausgewählt sind, können Sie die Knoten bezogenen Konfigurationen " "unter den entsprechenden Reitern festlegen." msgid "" "The first step is to determine which type of cluster you want to run. You " "may have several choices available depending on the configuration of your " "system. Click on \"choose plugin\" to bring up the list of data processing " "plugins. There you will be able to choose the data processing plugin along " "with the version number. Choosing this up front will allow the rest of the " "cluster creation steps to focus only on options that are pertinent to your " "desired cluster type." msgstr "" "Im ersten Schritt bestimmen Sie, welchen Clustertyp Sie laufen lassen " "wollen. Abhängig von der Systemkonfiguration haben Sie verschiedene zur " "Auswahl. Klicken Sie \"wähle Plugins\", um eine Liste von Datenverarbeitungs-" "Plugins anzuzeigen. Dort wählen Sie das Datenverarbeitungs-Plugin und dessen " "Versionsnummer. Wenn Sie dies vorab auswählen, erhalten Sie nur Optionen, " "die für den gewünschten Clustertyp möglich sind." msgid "The value of shares must be a list of values" msgstr "Der Wert der Freigaben muss in einer Liste von Werten sein" msgid "This Cluster Template will be created for:" msgstr "Diese Clustervorlage wird erzeugt für:" msgid "This Cluster will be started with:" msgstr "Der Cluster wird gestartet mit:" msgid "This Node Group Template will be created for:" msgstr "Diese Knoten-Gruppenvorlage wird erzeugt für:" msgid "Title" msgstr "Titel" msgid "Topology Name" msgstr "Topologie Name" msgid "Type" msgstr "Typ" msgid "URL" msgstr "URL" msgid "Unable to create job binary" msgstr "Aufgaben-Binärprogramm kann nicht erzeugt werden" #, python-format msgid "Unable to create job binary: %s" msgstr "Konnte Job Binar nicht erstellen: %s" msgid "Unable to create new cluster for job." msgstr "Für die Aufgabe kann kein neuer Cluster erzeugt werden." msgid "Unable to create the cluster" msgstr "Cluster kann nicht erstellt werden." #, python-format msgid "Unable to fetch Base Image with id: %s." msgstr "Basis-Abbild mit der ID %s kann nicht abgerufen werden." msgid "Unable to fetch available images." msgstr "Verfügbare Abbilder können nicht abgerufen werden." msgid "Unable to fetch base image details" msgstr "Details des Basisabbilds konnten nicht abgerufen werden" msgid "Unable to fetch cluster list" msgstr "Clusterliste kann nicht abgerufen werden." msgid "Unable to fetch cluster template list" msgstr "Abrufen der Liste der Clustervorlagen nicht möglich." msgid "Unable to fetch cluster template." msgstr "Abruf der Clustervorlage nicht möglich." msgid "Unable to fetch cluster to scale" msgstr "Abruf der zu skalierenden Cluster fehlgeschlagen" msgid "Unable to fetch cluster to scale." msgstr "Abruf der zu skalierenden Cluster fehlgeschlagen." msgid "Unable to fetch cluster." msgstr "Cluster kann nicht abgerufen werden." msgid "Unable to fetch clusters." msgstr "Cluster können nicht abgerufen werden." msgid "Unable to fetch data source list" msgstr "Liste der Plugins kann nicht abgerufen werden." msgid "Unable to fetch data sources." msgstr "Datenquellen können nicht abgerufen werden." msgid "Unable to fetch flavor for template." msgstr "Die Variante für die Vorlage kann nicht abgerufen werden." msgid "Unable to fetch floating ip pools." msgstr "Floating-IP-Pools können nicht abgerufen werden." msgid "Unable to fetch image choices." msgstr "Abrufen der Abbild Auswahlmöglichkeiten fehlgeschlagen." msgid "Unable to fetch instance details." msgstr "Instanzdetails können nicht abgerufen werden." msgid "Unable to fetch job binary list" msgstr "Liste der Aufgaben-Binärprogramme kann nicht abgerufen werden." #, python-format msgid "Unable to fetch job binary: %(exc)s" msgstr "Aufgaben-Binärprogramm kann nicht abgerufen werden: %(exc)s" msgid "Unable to fetch job list" msgstr "Liste der Aufgabenvorlagen kann nicht abgerufen werden." msgid "Unable to fetch job template list" msgstr "Liste der Aufgabenvorlagen kann nicht abgerufen werden." msgid "Unable to fetch jobs." msgstr "Aufgaben können nicht abgerufen werden." msgid "Unable to fetch keypair choices." msgstr "Auswahlmöglichkeiten der Schlüsselpaare können nicht abgerufen werden." msgid "Unable to fetch network details" msgstr "Details des Netzwerkes konnten nicht abgerufen werden" msgid "Unable to fetch node group details." msgstr "Knotengruppendetails können nicht abgerufen werden." msgid "Unable to fetch node group template list" msgstr "Liste der Knoten-Gruppenvorlagen kann nicht abgerufen werden" msgid "Unable to fetch plugin details." msgstr "Plugindetails können nicht abgerufen werden." msgid "Unable to fetch plugin list" msgstr "Liste der Plugins kann nicht abgerufen werden." msgid "Unable to fetch plugin object." msgstr "Plugin-Objekt kann nicht abgerufen werden." msgid "Unable to fetch template object." msgstr "Vorlagenobjekt kann nicht abgerufen werden." msgid "Unable to fetch template to copy." msgstr "Zu kopierende Vorlage kann nicht abgerufen werden." msgid "Unable to fetch template to edit." msgstr "Vorlage zum Bearbeiten kann nicht abgerufen werden." msgid "Unable to fetch the image details" msgstr "Abbilddetails können nicht abgerufen werden" msgid "Unable to generate process choices." msgstr "Die Prozessauswahl kann nicht erzeugt werden." msgid "Unable to get node group details." msgstr "Knotengruppendetails können nicht abgerufen werden." msgid "Unable to get security group list." msgstr "Liste der Sicherheitsgruppen kann nicht abgerufen werden." msgid "Unable to launch job." msgstr "Die Aufgabe kann nicht ausgeführt werden." msgid "Unable to populate anti-affinity processes." msgstr "Anti-Affinität Prozesse können nicht bestückt werden." msgid "Unable to process plugin tags" msgstr "Verarbeitung der Plugin Schlagwörter fehlgeschlagen" msgid "Unable to retrieve Nova availability zones." msgstr "Nova-Verfügbarkeitszonen können nicht abgerufen werden." msgid "Unable to retrieve data processing plugins." msgstr "Datenverarbeitungsplugins können nicht abgerufen werden." #, python-format msgid "Unable to retrieve details for cluster \"%s\"." msgstr "Details für Cluster \"%s\" können nicht abgerufen werden." #, python-format msgid "Unable to retrieve details for cluster template \"%s\"." msgstr "Details zur Clustervorlage \"%s\" können nicht abgerufen werden." #, python-format msgid "Unable to retrieve details for data source \"%s\"." msgstr "Details zur Datenquelle \"%s\" können nicht abgerufen werden." #, python-format msgid "Unable to retrieve details for job \"%s\"." msgstr "Details zur Aufgabe \"%s\" können nicht abgerufen werden." #, python-format msgid "Unable to retrieve details for job binary \"%s\"." msgstr "" "Details des Aufgaben-Binärprogramms \"%s\" können nicht abgerufen werden." #, python-format msgid "Unable to retrieve details for job template \"%s\"." msgstr "Details zur Aufgabenvorlage \"%s\" können nicht abgerufen werden." #, python-format msgid "Unable to retrieve details for node group template \"%s\"." msgstr "" "Details zur Knoten-Gruppenvorlage \"%s\" können nicht abgerufen werden." msgid "Unable to retrieve image list" msgstr "Liste der Abbilder kann nicht abgerufen werden" #, python-format msgid "Unable to retrieve images with filter %s." msgstr "Abbilder können mit dem Filter %s nicht abgerufen werden." #, python-format msgid "Unable to retrieve job binary \"%s\"." msgstr "Aufgaben-Binärprogramm \"%s\" konnte nicht abgerufen werden." msgid "Unable to retrieve networks." msgstr "Netzwerke können nicht abgerufen werden." msgid "Unable to retrieve plugin." msgstr "Das Plugin kann nicht abgerufen werden." #, python-format msgid "Unable to retrieve security group %(group)s." msgstr "Sicherheitsgruppe %(group)s kann nicht abgerufen werden." msgid "Unable to retrieve volumes availability zones." msgstr "Datenträger-Verfügbarkeitszonen können nicht abgerufen werden." msgid "Unable to set cluster type" msgstr "Clustertyp kann nicht gesetzt werden" msgid "Unable to set job type" msgstr "Aufgabentyp kann nicht gesetzt werden" msgid "Unable to set node group template" msgstr "Liste der Koten-Gruppenvorlagen kann nicht gesetzt werden." msgid "Unable to update job binary" msgstr "Job Binärprogramm konnte nicht aktualisiert werden" #, python-format msgid "Unable to update job binary: %s" msgstr "Konnte Job Binar nicht aktualisieren: %s" msgid "Unable to update row" msgstr "Die Reihe kann nicht aktualisiert werden" msgid "Unable to upload job binary" msgstr "Aufgaben-Binärprogramm kann nicht hochgeladen werden" msgid "Unknown" msgstr "Unbekannt" msgid "Unnecessary tags may be removed by clicking a cross near tag's name." msgstr "" "Klicken Sie auf das Kreuz neben dem Namen, um unnötige Schlagwörter zu " "entfernen." msgid "Unregister Image" msgid_plural "Unregister Images" msgstr[0] "Abbild austragen" msgstr[1] "Abbilder austragen" msgid "Unregistered Image" msgid_plural "Unregistered Images" msgstr[0] "Ausgetragenes Abbild" msgstr[1] "Ausgetragene Abbilder" msgid "Update" msgstr "Aktualisieren" msgid "Update Cluster Shares" msgstr "Cluster-Freigaben aktualisieren" msgid "Update Plugin" msgstr "Aktualisiere Plugin" msgid "Update Shares" msgstr "Aktualisierte Freigaben" msgid "Update the plugin labels" msgstr "Aktualisiere Plugin Beschreibung" msgid "Updated" msgstr "Aktualisiert" msgid "Updated time" msgstr "Aktualisierte Zeit" msgid "Upload" msgstr "Hochladen" msgid "Upload File" msgstr "Datei hochladen" msgid "Upload Template" msgstr "Vorlage hochladen" msgid "Upload a new file" msgstr "Eine neue Datei hochladen" msgid "Uptime" msgstr "Uptime" msgid "Url" msgstr "URL" msgid "Use Data Source Substitution for Names and UUIDs" msgstr "Benutzen Sie Datenquelle Ersetzung für Namen und UUIDs" msgid "Use HBase Common library" msgstr "Allgemeine HBase Bibliothek verwenden" msgid "Use SSL" msgstr "SSL benutzen" msgid "Use anti-affinity groups for processes" msgstr "Anti-Affinität Gruppen für Prozesse nutzen" msgid "Use anti-affinity groups for: " msgstr "Benutze Anti-Affinity Gruppen für:" msgid "Use auto-configuration" msgstr "Benutze Auto-Konfiguration" msgid "Use bucket in path" msgstr "Bucket im Pfad benutzen" msgid "Use the same topology name as defined in your .yaml file" msgstr "Benutze denselben Topologienamen wie in Ihrer .yaml Datei" msgid "User" msgstr "Benutzer" msgid "User Name" msgstr "Benutzername" msgid "User has to choose a keypair to have access to clusters instances." msgstr "" "Der Benutzer muss ein Schlüsselpaar auswählen, um Zugriff auf die " "Clusterinstanzen zu haben." msgid "Username" msgstr "Benutzername" msgid "Value" msgstr "Wert" msgid "Value Type" msgstr "Werttyp" msgid "Version" msgstr "Version" msgid "Version:" msgstr "Version:" #, python-format msgid "" "Version: %(hadoop_version)s of plugin %(plugin_name)s is now " "deprecated." msgstr "" "Version: %(hadoop_version)s des Plugins %(plugin_name)s ist " "jetzt veraltet." msgid "Volume local to instance" msgstr "Lokaler Datenträger an Instanz" msgid "Volumes Availability Zone" msgstr "Datenträger Verfügbarkeitszone" msgid "Volumes local to instance" msgstr "Lokaler Datenträger für Instanz" msgid "Volumes per node" msgstr "Datenträger pro Knoten" msgid "Volumes size" msgstr "Größe der Datenträger" msgid "Volumes size (GB)" msgstr "Größe der Datenträger (GB)" msgid "Volumes type" msgstr "Datenträgertyp" msgid "Warning!" msgstr "Warnung!" msgid "Which keypair to use for authentication." msgstr "Welches Schlüsselpaar soll für die Authentifizierung verwendet werden." msgid "Worker Node Group Template:" msgstr "Worker Knoten-Gruppenvorlage:" msgid "" "You are now ready to launch your cluster. When you click on the link below, " "you will need to give your cluster a name, choose the Cluster Template to " "use and choose which image to use to build your instances. After you click " "on \"Create\", your instances will begin to spawn. Your cluster should be " "operational in a few minutes." msgstr "" "Sie sind jetzt bereit, den Cluster zu starten. Wenn Sie den unten stehenden " "Link anklicken, müssen Sie dem Cluster einen Namen zuweisen, eine " "Clustervorlage auswählen und das Abbild wählen, aus dem die Instanzen gebaut " "werden. Nachdem Sie \"Erstellen\" \n" "geklickt haben, startet die Verteilung Ihrer Instanzen. Ihr Cluster sollte " "innerhalb weniger Minuten verfügbar sein.\n" " " msgid "You may also add any custom tag." msgstr "Sie können auch benutzerspezifische Schlagwörter hinzufügen." msgid "You may also enter an optional description for your Data Source." msgstr "" "Sie können ebenfalls eine optionale Beschreibung der Datenquelle eingeben." msgid "You may also enter an optional description for your job binary." msgstr "" "Sie können eine optionale Beschreibung ihres Aufgaben-Binärprogramms " "eingeben." msgid "You may also enter an optional description for your job template." msgstr "" "Sie können eine optionale Beschreibung für Ihre Aufgabenvorlage eingeben." msgid "You may need to enter the username and password for your Data Source." msgstr "" "Sie müssen möglicherweise Benutzernamen und Passwort für Ihre Datenquelle " "angeben." msgid "You may set cluster scoped configurations on corresponding tabs." msgstr "" "Sie können Konfigurationen für den Cluster Bereich in den " "entsprechenden Reitern setzen." msgid "" "You must choose a flavor to determine the size (VCPUs, memory and storage) " "of all launched VMs." msgstr "" "Sie müssen eine Variante wählen, um die Größe (VCPUs, Speicher und Storage) " "aller gestarteten VMs zu bestimmen." msgid "" "You need to register an image to launch instances of your cluster. Skip this " "step if you already have a registered image for your plugin, otherwise click " "the link below. In the form you will need to choose the image, input the " "username and add tags for the chosen plugin." msgstr "" "Sie müssen ein Abbild registrieren, um Instanzen Ihres Clusters zu starten. " "Überspringen Sie diesen Schritt, wenn Sie bereits ein Abbild für Ihr Plugin " "registriert haben, andernfalls klicken Sie auf den unten angegebenen Link. " "Im Formular müssen Sie ein Abbild auswählen, einen Benutzernamen eingeben " "und Marken für das ausgewählte Plugin hinzufügen." msgid "" "You've chosen a cluster that is in 'Error' state. Appropriate execution of " "the job can't be guaranteed." msgstr "" "Sie haben einen Cluster im 'Error' Status gewählt. Erfolgreiche Job-" "Ausführung kann nicht garantiert werden." msgid "cluster" msgstr "Cluster" msgid "cluster template" msgstr "Clustervorlage" msgid "data source" msgstr "Datenquelle" msgid "job" msgstr "Aufgabe" msgid "job binary" msgstr "Aufgaben-Binärprogramm" msgid "no processes" msgstr "keine Prozesse" msgid "node group template" msgstr "Knoten-Gruppenvorlage" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/de/LC_MESSAGES/djangojs.po0000664000175000017500000000434300000000000026032 0ustar00zuulzuul00000000000000# Frank Kloeker , 2016. #zanata # Frank Kloeker , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-03-01 09:13+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-02-11 07:32+0000\n" "Last-Translator: Frank Kloeker \n" "Language-Team: German\n" "Language: de\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "(show events)" msgstr "(zeige Ergebnisse)" msgid "Configuration Value" msgstr "Konfigurationswert" msgid "Data Source" msgstr "Datenquelle" msgid "Default Value" msgstr "Voreingestellter Wert" msgid "Description" msgstr "Beschreibung" msgid "Event log is not available." msgstr "Ereignisprotokoll ist nicht verfügbar." msgid "" "For configs and params, type the key name; for args, type the index as an " "integer, starting from 0." msgstr "" "Für Konfigurationen und Parameter geben Sie den Schlüsselnamen an. Für " "Argumente geben Sie den Index als Ganzzahl an, beginnend mit der 0." msgid "" "For data sources, use a data source UUID or a path (as per data source " "creation.)" msgstr "" "Für Datenquellen verwenden Sie eine Datenquellen-UUID oder einen Pfad (wie " "bei der Datenquellenerstellung)." msgid "Location" msgstr "Ort" msgid "Mapping Type" msgstr "Abbildungstyp" msgid "Name" msgstr "Name" msgid "Named Parameter" msgstr "Bezeichneter Parameter" msgid "Number" msgstr "Zahl" msgid "Positional Argument" msgstr "Stellungsargument" msgid "Remove" msgstr "Entfernen" msgid "Required?" msgstr "Erforderlich?" msgid "" "See https://docs.openstack.org/sahara/latest/user/edp.html for definitions." msgstr "" "Sehen Sie https://docs.openstack.org/sahara/latest/user/edp.html für " "Definitionen." msgid "String" msgstr "Zeichenkette" msgid "The step has completed successfully. No events to display." msgstr "Der Schritt wurde erfolgreich beendet. Keine Ereignisse zum Anzeigen." msgid "Value Type" msgstr "Werttyp" msgid "Verification is not available." msgstr "Überprüfung ist nicht verfügbar." msgid "Warning!" msgstr "Warnung!" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/locale/en_GB/0000775000175000017500000000000000000000000022464 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.592073 sahara-dashboard-16.0.0/sahara_dashboard/locale/en_GB/LC_MESSAGES/0000775000175000017500000000000000000000000024251 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/en_GB/LC_MESSAGES/django.po0000664000175000017500000014714600000000000026070 0ustar00zuulzuul00000000000000# Andi Chandler , 2016. #zanata # Andi Chandler , 2017. #zanata # Andi Chandler , 2018. #zanata # Andi Chandler , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-11-08 04:41+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-11-14 11:29+0000\n" "Last-Translator: Andi Chandler \n" "Language-Team: English (United Kingdom)\n" "Language: en_GB\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid " Done" msgstr " Done" msgid " or " msgstr " or " #, python-format msgid "%(conf_name)s: %(conf_val)s" msgstr "%(conf_name)s: %(conf_val)s" #, python-format msgid "%(conf_name)s: %(conf_value)s" msgstr "%(conf_name)s: %(conf_value)s" #, python-format msgid "%(group)s:" msgstr "%(group)s:" #, python-format msgid "%(key)s: %(val)s" msgstr "%(key)s: %(val)s" #, python-format msgid "%s processes: " msgstr "%s processes: " msgid "-- not selected --" msgstr "-- not selected --" msgid "" "Important: The name that you give your job binary will be the name " "used in your job execution. If your binary requires a particular name or " "extension (ie: \".jar\"), be sure to include it here." msgstr "" "Important: The name that you give your job binary will be the name " "used in your job execution. If your binary requires a particular name or " "extension (ie: \".jar\"), be sure to include it here." msgid "Access Key" msgstr "Access Key" msgid "Adapt For Oozie" msgstr "Adapt For Oozie" msgid "Add" msgstr "Add" msgid "Add Node Group" msgstr "Add Node Group" msgid "Add libraries to your job template." msgstr "Add libraries to your job template." msgid "Anti-affinity enabled for" msgstr "Anti-affinity enabled for" msgid "Arguments" msgstr "Arguments" msgid "Attached storage location" msgstr "Attached storage location" msgid "Auto Security Group" msgstr "Auto Security Group" msgid "Auto-configure" msgstr "Auto-configure" msgid "" "Automatically modify the Hadoop configuration so that job config values are " "set and so that Oozie will handle exit codes correctly." msgstr "" "Automatically modify the Hadoop configuration so that job config values are " "set and so that Oozie will handle exit codes correctly." msgid "Availability Zone" msgstr "Availability Zone" msgid "Base Image" msgstr "Base Image" msgid "Boot Volume AZ" msgstr "Boot Volume AZ" msgid "Boot Volume locality" msgstr "Boot Volume locality" msgid "Boot Volume type" msgstr "Boot Volume type" msgid "Boot from Volume" msgstr "Boot from Volume" msgid "Boot storage location" msgstr "Boot storage location" msgid "Boot volume availability Zone" msgstr "Boot volume availability Zone" msgid "Boot volume availability zone" msgstr "Boot volume availability zone" msgid "Boot volume local to instance" msgstr "Boot volume local to instance" msgid "Boot volume locality" msgstr "Boot volume locality" msgid "Boot volume type" msgstr "Boot volume type" msgid "Cancel" msgstr "Cancel" msgid "Checked?" msgstr "Checked?" msgid "Checking" msgstr "Checking" msgid "Choose" msgstr "Choose" msgid "Choose a boot mode" msgstr "Choose a boot mode" msgid "Choose a main binary" msgstr "Choose a main binary" msgid "Choose a shell script" msgstr "Choose a shell script" msgid "Choose a storage location" msgstr "Choose a storage location" msgid "Choose additional files" msgstr "Choose additional files" msgid "Choose an existing Master Node Group Template" msgstr "Choose an existing Master Node Group Template" msgid "Choose an existing Worker Node Group Template" msgstr "Choose an existing Worker Node Group Template" msgid "Choose an existing file" msgstr "Choose an existing file" msgid "" "Choose from the list of binaries and click \"choose\" to add the library to " "your job template. This can be repeated for additional libraries." msgstr "" "Choose from the list of binaries and click \"choose\" to add the library to " "your job template. This can be repeated for additional libraries." msgid "Choose job type" msgstr "Choose job type" msgid "Choose libraries" msgstr "Choose libraries" msgid "Choose node group template" msgstr "Choose node group template" msgid "" "Choose or create your main binary. Additional libraries can be added from " "the \"Libs\" tab." msgstr "" "Choose or create your main binary. Additional libraries can be added from " "the \"Libs\" tab." msgid "Choose plugin" msgstr "Choose plugin" msgid "Choose plugin and version" msgstr "Choose plugin and version" msgid "Choose plugin type and version" msgstr "Choose plugin type and version" msgid "Choose the Input Data Source (n/a for Java and Shell jobs)." msgstr "Choose the Input Data Source (n/a for Java and Shell jobs)." msgid "Choose the Output Data Source (n/a for Java and Shell jobs)." msgstr "Choose the Output Data Source (n/a for Java and Shell jobs)." msgid "Choose the binary which should be used in this Job." msgstr "Choose the binary which should be used in this Job." msgid "Choose the cluster to use for the job." msgstr "Choose the cluster to use for the job." msgid "Chosen Libraries" msgstr "Chosen Libraries" msgid "Cinder Volume" msgstr "Cinder Volume" msgid "Cinder service is unavailable now" msgstr "Cinder service is unavailable now" msgid "Cinder volumes" msgstr "Cinder volumes" msgid "Cluster" msgstr "Cluster" msgid "Cluster Configuration Overview" msgstr "Cluster Configuration Overview" msgid "Cluster Count" msgstr "Cluster Count" msgid "Cluster Creation Guide" msgstr "Cluster Creation Guide" msgid "Cluster Events" msgstr "Cluster Events" msgid "Cluster Instances" msgstr "Cluster Instances" msgid "Cluster Name" msgstr "Cluster Name" msgid "Cluster Template" msgstr "Cluster Template" #, python-format msgid "Cluster Template %s updated" msgstr "Cluster Template %s updated" msgid "Cluster Template Configuration Overview" msgstr "Cluster Template Configuration Overview" #, python-format msgid "Cluster Template copy %s created" msgstr "Cluster Template copy %s created" msgid "Cluster Templates" msgstr "Cluster Templates" msgid "Cluster can be launched using existing Cluster Templates." msgstr "Cluster can be launched using existing Cluster Templates." msgid "Cluster configurations are not specified" msgstr "Cluster configurations are not specified" msgid "Cluster health checks" msgstr "Cluster health checks" msgid "Cluster provision steps" msgstr "Cluster provision steps" msgid "Cluster share update failed." msgstr "Cluster share update failed." msgid "Cluster template creation failed" msgstr "Cluster Template creation failed" msgid "Cluster template update failed" msgstr "Cluster Template update failed" msgid "Cluster type chosen" msgstr "Cluster type chosen" msgid "Clusters" msgstr "Clusters" msgid "Completed Successfully" msgstr "Completed Successfully" msgid "Configuration" msgstr "Configuration" msgid "Configuration Details" msgstr "Configuration Details" msgid "Configuration Value" msgstr "Configuration Value" msgid "Configure" msgstr "Configure" msgid "Configure Cluster" msgstr "Configure Cluster" msgid "Configure Cluster Template" msgstr "Configure Cluster Template" msgid "Configure Node Group Template" msgstr "Configure Node Group Template" msgid "Configure Template" msgstr "Configure Template" msgid "Control access to instances of the node group." msgstr "Control access to instances of the node group." msgid "Copy Cluster Template" msgstr "Copy Cluster Template" msgid "Copy Template" msgstr "Copy Template" msgid "Could not create" msgstr "Could not create" msgid "Could not create data source" msgstr "Could not create data source" msgid "Could not create job template" msgstr "Could not create job template" msgid "Could not launch job" msgstr "Could not launch job" msgid "Could not parse template" msgstr "Could not parse template" msgid "Could not update cluster shares" msgstr "Could not update cluster shares" msgid "Could not update data source" msgstr "Could not update data source" msgid "Could not update plugin" msgstr "Could not update plugin" msgid "Count" msgstr "Count" msgid "Create" msgstr "Create" msgid "Create Cluster Template" msgstr "Create Cluster Template" msgid "Create Data Source" msgstr "Create Data Source" msgid "Create Job Binary" msgstr "Create Job Binary" msgid "Create Job Template" msgstr "Create Job Template" msgid "Create Node Group Template" msgstr "Create Node Group Template" msgid "Create Template" msgstr "Create Template" msgid "Create a Cluster Template" msgstr "Create a Cluster Template" msgid "Create a Data Source with a specified name." msgstr "Create a Data Source with a specified name." msgid "Create a Master Node Group Template" msgstr "Create a Master Node Group Template" msgid "Create a Worker Node Group Template" msgstr "Create a Worker Node Group Template" msgid "Create a data source" msgstr "Create a data source" msgid "Create a job template" msgstr "Create a job template" msgid "Create a job template with a specified name." msgstr "Create a job template with a specified name." msgid "Create a script to be uploaded dynamically" msgstr "Create a script to be uploaded dynamically" msgid "Create boot volume in this availability zone." msgstr "Create boot volume in this availability zone." msgid "Create security group for this Node Group." msgstr "Create security group for this Node Group." msgid "Create time" msgstr "Create time" msgid "Create volumes in this availability zone." msgstr "Create volumes in this availability zone." msgid "Created" msgstr "Created" msgctxt "Created time" msgid "Created" msgstr "Created" #, python-format msgid "Created Cluster Template %s" msgstr "Created Cluster Template %s" #, python-format msgid "Created Node Group Template %s" msgstr "Created Node Group Template %s" msgid "Created time" msgstr "Created time" msgid "Current choice:" msgstr "Current choice:" msgid "Current type:" msgstr "Current type:" msgid "Custom Tag" msgstr "Custom Tag" msgid "DNS Domain Names" msgstr "DNS Domain Names" msgid "Data Processing" msgstr "Data Processing" msgid "Data Processing Plugin Details" msgstr "Data Processing Plugin Details" msgid "Data Processing Plugins" msgstr "Data Processing Plugins" msgid "Data Processing internal database" msgstr "Data Processing internal database" msgid "" "Data Processing provides different storage location options. You may choose " "Ephemeral Drive or a Cinder Volume to be attached to instances." msgstr "" "Data Processing provides different storage location options. You may choose " "Ephemeral Drive or a Cinder Volume to be attached to instances." msgid "Data Source" msgstr "Data Source" msgid "Data Source Type" msgstr "Data Source Type" msgid "Data Sources" msgstr "Data Sources" msgid "" "Data Sources are what your job uses for input and output. Depending on the " "type of job you will be running, you may need to define one or more data " "sources. You can create multiple data sources by repeating this step." msgstr "" "Data Sources are what your job uses for input and output. Depending on the " "type of job you will be running, you may need to define one or more data " "sources. You can create multiple data sources by repeating this step." msgid "Data source created" msgstr "Data source created" msgid "Data source updated" msgstr "Data source updated" msgid "Default Value" msgstr "Default Value" msgid "" "Define your Job Template. This is where you choose the type of job that you " "want to run (Pig, Java Action, Spark, etc) and choose or upload the files " "necessary to run it. The inputs and outputs will be defined later." msgstr "" "Define your Job Template. This is where you choose the type of job that you " "want to run (Pig, Java Action, Spark, etc) and choose or upload the files " "necessary to run it. The inputs and outputs will be defined later." msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Delete Cluster" msgstr[1] "Delete Clusters" msgid "Delete Data Source" msgid_plural "Delete Data Sources" msgstr[0] "Delete Data Source" msgstr[1] "Delete Data Sources" msgid "Delete Job" msgid_plural "Delete Jobs" msgstr[0] "Delete Job" msgstr[1] "Delete Jobs" msgid "Delete Job Binary" msgid_plural "Delete Job Binaries" msgstr[0] "Delete Job Binary" msgstr[1] "Delete Job Binaries" msgid "Delete Job Template" msgid_plural "Delete Job Templates" msgstr[0] "Delete Job Template" msgstr[1] "Delete Job Templates" msgid "Delete Template" msgid_plural "Delete Templates" msgstr[0] "Delete Template" msgstr[1] "Delete Templates" msgid "Deleted Cluster" msgid_plural "Deleted Clusters" msgstr[0] "Deleted Cluster" msgstr[1] "Deleted Clusters" msgid "Deleted Data Source" msgid_plural "Deleted Data Sources" msgstr[0] "Deleted Data Source" msgstr[1] "Deleted Data Sources" msgid "Deleted Job" msgid_plural "Deleted Jobs" msgstr[0] "Deleted Job" msgstr[1] "Deleted Jobs" msgid "Deleted Job Binary" msgid_plural "Deleted Job Binaries" msgstr[0] "Deleted Job Binary" msgstr[1] "Deleted Job Binaries" msgid "Deleted Job Template" msgid_plural "Deleted Jobs Templates" msgstr[0] "Deleted Job Template" msgstr[1] "Deleted Jobs Templates" msgid "Deleted Template" msgid_plural "Deleted Templates" msgstr[0] "Deleted Template" msgstr[1] "Deleted Templates" msgid "Description" msgstr "Description" msgid "Details" msgstr "Details" msgid "Domain Name" msgstr "Domain Name" msgid "Domain name" msgstr "Domain name" msgid "Done" msgstr "Done" msgctxt "Current status of a Job" msgid "Done with Error" msgstr "Done with Error" msgid "Download Job Binary" msgstr "Download Job Binary" msgid "Download job binary" msgstr "Download job binary" msgid "Drive type" msgstr "Drive type" msgid "Duration" msgstr "Duration" msgid "Edit Cluster Template" msgstr "Edit Cluster Template" msgid "Edit Data Source" msgstr "Edit Data Source" msgid "Edit Image Tags" msgstr "Edit Image Tags" msgid "Edit Job Binary" msgstr "Edit Job Binary" msgid "Edit Node Group Template" msgstr "Edit Node Group Template" msgid "Edit Tags" msgstr "Edit Tags" msgid "Edit Template" msgstr "Edit Template" msgid "Enable Swift Paths" msgstr "Enable Swift Paths" msgid "Enabled Versions" msgstr "Enabled Versions" msgctxt "End time" msgid "Ended" msgstr "Ended" msgid "Endpoint should be specified without protocol" msgstr "Endpoint should be specified without protocol" msgid "Engine Job ID" msgstr "Engine Job ID" msgid "Enter any custom configuration required for your job's execution." msgstr "Enter any custom configuration required for your job's execution." msgid "Enter the URL for the file" msgstr "Enter the URL for the file" msgid "Enter the access key and secret key required to access that file" msgstr "Enter the access key and secret key required to access that file" msgid "Enter the endpoint of the S3 service where the file is stored" msgstr "Enter the endpoint of the S3 service where the file is stored" msgid "Enter the username and password required to access that file" msgstr "Enter the username and password required to access that file" msgid "Ephemeral Drive" msgstr "Ephemeral Drive" msgid "Ephemeral drive" msgstr "Ephemeral drive" msgid "Error Details" msgstr "Error Details" msgid "Event time" msgstr "Event time" msgid "Export Template" msgstr "Export Template" msgid "Failed" msgstr "Failed" msgctxt "Current status of a Job" msgid "Failed" msgstr "Failed" msgid "Failed to fetch internal binary list" msgstr "Failed to fetch internal binary list" msgid "Failed to get list of internal binaries." msgstr "Failed to get list of internal binaries." msgid "Failed to get list of shares" msgstr "Failed to get list of shares" msgid "Failed to update image." msgstr "Failed to update image." msgid "Filter" msgstr "Filter" msgid "" "First, select which type of job that you want to run. This choice will " "determine which other steps are required" msgstr "" "First, select which type of job that you want to run. This choice will " "determine which other steps are required" msgid "Flavor" msgstr "Flavour" msgid "Flavor is not specified" msgstr "Flavour is not specified" msgid "Floating IP Pool" msgstr "Floating IP Pool" msgid "" "For Data Processing internal job binaries, you may choose from the following:" msgstr "" "For Data Processing internal job binaries, you may choose from the following:" msgid "" "For Data Sources in S3 storage, the URL should be specified in the format " "s3a://bucket/path. Also, each of the access properties may be optional if " "you have configured that property on your cluster manually." msgstr "" "For Data Sources in S3 storage, the URL should be specified in the format " "s3a://bucket/path. Also, each of the access properties may be optional if " "you have configured that property on your cluster manually." msgid "" "For Data Sources on a Manila share, choose the share and enter the path " "relative to the share (example: /outputdir/myinputfile.txt)" msgstr "" "For Data Sources on a Manila share, choose the share and enter the path " "relative to the share (example: /outputdir/myinputfile.txt)" msgid "" "For MapReduce or Java Action jobs, \"mains\" are not applicable. You are " "required to add one or more \"libs\" for these jobs." msgstr "" "For MapReduce or Java Action jobs, \"mains\" are not applicable. You are " "required to add one or more \"libs\" for these jobs." msgid "For Object Store job binaries, you must:" msgstr "For Object Store job binaries, you must:" msgid "For S3 job binaries, you must:" msgstr "For S3 job binaries, you must:" msgid "" "For Shell Action jobs, any required files beyond the main script may be " "added as \"libraries\"." msgstr "" "For Shell Action jobs, any required files beyond the main script may be " "added as \"libraries\"." msgid "" "For Storm, Storm Pyleus, Spark and Shell jobs, only a main is required,\"libs" "\" are optional." msgstr "" "For Storm, Storm Pyleus, Spark and Shell jobs, only a main is required,\"libs" "\" are optional." msgid "Force Delete Cluster" msgid_plural "Force Delete Clusters" msgstr[0] "Force Delete Cluster" msgstr[1] "Force Delete Clusters" msgid "Force Deleted Cluster" msgid_plural "Force Deleted Clusters" msgstr[0] "Force Deleted Cluster" msgstr[1] "Force Deleted Clusters" msgid "General Info" msgstr "General Info" msgid "Guided Cluster Creation" msgstr "Guided Cluster Creation" msgid "Guided Job Execution" msgstr "Guided Job Execution" msgid "HDFS placement" msgstr "HDFS placement" msgid "Health" msgstr "Health" msgid "Hide full configuration" msgstr "Hide full configuration" msgid "Hive" msgstr "Hive" msgid "ID" msgstr "ID" msgid "If checked, bucket will be in path instead of host" msgstr "If checked, bucket will be in path instead of host" #, python-format msgid "" "If selected, %s will be protected from modifications until this will be " "unselected" msgstr "" "If selected, %s will be protected from modifications until this will be " "unselected" #, python-format msgid "If selected, %s will be shared across the tenants" msgstr "If selected, %s will be shared across the tenants" msgid "" "If selected, instances of a cluster will be automatically configured during " "creation. Otherwise you should manually specify configuration values" msgstr "" "If selected, instances of a cluster will be automatically configured during " "creation. Otherwise you should manually specify configuration values" msgid "" "If selected, instances of a node group will be automatically configured " "during cluster creation. Otherwise you should manually specify configuration " "values." msgstr "" "If selected, instances of a node group will be automatically configured " "during cluster creation. Otherwise you should manually specify configuration " "values." msgid "Image" msgstr "Image" msgid "Image Registry" msgstr "Image Registry" msgid "" "Image Registry is used to provide additional information about images for " "Data Processing." msgstr "" "Image Registry is used to provide additional information about images for " "Data Processing." msgid "Image Registry tool:" msgstr "Image Registry tool:" msgid "Import" msgstr "Import" msgid "Import Cluster Template" msgstr "Import Cluster Template" msgid "Import Node Group Template" msgstr "Import Node Group Template" msgid "Import Template" msgstr "Import Template" msgid "In progress" msgstr "In progress" msgid "Info" msgstr "Info" msgid "Input" msgstr "Input" msgid "Input Data Source" msgstr "Input Data Source" msgid "" "Input correct User Name for image. For Ubuntu images input 'ubuntu', " "'fedora' for Fedora images, 'cloud-user' for CentOS 6.x images and 'centos' " "for CentOS 7.x images." msgstr "" "Input correct User Name for image. For Ubuntu images input 'ubuntu', " "'fedora' for Fedora images, 'cloud-user' for CentOS 6.x images and 'centos' " "for CentOS 7.x images." msgid "Instance" msgstr "Instance" msgid "Instance and attached volumes will be created on the same physical host" msgstr "" "Instance and attached volumes will be created on the same physical host" msgid "Instances" msgstr "Instances" msgid "Instances Count" msgstr "Instances Count" msgid "Interface Arguments" msgstr "Interface Arguments" msgid "Internal Binary" msgstr "Internal Binary" msgid "Internal IP" msgstr "Internal IP" msgid "Internal binary" msgstr "Internal binary" msgid "Java" msgstr "Java" msgid "Java Action" msgstr "Java Action" msgid "Java Opts" msgstr "Java Opts" msgid "Job" msgstr "Job" msgid "Job Binaries" msgstr "Job Binaries" msgid "Job Configuration" msgstr "Job Configuration" msgid "Job Execution ID" msgstr "Job Execution ID" msgid "Job Guide" msgstr "Job Guide" msgid "Job Template" msgstr "Job Template" msgid "Job Templates" msgstr "Job Templates" msgid "Job Type" msgstr "Job Type" msgid "Job args" msgstr "Job args" msgid "Job configs" msgstr "Job configs" msgid "Job created" msgstr "Job created" msgid "Job launched" msgstr "Job launched" msgid "Job params" msgstr "Job params" msgid "Job template:" msgstr "Job template:" msgid "Job type chosen" msgstr "Job type chosen" msgid "Jobs" msgstr "Jobs" msgid "Keypair" msgstr "Keypair" msgctxt "Current status of a Job" msgid "Killed" msgstr "Killed" msgid "Label" msgstr "Label" msgid "Label details" msgstr "Label details" msgid "Last Updated" msgstr "Last Updated" msgid "Launch" msgstr "Launch" msgid "Launch Cluster" msgstr "Launch Cluster" msgid "Launch Job" msgid_plural "Launch Jobs" msgstr[0] "Launch Job" msgstr[1] "Launch Jobs" msgid "Launch On Existing Cluster" msgstr "Launch On Existing Cluster" msgid "Launch On New Cluster" msgstr "Launch On New Cluster" msgid "Launch a Cluster" msgstr "Launch a Cluster" msgid "Launch instances in these security groups." msgstr "Launch instances in these security groups." msgid "" "Launch instances in these security groups. Auto security group will be " "determined by the value present in the imported template." msgstr "" "Launch instances in these security groups. Auto security group will be " "determined by the value present in the imported template." msgid "Launch instances in this availability zone." msgstr "Launch instances in this availability zone." msgid "Launch job" msgstr "Launch job" msgid "Launch the given job template on a cluster." msgstr "Launch the given job template on a cluster." msgid "" "Launch your job. When launching, you may need to choose your input and " "output data sources. This is where you would also add any special " "configuration values, parameters, or arguments that you need to pass along " "to your job." msgstr "" "Launch your job. When launching, you may need to choose your input and " "output data sources. This is where you would also add any special " "configuration values, parameters, or arguments that you need to pass along " "to your job." #, python-format msgid "Launched Cluster %s" msgstr "Launched Cluster %s" msgid "Launched Job" msgid_plural "Launched Jobs" msgstr[0] "Launched Job" msgstr[1] "Launched Jobs" msgid "Libs" msgstr "Libs" msgid "Location" msgstr "Location" msgid "Main Class" msgstr "Main Class" msgid "Mains" msgstr "Mains" msgid "Management IP" msgstr "Management IP" msgid "Manila share" msgstr "Manila share" msgid "MapReduce" msgstr "MapReduce" msgid "Mapper" msgstr "Mapper" msgid "Mapping Type" msgstr "Mapping Type" msgid "Master Node Group Template:" msgstr "Master Node Group Template:" msgid "" "Modify the configuration so that swift URLs can be dereferenced through HDFS " "at runtime." msgstr "" "Modify the configuration so that swift URLs can be dereferenced through HDFS " "at runtime." msgid "Name" msgstr "Name" msgid "" "Name must be provided either here or in the template. If provided in both " "places, this one will be used." msgstr "" "Name must be provided either here or in the template. If provided in both " "places, this one will be used." #, python-format msgid "Name: %(node_group_name)s" msgstr "Name: %(node_group_name)s" msgid "Named Parameter" msgstr "Named Parameter" msgid "Neutron Management Network" msgstr "Neutron Management Network" msgid "Never" msgstr "Never" msgid "Next" msgstr "Next" msgid "" "Next, you need to define the different types of machines in your cluster. " "This is done by defining a Node Group Template for each type of machine. A " "very common case is where you need to have one or more machines running a " "\"master\" set of processes while another set of machines need to be running " "the \"worker\" processes. Here, you will define the Node Group Template for " "your \"master\" node(s)." msgstr "" "Next, you need to define the different types of machines in your cluster. " "This is done by defining a Node Group Template for each type of machine. A " "very common case is where you need to have one or more machines running a " "\"master\" set of processes while another set of machines need to be running " "the \"worker\" processes. Here, you will define the Node Group Template for " "your \"master\" node(s)." msgid "No Cluster Template Created" msgstr "No Cluster Template Created" msgid "No Images Available" msgstr "No Images Available" msgid "No Master Node Group Template Created" msgstr "No Master Node Group Template Created" msgid "No Templates Available" msgstr "No Templates Available" msgid "No Worker Node Group Template Created" msgstr "No Worker Node Group Template Created" msgid "No availability zone specified" msgstr "No availability zone specified" msgid "No clusters available" msgstr "No clusters available" msgid "No configurations" msgstr "No configurations" msgid "No description" msgstr "No description" msgid "No domain is specified" msgstr "No domain is specified" msgid "No enabled versions" msgstr "No enabled versions" msgid "No image specified" msgstr "No image specified" msgid "No images available." msgstr "No images available." msgid "No info available" msgstr "No info available" msgid "No job template created" msgstr "No job template created" msgid "No keypair" msgstr "No keypair" msgid "No plugin chosen" msgstr "No plugin chosen" msgid "No type chosen" msgstr "No type chosen" msgid "No volume type" msgstr "No volume type" msgid "Node Group" msgstr "Node Group" #, python-format msgid "Node Group Name: %(node_group_name)s" msgstr "Node Group Name: %(node_group_name)s" msgid "Node Group Template" msgstr "Node Group Template" #, python-format msgid "Node Group Template %s updated" msgstr "Node Group Template %s updated" #, python-format msgid "Node Group Template copy %s created" msgstr "Node Group Template copy %s created" msgid "Node Group Templates" msgstr "Node Group Templates" #, python-format msgid "Node Group: %(node_group_name)s" msgstr "Node Group: %(node_group_name)s" msgid "Node Groups" msgstr "Node Groups" msgid "Node Groups Configuration Overview" msgstr "Node Groups Configuration Overview" msgid "Node Processes" msgstr "Node Processes" msgid "Node group cluster" msgstr "Node group cluster" msgid "Node group configurations are not specified" msgstr "Node group configurations are not specified" msgid "Node processes are not specified" msgstr "Node processes are not specified" msgid "Nodes Count" msgstr "Nodes Count" msgid "None" msgstr "None" msgid "Not available" msgstr "Not available" msgid "" "Now you need to set the layout of your cluster. By creating a Cluster " "Template, you will be choosing the number of instances of each Node Group " "Template that will appear in your cluster. Additionally, you will have a " "chance to set any cluster-specific configuration items in the additional " "tabs on the create Cluster Template form." msgstr "" "Now you need to set the layout of your cluster. By creating a Cluster " "Template, you will be choosing the number of instances of each Node Group " "Template that will appear in your cluster. Additionally, you will have a " "chance to set any cluster-specific configuration items in the additional " "tabs on the create Cluster Template form." msgid "Number" msgstr "Number" msgid "Number of Nodes" msgstr "Number of Nodes" msgid "Number of clusters to launch." msgstr "Number of clusters to launch." msgid "Oozie Job ID" msgstr "Oozie Job ID" msgid "OpenStack Flavor" msgstr "OpenStack Flavour" msgid "Output" msgstr "Output" msgid "Output Data Source" msgstr "Output Data Source" msgid "Parameters" msgstr "Parameters" msgid "Password" msgstr "Password" msgid "Path" msgstr "Path" msgid "Path on share" msgstr "Path on share" msgid "Persist cluster after job exit" msgstr "Persist cluster after job exit" msgid "Pig" msgstr "Pig" msgid "Plugin" msgstr "Plugin" msgid "Plugin Name" msgstr "Plugin Name" msgid "Plugin and Version Tag" msgstr "Plugin and Version Tag" msgid "Plugin label" msgstr "Plugin label" msgid "Plugin name" msgstr "Plugin name" msgid "Plugin update failed." msgstr "Plugin update failed." #, python-format msgid "Plugin version %(version)s label" msgstr "Plugin version %(version)s label" #, python-format msgid "Plugin version %s" msgstr "Plugin version %s" msgid "Plugin:" msgstr "Plugin:" msgid "Plugins" msgstr "Plugins" msgid "Positional Argument" msgstr "Positional Argument" msgid "Progress" msgstr "Progress" msgid "Project ID" msgstr "Project ID" msgid "Protected" msgstr "Protected" msgid "Proxy Gateway" msgstr "Proxy Gateway" msgid "Public" msgstr "Public" msgid "Read only" msgstr "Read only" msgid "Read/Write" msgstr "Read/Write" msgid "Reducer" msgstr "Reducer" msgid "Register Image" msgstr "Register Image" msgid "Relaunch On Existing Cluster" msgstr "Relaunch On Existing Cluster" msgid "Relaunch On New Cluster" msgstr "Relaunch On New Cluster" msgid "Remove" msgstr "Remove" msgid "" "Repeat the Node Group Template creation process, but this time you are " "creating your \"worker\" Node Group Template." msgstr "" "Repeat the Node Group Template creation process, but this time you are " "creating your \"worker\" Node Group Template." msgid "Required" msgstr "Required" msgid "Reset Cluster Creation Guide" msgstr "Reset Cluster Creation Guide" msgid "Reset Cluster Guide" msgstr "Reset Cluster Guide" msgid "Reset Job Execution Guide" msgstr "Reset Job Execution Guide" msgid "Return Code" msgstr "Return Code" msgid "Run HBase EDP Jobs with common HBase library on HDFS" msgstr "Run HBase EDP Jobs with common HBase library on HDFS" msgid "S3" msgstr "S3" msgid "S3 Endpoint" msgstr "S3 Endpoint" msgid "S3 access key" msgstr "S3 access key" msgid "S3 accsss key" msgstr "S3 acesss key" msgid "S3 endpoint" msgstr "S3 endpoint" msgid "S3 secret key" msgstr "S3 secret key" msgid "" "Sahara will use instances of this node group to access other cluster " "instances." msgstr "" "Sahara will use instances of this node group to access other cluster " "instances." msgid "Scale" msgstr "Scale" msgid "Scale Cluster" msgstr "Scale Cluster" msgid "Scale cluster operation failed" msgstr "Scale cluster operation failed" msgid "Scaled cluster successfully started." msgstr "Scaled cluster successfully started." msgid "Scope" msgstr "Scope" msgid "Script name" msgstr "Script name" msgid "Script text" msgstr "Script text" msgid "Secret Key" msgstr "Secret Key" msgid "Security" msgstr "Security" msgid "Security Groups" msgstr "Security Groups" msgid "Select" msgstr "Select" msgid "Select Image" msgstr "Select Image" msgid "Select Node Group Processes" msgstr "Select Node Group Processes" msgid "Select Shares" msgstr "Select Shares" msgid "Select a Node Group Template to add:" msgstr "Select a Node Group Template to add:" msgid "Select a Value Type for your next argument:" msgstr "Select a Value Type for your next argument:" msgid "Select a plugin and version for a new Cluster template." msgstr "Select a plugin and version for a new Cluster template." msgid "Select a plugin and version for a new Cluster." msgstr "Select a plugin and version for a new Cluster." msgid "Select a plugin and version for the new Node Group template." msgstr "Select a plugin and version for the new Node Group template." msgid "" "Select an existing node group template.\n" " " msgstr "" "Select an existing node group template.\n" " " msgid "Select node processes for the node group" msgstr "Select node processes for the node group" msgid "Select plugin and hadoop version" msgstr "Select plugin and Hadoop version" msgid "Select plugin and hadoop version for cluster" msgstr "Select plugin and Hadoop version for cluster" msgid "Select plugin and hadoop version for cluster template" msgstr "Select plugin and hadoop version for cluster template" msgid "Select property name" msgstr "Select property name" msgid "Select the domain name for internal and external hostname resolution." msgstr "Select the domain name for internal and external hostname resolution." msgid "Select the manila shares for this cluster" msgstr "Select the Manila shares for this cluster" msgid "Select the manila shares for this node group" msgstr "Select the Manila shares for this node group" msgid "Select the storage type for your job binary." msgstr "Select the storage type for your job binary." msgid "Select the type of your Data Source." msgstr "Select the type of your Data Source." msgid "Select the type of your job:" msgstr "Select the type of your job:" msgid "Select type" msgstr "Select type" msgid "" "Select which plugin and version that you want to use to create your cluster." msgstr "" "Select which plugin and version that you want to use to create your cluster." msgid "" "Select which type of job that you want to run. This choice will dictate " "which steps are required to successfully execute your job." msgstr "" "Select which type of job that you want to run. This choice will dictate " "which steps are required to successfully execute your job." msgid "" "Selected domain name should already exist in the Designate. You can check it " "in "DNS" tab on the left menu or by executing "designate " "domain-list" on the controller node." msgstr "" "Selected domain name should already exist in the Designate. You can check it " "in "DNS" tab on the left menu or by executing "designate " "domain-list" on the controller node." msgid "Service Configurations" msgstr "Service Configurations" msgid "Share" msgstr "Share" msgid "Shares" msgstr "Shares" msgid "Shell" msgstr "Shell" msgid "Shell Action" msgstr "Shell Action" msgid "Show full configuration" msgstr "Show full configuration" msgid "Source password" msgstr "Source password" msgid "Source username" msgstr "Source username" msgid "Spark" msgstr "Spark" msgid "" "Specified User Name will be used by Data Processing to apply configs and " "manage processes on instances." msgstr "" "Specified User Name will be used by Data Processing to apply configs and " "manage processes on instances." msgid "Start Verification" msgid_plural "Start Verifications" msgstr[0] "Start Verification" msgstr[1] "Start Verifications" msgctxt "Start time" msgid "Started" msgstr "Started" msgid "Started Verification" msgid_plural "Started Verifications" msgstr[0] "Started Verification" msgstr[1] "Started Verifications" msgid "Started at" msgstr "Started at" msgid "Status" msgstr "Status" msgid "Status description" msgstr "Status description" msgid "Step Description" msgstr "Step Description" msgid "Storage type" msgstr "Storage type" msgid "Storm" msgstr "Storm" msgid "Storm Pyleus" msgstr "Storm Pyleus" msgid "Streaming MapReduce" msgstr "Streaming MapReduce" msgid "String" msgstr "String" msgid "" "Substitute data source objects for URLs of the form datasource://name or " "uuid." msgstr "" "Substitute data source objects for URLs of the form datasource://name or " "uuid." msgctxt "Current status of a Job" msgid "Succeeded" msgstr "Succeeded" msgid "Successfully updated image." msgstr "Successfully updated image." msgid "Supported Versions" msgstr "Supported Versions" msgid "Swift" msgstr "Swift" msgid "Tags" msgstr "Tags" msgid "" "Tags are used for filtering images suitable for each plugin and each Data " "Processing version. To add required tags, select a plugin and a Data " "Processing version and click the "Add" button." msgstr "" "Tags are used for filtering images suitable for each plugin and each Data " "Processing version. To add required tags, select a plugin and a Data " "Processing version and click the "Add" button." msgid "Template" msgstr "Template" msgid "Template File" msgstr "Template File" msgid "Template JSON contained invalid key" msgstr "Template JSON contained invalid key" msgid "Template Name" msgstr "Template Name" msgid "Template not specified" msgstr "Template not specified" msgid "" "The Cluster Template object may specify a list of processes in anti-affinity " "group. That means these processes may not be launched more than once on a " "single host." msgstr "" "The Cluster Template object may specify a list of processes in anti-affinity " "group. That means these processes may not be launched more than once on a " "single host." msgid "" "The Cluster Template object should specify Node Group Templates that will be " "used to build a Cluster. You can add Node Groups using Node Group Templates " "on a "Node Groups" tab." msgstr "" "The Cluster Template object should specify Node Group Templates that will be " "used to build a Cluster. You can add Node Groups using Node Group Templates " "on a "Node Groups" tab." msgid "" "The Cluster object should specify OpenStack Image to boot instances for " "Cluster." msgstr "" "The Cluster object should specify OpenStack Image to boot instances for " "Cluster." msgid "" "The Node Group Template object specifies the processes that will be launched " "on each instance. Check one or more processes. When processes are selected, " "you may set node scoped configurations on corresponding tabs." msgstr "" "The Node Group Template object specifies the processes that will be launched " "on each instance. Check one or more processes. When processes are selected, " "you may set node scoped configurations on corresponding tabs." msgid "" "The first step is to determine which type of cluster you want to run. You " "may have several choices available depending on the configuration of your " "system. Click on \"choose plugin\" to bring up the list of data processing " "plugins. There you will be able to choose the data processing plugin along " "with the version number. Choosing this up front will allow the rest of the " "cluster creation steps to focus only on options that are pertinent to your " "desired cluster type." msgstr "" "The first step is to determine which type of cluster you want to run. You " "may have several choices available depending on the configuration of your " "system. Click on \"choose plugin\" to bring up the list of data processing " "plugins. There you will be able to choose the data processing plugin along " "with the version number. Choosing this up front will allow the rest of the " "cluster creation steps to focus only on options that are pertinent to your " "desired cluster type." msgid "The value of shares must be a list of values" msgstr "The value of shares must be a list of values" msgid "This Cluster Template will be created for:" msgstr "This Cluster Template will be created for:" msgid "This Cluster will be started with:" msgstr "This Cluster will be started with:" msgid "This Node Group Template will be created for:" msgstr "This Node Group Template will be created for:" msgid "Title" msgstr "Title" msgid "Topology Name" msgstr "Topology Name" msgid "Type" msgstr "Type" msgid "URL" msgstr "URL" msgid "Unable to create job binary" msgstr "Unable to create job binary" #, python-format msgid "Unable to create job binary: %s" msgstr "Unable to create job binary: %s" msgid "Unable to create new cluster for job." msgstr "Unable to create new cluster for job." msgid "Unable to create the cluster" msgstr "Unable to create the cluster" #, python-format msgid "Unable to fetch Base Image with id: %s." msgstr "Unable to fetch Base Image with id: %s." msgid "Unable to fetch available images." msgstr "Unable to fetch available images." msgid "Unable to fetch base image details" msgstr "Unable to fetch base image details" msgid "Unable to fetch cluster list" msgstr "Unable to fetch cluster list" msgid "Unable to fetch cluster template list" msgstr "Unable to fetch cluster template list" msgid "Unable to fetch cluster template." msgstr "Unable to fetch cluster template." msgid "Unable to fetch cluster to scale" msgstr "Unable to fetch cluster to scale" msgid "Unable to fetch cluster to scale." msgstr "Unable to fetch cluster to scale." msgid "Unable to fetch cluster." msgstr "Unable to fetch cluster." msgid "Unable to fetch clusters." msgstr "Unable to fetch clusters." msgid "Unable to fetch data source list" msgstr "Unable to fetch data source list" msgid "Unable to fetch data sources." msgstr "Unable to fetch data sources." msgid "Unable to fetch flavor for template." msgstr "Unable to fetch flavour for template." msgid "Unable to fetch floating ip pools." msgstr "Unable to fetch floating IP pools." msgid "Unable to fetch image choices." msgstr "Unable to fetch image choices." msgid "Unable to fetch instance details." msgstr "Unable to fetch instance details." msgid "Unable to fetch job binary list" msgstr "Unable to fetch job binary list" #, python-format msgid "Unable to fetch job binary: %(exc)s" msgstr "Unable to fetch job binary: %(exc)s" msgid "Unable to fetch job list" msgstr "Unable to fetch job list" msgid "Unable to fetch job template list" msgstr "Unable to fetch job template list" msgid "Unable to fetch jobs." msgstr "Unable to fetch jobs." msgid "Unable to fetch keypair choices." msgstr "Unable to fetch keypair choices." msgid "Unable to fetch network details" msgstr "Unable to fetch network details" msgid "Unable to fetch node group details." msgstr "Unable to fetch node group details." msgid "Unable to fetch node group template list" msgstr "Unable to fetch node group template list" msgid "Unable to fetch plugin details." msgstr "Unable to fetch plugin details." msgid "Unable to fetch plugin list" msgstr "Unable to fetch plugin list" msgid "Unable to fetch plugin object." msgstr "Unable to fetch plugin object." msgid "Unable to fetch template object." msgstr "Unable to fetch template object." msgid "Unable to fetch template to copy." msgstr "Unable to fetch template to copy." msgid "Unable to fetch template to edit." msgstr "Unable to fetch template to edit." msgid "Unable to fetch the image details" msgstr "Unable to fetch the image details" msgid "Unable to generate process choices." msgstr "Unable to generate process choices." msgid "Unable to get node group details." msgstr "Unable to get node group details." msgid "Unable to get security group list." msgstr "Unable to get security group list." msgid "Unable to launch job." msgstr "Unable to launch job." msgid "Unable to populate anti-affinity processes." msgstr "Unable to populate anti-affinity processes." msgid "Unable to process plugin tags" msgstr "Unable to process plugin tags" msgid "Unable to retrieve Nova availability zones." msgstr "Unable to retrieve Nova availability zones." msgid "Unable to retrieve data processing plugins." msgstr "Unable to retrieve data processing plugins." #, python-format msgid "Unable to retrieve details for cluster \"%s\"." msgstr "Unable to retrieve details for cluster \"%s\"." #, python-format msgid "Unable to retrieve details for cluster template \"%s\"." msgstr "Unable to retrieve details for cluster template \"%s\"." #, python-format msgid "Unable to retrieve details for data source \"%s\"." msgstr "Unable to retrieve details for data source \"%s\"." #, python-format msgid "Unable to retrieve details for job \"%s\"." msgstr "Unable to retrieve details for job \"%s\"." #, python-format msgid "Unable to retrieve details for job binary \"%s\"." msgstr "Unable to retrieve details for job binary \"%s\"." #, python-format msgid "Unable to retrieve details for job template \"%s\"." msgstr "Unable to retrieve details for job template \"%s\"." #, python-format msgid "Unable to retrieve details for node group template \"%s\"." msgstr "Unable to retrieve details for node group template \"%s\"." msgid "Unable to retrieve image list" msgstr "Unable to retrieve image list" #, python-format msgid "Unable to retrieve images with filter %s." msgstr "Unable to retrieve images with filter %s." #, python-format msgid "Unable to retrieve job binary \"%s\"." msgstr "Unable to retrieve job binary \"%s\"." msgid "Unable to retrieve networks." msgstr "Unable to retrieve networks." msgid "Unable to retrieve plugin." msgstr "Unable to retrieve plugin." #, python-format msgid "Unable to retrieve security group %(group)s." msgstr "Unable to retrieve security group %(group)s." msgid "Unable to retrieve volumes availability zones." msgstr "Unable to retrieve volumes availability zones." msgid "Unable to set cluster type" msgstr "Unable to set cluster type" msgid "Unable to set job type" msgstr "Unable to set job type" msgid "Unable to set node group template" msgstr "Unable to set node group template" msgid "Unable to update job binary" msgstr "Unable to update job binary" #, python-format msgid "Unable to update job binary: %s" msgstr "Unable to update job binary: %s" msgid "Unable to update row" msgstr "Unable to update row" msgid "Unable to upload job binary" msgstr "Unable to upload job binary" msgid "Unknown" msgstr "Unknown" msgid "Unnecessary tags may be removed by clicking a cross near tag's name." msgstr "Unnecessary tags may be removed by clicking a cross near tag's name." msgid "Unregister Image" msgid_plural "Unregister Images" msgstr[0] "Unregister Image" msgstr[1] "Unregister Images" msgid "Unregistered Image" msgid_plural "Unregistered Images" msgstr[0] "Unregistered Image" msgstr[1] "Unregistered Images" msgid "Update" msgstr "Update" msgid "Update Cluster Shares" msgstr "Update Cluster Shares" msgid "Update Plugin" msgstr "Update Plugin" msgid "Update Shares" msgstr "Update Shares" msgid "Update the plugin labels" msgstr "Update the plugin labels" msgid "Updated" msgstr "Updated" msgid "Updated time" msgstr "Updated time" msgid "Upload" msgstr "Upload" msgid "Upload File" msgstr "Upload File" msgid "Upload Template" msgstr "Upload Template" msgid "Upload a new file" msgstr "Upload a new file" msgid "Uptime" msgstr "Uptime" msgid "Url" msgstr "URL" msgid "Use Data Source Substitution for Names and UUIDs" msgstr "Use Data Source Substitution for Names and UUIDs" msgid "Use HBase Common library" msgstr "Use HBase Common library" msgid "Use SSL" msgstr "Use SSL" msgid "Use anti-affinity groups for processes" msgstr "Use anti-affinity groups for processes" msgid "Use anti-affinity groups for: " msgstr "Use anti-affinity groups for: " msgid "Use auto-configuration" msgstr "Use auto-configuration" msgid "Use bucket in path" msgstr "Use bucket in path" msgid "Use the same topology name as defined in your .yaml file" msgstr "Use the same topology name as defined in your .yaml file" msgid "User" msgstr "User" msgid "User Name" msgstr "User Name" msgid "User has to choose a keypair to have access to clusters instances." msgstr "User has to choose a keypair to have access to clusters instances." msgid "Username" msgstr "Username" msgid "Value" msgstr "Value" msgid "Value Type" msgstr "Value Type" msgid "Version" msgstr "Version" msgid "Version:" msgstr "Version:" #, python-format msgid "" "Version: %(hadoop_version)s of plugin %(plugin_name)s is now " "deprecated." msgstr "" "Version: %(hadoop_version)s of plugin %(plugin_name)s is now " "deprecated." msgid "Volume local to instance" msgstr "Volume local to instance" msgid "Volumes Availability Zone" msgstr "Volumes Availability Zone" msgid "Volumes local to instance" msgstr "Volumes local to instance" msgid "Volumes per node" msgstr "Volumes per node" msgid "Volumes size" msgstr "Volumes size" msgid "Volumes size (GB)" msgstr "Volumes size (GB)" msgid "Volumes type" msgstr "Volumes type" msgid "Warning!" msgstr "Warning!" msgid "Which keypair to use for authentication." msgstr "Which keypair to use for authentication." msgid "Worker Node Group Template:" msgstr "Worker Node Group Template:" msgid "" "You are now ready to launch your cluster. When you click on the link below, " "you will need to give your cluster a name, choose the Cluster Template to " "use and choose which image to use to build your instances. After you click " "on \"Create\", your instances will begin to spawn. Your cluster should be " "operational in a few minutes." msgstr "" "You are now ready to launch your cluster. When you click on the link below, " "you will need to give your cluster a name, choose the Cluster Template to " "use and choose which image to use to build your instances. After you click " "on \"Create\", your instances will begin to spawn. Your cluster should be " "operational in a few minutes." msgid "You may also add any custom tag." msgstr "You may also add any custom tag." msgid "You may also enter an optional description for your Data Source." msgstr "You may also enter an optional description for your Data Source." msgid "You may also enter an optional description for your job binary." msgstr "You may also enter an optional description for your job binary." msgid "You may also enter an optional description for your job template." msgstr "You may also enter an optional description for your job template." msgid "You may need to enter the username and password for your Data Source." msgstr "You may need to enter the username and password for your Data Source." msgid "You may set cluster scoped configurations on corresponding tabs." msgstr "" "You may set cluster scoped configurations on corresponding tabs." msgid "" "You must choose a flavor to determine the size (VCPUs, memory and storage) " "of all launched VMs." msgstr "" "You must choose a flavour to determine the size (VCPUs, memory and storage) " "of all launched VMs." msgid "" "You need to register an image to launch instances of your cluster. Skip this " "step if you already have a registered image for your plugin, otherwise click " "the link below. In the form you will need to choose the image, input the " "username and add tags for the chosen plugin." msgstr "" "You need to register an image to launch instances of your cluster. Skip this " "step if you already have a registered image for your plugin, otherwise click " "the link below. In the form you will need to choose the image, input the " "username and add tags for the chosen plugin." msgid "" "You've chosen a cluster that is in 'Error' state. Appropriate execution of " "the job can't be guaranteed." msgstr "" "You've chosen a cluster that is in 'Error' state. Appropriate execution of " "the job can't be guaranteed." msgid "cluster" msgstr "cluster" msgid "cluster template" msgstr "cluster template" msgid "data source" msgstr "data source" msgid "job" msgstr "job" msgid "job binary" msgstr "job binary" msgid "no processes" msgstr "no processes" msgid "node group template" msgstr "node group template" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/en_GB/LC_MESSAGES/djangojs.po0000664000175000017500000000417400000000000026416 0ustar00zuulzuul00000000000000# Andi Chandler , 2016. #zanata # Andi Chandler , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-02-17 13:24+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-01-22 03:47+0000\n" "Last-Translator: Andi Chandler \n" "Language-Team: English (United Kingdom)\n" "Language: en_GB\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "(show events)" msgstr "(show events)" msgid "Configuration Value" msgstr "Configuration Value" msgid "Data Source" msgstr "Data Source" msgid "Default Value" msgstr "Default Value" msgid "Description" msgstr "Description" msgid "Event log is not available." msgstr "Event log is not available." msgid "" "For configs and params, type the key name; for args, type the index as an " "integer, starting from 0." msgstr "" "For configs and params, type the key name; for args, type the index as an " "integer, starting from 0." msgid "" "For data sources, use a data source UUID or a path (as per data source " "creation.)" msgstr "" "For data sources, use a data source UUID or a path (as per data source " "creation.)" msgid "Location" msgstr "Location" msgid "Mapping Type" msgstr "Mapping Type" msgid "Name" msgstr "Name" msgid "Named Parameter" msgstr "Named Parameter" msgid "Number" msgstr "Number" msgid "Positional Argument" msgstr "Positional Argument" msgid "Remove" msgstr "Remove" msgid "Required?" msgstr "Required?" msgid "" "See https://docs.openstack.org/sahara/latest/user/edp.html for definitions." msgstr "" "See https://docs.openstack.org/sahara/latest/user/edp.html for definitions." msgid "String" msgstr "String" msgid "The step has completed successfully. No events to display." msgstr "The step has completed successfully. No events to display." msgid "Value Type" msgstr "Value Type" msgid "Verification is not available." msgstr "Verification is not available." msgid "Warning!" msgstr "Warning!" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/locale/fr/0000775000175000017500000000000000000000000022121 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.592073 sahara-dashboard-16.0.0/sahara_dashboard/locale/fr/LC_MESSAGES/0000775000175000017500000000000000000000000023706 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/fr/LC_MESSAGES/django.po0000664000175000017500000012661700000000000025525 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # Gérald LONLAS , 2016. #zanata # Pascal Larivée , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-22 11:41+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-08-10 01:47+0000\n" "Last-Translator: Pascal Larivée \n" "Language-Team: French\n" "Language: fr\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" msgid " Done" msgstr "Terminé" msgid " or " msgstr "ou" #, python-format msgid "%(conf_name)s: %(conf_val)s" msgstr "%(conf_name)s: %(conf_val)s" #, python-format msgid "%(conf_name)s: %(conf_value)s" msgstr "%(conf_name)s : %(conf_value)s" #, python-format msgid "%(group)s:" msgstr "%(group)s :" #, python-format msgid "%(key)s: %(val)s" msgstr "%(key)s : %(val)s" #, python-format msgid "%s processes: " msgstr "Processus %s : " msgid "-- not selected --" msgstr "-- aucune sélection --" msgid "Adapt For Oozie" msgstr "Adaptation pour Oozie" msgid "Add" msgstr "Ajouter" msgid "Add Node Group" msgstr "Ajouter un groupe de nœuds" msgid "Add libraries to your job template." msgstr "Ajouter des bibliothèques à votre modèle de tâche." msgid "Anti-affinity enabled for" msgstr "Anti-affinité activée pour" msgid "Arguments" msgstr "Arguments" msgid "Auto Security Group" msgstr "Groupe de sécurité automatique" msgid "Auto-configure" msgstr "Auto-configure" msgid "" "Automatically modify the Hadoop configuration so that job config values are " "set and so that Oozie will handle exit codes correctly." msgstr "" "Modifie automatiquement la configuration Hadoop pour que les valeurs de " "configuration des tâches soient définies et que Oozie traite correctement " "les codes de sortie." msgid "Availability Zone" msgstr "Zone de disponibilité" msgid "Base Image" msgstr "Image de base" msgid "Cancel" msgstr "Annuler" msgid "Checked?" msgstr "Coché ?" msgid "Checking" msgstr "Vérification" msgid "Choose" msgstr "Choisir" msgid "Choose a main binary" msgstr "Choisissez le binaire principal" msgid "Choose a shell script" msgstr "Choisissez un script shell" msgid "Choose a storage location" msgstr "Choisir un espace de stockage" msgid "Choose additional files" msgstr "Choisir les fichiers supplémentaires " msgid "Choose an existing Master Node Group Template" msgstr "Sélectionner un modèle de groupe de nœuds Master existant." msgid "Choose an existing Worker Node Group Template" msgstr "Sélectionner un modèle de groupe de nœuds Worker existant." msgid "Choose an existing file" msgstr "Choisir un fichier existant" msgid "" "Choose from the list of binaries and click \"choose\" to add the library to " "your job template. This can be repeated for additional libraries." msgstr "" "Choisissez dans la liste des binaires et cliquez sur \"choisir\" pour " "ajouter la bibliothèque à votre modèle de tâche. Ceci peut être répété pour " "des bibliothèques additionnelles." msgid "Choose job type" msgstr "Sélectionner le type de tâche" msgid "Choose libraries" msgstr "Choisir les bibliothèques" msgid "Choose node group template" msgstr "Choissir un modèle de groupe de nœuds" msgid "" "Choose or create your main binary. Additional libraries can be added from " "the \"Libs\" tab." msgstr "" "Choisissez ou créez votre binaire principal. Les bibliothèques " "additionnelles peuvent être ajoutées à partir de l'onglet \"Libs\"." msgid "Choose plugin" msgstr "Sélectionner un plugin" msgid "Choose plugin and version" msgstr "Sélectionner un plugin et une version" msgid "Choose plugin type and version" msgstr "Sélectionner un type de plugin et une version" msgid "Choose the Input Data Source (n/a for Java and Shell jobs)." msgstr "Choisissez la source de données d'entrée (n/a pour les tâches Shell)." msgid "Choose the Output Data Source (n/a for Java and Shell jobs)." msgstr "Choisissez la source de données de sortie (n/a pour les tâches Shell)." msgid "Choose the binary which should be used in this Job." msgstr "Choisissez le binaire qui pourra être utilisé pour cette tâche." msgid "Choose the cluster to use for the job." msgstr "Sélectionnez le cluster à utiliser pour cette tâche." msgid "Chosen Libraries" msgstr "Bibliothèques choisies" msgid "Cinder Volume" msgstr "Volume Cinder" msgid "Cinder service is unavailable now" msgstr "Le service Cinder n'est pas disponible maintenant" msgid "Cinder volumes" msgstr "Volumes Cinder" msgid "Cluster" msgstr "Cluster" msgid "Cluster Configuration Overview" msgstr "Aperçu de la configuration du cluster" msgid "Cluster Count" msgstr "Nombre de cluster" msgid "Cluster Creation Guide" msgstr "Guide de création d'un cluster" msgid "Cluster Events" msgstr "Événements sur le cluster" msgid "Cluster Instances" msgstr "Instances de cluster" msgid "Cluster Name" msgstr "Nom du cluster" msgid "Cluster Template" msgstr "Modèle de cluster" #, python-format msgid "Cluster Template %s updated" msgstr "Modèle de cluster %s mis a jour" msgid "Cluster Template Configuration Overview" msgstr "Aperçu de la configuration du modèle de cluster" #, python-format msgid "Cluster Template copy %s created" msgstr "Copie du modèle de cluster %s créée" msgid "Cluster Templates" msgstr "Modèles de cluster" msgid "Cluster can be launched using existing Cluster Templates." msgstr "Le cluster peut être démarré en utilisant les modèles de cluster." msgid "Cluster configurations are not specified" msgstr "Les configurations de cluster ne sont pas spécifiées" msgid "Cluster health checks" msgstr "Vérification de la santé du cluster" msgid "Cluster provision steps" msgstr "Étapes de déploiement du cluster" msgid "Cluster share update failed." msgstr "Échec de la mise à jour des partages du cluster." msgid "Cluster template creation failed" msgstr "Échec de la création du modèle de cluster" msgid "Cluster template update failed" msgstr "Échec de la mise à jour du modèle de cluster" msgid "Cluster type chosen" msgstr "Type de cluster sélectionné" msgid "Clusters" msgstr "Clusters" msgid "Completed Successfully" msgstr "Terminé avec succès" msgid "Configuration" msgstr "Configuration" msgid "Configuration Details" msgstr "Détails de la configuration" msgid "Configuration Value" msgstr "Valeur de configuration" msgid "Configure" msgstr "Configurer" msgid "Configure Cluster" msgstr "Configurer le cluster" msgid "Configure Cluster Template" msgstr "Configurer le modèle de Cluster" msgid "Configure Node Group Template" msgstr "Configurer le modèle de groupe de nœud" msgid "Configure Template" msgstr "Configurer un modèle" msgid "Control access to instances of the node group." msgstr "Contrôlez l'accès aux instances du groupe de nœuds." msgid "Copy Cluster Template" msgstr "Copier le modèle cluster" msgid "Copy Template" msgstr "Copier le modèle" msgid "Could not create" msgstr "Ne peut pas être créé" msgid "Could not create data source" msgstr "Impossible de créer de la source de données" msgid "Could not create job template" msgstr "N'a pas pu créer de modèle de tâche" msgid "Could not launch job" msgstr "Impossible de démarrer la tâche" msgid "Could not update cluster shares" msgstr "Impossible de mettre à jour les partages du cluster" msgid "Could not update data source" msgstr "Impossible de mettre à jour de la source de données " msgid "Could not update plugin" msgstr "Impossible de mettre à jour le plugin" msgid "Count" msgstr "Compteur" msgid "Create" msgstr "Créer" msgid "Create Cluster Template" msgstr "Créer un modèle de cluster" msgid "Create Data Source" msgstr "Créer une source de données" msgid "Create Job Binary" msgstr "Créer un binaire pour une tâche" msgid "Create Job Template" msgstr "Créer un modèle de tâche" msgid "Create Node Group Template" msgstr "Créer un modèle de groupe de noeud" msgid "Create Template" msgstr "Créer un modèle" msgid "Create a Cluster Template" msgstr "Créer un modèle de cluster" msgid "Create a Data Source with a specified name." msgstr "Créer une source de données avec un nom personnalisé." msgid "Create a Master Node Group Template" msgstr "Créer un modèle de groupe de nœuds Master" msgid "Create a Worker Node Group Template" msgstr "Créer un modèle de groupe de nœuds Worker" msgid "Create a data source" msgstr "Créer une source de données" msgid "Create a job template" msgstr "Créer un modèle de tâche" msgid "Create a job template with a specified name." msgstr "Créer un modèle de tâche avec un nom indiqué." msgid "Create a script to be uploaded dynamically" msgstr "Créer un script qui sera chargé dynamiquement" msgid "Create security group for this Node Group." msgstr "Créer un groupe de sécurité pour ce groupe de nœuds." msgid "Create time" msgstr "Heure de création" msgid "Create volumes in this availability zone." msgstr "Créer des volumes dans cette zone de disponibilité." msgid "Created" msgstr "Créé" msgctxt "Created time" msgid "Created" msgstr "Créé" #, python-format msgid "Created Cluster Template %s" msgstr "Modèle de cluster %s créé" #, python-format msgid "Created Node Group Template %s" msgstr "Modèle de groupe de nœuds %s créé" msgid "Created time" msgstr "Heure de création" msgid "Current choice:" msgstr "Choix actuel :" msgid "Current type:" msgstr "Type actuel :" msgid "Custom Tag" msgstr "Étiquette personnalisée" msgid "DNS Domain Names" msgstr "Nom de domaine DNS" msgid "Data Processing" msgstr "Traitement de données" msgid "Data Processing Plugin Details" msgstr "Détails du plugin de traitement de données" msgid "Data Processing Plugins" msgstr "Plugins de traitement des données" msgid "Data Processing internal database" msgstr "Base de donnée interne du traitement de données" msgid "" "Data Processing provides different storage location options. You may choose " "Ephemeral Drive or a Cinder Volume to be attached to instances." msgstr "" "Le traitement des données propose différentes options d'emplacement de " "stockage. Vous pouvez choisir un disque Éphémère ou un Volume Cinder à " "attacher aux instances." msgid "Data Source" msgstr "Source de données" msgid "Data Source Type" msgstr "Type de la source de données" msgid "Data Sources" msgstr "Sources de données" msgid "Data source created" msgstr "Source de données créée" msgid "Data source updated" msgstr "Source de données mise à jour" msgid "Default Value" msgstr "Valeur par défaut" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Supprimer le cluster" msgstr[1] "Supprimer les clusters" msgid "Delete Data Source" msgid_plural "Delete Data Sources" msgstr[0] "Supprimer la source de données" msgstr[1] "Supprimer les sources de données" msgid "Delete Job" msgid_plural "Delete Jobs" msgstr[0] "Supprimer la tâche" msgstr[1] "Supprimer les tâches" msgid "Delete Job Binary" msgid_plural "Delete Job Binaries" msgstr[0] "Supprimer un binaire pour une tâche" msgstr[1] "Supprimer des binaires pour une tâche" msgid "Delete Job Template" msgid_plural "Delete Job Templates" msgstr[0] "Supprimer le modèle de tâche" msgstr[1] "Supprimer les modèles de tâche" msgid "Delete Template" msgid_plural "Delete Templates" msgstr[0] "Supprimer le Modèle" msgstr[1] "Supprimer les Modèles" msgid "Deleted Cluster" msgid_plural "Deleted Clusters" msgstr[0] "Cluster supprimé" msgstr[1] "Clusters supprimés" msgid "Deleted Data Source" msgid_plural "Deleted Data Sources" msgstr[0] "Source de données supprimée" msgstr[1] "Sources de données supprimées" msgid "Deleted Job" msgid_plural "Deleted Jobs" msgstr[0] "Tâche supprimée" msgstr[1] "Tâches supprimées" msgid "Deleted Job Binary" msgid_plural "Deleted Job Binaries" msgstr[0] "Binaire pour une tâche supprimées" msgstr[1] "Binaires pour une tâche supprimées" msgid "Deleted Job Template" msgid_plural "Deleted Jobs Templates" msgstr[0] "Modèle de tâche supprimé" msgstr[1] "Modèles de tâches supprimés" msgid "Deleted Template" msgid_plural "Deleted Templates" msgstr[0] "Modèle supprimé" msgstr[1] "Modèles supprimés" msgid "Description" msgstr "Description" msgid "Details" msgstr "Détails" msgid "Domain Name" msgstr "Nom de domaine" msgid "Domain name" msgstr "Nom de domaine" msgid "Done" msgstr "Terminé" msgctxt "Current status of a Job" msgid "Done with Error" msgstr "Effectué avec une erreur" msgid "Download Job Binary" msgstr "Télécharger le binaire pour une tâche" msgid "Download job binary" msgstr "Télécharger le binaire de tâche" msgid "Drive type" msgstr "Type de disque" msgid "Duration" msgstr "Durée" msgid "Edit Cluster Template" msgstr "Modifier le modèle de cluster" msgid "Edit Data Source" msgstr "Modifier la source de données" msgid "Edit Image Tags" msgstr "Éditer les étiquettes de l'image" msgid "Edit Job Binary" msgstr "Modifier le binaire pour une tâche" msgid "Edit Node Group Template" msgstr "Éditer le modèle de groupe de nœuds" msgid "Edit Tags" msgstr "Modifier les étiquettes" msgid "Edit Template" msgstr "Éditer le modèle" msgid "Enable Swift Paths" msgstr "Activation des chemins swifts" msgid "Enabled Versions" msgstr "Versions activées" msgctxt "End time" msgid "Ended" msgstr "Terminé" msgid "Enter any custom configuration required for your job's execution." msgstr "" "Entrer vos configurations personnalisées et requises pour l'exécution de vos " "tâches." msgid "Enter the URL for the file" msgstr "Entrer l'URL du fichier" msgid "Enter the username and password required to access that file" msgstr "" "Entrer le nom de l'utilisateur et son mot de passe requis pour accéder au " "fichier" msgid "Ephemeral Drive" msgstr "Disque éphémère" msgid "Ephemeral drive" msgstr "Disque éphémère" msgid "Error Details" msgstr "Détails de l'erreur" msgid "Event time" msgstr "Date de l’événement" msgid "Failed" msgstr "Échec" msgctxt "Current status of a Job" msgid "Failed" msgstr "Échec" msgid "Failed to fetch internal binary list" msgstr "Échec de la récupération de la liste binaire interne" msgid "Failed to get list of internal binaries." msgstr "Impossible d'obtenir la liste des fichiers binaires internes." msgid "Failed to get list of shares" msgstr "Impossible d'obtenir la liste des partages" msgid "Failed to update image." msgstr "Échec de la mise à jour de l'image." msgid "Filter" msgstr "Filtrer" msgid "Flavor" msgstr "Gabarit" msgid "Flavor is not specified" msgstr "Le gabarit n'est pas précisé" msgid "Floating IP Pool" msgstr "Pool d'IP flottantes" msgid "" "For Data Processing internal job binaries, you may choose from the following:" msgstr "" "Pour les binaires de Traitement de Donnée internes, vous pouvez choisir " "parmi les suivants :" msgid "" "For Data Sources on a Manila share, choose the share and enter the path " "relative to the share (example: /outputdir/myinputfile.txt)" msgstr "" "Pour les sources de données de partage sur Manila, choisissez le partage et " "entrez le chemin relatif vers ce partage (exemple : /outputdir/myinputfile." "txt)" msgid "For Object Store job binaries, you must:" msgstr "Pour les binaires de tâche d'Object Store, vous devez :" msgid "" "For Shell Action jobs, any required files beyond the main script may be " "added as \"libraries\"." msgstr "" "Pour les travaux Action Shell, tout fichier requis en dehors du script " "principal doit être ajouté en tant que \"librairie\"." msgid "" "For Storm, Storm Pyleus, Spark and Shell jobs, only a main is required,\"libs" "\" are optional." msgstr "" "Pour Storm, Storm Pyleus, Spark et Shell jobs, seulement le main est requis, " "les \"libs\" sont optionnelles." msgid "General Info" msgstr "Informations générales" msgid "Guided Cluster Creation" msgstr "Création de cluster guidée" msgid "Guided Job Execution" msgstr "Éxécution de tâche guidée" msgid "HDFS placement" msgstr "emplacement HDFS" msgid "Health" msgstr "Santé" msgid "Hide full configuration" msgstr "Cacher la configuration complète" msgid "Hive" msgstr "Hive" msgid "ID" msgstr "ID" #, python-format msgid "" "If selected, %s will be protected from modifications until this will be " "unselected" msgstr "" "Si sélectionné, %s sera protégé des modifications jusqu'à ce qu'il soit " "désélectionné" #, python-format msgid "If selected, %s will be shared across the tenants" msgstr "Si sélectionné, %s sera partagé à travers les tenants" msgid "" "If selected, instances of a cluster will be automatically configured during " "creation. Otherwise you should manually specify configuration values" msgstr "" "Si sélectionné, les instances d'un cluster seront automatiquement configurés " "pendant la création. Autrement vous devrez spécifier manuellement les " "valeurs de configuration." msgid "" "If selected, instances of a node group will be automatically configured " "during cluster creation. Otherwise you should manually specify configuration " "values." msgstr "" "Si cette option est sélectionnée, les instances d'un groupe de nœuds seront " "configurées automatiquement pendant la création du cluster. Sinon, vous " "devrez spécifier manuellement les valeurs de configuration." msgid "Image" msgstr "Image" msgid "Image Registry" msgstr "Registre des images" msgid "" "Image Registry is used to provide additional information about images for " "Data Processing." msgstr "" "Le registre des images est utilisé pour fournir des informations " "supplémentaires sur les images dédiées au Traitement de Données." msgid "Image Registry tool:" msgstr "Outil de registre d'images :" msgid "In progress" msgstr "En cours" msgid "Info" msgstr "Information" msgid "Input" msgstr "Entrée" msgid "Input Data Source" msgstr "Source de données d'entrée" msgid "Instance" msgstr "Instance" msgid "Instance and attached volumes will be created on the same physical host" msgstr "" "L'instance et les volumes attachés seront créés sur le même hôte physique" msgid "Instances" msgstr "Instances" msgid "Instances Count" msgstr "Nombre d'instances" msgid "Interface Arguments" msgstr "Arguments de l’interface" msgid "Internal Binary" msgstr "Binaire interne" msgid "Internal IP" msgstr "IP interne" msgid "Internal binary" msgstr "Binaire interne" msgid "Java" msgstr "Java" msgid "Java Action" msgstr "Action Java" msgid "Java Opts" msgstr "Java Opts" msgid "Job" msgstr "Tâche" msgid "Job Binaries" msgstr "Binaire pour une tâche" msgid "Job Configuration" msgstr "Configuration de la tâche" msgid "Job Execution ID" msgstr "ID de l'exécution du job" msgid "Job Guide" msgstr "Guide pour une tâche" msgid "Job Template" msgstr "Modèle de tâche" msgid "Job Templates" msgstr "Modèles de tâche" msgid "Job Type" msgstr "Type de tâche" msgid "Job args" msgstr "Arguments de la tâche" msgid "Job configs" msgstr "Configurations des tâches" msgid "Job created" msgstr "Tâche créée" msgid "Job launched" msgstr "Tâche démarrée" msgid "Job params" msgstr "Paramètres de la tâche" msgid "Job template:" msgstr "Modèle de tâche :" msgid "Job type chosen" msgstr "Type de tâche choisie" msgid "Jobs" msgstr "Tâches" msgid "Keypair" msgstr "Paire de clés" msgctxt "Current status of a Job" msgid "Killed" msgstr "Supprimé de force" msgid "Label" msgstr "Libellé" msgid "Label details" msgstr "Détails du libellé" msgid "Last Updated" msgstr "Dernière mise à jour" msgid "Launch" msgstr "Démarrer" msgid "Launch Cluster" msgstr "Lancer le Cluster" msgid "Launch Job" msgid_plural "Launch Jobs" msgstr[0] "Démarrer la tâche" msgstr[1] "Démarrer les tâches" msgid "Launch On Existing Cluster" msgstr "Lancer sur le cluster existant" msgid "Launch On New Cluster" msgstr "Lancer sur un nouveau cluster" msgid "Launch a Cluster" msgstr "Lancer un Cluster" msgid "Launch instances in these security groups." msgstr "Démarrer ces instances dans ces groupes de sécurité." msgid "Launch instances in this availability zone." msgstr "Démarrer des instances dans cette zone de disponibilité." msgid "Launch job" msgstr "Démarrer une tâche" msgid "Launch the given job template on a cluster." msgstr "Lancer le modèle de tâche sélectionné sur un cluster." #, python-format msgid "Launched Cluster %s" msgstr "Cluster démarré %s" msgid "Launched Job" msgid_plural "Launched Jobs" msgstr[0] "Tâche démarrée" msgstr[1] "Tâches démarrées" msgid "Libs" msgstr "Libs" msgid "Location" msgstr "Emplacement" msgid "Main Class" msgstr "Classe principale" msgid "Mains" msgstr "Mains" msgid "Management IP" msgstr "IP de management" msgid "Manila share" msgstr "Partage de Manila" msgid "MapReduce" msgstr "MapReduce" msgid "Mapper" msgstr "Mapper" msgid "Mapping Type" msgstr "Type de mappage" msgid "Master Node Group Template:" msgstr "Modèle de groupe de nœuds Master :" msgid "" "Modify the configuration so that swift URLs can be dereferenced through HDFS " "at runtime." msgstr "" "Modifiez la configuration pour que les URLs swift soient déréférencées à " "travers HDFS au démarrage." msgid "Name" msgstr "Nom" #, python-format msgid "Name: %(node_group_name)s" msgstr "Nom : %(node_group_name)s" msgid "Named Parameter" msgstr "Paramètre nommé" msgid "Neutron Management Network" msgstr "Réseau de management de Neutron" msgid "Never" msgstr "Jamais" msgid "Next" msgstr "Suivant" msgid "No Cluster Template Created" msgstr "Aucun modèle de cluster créé" msgid "No Images Available" msgstr "Pas d'image disponible" msgid "No Master Node Group Template Created" msgstr "Aucun modèle de groupe de nœuds Master créé" msgid "No Templates Available" msgstr "Pas de template disponible" msgid "No Worker Node Group Template Created" msgstr "Aucun modèle de groupe de nœuds Worker créé" msgid "No availability zone specified" msgstr "Pas de zone de disponibilité spécifiée" msgid "No clusters available" msgstr "Aucun clusters disponibles" msgid "No configurations" msgstr "Pas de configuration" msgid "No description" msgstr "Pas de description" msgid "No domain is specified" msgstr "Aucun nom de domaine spécifié" msgid "No enabled versions" msgstr "Aucune version activée" msgid "No image specified" msgstr "Aucune image spécifiée" msgid "No images available." msgstr "Pas d'image disponible." msgid "No info available" msgstr "Aucune information disponible" msgid "No job template created" msgstr "Aucun modèle de tâche n'a été créé" msgid "No keypair" msgstr "Pas de paire de clés" msgid "No plugin chosen" msgstr "Aucun plugin sélectionné" msgid "No type chosen" msgstr "Aucun type choisi" msgid "No volume type" msgstr "Pas de type de volume" msgid "Node Group" msgstr "Groupe de nœuds" #, python-format msgid "Node Group Name: %(node_group_name)s" msgstr "Nom du groupe de nœuds : %(node_group_name)s" msgid "Node Group Template" msgstr "Modèle du groupe de noeud" #, python-format msgid "Node Group Template %s updated" msgstr "Le modèle de groupe de nœuds \"%s\" a été mis à jour" #, python-format msgid "Node Group Template copy %s created" msgstr "Copie du modèle de groupe de noeud %s créée" msgid "Node Group Templates" msgstr "Modèles de groupes de noeuds" #, python-format msgid "Node Group: %(node_group_name)s" msgstr "Groupe de nœuds : %(node_group_name)s" msgid "Node Groups" msgstr "Groupes de noeuds" msgid "Node Groups Configuration Overview" msgstr "Aperçu de la configuration du groupe de nœuds" msgid "Node Processes" msgstr "Processus du noeud" msgid "Node group cluster" msgstr "Groupe de nœuds pour le cluster" msgid "Node group configurations are not specified" msgstr "Les configurations du groupe de noeuds ne sont pas spécifiées" msgid "Node processes are not specified" msgstr "Les processus du nœud ne sont pas spécifiés" msgid "Nodes Count" msgstr "Compteur de nœuds" msgid "None" msgstr "Aucun" msgid "Not available" msgstr "Non disponible" msgid "Number" msgstr "Nombre" msgid "Number of Nodes" msgstr "Nombre de nœuds" msgid "Number of clusters to launch." msgstr "Nombre de clusters à lancer." msgid "Oozie Job ID" msgstr "ID de la tâche Oozie" msgid "OpenStack Flavor" msgstr "Gabarit OpenStack" msgid "Output" msgstr "Sortie" msgid "Output Data Source" msgstr "Source de données de sortie" msgid "Parameters" msgstr "Paramètres" msgid "Password" msgstr "Mot de passe" msgid "Path" msgstr "Chemin" msgid "Path on share" msgstr "Chemin du partage" msgid "Persist cluster after job exit" msgstr "Sauvegarder le cluster après la fin de la tâche" msgid "Pig" msgstr "Pig" msgid "Plugin" msgstr "Plugin" msgid "Plugin Name" msgstr "Nom du plugin" msgid "Plugin and Version Tag" msgstr "Plugin et Tag de version" msgid "Plugin label" msgstr "Etiquette du plugin" msgid "Plugin name" msgstr "Nom du plugin" msgid "Plugin update failed." msgstr "Échec de la mise à jour du plugin:" #, python-format msgid "Plugin version %(version)s label" msgstr "Etiquette version du plugin %(version)s" #, python-format msgid "Plugin version %s" msgstr "Version du plugin : %s" msgid "Plugin:" msgstr "Plugin :" msgid "Plugins" msgstr "Plugins" msgid "Positional Argument" msgstr "Argument positionnel" msgid "Progress" msgstr "Avancement" msgid "Project ID" msgstr "ID Projet" msgid "Protected" msgstr "Protégée" msgid "Proxy Gateway" msgstr "Passerelle du proxy" msgid "Public" msgstr "Publique" msgid "Read only" msgstr "Lecture seulement" msgid "Read/Write" msgstr "Lecture/Écriture" msgid "Reducer" msgstr "Reducer" msgid "Register Image" msgstr "Inscrire l'image" msgid "Relaunch On Existing Cluster" msgstr "Relancer sur le cluster existant" msgid "Relaunch On New Cluster" msgstr "Relancer sur le nouveau cluster" msgid "Remove" msgstr "Supprimer" msgid "Required" msgstr "Obligatoire" msgid "Reset Cluster Creation Guide" msgstr "Réinitialisation du guide de création du cluster" msgid "Reset Cluster Guide" msgstr "Réinitialisation du guide du cluster" msgid "Reset Job Execution Guide" msgstr "Réinitialiser le guide d'exécution de tâches" msgid "Return Code" msgstr "Code retour" msgid "Run HBase EDP Jobs with common HBase library on HDFS" msgstr "" "Exécuter les travaux HBase EDP avec la bibliothèque HBase commune sur HDFS" msgid "" "Sahara will use instances of this node group to access other cluster " "instances." msgstr "" "Sahara utilisera les instances de ce groupe de noeuds pour accéder aux " "autres instances du cluster." msgid "Scale" msgstr "Échelonner" msgid "Scale Cluster" msgstr "Échelonner le Cluster" msgid "Scale cluster operation failed" msgstr "Échec lors de la mise à l'échelle du cluster" msgid "Scaled cluster successfully started." msgstr "Cluster échelonné démarré avec succès" msgid "Scope" msgstr "Périmètre" msgid "Script name" msgstr "Nom du script" msgid "Script text" msgstr "Texte du script" msgid "Security" msgstr "Sécurité" msgid "Security Groups" msgstr "Groupes de sécurité" msgid "Select" msgstr "Sélectionner" msgid "Select Image" msgstr "Sélectionner une image " msgid "Select Node Group Processes" msgstr "Sélectionner processus du groupe de nœuds" msgid "Select Shares" msgstr "Sélectionner les partages" msgid "Select a Node Group Template to add:" msgstr "Sélectionner un modèle de groupe de nœuds à ajouter :" msgid "Select a Value Type for your next argument:" msgstr "Sélectionner un type de valeur pour votre prochain argument." msgid "Select a plugin and version for a new Cluster template." msgstr "" "Sélectionner un plugin et une version pour un nouveau modèle de cluster. " msgid "Select a plugin and version for a new Cluster." msgstr "Sélectionner un plugin et une version pour un nouveau cluster. " msgid "Select a plugin and version for the new Node Group template." msgstr "" "Sélectionner un plugin et une version avec un nouveau modèle de groupe de " "nœud." msgid "" "Select an existing node group template.\n" " " msgstr "" "Sélectionner un modèle de groupe de nœuds existant.\n" " " msgid "Select node processes for the node group" msgstr "Sélectionner processus du noeud pour le groupe de nœuds" msgid "Select plugin and hadoop version" msgstr "Sélectionnez le plugin et la version d'Hadoop" msgid "Select plugin and hadoop version for cluster" msgstr "Sélectionnez le plugin et la version d'Hadoop pour le cluster" msgid "Select plugin and hadoop version for cluster template" msgstr "Sélectionner le plugin et la version pour le modèle de cluster" msgid "Select property name" msgstr "Sélectionner un nom de propriété" msgid "Select the domain name for internal and external hostname resolution." msgstr "" "Sélectionnez le nom de domaine pour la résolution du hostname interne ou " "externe." msgid "Select the manila shares for this cluster" msgstr "Sélectionner les partages Manila pour ce cluster" msgid "Select the manila shares for this node group" msgstr "Sélectionner les partages Manila pour ce groupe de nœuds" msgid "Select the storage type for your job binary." msgstr "Sélectionner le type de stockage pour votre binaire de tâche." msgid "Select the type of your Data Source." msgstr "Sélectionner le type de source de données." msgid "Select the type of your job:" msgstr "Sélectionner le type de votre tâche :" msgid "Select type" msgstr "Sélectionner le type" msgid "Service Configurations" msgstr "Configuration des services" msgid "Share" msgstr "Partage" msgid "Shares" msgstr "Partages" msgid "Shell" msgstr "Shell" msgid "Shell Action" msgstr "Action Shell" msgid "Show full configuration" msgstr "Afficher la configuration complète" msgid "Source password" msgstr "Mot de passe de la source" msgid "Source username" msgstr "Nom d'utilisateur de la source" msgid "Spark" msgstr "Spark" msgid "" "Specified User Name will be used by Data Processing to apply configs and " "manage processes on instances." msgstr "" "Le nom d'utilisateur spécifié sera utilisé par le Traitement de Données afin " "d'appliquer les configurations et administrer les processus sur les " "instances." msgid "Start Verification" msgid_plural "Start Verifications" msgstr[0] "Démarrer la vérification" msgstr[1] "Démarrer les vérifications" msgctxt "Start time" msgid "Started" msgstr "Démarré" msgid "Started Verification" msgid_plural "Started Verifications" msgstr[0] "Vérification démarrée" msgstr[1] "Vérifications démarrées" msgid "Started at" msgstr "Démarré à" msgid "Status" msgstr "Statut" msgid "Status description" msgstr "Description de l'état" msgid "Step Description" msgstr "Description de l'étape" msgid "Storage type" msgstr "Type de stockage" msgid "Storm" msgstr "Storm" msgid "Storm Pyleus" msgstr "Storm Pyleus" msgid "Streaming MapReduce" msgstr "Streaming MapReduce" msgid "String" msgstr "Chaîne de caractères" msgid "" "Substitute data source objects for URLs of the form datasource://name or " "uuid." msgstr "" "Remplacer la source de données des objets pour les URLs du formulaire " "datasource://name ou UUID." msgctxt "Current status of a Job" msgid "Succeeded" msgstr "Réussi" msgid "Successfully updated image." msgstr "Image mise à jour avec succès" msgid "Supported Versions" msgstr "Versions supportées" msgid "Swift" msgstr "Swift" msgid "Tags" msgstr "Etiquettes" msgid "Template" msgstr "Modèle" msgid "Template Name" msgstr "Nom du modèle" msgid "Template not specified" msgstr "Modèle non spécifié" msgid "" "The Cluster object should specify OpenStack Image to boot instances for " "Cluster." msgstr "" "L'objet Cluster doit spécifier une Image OpenStack pour démarrer des " "instances pour le Cluster." msgid "The value of shares must be a list of values" msgstr "La valeur des partages doivent être une liste de valeurs." msgid "This Cluster Template will be created for:" msgstr "Ce modèle de cluster sera créé pour : " msgid "This Cluster will be started with:" msgstr "Ce cluster sera démarré avec :" msgid "This Node Group Template will be created for:" msgstr "Ce modèle de groupe de nœuds sera créé pour :" msgid "Title" msgstr "Titre" msgid "Topology Name" msgstr "Nom de topologie" msgid "Type" msgstr "Type" msgid "URL" msgstr "URL" msgid "Unable to create job binary" msgstr "Impossible de créer le binaire pour une tâche" #, python-format msgid "Unable to create job binary: %s" msgstr "Impossible de créer la tâche binaire : %s" msgid "Unable to create new cluster for job." msgstr "Impossible de créer le nouveau cluster pour la tâche" msgid "Unable to create the cluster" msgstr "Impossible de créer le cluster" #, python-format msgid "Unable to fetch Base Image with id: %s." msgstr "Impossible de récupérer l'image de base avec l'ID : %s." msgid "Unable to fetch available images." msgstr "Impossible de récupérer les images disponibles." msgid "Unable to fetch base image details" msgstr "Impossible de récupérer les détails de l'image d'origine" msgid "Unable to fetch cluster list" msgstr "Impossible de récupérer la liste de clusters" msgid "Unable to fetch cluster template list" msgstr "Impossible de récupérer la liste des modèles de cluster" msgid "Unable to fetch cluster template." msgstr "Impossible de récupérer le modèle de cluster" msgid "Unable to fetch cluster to scale" msgstr "Impossible de récupérer le cluster à échelonner" msgid "Unable to fetch cluster to scale." msgstr "Impossible de récupérer le cluster à échelonner" msgid "Unable to fetch cluster." msgstr "Impossible de récupérer le cluster" msgid "Unable to fetch clusters." msgstr "Impossible de contacter les clusters." msgid "Unable to fetch data source list" msgstr "Impossible de récupérer la liste des sources de données" msgid "Unable to fetch data sources." msgstr "Impossible de récupérer les sources de données" msgid "Unable to fetch flavor for template." msgstr "Impossible de récupérer le gabarit pour le modèle." msgid "Unable to fetch floating ip pools." msgstr "Impossible d'extraire les pools d'IP flottantes." msgid "Unable to fetch image choices." msgstr "Impossible de récupérer les choix d'image." msgid "Unable to fetch instance details." msgstr "Impossible de récupérer les détails de l'instance" msgid "Unable to fetch job binary list" msgstr "Impossible de récupérer la liste des binaires de tâche" #, python-format msgid "Unable to fetch job binary: %(exc)s" msgstr "Impossible de récupérer le binaire de tâche : %(exc)s" msgid "Unable to fetch job list" msgstr "Impossible de récupérer la liste des binaires de tâche" msgid "Unable to fetch job template list" msgstr "Impossible de récupérer la liste du modèle de tâche" msgid "Unable to fetch jobs." msgstr "Impossible de récupérer les tâches." msgid "Unable to fetch keypair choices." msgstr "Impossible de récupérer les choix de paires de clés." msgid "Unable to fetch network details" msgstr "Impossible de récupérer les détails des réseaux" msgid "Unable to fetch node group details." msgstr "Impossible de récupérer les détails du groupe de noeuds." msgid "Unable to fetch node group template list" msgstr "Impossible de récupérer la liste des modèles de groupe de noeuds." msgid "Unable to fetch plugin details." msgstr "Impossible de récupérer les détails du plugin." msgid "Unable to fetch plugin list" msgstr "Impossible de récupérer la liste des plugins" msgid "Unable to fetch plugin object." msgstr "Impossible de récupérer le objet plugin" msgid "Unable to fetch template object." msgstr "Impossible de récupérer l'objet modèle." msgid "Unable to fetch template to copy." msgstr "Impossible de récupérer le modèle à copier" msgid "Unable to fetch template to edit." msgstr "Impossible de récupérer l'objet modèle à éditer." msgid "Unable to fetch the image details" msgstr "Impossible de récupérer les détails de l'image" msgid "Unable to generate process choices." msgstr "Impossible de générer des choix de processus." msgid "Unable to get node group details." msgstr "Impossible de charger les détails du groupe de noeuds" msgid "Unable to get security group list." msgstr "Impossible d'obtenir la liste des groupes de sécurité." msgid "Unable to launch job." msgstr "Impossible de démarrer la tâche." msgid "Unable to populate anti-affinity processes." msgstr "Impossible de peupler les processus d'anti-affinité." msgid "Unable to process plugin tags" msgstr "Impossible de traiter les étiquettes de plugin" msgid "Unable to retrieve data processing plugins." msgstr "Impossible de récupérer les plugins de traitement des données." #, python-format msgid "Unable to retrieve details for cluster \"%s\"." msgstr "Impossible de récupérer les détails du cluster \"%s\"." #, python-format msgid "Unable to retrieve details for cluster template \"%s\"." msgstr "Impossible de récupérer les détails du modèle de cluster \"%s\"." #, python-format msgid "Unable to retrieve details for data source \"%s\"." msgstr "Impossible de récupérer les détails de la source de données \"%s\"." #, python-format msgid "Unable to retrieve details for job \"%s\"." msgstr "Impossible de récupérer les détails de la tâche \"%s\"." #, python-format msgid "Unable to retrieve details for job binary \"%s\"." msgstr "Impossible de récupérer les détails du binaire de tâche \"%s\"." #, python-format msgid "Unable to retrieve details for job template \"%s\"." msgstr "Impossible de récupérer les détails du modèle de tâche \"%s\"." #, python-format msgid "Unable to retrieve details for node group template \"%s\"." msgstr "" "Impossible de retrouver les détails du modèle de groupe de noeuds \"%s\"." msgid "Unable to retrieve image list" msgstr "Impossible de récupérer la liste des images" #, python-format msgid "Unable to retrieve images with filter %s." msgstr "Impossible de récupérer les images avec le filtre %s." #, python-format msgid "Unable to retrieve job binary \"%s\"." msgstr "Impossible de récupérer le binaire de tâche \"%s\"." msgid "Unable to retrieve networks." msgstr "Impossible de récupérer les réseaux." msgid "Unable to retrieve plugin." msgstr "Impossible de récupérer le plugin." #, python-format msgid "Unable to retrieve security group %(group)s." msgstr "Impossible d'extraire le groupe de sécurité %(group)s." msgid "Unable to set cluster type" msgstr "Impossible de définir le type de cluster" msgid "Unable to set job type" msgstr "Impossible de définir le type de tâche" msgid "Unable to set node group template" msgstr "Impossible de configurer le modèle du groupe de nœuds" msgid "Unable to update job binary" msgstr "Impossible de mettre à jour le binaire de tâche" #, python-format msgid "Unable to update job binary: %s" msgstr "Impossible de mettre à jour la tâche binaire : %s" msgid "Unable to update row" msgstr "Impossible de modifier la ligne" msgid "Unable to upload job binary" msgstr "Impossible de charger le binaire pour une tâche" msgid "Unknown" msgstr "Inconnu" msgid "Unnecessary tags may be removed by clicking a cross near tag's name." msgstr "" "Les étiquettes non obligatoires peuvent être supprimées en cliquant sur la " "croix à côté du nom de l'étiquette." msgid "Unregister Image" msgid_plural "Unregister Images" msgstr[0] "Désinscrire l'image" msgstr[1] "Désinscrire les images" msgid "Unregistered Image" msgid_plural "Unregistered Images" msgstr[0] "Image désinscrite" msgstr[1] "Images désinscrites" msgid "Update" msgstr "Mettre à jour" msgid "Update Cluster Shares" msgstr "Mise à jour des Cluster partagés" msgid "Update Plugin" msgstr "Mise à jour du Plugin" msgid "Update Shares" msgstr "Mise à jour des partages" msgid "Update the plugin labels" msgstr "Mettre à jour les étiquettes du plugin" msgid "Updated" msgstr "Mis à jour" msgid "Updated time" msgstr "Heure mise à jour" msgid "Upload" msgstr "Charger" msgid "Upload File" msgstr "Charger un fichier" msgid "Upload Template" msgstr "Charger un modèle" msgid "Upload a new file" msgstr "Charger un nouveau fichier" msgid "Uptime" msgstr "Durée de fonctionnement" msgid "Url" msgstr "Url" msgid "Use Data Source Substitution for Names and UUIDs" msgstr "Utiliser la source de données de substitution pour les noms et UUIDs" msgid "Use HBase Common library" msgstr "Utiliser la bibliothèque commune HBase" msgid "Use anti-affinity groups for processes" msgstr "Utiliser les groupes d'anti-affinité pour les processus" msgid "Use anti-affinity groups for: " msgstr "Utiliser les groupes d'anti-affinité pour :" msgid "Use auto-configuration" msgstr "Utilisation de la configuration auto" msgid "Use the same topology name as defined in your .yaml file" msgstr "" "Utilisez le même nom de topologie que celui définie dans votre fichier .yaml" msgid "User" msgstr "Utilisateur" msgid "User Name" msgstr "Nom d'utilisateur" msgid "User has to choose a keypair to have access to clusters instances." msgstr "" "L'utilisateur doit choisir une paire de clés pour avoir accès aux instances " "des clusters." msgid "Username" msgstr "Nom d'utilisateur" msgid "Value" msgstr "Valeur" msgid "Value Type" msgstr "Type de valeur" msgid "Version" msgstr "Version" msgid "Version:" msgstr "Version :" msgid "Volume local to instance" msgstr "Volume local à l'instance" msgid "Volumes Availability Zone" msgstr "Zone de disponibilité" msgid "Volumes local to instance" msgstr "Volumes locaux à l'instance" msgid "Volumes per node" msgstr "Volumes par noeud" msgid "Volumes size" msgstr "Taille des volumes" msgid "Volumes size (GB)" msgstr "Taille des volumes (Go)" msgid "Volumes type" msgstr "Type des volumes" msgid "Warning!" msgstr "Avertissement !" msgid "Which keypair to use for authentication." msgstr "Utiliser quelle paire de clés pour l'authentification." msgid "Worker Node Group Template:" msgstr "Modèles de groupe de nœuds Worker" msgid "You may also add any custom tag." msgstr "Vous pouvez aussi ajouter une étiquette personnalisée." msgid "You may also enter an optional description for your Data Source." msgstr "" "Vous pouvez aussi fournir une description optionnelle pour votre source de " "données." msgid "You may also enter an optional description for your job binary." msgstr "" "Vous pouvez aussi donner une description optionnelle pour votre binaire de " "tâche." msgid "You may also enter an optional description for your job template." msgstr "" "Vous pouvez également saisir une description en option pour votre modèle de " "tâche." msgid "You may need to enter the username and password for your Data Source." msgstr "" "Vous devez peut-être entrer le nom d'utilisateur et le mot de passe pour " "votre source de données." msgid "You may set cluster scoped configurations on corresponding tabs." msgstr "" "Vous pouvez paramétrer le cluster dédié aux configurations via les " "onglets correspondants." msgid "" "You must choose a flavor to determine the size (VCPUs, memory and storage) " "of all launched VMs." msgstr "" "Vous devez sélectionner un gabarit pour déterminer la taille (les vCPU, la " "mémoire et le stockage) de toutes les machines virtuelles démarrées." msgid "" "You've chosen a cluster that is in 'Error' state. Appropriate execution of " "the job can't be guaranteed." msgstr "" "Vous avez choisi un cluster qui est dans l'état 'Error'. Un déroulement " "correct de la tâche ne peut pas être garanti." msgid "cluster" msgstr "cluster" msgid "cluster template" msgstr "Modèle de cluster" msgid "data source" msgstr "Source de données" msgid "job" msgstr "Tâche" msgid "job binary" msgstr "Binaire pour une tâche" msgid "no processes" msgstr "aucun processus" msgid "node group template" msgstr "Modèle du groupe de nœuds" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/fr/LC_MESSAGES/djangojs.po0000664000175000017500000000420000000000000026041 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # Gérald LONLAS , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard 7.0.0.0rc2.dev21\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2017-10-13 23:21+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-10-26 01:16+0000\n" "Last-Translator: Gérald LONLAS \n" "Language-Team: French\n" "Language: fr\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" msgid "(show events)" msgstr "(Afficher les événements)" msgid "Configuration Value" msgstr "Valeur de configuration" msgid "Data Source" msgstr "Source de données" msgid "Default Value" msgstr "Valeur par défaut" msgid "Description" msgstr "Description" msgid "Event log is not available." msgstr "Le journal des événements n'est pas disponible." msgid "" "For configs and params, type the key name; for args, type the index as an " "integer, starting from 0." msgstr "" "Pour configurer et paramétrer; saisir le nom de la clé; Pour les args, " "saisir un entier pour l'index, en commençant par 0." msgid "" "For data sources, use a data source UUID or a path (as per data source " "creation.)" msgstr "" "Pour les sources de données, utiliser l'UUID de la source de données ou un " "chemin (tel que celui utilisé pour la création)" msgid "Location" msgstr "Emplacement" msgid "Mapping Type" msgstr "Type de mappage" msgid "Name" msgstr "Nom" msgid "Named Parameter" msgstr "Paramètre nommé" msgid "Number" msgstr "Nombre" msgid "Positional Argument" msgstr "Argument positionnel" msgid "Remove" msgstr "Supprimer" msgid "Required?" msgstr "Obligatoire ?" msgid "String" msgstr "Chaîne de caractères" msgid "The step has completed successfully. No events to display." msgstr "L'étape s'est terminée avec succès. Aucun événement à afficher." msgid "Value Type" msgstr "Type de valeur" msgid "Verification is not available." msgstr "La vérification n'est pas disponible." msgid "Warning!" msgstr "Attention !" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/locale/id/0000775000175000017500000000000000000000000022106 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.592073 sahara-dashboard-16.0.0/sahara_dashboard/locale/id/LC_MESSAGES/0000775000175000017500000000000000000000000023673 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/id/LC_MESSAGES/django.po0000664000175000017500000016007300000000000025504 0ustar00zuulzuul00000000000000# suhartono , 2016. #zanata # suhartono , 2017. #zanata # suhartono , 2018. #zanata # suhartono , 2019. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-07-10 20:40+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2019-07-17 04:34+0000\n" "Last-Translator: suhartono \n" "Language-Team: Indonesian\n" "Language: id\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid " Done" msgstr " Done" msgid " or " msgstr " atau " #, python-format msgid "%(conf_name)s: %(conf_val)s" msgstr "%(conf_name)s: %(conf_val)s" #, python-format msgid "%(conf_name)s: %(conf_value)s" msgstr "%(conf_name)s: %(conf_value)s" #, python-format msgid "%(group)s:" msgstr "%(group)s:" #, python-format msgid "%(key)s: %(val)s" msgstr "%(key)s: %(val)s" #, python-format msgid "%s processes: " msgstr "%s proses: " msgid "-- not selected --" msgstr "-- not selected --" msgid "" "Important: The name that you give your job binary will be the name " "used in your job execution. If your binary requires a particular name or " "extension (ie: \".jar\"), be sure to include it here." msgstr "" "Important: Nama yang Anda berikan pada pekerjaan biner Anda akan " "menjadi nama yang digunakan dalam pelaksanaan pekerjaan Anda. Jika biner " "Anda memerlukan nama atau ekstensi tertentu (misalnya: \".jar\"), pastikan " "untuk menyertakannya di sini." msgid "Access Key" msgstr "Access Key" msgid "Adapt For Oozie" msgstr "Adapt For Oozie (beradaptasi untuk Oozie)" msgid "Add" msgstr "Add (tambah)" msgid "Add Node Group" msgstr "Add Node Group (menambah grup simpul)" msgid "Add libraries to your job template." msgstr "Tambahkan perpustakaan ke template pekerjaan Anda." msgid "Anti-affinity enabled for" msgstr "Anti-afinitas diaktifkan untuk" msgid "Arguments" msgstr "Arguments (argumen)" msgid "Attached storage location" msgstr "Lokasi penyimpanan terlampir" msgid "Auto Security Group" msgstr "Auto Security Group (grup keamanan otomatis)" msgid "Auto-configure" msgstr "Auto-configure" msgid "" "Automatically modify the Hadoop configuration so that job config values are " "set and so that Oozie will handle exit codes correctly." msgstr "" "Memodifikasi secara otomatis konfigurasi Hadoop sehingga nilai config " "pekerjaan ditetapkan dan agar Oozie akan menangani kode keluar dengan benar." msgid "Availability Zone" msgstr "Availability Zone (ketersediaan zona)" msgid "Base Image" msgstr "Base Image (image dasar)" msgid "Boot Volume AZ" msgstr "Volume Booting AZ" msgid "Boot Volume locality" msgstr "Boot Volume lokalitas" msgid "Boot Volume type" msgstr "Jenis Volume Booting" msgid "Boot from Volume" msgstr "Boot dari Volume" msgid "Boot storage location" msgstr "Lokasi penyimpanan boot" msgid "Boot volume availability Zone" msgstr "Zona ketersediaan volume boot" msgid "Boot volume availability zone" msgstr "Zona ketersediaan volume boot" msgid "Boot volume local to instance" msgstr "Boot volume lokal ke instance" msgid "Boot volume locality" msgstr "Boot lokalitas volume" msgid "Boot volume type" msgstr "Jenis volume boot" msgid "Cancel" msgstr "Cancel (pembatalan)" msgid "Checked?" msgstr "Checked? (diperiksa?)" msgid "Checking" msgstr "Checking (pengecekan)" msgid "Choose" msgstr "Choose (pilih)" msgid "Choose a boot mode" msgstr "Pilih mode boot" msgid "Choose a main binary" msgstr "Pilih biner utama" msgid "Choose a shell script" msgstr "Pilih skrip shell" msgid "Choose a storage location" msgstr "Pilih lokasi penyimpanan" msgid "Choose additional files" msgstr "Pilih file tambahan" msgid "Choose an existing Master Node Group Template" msgstr "" "Pilih Master Node Group Template (template grup simpul master) yang ada." msgid "Choose an existing Worker Node Group Template" msgstr "Pilih Worker Node Group Template yang ada" msgid "Choose an existing file" msgstr "Pilih file yang ada" msgid "" "Choose from the list of binaries and click \"choose\" to add the library to " "your job template. This can be repeated for additional libraries." msgstr "" "Pilih dari daftar binari dan klik \"choose\" untuk menambahkan perpustakaan " "ke template pekerjaan Anda. Hal ini dapat diulang untuk perpustakaan " "tambahan." msgid "Choose job type" msgstr "Pilih tipe pekerjaan" msgid "Choose libraries" msgstr "Choose libraries (pilih perpustakaan)" msgid "Choose node group template" msgstr "Pilih node group template" msgid "" "Choose or create your main binary. Additional libraries can be added from " "the \"Libs\" tab." msgstr "" "Memilih atau membuat binary utama Anda. Perpustakaan tambahan dapat " "ditambahkan dari tab \"Libs\"." msgid "Choose plugin" msgstr "Pilih plugin" msgid "Choose plugin and version" msgstr "Pilih plugin dan versi" msgid "Choose plugin type and version" msgstr "Pilih tipe plugin dan versi" msgid "Choose the Input Data Source (n/a for Java and Shell jobs)." msgstr "Pilih Input Data Source (n/a untuk pekerjaan Java dan Shell)." msgid "Choose the Output Data Source (n/a for Java and Shell jobs)." msgstr "Pilih Output Data Source (n/a untuk pekerjaan Java dan Shell)." msgid "Choose the binary which should be used in this Job." msgstr "Pilih biner yang harus digunakan dalam pekerjaan ini." msgid "Choose the cluster to use for the job." msgstr "Pilih klaster digunakan untuk pekerjaan." msgid "Chosen Libraries" msgstr "Chosen Libraries (perpustakaan yang dipilih)" msgid "Cinder Volume" msgstr "Cinder Volume (volume Cinder)" msgid "Cinder service is unavailable now" msgstr "Layanan Cinder tidak tersedia sekarang" msgid "Cinder volumes" msgstr "Cinder Volumes" msgid "Cluster" msgstr "Cluster (klaster)" msgid "Cluster Configuration Overview" msgstr "Cluster Configuration Overview (ikhtisar konfigurasi klaster)" msgid "Cluster Count" msgstr "Cluster Count (hitung klaster)" msgid "Cluster Creation Guide" msgstr "Cluster Creation Guide" msgid "Cluster Events" msgstr "Cluster Events (kegiatan klaster)" msgid "Cluster Instances" msgstr "Cluster Instances (instance klaster)" msgid "Cluster Name" msgstr "Cluster Name (nama klaster)" msgid "Cluster Template" msgstr "Cluster Template (template klaster)" #, python-format msgid "Cluster Template %s updated" msgstr "Cluster Template %s updated" msgid "Cluster Template Configuration Overview" msgstr "" "Cluster Template Configuration Overview (ikhtisar kongigurasi template " "klaster)" #, python-format msgid "Cluster Template copy %s created" msgstr "Cluster Template copy %s dibuat" msgid "Cluster Templates" msgstr "Cluster Templates (template klaster)" msgid "Cluster can be launched using existing Cluster Templates." msgstr "Klaster dapat diluncurkan menggunakan Cluster Template yang ada." msgid "Cluster configurations are not specified" msgstr "Konfigurasi klaster tidak ditentukan" msgid "Cluster health checks" msgstr "Pemeriksaan kesehatan klaster)" msgid "Cluster provision steps" msgstr "Langkah penyediaan klaster" msgid "Cluster share update failed." msgstr "Pembaruan share klaster gagal." msgid "Cluster template creation failed" msgstr "Pembentukan Cluster Template gagal" msgid "Cluster template update failed" msgstr "Pembaruan Cluster Template gagal" msgid "Cluster type chosen" msgstr "Tipe klaster dipilih" msgid "Clusters" msgstr "Clusters (klaster)" msgid "Completed Successfully" msgstr "Completed Successfully (berhasil menyelesaikan)" msgid "Configuration" msgstr "Configuration (konfigurasi)" msgid "Configuration Details" msgstr "Configuration Details (rincian konfigurasi)" msgid "Configuration Value" msgstr "Configuration Value (nilai konfigurasi)" msgid "Configure" msgstr "Configure (konfigurasi)" msgid "Configure Cluster" msgstr "Configure Cluster (konfigurasi klaster)" msgid "Configure Cluster Template" msgstr "Configure Cluster Template (konfigurasi klaster template)" msgid "Configure Node Group Template" msgstr "Mengkonfigurasi template kelompok simpul" msgid "Configure Template" msgstr "Configure Template (konfigurasi template)" msgid "Control access to instances of the node group." msgstr "Mengontrol akses ke contoh dari kelompok simpul." msgid "Copy Cluster Template" msgstr "Copy Cluster Template (copy template cluster)" msgid "Copy Template" msgstr "Copy Template (copy template)" msgid "Could not create" msgstr "Tidak dapat membuat" msgid "Could not create data source" msgstr "Tidak dapat membuat sumber data" msgid "Could not create job template" msgstr "Tidak bisa membuat template pekerjaan" msgid "Could not launch job" msgstr "Tidak bisa memulai pekerjaan" msgid "Could not parse template" msgstr "Could not parse template" msgid "Could not update cluster shares" msgstr "Tidak dapat memperbarui share klaster" msgid "Could not update data source" msgstr "Tidak dapat memperbarui sumber data" msgid "Could not update plugin" msgstr "Tidak bisa update plugin" msgid "Count" msgstr "Count" msgid "Create" msgstr "Create" msgid "Create Cluster Template" msgstr "Create Cluster Template (pembentukan template kluster)" msgid "Create Data Source" msgstr "Create Data Source (buat sumber data)" msgid "Create Job Binary" msgstr "Create Job Binary (buat biner pekerjaan)" msgid "Create Job Template" msgstr "Create Job Template (membuat template pekerjaan)" msgid "Create Node Group Template" msgstr "Create Node Group Template (Buat template node grup)" msgid "Create Template" msgstr "Create Template (pembentukan template)" msgid "Create a Cluster Template" msgstr "Buat Cluster Template (template klaster)" msgid "Create a Data Source with a specified name." msgstr "Membuat Sumber Data dengan nama tertentu." msgid "Create a Master Node Group Template" msgstr "Membuat Master Node Group Template" msgid "Create a Worker Node Group Template" msgstr "Buat Worker Node Group Template (template grup simpul pekerja)" msgid "Create a data source" msgstr "Membuat sumber data" msgid "Create a job template" msgstr "Membuat template kerja" msgid "Create a job template with a specified name." msgstr "Membuat template pekerjaan dengan nama tertentu." msgid "Create a script to be uploaded dynamically" msgstr "Membuat skrip untuk upload dinamis" msgid "Create boot volume in this availability zone." msgstr "Buat volume boot di zona ketersediaan ini." msgid "Create security group for this Node Group." msgstr "Buat grup keamanan untuk grup node ini" msgid "Create time" msgstr "Buat waktu" msgid "Create volumes in this availability zone." msgstr "Membuat volume di zona ketersediaan ini." msgid "Created" msgstr "Created" msgctxt "Created time" msgid "Created" msgstr "Created (Dibuat)" #, python-format msgid "Created Cluster Template %s" msgstr "Created Cluster Template %s" #, python-format msgid "Created Node Group Template %s" msgstr "Node Group Template dibuat %s" msgid "Created time" msgstr "Waktu dibuat" msgid "Current choice:" msgstr "Pilihan saat ini:" msgid "Current type:" msgstr "Tipe saat ini:" msgid "Custom Tag" msgstr "Custom Tag (tag kustom)" msgid "DNS Domain Names" msgstr "DNS Domain Names" msgid "Data Processing" msgstr "Data Processing (proses data)" msgid "Data Processing Plugin Details" msgstr "Data Processing Plugin Details (rincian plugin pengolahan data)" msgid "Data Processing Plugins" msgstr "Data Processing Plugins (plugin pengolahan data)" msgid "Data Processing internal database" msgstr "Pengolahan Data database internal" msgid "" "Data Processing provides different storage location options. You may choose " "Ephemeral Drive or a Cinder Volume to be attached to instances." msgstr "" "Data Processing (proses data) memberikan pilihan lokasi penyimpanan yang " "berbeda. Anda dapat memilih Ephemeral Drive atau Cinder Volume terpasang ke " "instance." msgid "Data Source" msgstr "Data Source (sumber data)" msgid "Data Source Type" msgstr "Data Source Type (tipe sumber data)" msgid "Data Sources" msgstr "Data Sources (sumber data)" msgid "" "Data Sources are what your job uses for input and output. Depending on the " "type of job you will be running, you may need to define one or more data " "sources. You can create multiple data sources by repeating this step." msgstr "" "Sumber Data (Data Sources) adalah apa yang digunakan pekerjaan Anda untuk " "input dan output. Bergantung pada jenis pekerjaan yang akan Anda jalankan, " "Anda mungkin perlu mendefinisikan satu atau lebih sumber data. Anda dapat " "membuat beberapa sumber data dengan mengulangi langkah ini." msgid "Data source created" msgstr "Sumber data yang dibuat" msgid "Data source updated" msgstr "Sumber data diperbarui" msgid "Default Value" msgstr "Default Value (nilai default)" msgid "" "Define your Job Template. This is where you choose the type of job that you " "want to run (Pig, Java Action, Spark, etc) and choose or upload the files " "necessary to run it. The inputs and outputs will be defined later." msgstr "" "Tentukan Job Template Anda. Di sinilah Anda memilih jenis pekerjaan yang " "ingin Anda jalankan (Pig, Java Action, Spark, dll) dan pilih atau upload " "file yang diperlukan untuk menjalankannya. Input dan output akan ditentukan " "nanti." msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Delete Cluster" msgid "Delete Data Source" msgid_plural "Delete Data Sources" msgstr[0] "Delete Data Source" msgid "Delete Job" msgid_plural "Delete Jobs" msgstr[0] "Delete Job" msgid "Delete Job Binary" msgid_plural "Delete Job Binaries" msgstr[0] "Delete Job Binary" msgid "Delete Job Template" msgid_plural "Delete Job Templates" msgstr[0] "Delete Job Template" msgid "Delete Template" msgid_plural "Delete Templates" msgstr[0] "Delete Template" msgid "Deleted Cluster" msgid_plural "Deleted Clusters" msgstr[0] "Deleted Cluster" msgid "Deleted Data Source" msgid_plural "Deleted Data Sources" msgstr[0] "Deleted Data Source" msgid "Deleted Job" msgid_plural "Deleted Jobs" msgstr[0] "Deleted Job" msgid "Deleted Job Binary" msgid_plural "Deleted Job Binaries" msgstr[0] "Deleted Job Binary" msgid "Deleted Job Template" msgid_plural "Deleted Jobs Templates" msgstr[0] "Deleted Job Template" msgid "Deleted Template" msgid_plural "Deleted Templates" msgstr[0] "Deleted Template" msgid "Description" msgstr "Description (deskripsi)" msgid "Details" msgstr "Details" msgid "Domain Name" msgstr "Domain Name" msgid "Domain name" msgstr "Nama domain" msgid "Done" msgstr "Done" msgctxt "Current status of a Job" msgid "Done with Error" msgstr "Done with Error (selesai dengan kesalahan)" msgid "Download Job Binary" msgstr "Download Job Binary" msgid "Download job binary" msgstr "Download pekerjaan biner" msgid "Drive type" msgstr "Tipe drive" msgid "Duration" msgstr "Duration (lamanya)" msgid "Edit Cluster Template" msgstr "Edit Cluster Template" msgid "Edit Data Source" msgstr "Edit Data Source (mengedit sumber data)" msgid "Edit Image Tags" msgstr "Mengedit kata kunci image" msgid "Edit Job Binary" msgstr "Edit Job Binary (mengedit pekerjaan biner)" msgid "Edit Node Group Template" msgstr "Edit Node Group Template (edit template grup simpul)" msgid "Edit Tags" msgstr "Edit Tags (mengedit kata kunci)" msgid "Edit Template" msgstr "Edit Template (edit template)" msgid "Enable Swift Paths" msgstr "Enable Swift Paths (aktifkan jalur Swift)" msgid "Enabled Versions" msgstr "Enabled Versions (versi diaktifkan)" msgctxt "End time" msgid "Ended" msgstr "Ended (diakhiri)" msgid "Endpoint should be specified without protocol" msgstr "Endpoint harus ditentukan tanpa protokol" msgid "Engine Job ID" msgstr "Engine Job ID" msgid "Enter any custom configuration required for your job's execution." msgstr "" "Masukkan konfigurasi kustom yang diperlukan untuk pelaksanaan pekerjaan Anda." msgid "Enter the URL for the file" msgstr "Masukkan URL untuk file itu" msgid "Enter the access key and secret key required to access that file" msgstr "" "Masukkan access key dan secret key yang diperlukan untuk mengakses file " "tersebut" msgid "Enter the endpoint of the S3 service where the file is stored" msgstr "Masukkan endpoint layanan S3 tempat file disimpan" msgid "Enter the username and password required to access that file" msgstr "" "Masukkan username dan password yang diperlukan untuk mengakses file itu" msgid "Ephemeral Drive" msgstr "Ephemeral Drive (drive bersifat sementara)" msgid "Ephemeral drive" msgstr "Drive bersifat sementara" msgid "Error Details" msgstr "Error Details (rincian kesalahan)" msgid "Event time" msgstr "Event time (waktu saat acara)" msgid "Export Template" msgstr "Template Ekspor" msgid "Failed" msgstr "Failed (gagal)" msgctxt "Current status of a Job" msgid "Failed" msgstr "Failed (gagal)" msgid "Failed to fetch internal binary list" msgstr "Gagal mengambil daftar biner internal" msgid "Failed to get list of internal binaries." msgstr "Gagal mendapatkan daftar binari internal." msgid "Failed to get list of shares" msgstr "Gagal mendapatkan daftar berbagi" msgid "Failed to update image." msgstr "Image gagal memperbarui " msgid "Filter" msgstr "Filter (penyaring)" msgid "" "First, select which type of job that you want to run. This choice will " "determine which other steps are required" msgstr "" "Pertama, pilih jenis pekerjaan yang ingin Anda jalankan. Pilihan ini akan " "menentukan langkah-langkah lain yang diperlukan" msgid "Flavor" msgstr "Flavor" msgid "Flavor is not specified" msgstr "Flavor tidak ditentukan" msgid "Floating IP Pool" msgstr "Floating IP Pool (kolam IP mengambang)" msgid "" "For Data Processing internal job binaries, you may choose from the following:" msgstr "" "Untuk Pengolahan Data binari pekerjaan internal, Anda dapat memilih dari " "berikut ini:" msgid "" "For Data Sources in S3 storage, the URL should be specified in the format " "s3a://bucket/path. Also, each of the access properties may be optional if " "you have configured that property on your cluster manually." msgstr "" "Untuk Sumber Data di penyimpanan S3, URL harus ditentukan dalam format s3a://" "bucket/path. Juga, setiap properti akses mungkin opsional jika Anda telah " "mengonfigurasi properti tersebut di kluster Anda secara manual." msgid "" "For Data Sources on a Manila share, choose the share and enter the path " "relative to the share (example: /outputdir/myinputfile.txt)" msgstr "" "Untuk Sumber Data pada Manila share, pilih share dan masukkan path relatif " "ke share (contoh: /outputdir/inputfile.txt)" msgid "" "For MapReduce or Java Action jobs, \"mains\" are not applicable. You are " "required to add one or more \"libs\" for these jobs." msgstr "" "Untuk pekerjaan MapReduce atau Java Action, \"mains\" tidak berlaku. Anda " "diminta untuk menambahkan satu atau lebih \"libs\" untuk pekerjaan ini." msgid "For Object Store job binaries, you must:" msgstr "Untuk binari pekerjaan Obyek Store, Anda harus:" msgid "For S3 job binaries, you must:" msgstr "Untuk binari kerja S3, Anda harus:" msgid "" "For Shell Action jobs, any required files beyond the main script may be " "added as \"libraries\"." msgstr "" "Untuk pekerjaan Shell Action, setiap file yang dibutuhkan di luar script " "utama dapat ditambahkan sebagai \"libraries\"." msgid "" "For Storm, Storm Pyleus, Spark and Shell jobs, only a main is required,\"libs" "\" are optional." msgstr "" "Untuk pekerjaan Storm, Storm Pyleus, Spark dan Shell, hanya main diperlukan, " "\"libs\" adalah opsional." msgid "Force Delete Cluster" msgid_plural "Force Delete Clusters" msgstr[0] "Force Delete Cluster" msgid "Force Deleted Cluster" msgid_plural "Force Deleted Clusters" msgstr[0] "Force Deleted Cluster" msgid "General Info" msgstr "General Info (info umum)" msgid "Guided Cluster Creation" msgstr "Guided Cluster Creation (pembuatan klaster dipandu)" msgid "Guided Job Execution" msgstr "Guided Job Execution (dipandu eksekusi kerja)" msgid "HDFS placement" msgstr "Penempatan HDFS" msgid "Health" msgstr "Health (kesehatan)" msgid "Hide full configuration" msgstr "Sembunyikan konfigurasi penuh" msgid "Hive" msgstr "Hive" msgid "ID" msgstr "ID" msgid "If checked, bucket will be in path instead of host" msgstr "Jika dicentang, bucket akan berada di path dari pada host" #, python-format msgid "" "If selected, %s will be protected from modifications until this will be " "unselected" msgstr "" "Jika dipilih, %s akan dilindungi dari modifikasi sampai ini akan tidak " "dipilih" #, python-format msgid "If selected, %s will be shared across the tenants" msgstr "Jika dipilih, %s akan dibagi untuk penyewa (tenant)" msgid "" "If selected, instances of a cluster will be automatically configured during " "creation. Otherwise you should manually specify configuration values" msgstr "" "Jika terpilih, instance cluster akan dikonfigurasi secara otomatis selama " "pembuatan. Jika tidak, Anda harus secara manual menentukan nilai konfigurasi" msgid "" "If selected, instances of a node group will be automatically configured " "during cluster creation. Otherwise you should manually specify configuration " "values." msgstr "" "Jika terpilih, instance dari kelompok node akan secara otomatis " "dikonfigurasi selama pembuatan cluster. Jika tidak, Anda harus secara manual " "menentukan nilai konfigurasi." msgid "Image" msgstr "Image (gambar)" msgid "Image Registry" msgstr "Image Registry (pendaftaran image)" msgid "" "Image Registry is used to provide additional information about images for " "Data Processing." msgstr "" "Image Registry digunakan untuk memberikan informasi tambahan tentang image " "untuk pengolahan data (Data Processing)." msgid "Image Registry tool:" msgstr "Alat Image Registry (registri image):" msgid "Import" msgstr "Import" msgid "Import Cluster Template" msgstr "Impor Cluster Template" msgid "Import Node Group Template" msgstr "Import Node Group Template" msgid "Import Template" msgstr "Import Template" msgid "In progress" msgstr "Sedang berlangsung" msgid "Info" msgstr "Info" msgid "Input" msgstr "Input (masukan)" msgid "Input Data Source" msgstr "Pemasukan sumber data" msgid "" "Input correct User Name for image. For Ubuntu images input 'ubuntu', " "'fedora' for Fedora images, 'cloud-user' for CentOS 6.x images and 'centos' " "for CentOS 7.x images." msgstr "" "Masukkan Nama Pengguna yang benar untuk image. Untuk image Ubuntu masukan " "'ubuntu', 'fedora' untuk image Fedora, 'cloud-user' untuk image CentOS 6.x " "dan 'centos' untuk image CentOS 7.x." msgid "Instance" msgstr "Instance" msgid "Instance and attached volumes will be created on the same physical host" msgstr "Instance dan volume yang melekat akan dibuat pada host fisik yang sama" msgid "Instances" msgstr "Instances (instance)" msgid "Instances Count" msgstr "Instances Count (hitung instance)" msgid "Interface Arguments" msgstr "Interface Arguments (argumen antarmuka)" msgid "Internal Binary" msgstr "Internal Binary (biner internal)" msgid "Internal IP" msgstr "Internal IP (IP internal)" msgid "Internal binary" msgstr "Biner internal" msgid "Java" msgstr "Java" msgid "Java Action" msgstr "Java Action (aksi java)" msgid "Java Opts" msgstr "Java Opts" msgid "Job" msgstr "Job (kerja)" msgid "Job Binaries" msgstr "Job Binaries (binari pekerjaan)" msgid "Job Configuration" msgstr "Job Configuration (konfigurasi kerja)" msgid "Job Execution ID" msgstr "Job Execution ID (ID eksekusi kerja)" msgid "Job Guide" msgstr "Job Guide (panduan kerja)" msgid "Job Template" msgstr "Job Template (template kerja)" msgid "Job Templates" msgstr "Job Templates (template pekerjaan)" msgid "Job Type" msgstr "Job Type (tipe pekerjaan)" msgid "Job args" msgstr "Job args" msgid "Job configs" msgstr "Job configs" msgid "Job created" msgstr "Job dibuat" msgid "Job launched" msgstr "Kerja diluncurkan" msgid "Job params" msgstr "Job params" msgid "Job template:" msgstr "Job template (template kerja):" msgid "Job type chosen" msgstr "Tipe pekerjaan yang dipilih" msgid "Jobs" msgstr "Jobs (pekerjaan)" msgid "Keypair" msgstr "Keypair (pasangan kunci)" msgctxt "Current status of a Job" msgid "Killed" msgstr "Killed (terbunuh)" msgid "Label" msgstr "Label (label)" msgid "Label details" msgstr "Label details (rincian label)" msgid "Last Updated" msgstr "Last Updated (terakhir diperbarui)" msgid "Launch" msgstr "Launch (meluncur)" msgid "Launch Cluster" msgstr "Launch Cluster (peluncuran kluster)" msgid "Launch Job" msgid_plural "Launch Jobs" msgstr[0] "Launch Job" msgid "Launch On Existing Cluster" msgstr "Launch On Existing Cluster (peluncuran cluster yang ada)" msgid "Launch On New Cluster" msgstr "Launch On New Cluster (peluncuran klaster baru" msgid "Launch a Cluster" msgstr "Meluncurkan klaster" msgid "Launch instances in these security groups." msgstr "Luncurkan instance dalam kelompok keamanan ini." msgid "" "Launch instances in these security groups. Auto security group will be " "determined by the value present in the imported template." msgstr "" "Luncurkan instance di grup keamanan ini. Grup keamanan otomatis akan " "ditentukan oleh nilai yang ada dalam template yang diimpor." msgid "Launch instances in this availability zone." msgstr "Luncurkan instance di zona ketersediaan ini." msgid "Launch job" msgstr "Peluncuran pekerjaan" msgid "Launch the given job template on a cluster." msgstr "Meluncurkan template kerja yang diberikan pada sebuah klaster." msgid "" "Launch your job. When launching, you may need to choose your input and " "output data sources. This is where you would also add any special " "configuration values, parameters, or arguments that you need to pass along " "to your job." msgstr "" "Luncurkan pekerjaanmu. Saat diluncurkan, Anda mungkin perlu memilih sumber " "data masukan dan keluaran Anda. Di sinilah Anda juga akan menambahkan nilai " "konfigurasi, parameter, atau argumen khusus yang perlu Anda sampaikan ke " "pekerjaan Anda." #, python-format msgid "Launched Cluster %s" msgstr "Launched Cluster %s (klaster diluncurkan)" msgid "Launched Job" msgid_plural "Launched Jobs" msgstr[0] "Launched Job" msgid "Libs" msgstr "Libs" msgid "Location" msgstr "Location (lokasi)" msgid "Main Class" msgstr "Main Class (kelas utama)" msgid "Mains" msgstr "Mains (induk)" msgid "Management IP" msgstr "Management IP (IP managemen)" msgid "Manila share" msgstr "Berbagi Manila" msgid "MapReduce" msgstr "MapReduce" msgid "Mapper" msgstr "Mapper (pemetaan)" msgid "Mapping Type" msgstr "Mapping Type (tipe pemetaan)" msgid "Master Node Group Template:" msgstr "Master Node Group Template (template grup simpul master):" msgid "" "Modify the configuration so that swift URLs can be dereferenced through HDFS " "at runtime." msgstr "" "Mengubah konfigurasi sehingga URL cepat dapat dereferenced melalui HDFS saat " "runtime." msgid "Name" msgstr "Name (nama)" msgid "" "Name must be provided either here or in the template. If provided in both " "places, this one will be used." msgstr "" "Nama harus disediakan di sini atau di template. Jika disediakan di kedua " "tempat itu, yang satu ini akan digunakan." #, python-format msgid "Name: %(node_group_name)s" msgstr "Name (nama): %(node_group_name)s" msgid "Named Parameter" msgstr "Named Parameter (parameter bernama)" msgid "Neutron Management Network" msgstr "Neutron Management Network (jaringan managemen neutron)" msgid "Never" msgstr "Never (tak pernah)" msgid "Next" msgstr "Next" msgid "" "Next, you need to define the different types of machines in your cluster. " "This is done by defining a Node Group Template for each type of machine. A " "very common case is where you need to have one or more machines running a " "\"master\" set of processes while another set of machines need to be running " "the \"worker\" processes. Here, you will define the Node Group Template for " "your \"master\" node(s)." msgstr "" "Selanjutnya, Anda perlu menentukan berbagai jenis mesin di cluster Anda. Hal " "ini dilakukan dengan mendefinisikan Node Group Template untuk setiap jenis " "mesin. Kasus yang sangat umum adalah di mana Anda perlu memiliki satu atau " "beberapa mesin yang menjalankan serangkaian proses \"master\" sementara satu " "set mesin lainnya harus menjalankan proses \"worker\". Di sini, Anda akan " "menentukan Node Group Template untuk node \"master\" Anda." msgid "No Cluster Template Created" msgstr "Tidak ada Cluster Template Created (template klaster yang dibuat)" msgid "No Images Available" msgstr "No Images Available (tidak ada image tersedia)" msgid "No Master Node Group Template Created" msgstr "" "Tidak ada Master Node Group Template Created (template grup simpul master " "yang dibuat)" msgid "No Templates Available" msgstr "No Templates Available (tidak tersedia template)" msgid "No Worker Node Group Template Created" msgstr "Tidak ada Worker Node Group Template yang dibuat" msgid "No availability zone specified" msgstr "Tidak ada zona ketersediaan ditentukan" msgid "No clusters available" msgstr "Tidak ada klaster yang tersedia" msgid "No configurations" msgstr "Tidak ada konfigurasi" msgid "No description" msgstr "Tidak ada deskripsi" msgid "No domain is specified" msgstr "Tidak ada domain yang ditentukan" msgid "No enabled versions" msgstr "Tidak ada versi diaktifkan" msgid "No image specified" msgstr "Tidak ada image yang ditentukan" msgid "No images available." msgstr "Tidak ada image yang tersedia." msgid "No info available" msgstr "Tidak ada info yang tersedia" msgid "No job template created" msgstr "Tidak ada template kerja yang dibuat" msgid "No keypair" msgstr "Tidak ada pasangan kunci" msgid "No plugin chosen" msgstr "Tidak ada plugin yang dipilih" msgid "No type chosen" msgstr "Tidak ada tipe yang dipilih" msgid "No volume type" msgstr "Tidak ada tipe volume" msgid "Node Group" msgstr "Node Group (grup simpul)" #, python-format msgid "Node Group Name: %(node_group_name)s" msgstr "Node Group Name: %(node_group_name)s" msgid "Node Group Template" msgstr "Node Group Template (template grup simpul)" #, python-format msgid "Node Group Template %s updated" msgstr "Node Group Template %s diperbaharui" #, python-format msgid "Node Group Template copy %s created" msgstr "copy template node grup %s dibentuk" msgid "Node Group Templates" msgstr "Node Group Templates (template kelompok simpul)" #, python-format msgid "Node Group: %(node_group_name)s" msgstr "Node Group (grup simpul): %(node_group_name)s" msgid "Node Groups" msgstr "Node Groups (grup node)" msgid "Node Groups Configuration Overview" msgstr "Node Groups Configuration Overview (Ikhtisar konfigurasi grup simple)" msgid "Node Processes" msgstr "Node Processes (proses simpul)" msgid "Node group cluster" msgstr "Node group cluster (klaster grup simpul)" msgid "Node group configurations are not specified" msgstr "Konfigurasi kelompok simpul tidak ditentukan" msgid "Node processes are not specified" msgstr "Proses simpul (Node) tidak ditentukan" msgid "Nodes Count" msgstr "Nodes Count (hitung simpul)" msgid "None" msgstr "None (tak satupun)" msgid "Not available" msgstr "Not available (tidak tersedia)" msgid "" "Now you need to set the layout of your cluster. By creating a Cluster " "Template, you will be choosing the number of instances of each Node Group " "Template that will appear in your cluster. Additionally, you will have a " "chance to set any cluster-specific configuration items in the additional " "tabs on the create Cluster Template form." msgstr "" "Sekarang Anda perlu mengatur tata letak cluster Anda. Dengan membuat Cluster " "Template, Anda akan memilih jumlah instance dari masing-masing Node Group " "Template yang akan muncul di cluster Anda. Selain itu, Anda akan memiliki " "kesempatan untuk menetapkan item konfigurasi cluster-specific di tab " "tambahan pada create Cluster Template form." msgid "Number" msgstr "Number (angka)" msgid "Number of Nodes" msgstr "Number of Nodes (jumlah simpul)" msgid "Number of clusters to launch." msgstr "Jumlah klaster untuk memulai." msgid "Oozie Job ID" msgstr "Oozie Job ID (ID kerja Oozie)" msgid "OpenStack Flavor" msgstr "OpenStack Flavor (flavor openstack)" msgid "Output" msgstr "Output (keluaran)" msgid "Output Data Source" msgstr "Pengeluaran sumber data" msgid "Parameters" msgstr "Parameters (parameter)" msgid "Password" msgstr "Password" msgid "Path" msgstr "Path (jalan)" msgid "Path on share" msgstr "Path on share (jalan untuk berbagi)" msgid "Persist cluster after job exit" msgstr "Bertahan klaster setelah keluar pekerjaan" msgid "Pig" msgstr "Pig" msgid "Plugin" msgstr "Plugin (plugin)" msgid "Plugin Name" msgstr "Plugin Name (nama plugin)" msgid "Plugin and Version Tag" msgstr "Plugin and Version Tag (tag plugin dan versi)" msgid "Plugin label" msgstr "Label plugin " msgid "Plugin name" msgstr "Nama plugin" msgid "Plugin update failed." msgstr "Perbarui plugin gagal." #, python-format msgid "Plugin version %(version)s label" msgstr "Versi plugin %(version)s label" #, python-format msgid "Plugin version %s" msgstr "Versi plugin %s" msgid "Plugin:" msgstr "Plugin:" msgid "Plugins" msgstr "Plugins (plugin)" msgid "Positional Argument" msgstr "Positional Argument (argumen posisi)" msgid "Progress" msgstr "Progress (kemajuan)" msgid "Project ID" msgstr "Project ID (ID proyek)" msgid "Protected" msgstr "Protected (terlindung)" msgid "Proxy Gateway" msgstr "Proxy Gateway (gerbang proxy)" msgid "Public" msgstr "Public (public)" msgid "Read only" msgstr "Read only (hanya baca)" msgid "Read/Write" msgstr "Read/Write (baca/tulis)" msgid "Reducer" msgstr "Reducer (peredam)" msgid "Register Image" msgstr "Register Image (mendaftar image)" msgid "Relaunch On Existing Cluster" msgstr "Relaunch On Existing Cluster (meluncurkan kembali klaster yang ada)" msgid "Relaunch On New Cluster" msgstr "Relaunch On New Cluster (meluncurkan kembali klaster baru)" msgid "Remove" msgstr "Remove (hapus)" msgid "" "Repeat the Node Group Template creation process, but this time you are " "creating your \"worker\" Node Group Template." msgstr "" "Ulangi proses pembuatan Node Group Template, tapi kali ini Anda menciptakan " "\"worker\" Node Group Template Anda." msgid "Required" msgstr "Required (wajib)" msgid "Reset Cluster Creation Guide" msgstr "Pengaturan ulang Cluster Creation Guide (panduan pembuatan klaster)" msgid "Reset Cluster Guide" msgstr "Pengaturan ulang Cluster Guide (panduan klaster)" msgid "Reset Job Execution Guide" msgstr "Mengatur ulang panduan pelaksanaan kerja" msgid "Return Code" msgstr "Return Code (kode kembalinya)" msgid "Run HBase EDP Jobs with common HBase library on HDFS" msgstr "Jalankan HBase EDP Jobs dengan perpustakaan HBase umum pada HDFS" msgid "S3" msgstr "S3" msgid "S3 Endpoint" msgstr "S3 Endpoint" msgid "S3 access key" msgstr "S3 access key" msgid "S3 accsss key" msgstr "S3 accsss key" msgid "S3 endpoint" msgstr "S3 endpoint" msgid "S3 secret key" msgstr "S3 secret key" msgid "" "Sahara will use instances of this node group to access other cluster " "instances." msgstr "" "Sahara akan menggunakan instance kelompok node ini untuk mengakses instance " "klaster lainnya." msgid "Scale" msgstr "Scale (memperbesar)" msgid "Scale Cluster" msgstr "Scale Cluster (Scale klaster)" msgid "Scale cluster operation failed" msgstr "Operasi skala klaster gagal" msgid "Scaled cluster successfully started." msgstr "Skala klaster berhasil dimulai." msgid "Scope" msgstr "Scope (cakupan)" msgid "Script name" msgstr "Nama skrip" msgid "Script text" msgstr "Teks skrip" msgid "Secret Key" msgstr "Secret Key" msgid "Security" msgstr "Security (keamanan)" msgid "Security Groups" msgstr "Security Groups (grup keamanan)" msgid "Select" msgstr "Pilih" msgid "Select Image" msgstr "Select Image (pilih image)" msgid "Select Node Group Processes" msgstr "Pilih proses grup node (Node Group Processes)" msgid "Select Shares" msgstr "Select Shares" msgid "Select a Node Group Template to add:" msgstr "Pilih Node Group Template (template grup simpul) untuk menambahkan:" msgid "Select a Value Type for your next argument:" msgstr "Pilih Value Type untuk argumen berikutnya:" msgid "Select a plugin and version for a new Cluster template." msgstr "Pilih plugin dan versi untuk template klaster baru." msgid "Select a plugin and version for a new Cluster." msgstr "Pilih plugin dan versi untuk klaster baru." msgid "Select a plugin and version for the new Node Group template." msgstr "Pilih plugin dan versi untuk template Node Group baru." msgid "" "Select an existing node group template.\n" " " msgstr "Pilih template kelompok simpul yang ada. " msgid "Select node processes for the node group" msgstr "Select node processes for the node group" msgid "Select plugin and hadoop version" msgstr "Pilih plugin dan versi Hadoop" msgid "Select plugin and hadoop version for cluster" msgstr "Pilih plugin dan versi Hadoop untuk cluster" msgid "Select plugin and hadoop version for cluster template" msgstr "Pilih Plugin dan versi Hadoop untuk template klaster" msgid "Select property name" msgstr "Pilih nama properti" msgid "Select the domain name for internal and external hostname resolution." msgstr "Pilih nama domain untuk resolusi nama host internal dan eksternal." msgid "Select the manila shares for this cluster" msgstr "Pilih share manila untuk cluster ini" msgid "Select the manila shares for this node group" msgstr "Pilih share manila untuk kelompok node ini" msgid "Select the storage type for your job binary." msgstr "Pilih tipe penyimpanan untuk biner pekerjaan Anda." msgid "Select the type of your Data Source." msgstr "Pilih jenis Sumber Data Anda." msgid "Select the type of your job:" msgstr "Pilih tipe pekerjaan Anda:" msgid "Select type" msgstr "Pilih tipe" msgid "" "Select which plugin and version that you want to use to create your cluster." msgstr "" "Pilih plugin dan versi yang ingin Anda gunakan untuk membuat cluster Anda." msgid "" "Select which type of job that you want to run. This choice will dictate " "which steps are required to successfully execute your job." msgstr "" "Pilih jenis pekerjaan yang ingin Anda jalankan. Pilihan ini akan menentukan " "langkah mana yang diperlukan untuk berhasil menjalankan pekerjaan Anda." msgid "" "Selected domain name should already exist in the Designate. You can check it " "in "DNS" tab on the left menu or by executing "designate " "domain-list" on the controller node." msgstr "" "Nama domain yang dipilih seharusnya sudah ada di dalam Designate. Anda dapat " "memeriksanya di tab "DNS" di menu sebelah kiri atau dengan " "menjalankan "designate domain-list" pada node controller." msgid "Service Configurations" msgstr "Service Configurations (konfigurasi layanan)" msgid "Share" msgstr "Share (berbagi)" msgid "Shares" msgstr "Shares" msgid "Shell" msgstr "Shell" msgid "Shell Action" msgstr "Shell Action (aksi shell)" msgid "Show full configuration" msgstr "Tampilkan konfigurasi penuh" msgid "Source password" msgstr "Sumber password" msgid "Source username" msgstr "Sumber username" msgid "Spark" msgstr "Spark (percikan)" msgid "" "Specified User Name will be used by Data Processing to apply configs and " "manage processes on instances." msgstr "" "Specified User Name (nama pengguna yang ditentukan) akan digunakan oleh " "pengolahan data untuk menerapkan konfigurasi dan mengelola proses pada " "instance." msgid "Start Verification" msgid_plural "Start Verifications" msgstr[0] "Start Verification" msgctxt "Start time" msgid "Started" msgstr "Started (dimulai)" msgid "Started Verification" msgid_plural "Started Verifications" msgstr[0] "Started Verification" msgid "Started at" msgstr "Dimulai di" msgid "Status" msgstr "Status" msgid "Status description" msgstr "Deskripsi status" msgid "Step Description" msgstr "Deskripsi langkah" msgid "Storage type" msgstr "Tipe penyimpanan" msgid "Storm" msgstr "Storm (badai)" msgid "Storm Pyleus" msgstr "Storm Pyleus" msgid "Streaming MapReduce" msgstr "Streaming MapReduce" msgid "String" msgstr "String (string)" msgid "" "Substitute data source objects for URLs of the form datasource://name or " "uuid." msgstr "" "Pengganti objek sumber data untuk URL dari sumber data berupa://nama atau " "uuid." msgctxt "Current status of a Job" msgid "Succeeded" msgstr "Succeeded (berhasil)" msgid "Successfully updated image." msgstr "Image berhasil diperbarui." msgid "Supported Versions" msgstr "Versi didukung" msgid "Swift" msgstr "Swift" msgid "Tags" msgstr "Tags (kata kunci)" msgid "" "Tags are used for filtering images suitable for each plugin and each Data " "Processing version. To add required tags, select a plugin and a Data " "Processing version and click the "Add" button." msgstr "" "Tag digunakan untuk menyaring image yang sesuai untuk setiap plugin dan " "setiap versi Pengolahan Data. Untuk menambahkan tag yang diperlukan, pilih " "plugin dan versi Pengolahan Data dan klik tombol "Add"" msgid "Template" msgstr "Template" msgid "Template File" msgstr "Template File" msgid "Template JSON contained invalid key" msgstr "Template JSON berisi kunci yang tidak valid" msgid "Template Name" msgstr "Template Name" msgid "Template not specified" msgstr "Template tidak ditentukan" msgid "" "The Cluster Template object may specify a list of processes in anti-affinity " "group. That means these processes may not be launched more than once on a " "single host." msgstr "" "Objek Cluster Template dapat menentukan daftar proses dalam kelompok anti-" "affinity. Itu berarti proses ini mungkin tidak diluncurkan lebih dari sekali " "pada satu host." msgid "" "The Cluster Template object should specify Node Group Templates that will be " "used to build a Cluster. You can add Node Groups using Node Group Templates " "on a "Node Groups" tab." msgstr "" "Objek Cluster Template harus menentukan Node Group Templates yang akan " "digunakan untuk membangun Cluster. Anda dapat menambahkan Node Groups " "menggunakan Node Group Templates pada tab "Node Groups"" msgid "" "The Cluster object should specify OpenStack Image to boot instances for " "Cluster." msgstr "" "Objek klaster harus menentukan OpenStack Image untuk boot instance untuk " "klaster." msgid "" "The Node Group Template object specifies the processes that will be launched " "on each instance. Check one or more processes. When processes are selected, " "you may set node scoped configurations on corresponding tabs." msgstr "" "Objek Node Group Template menentukan proses yang akan diluncurkan pada " "setiap instance. Periksa satu atau lebih proses. Saat proses dipilih, Anda " "dapat menetapkan konfigurasi scoped node pada tab yang sesuai." msgid "" "The first step is to determine which type of cluster you want to run. You " "may have several choices available depending on the configuration of your " "system. Click on \"choose plugin\" to bring up the list of data processing " "plugins. There you will be able to choose the data processing plugin along " "with the version number. Choosing this up front will allow the rest of the " "cluster creation steps to focus only on options that are pertinent to your " "desired cluster type." msgstr "" "Langkah pertama adalah menentukan jenis cluster yang ingin Anda jalankan. " "Anda mungkin memiliki beberapa pilihan yang tersedia tergantung pada " "konfigurasi sistem Anda. Klik \"choose plugin\" untuk memunculkan daftar " "plugin pengolah data. Di sana Anda akan bisa memilih plugin pengolah data " "beserta nomor versinya. Memilih ini di depan akan memberikan sisa langkah " "pembuatan klaster untuk berfokus hanya pada pilihan yang sesuai dengan tipe " "cluster yang Anda inginkan." msgid "The value of shares must be a list of values" msgstr "Nilai share harus daftar nilai" msgid "This Cluster Template will be created for:" msgstr "Template klaster (Cluster Template) ini akan dibuat untuk:" msgid "This Cluster will be started with:" msgstr "Klaster ini akan dimulai dengan:" msgid "This Node Group Template will be created for:" msgstr "Node Group Template (template grup simpul) ini akan dibuat untuk:" msgid "Title" msgstr "Title" msgid "Topology Name" msgstr "Topology Name" msgid "Type" msgstr "Type (tipe)" msgid "URL" msgstr "URL" msgid "Unable to create job binary" msgstr "Tidak dapat membuat biner pekerjaan" #, python-format msgid "Unable to create job binary: %s" msgstr "Tidak dapat membuat biner pekerjaan: %s" msgid "Unable to create new cluster for job." msgstr "Tidak dapat membuat cluster baru untuk pekerjaan." msgid "Unable to create the cluster" msgstr "Tidak dapat membuat klaster" #, python-format msgid "Unable to fetch Base Image with id: %s." msgstr "Tidak dapat mengambil image dasar (Base Image) dengan id: %s." msgid "Unable to fetch available images." msgstr "Tidak dapat mengambil image yang tersedia." msgid "Unable to fetch base image details" msgstr "Tidak dapat mengambil rincian image dasar" msgid "Unable to fetch cluster list" msgstr "Tidak dapat mengambil daftar klaster" msgid "Unable to fetch cluster template list" msgstr "Tidak dapat mengambil daftar template klaster)" msgid "Unable to fetch cluster template." msgstr "Tidak dapat mengambil klaster template." msgid "Unable to fetch cluster to scale" msgstr "Tidak dapat mengambil klaster untuk skala" msgid "Unable to fetch cluster to scale." msgstr "Tidak dapat mengambil cluster untuk skala." msgid "Unable to fetch cluster." msgstr "Tidak dapat mengambil klaster." msgid "Unable to fetch clusters." msgstr "Tidak dapat mengambil klaster." msgid "Unable to fetch data source list" msgstr "Tidak dapat mengambil daftar sumber data" msgid "Unable to fetch data sources." msgstr "Tidak dapat mengambil sumber data." msgid "Unable to fetch flavor for template." msgstr "Tidak dapat mengambil flavor untuk template." msgid "Unable to fetch floating ip pools." msgstr "Tidak dapat mengambil mengambang kolam ip." msgid "Unable to fetch image choices." msgstr "Tidak dapat mengambil pilihan image." msgid "Unable to fetch instance details." msgstr "Tidak dapat mengambil rincian instance." msgid "Unable to fetch job binary list" msgstr "Tidak dapat mengambil daftar biner pekerjaan" #, python-format msgid "Unable to fetch job binary: %(exc)s" msgstr "Tidak dapat mengambil biner pekerjaan: %(exc)s" msgid "Unable to fetch job list" msgstr "Tidak dapat mengambil daftar pekerjaan" msgid "Unable to fetch job template list" msgstr "Tidak dapat mengambil daftar template pekerjaan" msgid "Unable to fetch jobs." msgstr "Tidak dapat mengambil pekerjaan." msgid "Unable to fetch keypair choices." msgstr "Tidak dapat mengambil pilihan utama pasangan." msgid "Unable to fetch network details" msgstr "Tidak dapat mengambil rincian jaringan" msgid "Unable to fetch node group details." msgstr "Tidak dapat mengambil rincian kelompok simpul." msgid "Unable to fetch node group template list" msgstr "Tidak dapat mengambil daftar template kelompok simpul " msgid "Unable to fetch plugin details." msgstr "Tidak dapat mengambil rincian plugin." msgid "Unable to fetch plugin list" msgstr "Tidak dapat mengambil daftar plugin" msgid "Unable to fetch plugin object." msgstr "Tidak dapat mengambil objek plugin." msgid "Unable to fetch template object." msgstr "Tidak dapat mengambil objek template." msgid "Unable to fetch template to copy." msgstr "Tidak dapat mengambil template untuk menyalin." msgid "Unable to fetch template to edit." msgstr "Tidak dapat mengambil template untuk mengedit." msgid "Unable to fetch the image details" msgstr "Tidak dapat mengambil detil image" msgid "Unable to generate process choices." msgstr "Tidak dapat menghasilkan pilihan proses." msgid "Unable to get node group details." msgstr "Tidak dapat mendapatkan rincian kelompok simpul." msgid "Unable to get security group list." msgstr "Tidak dapat mendapatkan daftar grup keamanan." msgid "Unable to launch job." msgstr "Tidak dapat memulai pekerjaan." msgid "Unable to populate anti-affinity processes." msgstr "Tidak dapat mengisi proses anti-afinitas." msgid "Unable to process plugin tags" msgstr "Tidak dapat memproses kata kunci plugin" msgid "Unable to retrieve Nova availability zones." msgstr "Tidak dapat mengambil zona ketersediaan Nova." msgid "Unable to retrieve data processing plugins." msgstr "Tidak dapat mengambil plugin pengolahan data." #, python-format msgid "Unable to retrieve details for cluster \"%s\"." msgstr "Tidak dapat mengambil rincian untuk klaster \"%s\"." #, python-format msgid "Unable to retrieve details for cluster template \"%s\"." msgstr "Tidak dapat mengambil rincian untuk template klaster \"%s\"." #, python-format msgid "Unable to retrieve details for data source \"%s\"." msgstr "Tidak dapat mengambil rincian untuk sumber data \"%s\"." #, python-format msgid "Unable to retrieve details for job \"%s\"." msgstr "Unable to retrieve details for job \"%s\"." #, python-format msgid "Unable to retrieve details for job binary \"%s\"." msgstr "Tidak dapat mengambil rincian untuk biner pekerjaan \"%s\"." #, python-format msgid "Unable to retrieve details for job template \"%s\"." msgstr "Tidak dapat mengambil rincian untuk template pekerjaan \"%s\"." #, python-format msgid "Unable to retrieve details for node group template \"%s\"." msgstr "Tidak dapat mengambil rincian untuk template kelompok simpul \"%s\"." msgid "Unable to retrieve image list" msgstr "Tidak dapat mengambil daftar image" #, python-format msgid "Unable to retrieve images with filter %s." msgstr "Tidak dapat mengambil image dengan filter %s." #, python-format msgid "Unable to retrieve job binary \"%s\"." msgstr "Tidak dapat mengambil biner pekerjaan \"%s\"." msgid "Unable to retrieve networks." msgstr "Tidak dapat mengambil jaringan." msgid "Unable to retrieve plugin." msgstr "Tidak dapat mengambil plugin." #, python-format msgid "Unable to retrieve security group %(group)s." msgstr "Tidak dapat mengambil grup keamanan %(group)s." msgid "Unable to retrieve volumes availability zones." msgstr "Tidak dapat mengambil zona ketersediaan volume." msgid "Unable to set cluster type" msgstr "Tidak dapat menetapkan tipe klaster" msgid "Unable to set job type" msgstr "Tidak dapat mengatur tipe kerja" msgid "Unable to set node group template" msgstr "Tidak dapat mengatur template grup simpul" msgid "Unable to update job binary" msgstr "Tidak dapat memperbarui biner pekerjaan" #, python-format msgid "Unable to update job binary: %s" msgstr "Tidak dapat memperbarui biner pekerjaan: %s" msgid "Unable to update row" msgstr "Tidak dapat memperbarui baris" msgid "Unable to upload job binary" msgstr "Tidak dapat mengunggah biner pekerjaan" msgid "Unknown" msgstr "Unknown (tidal diketahui)" msgid "Unnecessary tags may be removed by clicking a cross near tag's name." msgstr "" "Tag yang tidak perlu dapat dihapus dengan mengklik nama tag dekat lintasan." msgid "Unregister Image" msgid_plural "Unregister Images" msgstr[0] "Unregister Image" msgid "Unregistered Image" msgid_plural "Unregistered Images" msgstr[0] "Unregistered Image" msgid "Update" msgstr "Update" msgid "Update Cluster Shares" msgstr "memperbarui share klaster" msgid "Update Plugin" msgstr "Update Plugin (perbarui plugin)" msgid "Update Shares" msgstr "Update Shares (memperbarui share)" msgid "Update the plugin labels" msgstr "Memperbaharui label plugin" msgid "Updated" msgstr "Updated (diperbarui)" msgid "Updated time" msgstr "Waktu diperbarui" msgid "Upload" msgstr "Upload (pengunggahan)" msgid "Upload File" msgstr "Upload File (unggah data)" msgid "Upload Template" msgstr "Upload Template (pengunggahan template)" msgid "Upload a new file" msgstr "Upload file baru" msgid "Uptime" msgstr "Uptime (waktu operasional)" msgid "Url" msgstr "Url" msgid "Use Data Source Substitution for Names and UUIDs" msgstr "Gunakan Pergantian Sumber Data untuk Nama dan UUID" msgid "Use HBase Common library" msgstr "Gunakan perpustakaan HBase Common" msgid "Use SSL" msgstr "Gunakan SSL" msgid "Use anti-affinity groups for processes" msgstr "Gunakan grup anti-afinitas untuk proses" msgid "Use anti-affinity groups for: " msgstr "Gunakan grup anti-afinitas untuk:" msgid "Use auto-configuration" msgstr "Gunakan auto-konfigurasi" msgid "Use bucket in path" msgstr "Gunakan bucket di path" msgid "Use the same topology name as defined in your .yaml file" msgstr "" "Menggunakan nama topologi yang sama seperti yang didefinisikan dalam file ." "yaml Anda" msgid "User" msgstr "User (pengguna)" msgid "User Name" msgstr "User Name (nama pengguna)" msgid "User has to choose a keypair to have access to clusters instances." msgstr "" "Pengguna harus memilih sepasang kunci (keypair) untuk memiliki akses ke " "instance klaster." msgid "Username" msgstr "Username (nama pengguna)" msgid "Value" msgstr "Value (nilai)" msgid "Value Type" msgstr "Value Type (tipe nilai)" msgid "Version" msgstr "Version (versi)" msgid "Version:" msgstr "Version:" #, python-format msgid "" "Version: %(hadoop_version)s of plugin %(plugin_name)s is now " "deprecated." msgstr "" "Versi: %(hadoop_version)s of plugin %(plugin_name)s sekarang " "tidak berlaku lagi." msgid "Volume local to instance" msgstr "Volume lokal untuk instance" msgid "Volumes Availability Zone" msgstr "Volumes Availability Zone (zona ketersediaan volume)" msgid "Volumes local to instance" msgstr "Volume lokal untuk instance" msgid "Volumes per node" msgstr "Volume per node" msgid "Volumes size" msgstr "Ukuran volume" msgid "Volumes size (GB)" msgstr "Ukuran volume (GB)" msgid "Volumes type" msgstr "Tipe volume" msgid "Warning!" msgstr "Peringatan!" msgid "Which keypair to use for authentication." msgstr "Yang sepasang kunci yang digunakan untuk otentikasi." msgid "Worker Node Group Template:" msgstr "Worker Node Group Template (template grup simpul pekerja):" msgid "" "You are now ready to launch your cluster. When you click on the link below, " "you will need to give your cluster a name, choose the Cluster Template to " "use and choose which image to use to build your instances. After you click " "on \"Create\", your instances will begin to spawn. Your cluster should be " "operational in a few minutes." msgstr "" "Anda sekarang siap meluncurkan cluster Anda. Saat Anda mengeklik tautan di " "bawah ini, Anda harus memberi nama pada grup Anda, pilih Cluster Template " "untuk digunakan dan pilih image mana yang akan digunakan untuk membuat " "instance Anda. Setelah Anda mengklik \"Create\", instance Anda akan mulai " "membiak (spawn). Cluster Anda harusnya beroperasi dalam beberapa menit." msgid "You may also add any custom tag." msgstr "Anda juga dapat menambahkan tag kustom." msgid "You may also enter an optional description for your Data Source." msgstr "Anda juga dapat memasukkan deskripsi opsional untuk Sumber Data Anda." msgid "You may also enter an optional description for your job binary." msgstr "" "Anda juga dapat memasukkan deskripsi opsional untuk biner pekerjaan Anda." msgid "You may also enter an optional description for your job template." msgstr "" "Anda juga dapat memasukkan deskripsi opsional untuk template pekerjaan Anda." msgid "You may need to enter the username and password for your Data Source." msgstr "" "Anda mungkin perlu memasukkan username dan password untuk Sumber Data Anda." msgid "You may set cluster scoped configurations on corresponding tabs." msgstr "" "Anda dapat mengatur cluster konfigurasi scoped pada tab yang sesuai." msgid "" "You must choose a flavor to determine the size (VCPUs, memory and storage) " "of all launched VMs." msgstr "" "Anda harus memilih flavor untuk menentukan ukuran (VCPU, memori dan " "penyimpanan) dari semua VM diluncurkan." msgid "" "You need to register an image to launch instances of your cluster. Skip this " "step if you already have a registered image for your plugin, otherwise click " "the link below. In the form you will need to choose the image, input the " "username and add tags for the chosen plugin." msgstr "" "Anda perlu mendaftarkan gambar untuk meluncurkan instance cluster Anda. " "Lewati langkah ini jika Anda sudah memiliki image terdaftar untuk plugin " "Anda, jika tidak klik link di bawah ini. Dalam form Anda perlu memilih " "image, masukan username dan tambahkan tag untuk plugin yang dipilih." msgid "" "You've chosen a cluster that is in 'Error' state. Appropriate execution of " "the job can't be guaranteed." msgstr "" "Anda telah memilih klaster yang ada di kondisi 'Error'. Pelaksanaan yang " "tepat dari pekerjaan ini tidak dapat dijamin." msgid "cluster" msgstr "klaster" msgid "cluster template" msgstr "Template klaster" msgid "data source" msgstr "Sumber data" msgid "job" msgstr "pekerjaan" msgid "job binary" msgstr "biner pekerjaan" msgid "no processes" msgstr "tidak ada proses" msgid "node group template" msgstr "Template kelompok simpul" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/id/LC_MESSAGES/djangojs.po0000664000175000017500000000455600000000000026044 0ustar00zuulzuul00000000000000# suhartono , 2016. #zanata # suhartono , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-01-22 12:16+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-01-22 05:35+0000\n" "Last-Translator: suhartono \n" "Language-Team: Indonesian\n" "Language: id\n" "X-Generator: Zanata 3.9.6\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "(show events)" msgstr "(menampilkan kegiatan)" msgid "Configuration Value" msgstr "Configuration Value (nilai konfigurasi)" msgid "Data Source" msgstr "Data Source (sumber data)" msgid "Default Value" msgstr "Default Value (nilai default)" msgid "Description" msgstr "Description (deskripsi)" msgid "Event log is not available." msgstr "Event log tidak tersedia." msgid "" "For configs and params, type the key name; for args, type the index as an " "integer, starting from 0." msgstr "" "Untuk konfigurasi dan params, ketik nama kunci; untuk args, ketik indeks " "sebagai integer, mulai dari 0." msgid "" "For data sources, use a data source UUID or a path (as per data source " "creation.)" msgstr "" "Untuk sumber data, menggunakan UUID sumber data atau jalur (per pembuatan " "sumber data.)" msgid "Location" msgstr "Location (lokasi)" msgid "Mapping Type" msgstr "Mapping Type (tipe perpetaan)" msgid "Name" msgstr "Name (nama)" msgid "Named Parameter" msgstr "Named Parameter (parameter dinamakan)" msgid "Number" msgstr "Number (angka)" msgid "Positional Argument" msgstr "Positional Argument (argumen posisi)" msgid "Remove" msgstr "Remove (menghapus)" msgid "Required?" msgstr "Required? (wajib ?)" msgid "" "See https://docs.openstack.org/sahara/latest/user/edp.html for definitions." msgstr "" "Lihat https://docs.openstack.org/sahara/latest/user/edp.html untuk definisi." msgid "String" msgstr "String (string)" msgid "The step has completed successfully. No events to display." msgstr "" "Langkah tersebut telah selesai dengan sukses. Tidak ada kejadian (event) " "untuk menampilkan." msgid "Value Type" msgstr "Value Type (tipe nilai)" msgid "Verification is not available." msgstr "Verifikasi tidak tersedia." msgid "Warning!" msgstr "Warning! (peringatan !)" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/locale/ja/0000775000175000017500000000000000000000000022104 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.592073 sahara-dashboard-16.0.0/sahara_dashboard/locale/ja/LC_MESSAGES/0000775000175000017500000000000000000000000023671 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/ja/LC_MESSAGES/django.po0000664000175000017500000013421200000000000025476 0ustar00zuulzuul00000000000000# Akihiro Motoki , 2016. #zanata # Andreas Jaeger , 2016. #zanata # Shu Muto , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-22 11:41+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-09-20 05:48+0000\n" "Last-Translator: Akihiro Motoki \n" "Language-Team: Japanese\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 4.3.3\n" msgid " Done" msgstr " 完了" msgid " or " msgstr "または" #, python-format msgid "%(conf_name)s: %(conf_val)s" msgstr "%(conf_name)s: %(conf_val)s" #, python-format msgid "%(conf_name)s: %(conf_value)s" msgstr "%(conf_name)s: %(conf_value)s" #, python-format msgid "%(group)s:" msgstr "%(group)s:" #, python-format msgid "%(key)s: %(val)s" msgstr "%(key)s: %(val)s" #, python-format msgid "%s processes: " msgstr "%s プロセス: " msgid "-- not selected --" msgstr "-- 選択されていません --" msgid "Adapt For Oozie" msgstr "Oozie 向けの調整" msgid "Add" msgstr "追加" msgid "Add Node Group" msgstr "ノードグループの追加" msgid "Add libraries to your job template." msgstr "ジョブテンプレートにライブラリーを追加します。" msgid "Anti-affinity enabled for" msgstr "anti-affinity の指定" msgid "Arguments" msgstr "引数" msgid "Auto Security Group" msgstr "自動セキュリティーグループ" msgid "Auto-configure" msgstr "自動設定" msgid "" "Automatically modify the Hadoop configuration so that job config values are " "set and so that Oozie will handle exit codes correctly." msgstr "" "Hadoop の設定を自動的に変更し、ジョブの設定値が設定され、Oozie が終了コードを" "正しく処理するようにします。" msgid "Availability Zone" msgstr "アベイラビリティーゾーン" msgid "Base Image" msgstr "ベースイメージ" msgid "Cancel" msgstr "取り消し" msgid "Checked?" msgstr "チェック済み?" msgid "Checking" msgstr "確認中" msgid "Choose" msgstr "選択" msgid "Choose a main binary" msgstr "メインバイナリーを選択してください" msgid "Choose a shell script" msgstr "シェルスクリプトを選択してください" msgid "Choose a storage location" msgstr "ストレージの場所を選択してください" msgid "Choose additional files" msgstr "追加ファイルの選択" msgid "Choose an existing Master Node Group Template" msgstr "既存のマスターノードグループテンプレートを選択してください" msgid "Choose an existing Worker Node Group Template" msgstr "既存のワーカーノードグループテンプレートを選択してください" msgid "Choose an existing file" msgstr "既存のファイルを選択" msgid "" "Choose from the list of binaries and click \"choose\" to add the library to " "your job template. This can be repeated for additional libraries." msgstr "" "ライブラリーをジョブテンプレートに追加するには、バイナリーの一覧から選択し" "「選択」をクリックします。追加するライブラリーの分だけ繰り返すことができま" "す。" msgid "Choose job type" msgstr "ジョブ種別を選択します" msgid "Choose libraries" msgstr "ライブラリーの選択" msgid "Choose node group template" msgstr "ノードグループテンプレートを選択してください" msgid "" "Choose or create your main binary. Additional libraries can be added from " "the \"Libs\" tab." msgstr "" "メインバイナリーを選択するか、作成してください。追加のライブラリーは「ライブ" "ラリー」タブから追加できます。" msgid "Choose plugin" msgstr "プラグインの選択" msgid "Choose plugin and version" msgstr "プラグインとバージョンを選択してください" msgid "Choose plugin type and version" msgstr "プラグイン種別とバージョンを選択します" msgid "Choose the Input Data Source (n/a for Java and Shell jobs)." msgstr "" "入力データソースを選択してください (Java ジョブとシェルジョブでは利用できませ" "ん)" msgid "Choose the Output Data Source (n/a for Java and Shell jobs)." msgstr "" "出力データソースを選択してください (Java ジョブとシェルジョブでは利用できませ" "ん)" msgid "Choose the binary which should be used in this Job." msgstr "このジョブで使用するバイナリーを選択してください。" msgid "Choose the cluster to use for the job." msgstr "ジョブで使用するクラスターを選択してください。" msgid "Chosen Libraries" msgstr "選択ライブラリー" msgid "Cinder Volume" msgstr "Cinder ボリューム" msgid "Cinder service is unavailable now" msgstr "Cinder サービスは現在利用できません。" msgid "Cinder volumes" msgstr "Cinder ボリューム" msgid "Cluster" msgstr "クラスター" msgid "Cluster Configuration Overview" msgstr "クラスター設定の概要" msgid "Cluster Count" msgstr "クラスター数" msgid "Cluster Creation Guide" msgstr "クラスター作成のガイド" msgid "Cluster Events" msgstr "クラスターのイベント" msgid "Cluster Instances" msgstr "クラスターインスタンス" msgid "Cluster Name" msgstr "クラスター名" msgid "Cluster Template" msgstr "クラスターテンプレート" #, python-format msgid "Cluster Template %s updated" msgstr " クラスターテンプレート %s が更新されました。" msgid "Cluster Template Configuration Overview" msgstr "クラスターテンプレート設定の概要" #, python-format msgid "Cluster Template copy %s created" msgstr "クラスターテンプレートのコピー %s が作成されました" msgid "Cluster Templates" msgstr "クラスターテンプレート" msgid "Cluster can be launched using existing Cluster Templates." msgstr "既存のクラスターテンプレートを使ってクラスターを起動できます。" msgid "Cluster configurations are not specified" msgstr "クラスター設定は指定されていません" msgid "Cluster health checks" msgstr "クラスターの動作状況チェック" msgid "Cluster provision steps" msgstr "クラスターのプロビジョニング手順" msgid "Cluster share update failed." msgstr "クラスターの共有の更新に失敗しました。" msgid "Cluster template creation failed" msgstr "クラスターテンプレートの作成に失敗しました" msgid "Cluster template update failed" msgstr "クラスターテンプレートの更新に失敗しました。" msgid "Cluster type chosen" msgstr "選択したクラスター種別" msgid "Clusters" msgstr "クラスター" msgid "Completed Successfully" msgstr "正常に完了しました。" msgid "Configuration" msgstr "設定" msgid "Configuration Details" msgstr "設定の詳細" msgid "Configuration Value" msgstr "設定値" msgid "Configure" msgstr "設定" msgid "Configure Cluster" msgstr "クラスターの設定" msgid "Configure Cluster Template" msgstr "クラスターテンプレートの設定" msgid "Configure Node Group Template" msgstr "ノードグループテンプレートの設定" msgid "Configure Template" msgstr "テンプレートの設定" msgid "Control access to instances of the node group." msgstr "ノードグループのインスタンスへのアクセスを制御します。" msgid "Copy Cluster Template" msgstr "クラスターテンプレートのコピー" msgid "Copy Template" msgstr "テンプレートのコピー" msgid "Could not create" msgstr "作成できませんでした" msgid "Could not create data source" msgstr "データソースを作成できませんでした" msgid "Could not create job template" msgstr "ジョブテンプレートを作成できません" msgid "Could not launch job" msgstr "ジョブを起動できません" msgid "Could not update cluster shares" msgstr "クラスターの共有を更新できませんでした" msgid "Could not update data source" msgstr "データソースを更新できませんでした" msgid "Could not update plugin" msgstr "プラグインを更新できませんでした" msgid "Count" msgstr "数" msgid "Create" msgstr "作成" msgid "Create Cluster Template" msgstr "クラスターテンプレートの作成" msgid "Create Data Source" msgstr "データソースの作成" msgid "Create Job Binary" msgstr "ジョブバイナリーの作成" msgid "Create Job Template" msgstr "ジョブテンプレートの作成" msgid "Create Node Group Template" msgstr "ノードグループテンプレートの作成" msgid "Create Template" msgstr "テンプレートの作成" msgid "Create a Cluster Template" msgstr "クラスターテンプレートの作成" msgid "Create a Data Source with a specified name." msgstr "指定した名前でデータソースを作成します。" msgid "Create a Master Node Group Template" msgstr "マスターノードグループテンプレートの作成" msgid "Create a Worker Node Group Template" msgstr "ワーカーノードグループテンプレートの作成" msgid "Create a data source" msgstr "データソースの作成" msgid "Create a job template" msgstr "ジョブテンプレートの作成" msgid "Create a job template with a specified name." msgstr "指定した名前でジョブテンプレートを作成します。" msgid "Create a script to be uploaded dynamically" msgstr "スクリプトを作成し、その場でアップロードする" msgid "Create security group for this Node Group." msgstr "このノードグループに対してセキュリティーグループを作成します。" msgid "Create time" msgstr "作成日時" msgid "Create volumes in this availability zone." msgstr "このアベイラビリティーゾーンにボリュームを作成します。" msgid "Created" msgstr "作成時刻" msgctxt "Created time" msgid "Created" msgstr "作成時刻" #, python-format msgid "Created Cluster Template %s" msgstr "クラスターテンプレート %s を作成しました" #, python-format msgid "Created Node Group Template %s" msgstr "ノードグループテンプレート %s を作成しました" msgid "Created time" msgstr "作成日時" msgid "Current choice:" msgstr "現在の選択項目:" msgid "Current type:" msgstr "現在の種別:" msgid "Custom Tag" msgstr "カスタムタグ" msgid "DNS Domain Names" msgstr "DNS ドメイン名" msgid "Data Processing" msgstr "データ処理" msgid "Data Processing Plugin Details" msgstr "データ処理プラグインの詳細" msgid "Data Processing Plugins" msgstr "データ処理プラグイン" msgid "Data Processing internal database" msgstr "データ処理基盤の内部データベース" msgid "" "Data Processing provides different storage location options. You may choose " "Ephemeral Drive or a Cinder Volume to be attached to instances." msgstr "" "データ処理基盤ではストレージの場所を選択できます。一時ドライブか、インスタン" "スに接続する Cinder ボリュームを選択できます。" msgid "Data Source" msgstr "データソース" msgid "Data Source Type" msgstr "データソース種別" msgid "Data Sources" msgstr "データソース" msgid "Data source created" msgstr "データソースが作成されました" msgid "Data source updated" msgstr "データソースが更新されました" msgid "Default Value" msgstr "デフォルト値" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "クラスターの削除" msgid "Delete Data Source" msgid_plural "Delete Data Sources" msgstr[0] "データソースの削除" msgid "Delete Job" msgid_plural "Delete Jobs" msgstr[0] "ジョブの削除" msgid "Delete Job Binary" msgid_plural "Delete Job Binaries" msgstr[0] "ジョブバイナリーの削除" msgid "Delete Job Template" msgid_plural "Delete Job Templates" msgstr[0] "ジョブテンプレートの削除" msgid "Delete Template" msgid_plural "Delete Templates" msgstr[0] "テンプレートの削除" msgid "Deleted Cluster" msgid_plural "Deleted Clusters" msgstr[0] "クラスターを削除しました" msgid "Deleted Data Source" msgid_plural "Deleted Data Sources" msgstr[0] "データソースを削除しました" msgid "Deleted Job" msgid_plural "Deleted Jobs" msgstr[0] "ジョブを削除しました" msgid "Deleted Job Binary" msgid_plural "Deleted Job Binaries" msgstr[0] "ジョブバイナリーを削除しました" msgid "Deleted Job Template" msgid_plural "Deleted Jobs Templates" msgstr[0] "ジョブテンプレートを削除しました" msgid "Deleted Template" msgid_plural "Deleted Templates" msgstr[0] "テンプレートを削除しました" msgid "Description" msgstr "説明" msgid "Details" msgstr "詳細" msgid "Domain Name" msgstr "ドメイン名" msgid "Domain name" msgstr "ドメイン名" msgid "Done" msgstr "完了" msgctxt "Current status of a Job" msgid "Done with Error" msgstr "エラー終了" msgid "Download Job Binary" msgstr "ジョブバイナリーのダウンロード" msgid "Download job binary" msgstr "ジョブバイナリーのダウンロード" msgid "Drive type" msgstr "ドライブ種別" msgid "Duration" msgstr "継続時間" msgid "Edit Cluster Template" msgstr "クラスターテンプレートの編集" msgid "Edit Data Source" msgstr "データソースの編集" msgid "Edit Image Tags" msgstr "イメージタグの編集" msgid "Edit Job Binary" msgstr "ジョブバイナリーの編集" msgid "Edit Node Group Template" msgstr "ノードグループテンプレートの編集" msgid "Edit Tags" msgstr "タグの編集" msgid "Edit Template" msgstr "テンプレートの編集" msgid "Enable Swift Paths" msgstr "Swift のパス指定を有効にする" msgid "Enabled Versions" msgstr "有効なバージョン" msgctxt "End time" msgid "Ended" msgstr "終了時刻" msgid "Enter any custom configuration required for your job's execution." msgstr "ジョブ実行で必要なカスタム設定をここで入力してください。" msgid "Enter the URL for the file" msgstr "ファイルの URL" msgid "Enter the username and password required to access that file" msgstr "そのファイルにアクセスするのに必要なユーザー名とパスワード" msgid "Ephemeral Drive" msgstr "一時ドライブ" msgid "Ephemeral drive" msgstr "一時ドライブ" msgid "Error Details" msgstr "エラー詳細" msgid "Event time" msgstr "イベント時刻" msgid "Failed" msgstr "失敗" msgctxt "Current status of a Job" msgid "Failed" msgstr "失敗" msgid "Failed to fetch internal binary list" msgstr "内部バイナリーの一覧を取得できません" msgid "Failed to get list of internal binaries." msgstr "内部バイナリーの一覧を取得できません" msgid "Failed to get list of shares" msgstr "共有の一覧を取得できませんでした" msgid "Failed to update image." msgstr "イメージのアップロードに失敗しました。" msgid "Filter" msgstr "フィルター" msgid "Flavor" msgstr "フレーバー" msgid "Flavor is not specified" msgstr "フレーバーは指定されていません" msgid "Floating IP Pool" msgstr "Floating IP プール" msgid "" "For Data Processing internal job binaries, you may choose from the following:" msgstr "" "データ処理基盤の内部データベース用のジョブバイナリーは、以下から選択する必要" "があります。" msgid "" "For Data Sources on a Manila share, choose the share and enter the path " "relative to the share (example: /outputdir/myinputfile.txt)" msgstr "" "Manila の共有上のデータソースの場合、共有を選択し、共有上での相対パスを入力し" "てください (例: /outputdir/myinputfile.txt)" msgid "For Object Store job binaries, you must:" msgstr "" "オブジェクトストア用のジョブバイナリーでは、以下を入力する必要があります。" msgid "" "For Shell Action jobs, any required files beyond the main script may be " "added as \"libraries\"." msgstr "" "シェルアクションジョブでは、メインスクリプト以外で必要なファイルは「ライブラ" "リー」として追加できます。" msgid "" "For Storm, Storm Pyleus, Spark and Shell jobs, only a main is required,\"libs" "\" are optional." msgstr "" "Storm、Storm Pyleus、Spark、およびシェルのジョブは、メインのみで必須で、 " "\"libs\" はオプションです。" msgid "General Info" msgstr "一般情報" msgid "Guided Cluster Creation" msgstr "ガイド付きクラスター作成" msgid "Guided Job Execution" msgstr "ガイド付きジョブ実行" msgid "HDFS placement" msgstr "HDFS 置き場" msgid "Health" msgstr "動作状況" msgid "Hide full configuration" msgstr "詳細設定を表示しない" msgid "Hive" msgstr "Hive" msgid "ID" msgstr "ID" #, python-format msgid "" "If selected, %s will be protected from modifications until this will be " "unselected" msgstr "" "このオプションを選択すると、 %s は選択を解除するまでは変更できなくなります。" #, python-format msgid "If selected, %s will be shared across the tenants" msgstr "このオプションを選択すると、 %s はプロジェクト間で共有されます。" msgid "" "If selected, instances of a cluster will be automatically configured during " "creation. Otherwise you should manually specify configuration values" msgstr "" "自動設定を選択すると、クラスターのインスタンスは作成中に自動で設定されます。" "選択しなかった場合には、設定値を手動で指定する必要があります。" msgid "" "If selected, instances of a node group will be automatically configured " "during cluster creation. Otherwise you should manually specify configuration " "values." msgstr "" "選択すると、ノードグループのインスタンスはクラスター作成時に自動的に設定され" "ます。選択しない場合は、設定値を手動で指定する必要があります。" msgid "Image" msgstr "イメージ" msgid "Image Registry" msgstr "イメージレジストリー" msgid "" "Image Registry is used to provide additional information about images for " "Data Processing." msgstr "" "イメージレジストリーは、データ処理用のイメージに関する追加の情報を提供するの" "に使用されます。" msgid "Image Registry tool:" msgstr "イメージレジストリーツール:" msgid "In progress" msgstr "進行中" msgid "Info" msgstr "情報" msgid "Input" msgstr "入力" msgid "Input Data Source" msgstr "入力データソース" msgid "Instance" msgstr "インスタンス" msgid "Instance and attached volumes will be created on the same physical host" msgstr "インスタンスと接続されるボリュームが同じ物理ホストに作成されます。" msgid "Instances" msgstr "インスタンス" msgid "Instances Count" msgstr "インスタンス数" msgid "Interface Arguments" msgstr "インターフェース引数" msgid "Internal Binary" msgstr "内部バイナリー" msgid "Internal IP" msgstr "内部用 IP" msgid "Internal binary" msgstr "内部バイナリー" msgid "Java" msgstr "Java" msgid "Java Action" msgstr "Java アクション" msgid "Java Opts" msgstr "Java オプション" msgid "Job" msgstr "ジョブ" msgid "Job Binaries" msgstr "ジョブバイナリー" msgid "Job Configuration" msgstr "ジョブ設定" msgid "Job Execution ID" msgstr "ジョブ実行 ID" msgid "Job Guide" msgstr "ジョブのガイド" msgid "Job Template" msgstr "ジョブテンプレート" msgid "Job Templates" msgstr "ジョブテンプレート" msgid "Job Type" msgstr "ジョブ種別" msgid "Job args" msgstr "ジョブ引数" msgid "Job configs" msgstr "ジョブ設定" msgid "Job created" msgstr "ジョブが作成されました" msgid "Job launched" msgstr "ジョブを起動しました" msgid "Job params" msgstr "ジョブパラメーター" msgid "Job template:" msgstr "ジョブテンプレート:" msgid "Job type chosen" msgstr "ジョブ種別を選択しました" msgid "Jobs" msgstr "ジョブ" msgid "Keypair" msgstr "キーペア" msgctxt "Current status of a Job" msgid "Killed" msgstr "強制終了" msgid "Label" msgstr "ラベル" msgid "Label details" msgstr "ラベルの詳細" msgid "Last Updated" msgstr "最終更新" msgid "Launch" msgstr "起動" msgid "Launch Cluster" msgstr "クラスターの起動" msgid "Launch Job" msgid_plural "Launch Jobs" msgstr[0] "ジョブの起動" msgid "Launch On Existing Cluster" msgstr "既存のクラスターで起動" msgid "Launch On New Cluster" msgstr "新規のクラスターで起動" msgid "Launch a Cluster" msgstr "クラスターの起動" msgid "Launch instances in these security groups." msgstr "これらのセキュリティーグループでインスタンスを起動します。" msgid "Launch instances in this availability zone." msgstr "指定したアベイラビリティーゾーンでインスタンスを起動します。" msgid "Launch job" msgstr "ジョブの起動" msgid "Launch the given job template on a cluster." msgstr "指定されたジョブテンプレートをクラスターで起動します。" #, python-format msgid "Launched Cluster %s" msgstr "クラスター %s を起動しました" msgid "Launched Job" msgid_plural "Launched Jobs" msgstr[0] "ジョブを起動しました" msgid "Libs" msgstr "ライブラリー" msgid "Location" msgstr "場所" msgid "Main Class" msgstr "Main クラス" msgid "Mains" msgstr "メイン" msgid "Management IP" msgstr "管理 IP" msgid "Manila share" msgstr "Manila 共有" msgid "MapReduce" msgstr "MapReduce" msgid "Mapper" msgstr "Mapper" msgid "Mapping Type" msgstr "マッピング種別" msgid "Master Node Group Template:" msgstr "マスターノードグループテンプレート:" msgid "" "Modify the configuration so that swift URLs can be dereferenced through HDFS " "at runtime." msgstr "設定を変更し、Swift の URL が実行時に HDFS で展開できるようにします。" msgid "Name" msgstr "名前" #, python-format msgid "Name: %(node_group_name)s" msgstr "名前: %(node_group_name)s" msgid "Named Parameter" msgstr "名前付きパラメーター" msgid "Neutron Management Network" msgstr "Neutron 管理ネットワーク" msgid "Never" msgstr "なし" msgid "Next" msgstr "次へ" msgid "No Cluster Template Created" msgstr "クラスターテンプレートが作成されていません" msgid "No Images Available" msgstr "利用可能なイメージがありません" msgid "No Master Node Group Template Created" msgstr "マスターノードグループテンプレートが作成されていません" msgid "No Templates Available" msgstr "利用可能なテンプレートがありません" msgid "No Worker Node Group Template Created" msgstr "ワーカーノードグループテンプレートが作成されていません" msgid "No availability zone specified" msgstr "アベイラビリティーゾーンの指定なし" msgid "No clusters available" msgstr "クラスターがありません" msgid "No configurations" msgstr "設定なし" msgid "No description" msgstr "説明なし" msgid "No domain is specified" msgstr "ドメインが指定されていません" msgid "No enabled versions" msgstr "有効なバージョンがありません" msgid "No image specified" msgstr "イメージが指定されていません。" msgid "No images available." msgstr "利用可能なイメージがありません。" msgid "No info available" msgstr "情報はありません。" msgid "No job template created" msgstr "ジョブテンプレートが作成されていません" msgid "No keypair" msgstr "キーペアがありません" msgid "No plugin chosen" msgstr "プラグインが選択されていません" msgid "No type chosen" msgstr "種別が選択されていません" msgid "No volume type" msgstr "ボリューム種別の指定なし" msgid "Node Group" msgstr "ノードグループ" #, python-format msgid "Node Group Name: %(node_group_name)s" msgstr "ノードグループ名: %(node_group_name)s" msgid "Node Group Template" msgstr "ノードグループテンプレート" #, python-format msgid "Node Group Template %s updated" msgstr "ノードグループテンプレート %s が更新されました。" #, python-format msgid "Node Group Template copy %s created" msgstr "ノードグループテンプレートのコピー %s を作成しました" msgid "Node Group Templates" msgstr "ノードグループテンプレート" #, python-format msgid "Node Group: %(node_group_name)s" msgstr "ノードグループ: %(node_group_name)s" msgid "Node Groups" msgstr "ノードグループ" msgid "Node Groups Configuration Overview" msgstr "ノードグループ設定の概要" msgid "Node Processes" msgstr "ノードプロセス" msgid "Node group cluster" msgstr "ノードグループクラスター" msgid "Node group configurations are not specified" msgstr "ノードグループ設定は指定されていません" msgid "Node processes are not specified" msgstr "ノードプロセスは指定されていません" msgid "Nodes Count" msgstr "ノード数" msgid "None" msgstr "なし" msgid "Not available" msgstr "利用できません" msgid "Number" msgstr "数字" msgid "Number of Nodes" msgstr "ノード数" msgid "Number of clusters to launch." msgstr "起動するクラスター数。" msgid "Oozie Job ID" msgstr "Oozie ジョブ ID" msgid "OpenStack Flavor" msgstr "OpenStack フレーバー" msgid "Output" msgstr "出力" msgid "Output Data Source" msgstr "出力データソース" msgid "Parameters" msgstr "パラメーター" msgid "Password" msgstr "パスワード" msgid "Path" msgstr "パス" msgid "Path on share" msgstr "共有上のパス" msgid "Persist cluster after job exit" msgstr "ジョブ終了後もクラスターを保持する" msgid "Pig" msgstr "Pig" msgid "Plugin" msgstr "プラグイン" msgid "Plugin Name" msgstr "プラグイン名" msgid "Plugin and Version Tag" msgstr "プラグインとバージョンタグ" msgid "Plugin label" msgstr "プラグインのラベル" msgid "Plugin name" msgstr "プラグイン名" msgid "Plugin update failed." msgstr "プラグインの更新に失敗しました。" #, python-format msgid "Plugin version %(version)s label" msgstr "プラグインバージョン %(version)s のラベル" #, python-format msgid "Plugin version %s" msgstr "プラグインバージョン %s" msgid "Plugin:" msgstr "プラグイン:" msgid "Plugins" msgstr "プラグイン" msgid "Positional Argument" msgstr "位置指定引数 (Positional Argument)" msgid "Progress" msgstr "進捗" msgid "Project ID" msgstr "プロジェクト ID" msgid "Protected" msgstr "保護" msgid "Proxy Gateway" msgstr "プロキシーゲートウェイ" msgid "Public" msgstr "パブリック" msgid "Read only" msgstr "読み込み専用" msgid "Read/Write" msgstr "読み書き両用" msgid "Reducer" msgstr "Reducer" msgid "Register Image" msgstr "イメージの登録" msgid "Relaunch On Existing Cluster" msgstr "既存のクラスターで再起動" msgid "Relaunch On New Cluster" msgstr "新規のクラスターで再起動" msgid "Remove" msgstr "削除" msgid "Required" msgstr "必須" msgid "Reset Cluster Creation Guide" msgstr "クラスター作成のガイドのリセット" msgid "Reset Cluster Guide" msgstr "クラスターのガイドのリセット" msgid "Reset Job Execution Guide" msgstr "ジョブ実行のガイドのリセット" msgid "Return Code" msgstr "リターンコード" msgid "Run HBase EDP Jobs with common HBase library on HDFS" msgstr "" "HDFS 上の共通の HBase ライブラリーを使用して HBase EDP ジョブを実行する" msgid "" "Sahara will use instances of this node group to access other cluster " "instances." msgstr "" "Sahara は、このノードグループのインスタンスを使用して他のクラスターインスタン" "スにアクセスします。" msgid "Scale" msgstr "サイズ調整" msgid "Scale Cluster" msgstr "クラスターのサイズ調整" msgid "Scale cluster operation failed" msgstr "クラスターのサイズ調整操作に失敗しました" msgid "Scaled cluster successfully started." msgstr "サイズ調整後のクラスターを正常に開始しました" msgid "Scope" msgstr "スコープ" msgid "Script name" msgstr "スクリプト名" msgid "Script text" msgstr "スクリプト本文" msgid "Security" msgstr "セキュリティー" msgid "Security Groups" msgstr "セキュリティーグループ" msgid "Select" msgstr "選択" msgid "Select Image" msgstr "イメージを選択してください" msgid "Select Node Group Processes" msgstr "ノードグループプロセスを選択してください" msgid "Select Shares" msgstr "共有の選択" msgid "Select a Node Group Template to add:" msgstr "追加するノードグループテンプレートを選択してください:" msgid "Select a Value Type for your next argument:" msgstr "次の引数の値の型を選択してください:" msgid "Select a plugin and version for a new Cluster template." msgstr "" "作成するクラスターテンプレートで使用するプラグインとバージョンを選択してくだ" "さい。" msgid "Select a plugin and version for a new Cluster." msgstr "新しいクラスターで使用するプラグインとバージョンを選択してください。" msgid "Select a plugin and version for the new Node Group template." msgstr "新規ノードグループテンプレートのプラグインとバージョンを選択します。" msgid "" "Select an existing node group template.\n" " " msgstr "" "既存のノードグループテンプレートを選択してください。\n" " " msgid "Select node processes for the node group" msgstr "このノードグループのノードプロセスを選択してください" msgid "Select plugin and hadoop version" msgstr "プラグインと Hadoop バージョンを選択してください" msgid "Select plugin and hadoop version for cluster" msgstr "このクラスターのプラグインと Hadoop バージョンを選択してください" msgid "Select plugin and hadoop version for cluster template" msgstr "" "クラスターテンプレートのプラグインと Hadoop バージョンを選択してください" msgid "Select property name" msgstr "プロパティー名を選択してください" msgid "Select the domain name for internal and external hostname resolution." msgstr "内部および外部のホスト名解決のためのドメイン名を選択してください。" msgid "Select the manila shares for this cluster" msgstr "このクラスター用の manila の共有を選択してください" msgid "Select the manila shares for this node group" msgstr "このノードグループ用の manila の共有を選択してください" msgid "Select the storage type for your job binary." msgstr "ジョブバイナリーのストレージ種別を選択してください。" msgid "Select the type of your Data Source." msgstr "データソース種別を選択してください。" msgid "Select the type of your job:" msgstr "ジョブの種別を選択してください。" msgid "Select type" msgstr "種別の選択" msgid "Service Configurations" msgstr "サービス設定" msgid "Share" msgstr "共有" msgid "Shares" msgstr "共有" msgid "Shell" msgstr "シェル" msgid "Shell Action" msgstr "シェルアクション" msgid "Show full configuration" msgstr "詳細設定を表示する" msgid "Source password" msgstr "データソースのパスワード" msgid "Source username" msgstr "データソースのユーザー名" msgid "Spark" msgstr "Spark" msgid "" "Specified User Name will be used by Data Processing to apply configs and " "manage processes on instances." msgstr "" "指定されたユーザー名は、設定を適用したり、インスタンス上のプロセスを管理した" "りするのに使用されます。" msgid "Start Verification" msgid_plural "Start Verifications" msgstr[0] "検証の開始" msgctxt "Start time" msgid "Started" msgstr "開始時刻" msgid "Started Verification" msgid_plural "Started Verifications" msgstr[0] "検証を開始しました" msgid "Started at" msgstr "開始時刻" msgid "Status" msgstr "ステータス" msgid "Status description" msgstr "ステータスの詳細" msgid "Step Description" msgstr "説明" msgid "Storage type" msgstr "ストレージ種別" msgid "Storm" msgstr "Storm" msgid "Storm Pyleus" msgstr "Storm Pyleus" msgid "Streaming MapReduce" msgstr "ストリーミング MapReduce" msgid "String" msgstr "文字列" msgid "" "Substitute data source objects for URLs of the form datasource://name or " "uuid." msgstr "" "データソースオブジェクトを datasource://名前またはUUID の形式の URL に置き換" "えます。" msgctxt "Current status of a Job" msgid "Succeeded" msgstr "正常終了" msgid "Successfully updated image." msgstr "イメージを正常にアップロードしました。" msgid "Supported Versions" msgstr "対応バージョン" msgid "Swift" msgstr "Swift" msgid "Tags" msgstr "タグ" msgid "Template" msgstr "テンプレート" msgid "Template Name" msgstr "テンプレート名" msgid "Template not specified" msgstr "テンプレートは指定されていません" msgid "" "The Cluster object should specify OpenStack Image to boot instances for " "Cluster." msgstr "" "クラスターオブジェクトでは、クラスター用のインスタンスを起動するのに使う " "OpenStack イメージを指定する必要があります。" msgid "The value of shares must be a list of values" msgstr "共有の値はリスト値でなければいけません" msgid "This Cluster Template will be created for:" msgstr "以下のプラグイン用のクラスターテンプレートを作成します。" msgid "This Cluster will be started with:" msgstr "このクラスターは以下のプラグインで開始されます。" msgid "This Node Group Template will be created for:" msgstr "以下のプラグイン用のノードグループテンプレートを作成します。" msgid "Title" msgstr "タイトル" msgid "Topology Name" msgstr "トポロジー名" msgid "Type" msgstr "種別" msgid "URL" msgstr "URL" msgid "Unable to create job binary" msgstr "ジョブバイナリーを作成できません" #, python-format msgid "Unable to create job binary: %s" msgstr "ジョブバイナリーを作成できません: %s" msgid "Unable to create new cluster for job." msgstr "ジョブ用の新しいクラスターを作成できません" msgid "Unable to create the cluster" msgstr "クラスターを作成できません" #, python-format msgid "Unable to fetch Base Image with id: %s." msgstr "ID %s のベースイメージを取得できません。" msgid "Unable to fetch available images." msgstr "利用可能なイメージ一覧を取得できません。" msgid "Unable to fetch base image details" msgstr "ベースイメージを取得できません" msgid "Unable to fetch cluster list" msgstr "クラスターの一覧を取得できません。" msgid "Unable to fetch cluster template list" msgstr "クラスターテンプレートの一覧を取得できません" msgid "Unable to fetch cluster template." msgstr "クラスターテンプレートを取得できません。" msgid "Unable to fetch cluster to scale" msgstr "サイズ調整を行うクラスターを取得できません" msgid "Unable to fetch cluster to scale." msgstr "サイズ調整を行うクラスターを取得できません" msgid "Unable to fetch cluster." msgstr "クラスターを取得できません。" msgid "Unable to fetch clusters." msgstr "クラスターの一覧を取得できません" msgid "Unable to fetch data source list" msgstr "データソースの一覧を取得できません" msgid "Unable to fetch data sources." msgstr "データソースの一覧を取得できません" msgid "Unable to fetch flavor for template." msgstr "テンプレート用のフレーバーを取得できません。" msgid "Unable to fetch floating ip pools." msgstr "Floating IP プールを取得できません。" msgid "Unable to fetch image choices." msgstr "イメージの選択肢を取得できません。" msgid "Unable to fetch instance details." msgstr "インスタンスの詳細を取得できません。" msgid "Unable to fetch job binary list" msgstr "ジョブバイナリーの一覧を取得できません" #, python-format msgid "Unable to fetch job binary: %(exc)s" msgstr "ジョブバイナリーを取得できません: %(exc)s" msgid "Unable to fetch job list" msgstr "ジョブの一覧を取得できません" msgid "Unable to fetch job template list" msgstr "ジョブテンプレートの一覧を取得できません" msgid "Unable to fetch jobs." msgstr "ジョブ一覧を取得できません" msgid "Unable to fetch keypair choices." msgstr "キーペアの選択肢を取得できません" msgid "Unable to fetch network details" msgstr "ネットワークの詳細を取得できません" msgid "Unable to fetch node group details." msgstr "ノードグループの詳細を取得できません。" msgid "Unable to fetch node group template list" msgstr "ノードグループテンプレートの一覧を取得できません" msgid "Unable to fetch plugin details." msgstr "プラグインの詳細を取得できません" msgid "Unable to fetch plugin list" msgstr "プラグインの一覧を取得できません" msgid "Unable to fetch plugin object." msgstr "プラグインオブジェクトを取得できません。" msgid "Unable to fetch template object." msgstr "テンプレートオブジェクトを取得できません" msgid "Unable to fetch template to copy." msgstr "コピーするテンプレートを取得できません" msgid "Unable to fetch template to edit." msgstr "編集するテンプレートを取得できませんでした。" msgid "Unable to fetch the image details" msgstr "イメージ詳細を取得できません" msgid "Unable to generate process choices." msgstr "プロセスの選択肢を生成できません" msgid "Unable to get node group details." msgstr "ノードグループの詳細を取得できません。" msgid "Unable to get security group list." msgstr "セキュリティーグループの一覧を取得できません。" msgid "Unable to launch job." msgstr "ジョブを起動できません" msgid "Unable to populate anti-affinity processes." msgstr "anti-affinity グループのプロセスを起動できません。" msgid "Unable to process plugin tags" msgstr "プラグインタグを処理できません" msgid "Unable to retrieve data processing plugins." msgstr "データ処理プラグイン一覧を取得できません。" #, python-format msgid "Unable to retrieve details for cluster \"%s\"." msgstr "クラスター \"%s\" の詳細を取得できません。" #, python-format msgid "Unable to retrieve details for cluster template \"%s\"." msgstr "クラスターテンプレート \"%s\" の詳細を取得できません。" #, python-format msgid "Unable to retrieve details for data source \"%s\"." msgstr "データソース \"%s\" の詳細を取得できません。" #, python-format msgid "Unable to retrieve details for job \"%s\"." msgstr "ジョブ \"%s\" の詳細を取得できません。" #, python-format msgid "Unable to retrieve details for job binary \"%s\"." msgstr "ジョブバイナリー \"%s\" の詳細を取得できません。" #, python-format msgid "Unable to retrieve details for job template \"%s\"." msgstr "ジョブテンプレート \"%s\" の詳細を取得できません。" #, python-format msgid "Unable to retrieve details for node group template \"%s\"." msgstr "ノードグループテンプレート \"%s\" の詳細を取得できません。" msgid "Unable to retrieve image list" msgstr "イメージ一覧を取得できません" #, python-format msgid "Unable to retrieve images with filter %s." msgstr "フィルター %s でイメージ一覧を取得できませんでした" #, python-format msgid "Unable to retrieve job binary \"%s\"." msgstr "ジョブバイナリー \"%s\" を取得できません。" msgid "Unable to retrieve networks." msgstr "ネットワーク一覧を取得できません。" msgid "Unable to retrieve plugin." msgstr "プラグインを取得できません" #, python-format msgid "Unable to retrieve security group %(group)s." msgstr "セキュリティーグループ %(group)s を取得できません。" msgid "Unable to set cluster type" msgstr "クラスター種別を設定できません" msgid "Unable to set job type" msgstr "ジョブ種別を設定できません" msgid "Unable to set node group template" msgstr "ノードグループテンプレートを設定できません" msgid "Unable to update job binary" msgstr "ジョブバイナリーを更新できません。" #, python-format msgid "Unable to update job binary: %s" msgstr "ジョブバイナリーを更新できません: %s" msgid "Unable to update row" msgstr "行を更新できません" msgid "Unable to upload job binary" msgstr "ジョブバイナリーをアップロードできません" msgid "Unknown" msgstr "不明" msgid "Unnecessary tags may be removed by clicking a cross near tag's name." msgstr "不要なタグは、タグ名の横の ☓ 印をクリックすると削除できます。" msgid "Unregister Image" msgid_plural "Unregister Images" msgstr[0] "イメージの登録削除" msgid "Unregistered Image" msgid_plural "Unregistered Images" msgstr[0] "イメージの登録を削除しました" msgid "Update" msgstr "更新" msgid "Update Cluster Shares" msgstr "クラスターの共有の更新" msgid "Update Plugin" msgstr "プラグインの更新" msgid "Update Shares" msgstr "共有の更新" msgid "Update the plugin labels" msgstr "プラグインのラベルの更新" msgid "Updated" msgstr "更新日時" msgid "Updated time" msgstr "更新日時" msgid "Upload" msgstr "アップロード" msgid "Upload File" msgstr "ファイルのアップロード" msgid "Upload Template" msgstr "テンプレートのアップロード" msgid "Upload a new file" msgstr "新しいファイルをアップロード" msgid "Uptime" msgstr "稼働時間" msgid "Url" msgstr "URL" msgid "Use Data Source Substitution for Names and UUIDs" msgstr "データソースから名前や UUID への置き換え" msgid "Use HBase Common library" msgstr "HBase 共通ライブラリーを使用" msgid "Use anti-affinity groups for processes" msgstr "プロセスに対して anti-affinity グループを使用します" msgid "Use anti-affinity groups for: " msgstr "anti-affinity グループを使用するプロセス:" msgid "Use auto-configuration" msgstr "自動設定を使用" msgid "Use the same topology name as defined in your .yaml file" msgstr ".yaml ファイルで定義したものと同じトポロジー名を使用してください" msgid "User" msgstr "ユーザー" msgid "User Name" msgstr "ユーザー名" msgid "User has to choose a keypair to have access to clusters instances." msgstr "" "クラスターのインスタンスにアクセスするためのキーペアを選択してください。" msgid "Username" msgstr "ユーザー名" msgid "Value" msgstr "値" msgid "Value Type" msgstr "値の型" msgid "Version" msgstr "バージョン" msgid "Version:" msgstr "バージョン:" msgid "Volume local to instance" msgstr "ボリュームをインスタンスと同じホストに配置" msgid "Volumes Availability Zone" msgstr "ボリュームアベイラビリティーゾーン" msgid "Volumes local to instance" msgstr "ボリュームをインスタンスと同じホストに配置" msgid "Volumes per node" msgstr "ノード当たりのボリューム数" msgid "Volumes size" msgstr "ボリュームサイズ" msgid "Volumes size (GB)" msgstr "ボリュームサイズ (GB)" msgid "Volumes type" msgstr "ボリューム種別" msgid "Which keypair to use for authentication." msgstr "認証に使用するキーペアを選択してください。" msgid "Worker Node Group Template:" msgstr "ワーカーノードグループテンプレート:" msgid "You may also add any custom tag." msgstr "任意のカスタムタグを追加できます。" msgid "You may also enter an optional description for your Data Source." msgstr "またオプションで、データソースの説明を入力することもできます。" msgid "You may also enter an optional description for your job binary." msgstr "またオプションで、ジョブバイナリーの説明を入力することもできます。" msgid "You may also enter an optional description for your job template." msgstr "またオプションで、ジョブテンプレートの説明を入力することもできます。" msgid "You may need to enter the username and password for your Data Source." msgstr "データソースのユーザー名とパスワードを入力する必要があります。" msgid "You may set cluster scoped configurations on corresponding tabs." msgstr "対応するタブでクラスター毎の設定を行うことができます。" msgid "" "You must choose a flavor to determine the size (VCPUs, memory and storage) " "of all launched VMs." msgstr "" "起動する全仮想マシンのサイズ (仮想 CPU、メモリー、ストレージ) を決定するため" "のフレーバーを選択する必要があります。" msgid "" "You've chosen a cluster that is in 'Error' state. Appropriate execution of " "the job can't be guaranteed." msgstr "" "選択したクラスターはエラー状態です。ジョブの適切な実行を保証できません。" msgid "cluster" msgstr "クラスター" msgid "cluster template" msgstr "クラスターテンプレート" msgid "data source" msgstr "データソース" msgid "job" msgstr "ジョブ" msgid "job binary" msgstr "ジョブバイナリー" msgid "no processes" msgstr "指定されたプロセスはありません" msgid "node group template" msgstr "ノードグループテンプレート" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/ja/LC_MESSAGES/djangojs.po0000664000175000017500000000411100000000000026025 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # Shu Muto , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard 7.0.0.0rc2.dev21\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2017-10-13 23:21+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-05-20 03:36+0000\n" "Last-Translator: Shu Muto \n" "Language-Team: Japanese\n" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Zanata 3.9.6\n" msgid "(show events)" msgstr "(イベントの表示)" msgid "Configuration Value" msgstr "設定値" msgid "Data Source" msgstr "データソース" msgid "Default Value" msgstr "デフォルト値" msgid "Description" msgstr "説明" msgid "Event log is not available." msgstr "イベントログはありません。" msgid "" "For configs and params, type the key name; for args, type the index as an " "integer, starting from 0." msgstr "" "設定とパラメーターにはキー名を、引数には 0 から始まる整数を入力してください。" msgid "" "For data sources, use a data source UUID or a path (as per data source " "creation.)" msgstr "" "データソースには、 UUID または (作成時に指定した) パスを使用してください" msgid "Location" msgstr "場所" msgid "Mapping Type" msgstr "マッピング種別" msgid "Name" msgstr "名前" msgid "Named Parameter" msgstr "名前付きパラメーター" msgid "Number" msgstr "数字" msgid "Positional Argument" msgstr "位置指定引数 (Positional Argument)" msgid "Remove" msgstr "削除" msgid "Required?" msgstr "必須?" msgid "String" msgstr "文字列" msgid "The step has completed successfully. No events to display." msgstr "手順が正常に完了しました。表示するイベントはありません。" msgid "Value Type" msgstr "値の型" msgid "Verification is not available." msgstr "検証機能が利用できません。" msgid "Warning!" msgstr "警告!" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/locale/ko_KR/0000775000175000017500000000000000000000000022517 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.592073 sahara-dashboard-16.0.0/sahara_dashboard/locale/ko_KR/LC_MESSAGES/0000775000175000017500000000000000000000000024304 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/ko_KR/LC_MESSAGES/django.po0000664000175000017500000016162200000000000026116 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # Ian Y. Choi , 2016. #zanata # Sungjin Kang , 2017. #zanata # minwook-shin , 2017. #zanata # ByungYeol Woo , 2018. #zanata # Ian Y. Choi , 2018. #zanata # ByungYeol Woo , 2019. #zanata # Ian Y. Choi , 2020. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-05-05 06:53+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2020-05-05 11:52+0000\n" "Last-Translator: Ian Y. Choi \n" "Language-Team: Korean (South Korea)\n" "Language: ko_KR\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid " Done" msgstr "완료" msgid " or " msgstr "또는" #, python-format msgid "%(conf_name)s: %(conf_val)s" msgstr "%(conf_name)s: %(conf_val)s" #, python-format msgid "%(conf_name)s: %(conf_value)s" msgstr "%(conf_name)s: %(conf_value)s" #, python-format msgid "%(group)s:" msgstr "%(group)s:" #, python-format msgid "%(key)s: %(val)s" msgstr "%(key)s: %(val)s" #, python-format msgid "%s processes: " msgstr "%s 프로세스: " msgid "-- not selected --" msgstr "-- 선택하지 않음 --" msgid "" "Important: The name that you give your job binary will be the name " "used in your job execution. If your binary requires a particular name or " "extension (ie: \".jar\"), be sure to include it here." msgstr "" "중요 사항: Job 바이너리에 지정한 이름을 job 실행 이름으로 사용합니다. " "바이너리에 특정 이름이나 확장이 필요한 경우 (예: \".jar\"), 여기에 포함해야합" "니다." msgid "Access Key" msgstr "액세스키" msgid "Adapt For Oozie" msgstr "Oozie에 맞게 조정" msgid "Add" msgstr "추가" msgid "Add Node Group" msgstr "노드 그룹 추가" msgid "Add libraries to your job template." msgstr "작업 템플릿에 라이브러리를 추가하십시오." msgid "Anti-affinity enabled for" msgstr "Anti-affinity 사용" msgid "Arguments" msgstr "인수" msgid "Attached storage location" msgstr "첨부된 스토리지 위치" msgid "Auto Security Group" msgstr "자동 보안 그룹" msgid "Auto-configure" msgstr "자동 구성" msgid "" "Automatically modify the Hadoop configuration so that job config values are " "set and so that Oozie will handle exit codes correctly." msgstr "" "작업 구성 값이 설정되고 Oozie가 종료 코드를 올바르게 처리하도록 Hadoop 구성" "을 자동으로 수정합니다." msgid "Availability Zone" msgstr "가용 구역" msgid "Base Image" msgstr "기본 이미지" msgid "Boot Volume AZ" msgstr "부트 볼륨 AZ" msgid "Boot Volume locality" msgstr "부트 볼륨 locality" msgid "Boot Volume type" msgstr "부트 볼륨 유형" msgid "Boot from Volume" msgstr "볼륨으로 부팅" msgid "Boot storage location" msgstr "부트 스토리지 위치" msgid "Boot volume availability Zone" msgstr "가용 구역 볼륨 부트" msgid "Boot volume availability zone" msgstr "부트 볼륨 가용 구역" msgid "Boot volume local to instance" msgstr "로컬에서 인스턴스에 대한 부트 볼륜" msgid "Boot volume locality" msgstr "부트 볼륨 locality" msgid "Boot volume type" msgstr "부트 볼륨 유형" msgid "Cancel" msgstr "취소" msgid "Checked?" msgstr "선택 여부?" msgid "Checking" msgstr "검사" msgid "Choose" msgstr "선택" msgid "Choose a boot mode" msgstr "부트 모드 선택" msgid "Choose a main binary" msgstr "기본 바이너리 선택" msgid "Choose a shell script" msgstr "쉘 스크립트 선택" msgid "Choose a storage location" msgstr "스토리지 위치 선택" msgid "Choose additional files" msgstr "추가 파일 선택" msgid "Choose an existing Master Node Group Template" msgstr "기존 마스터 노드 그룹 템플릿 선택" msgid "Choose an existing Worker Node Group Template" msgstr "기존 작업자 노드 그룹 템플릿 선택" msgid "Choose an existing file" msgstr "기존 파일 선택" msgid "" "Choose from the list of binaries and click \"choose\" to add the library to " "your job template. This can be repeated for additional libraries." msgstr "" "바이너리 목록에서 선택하고 \"선택\"을 눌러 작업 템플릿에 라이브러리를 추가하" "십시오. 라이브러리가 추가될 때마다 이 작업을 반복할 수 있습니다." msgid "Choose job type" msgstr "작업 타입 선택" msgid "Choose libraries" msgstr "라이브러리 선택" msgid "Choose node group template" msgstr "노드 그룹 템플릿 선택" msgid "" "Choose or create your main binary. Additional libraries can be added from " "the \"Libs\" tab." msgstr "" "기본 바이너리를 선택하거나 생성하십시오. \"Libs\" 탭에서 라이브러리를 추가할 " "수 있습니다." msgid "Choose plugin" msgstr "플러그인 선택" msgid "Choose plugin and version" msgstr "플러그인 및 버전 선택" msgid "Choose plugin type and version" msgstr "플러그인 타입 및 버전 선택" msgid "Choose the Input Data Source (n/a for Java and Shell jobs)." msgstr "입력 데이터 소스를 선택하십시오(Java 및 Shell 작업의 경우 n/a)." msgid "Choose the Output Data Source (n/a for Java and Shell jobs)." msgstr "출력 데이터 소스를 선택하십시오(Java 및 Shell 작업의 경우 n/a)." msgid "Choose the binary which should be used in this Job." msgstr "이 작업에서 사용해야 하는 바이너리를 선택하십시오." msgid "Choose the cluster to use for the job." msgstr "작업에 사용할 클러스터를 선택하십시오." msgid "Chosen Libraries" msgstr "선택한 라이브러리" msgid "Cinder Volume" msgstr "Cinder 볼륨" msgid "Cinder service is unavailable now" msgstr "현재 Cinder 서비스를 사용할 수 없습니다" msgid "Cinder volumes" msgstr "Cinder 볼륨" msgid "Cluster" msgstr "클러스터" msgid "Cluster Configuration Overview" msgstr "클러스터 구성 개요" msgid "Cluster Count" msgstr "클러스터 개수" msgid "Cluster Creation Guide" msgstr "클러스터 생성 가이드" msgid "Cluster Events" msgstr "클러스터 이벤트" msgid "Cluster Instances" msgstr "클러스터 인스턴스" msgid "Cluster Name" msgstr "클러스터 이름" msgid "Cluster Template" msgstr "클러스터 템플릿" #, python-format msgid "Cluster Template %s updated" msgstr "클러스터 템플릿 %s이(가) 업데이트됨" msgid "Cluster Template Configuration Overview" msgstr "클러스터 템플릿 구성 개요" #, python-format msgid "Cluster Template copy %s created" msgstr "클러스터 템플릿 사본 %s이(가) 작성됨" msgid "Cluster Templates" msgstr "클러스터 템플릿" msgid "Cluster can be launched using existing Cluster Templates." msgstr "기존 클러스터 템플릿을 사용하여 클러스터를 시작할 수 있습니다." msgid "Cluster configurations are not specified" msgstr "클러스터 구성이 지정되지 않음" msgid "Cluster health checks" msgstr "클러스터 상태 확인" msgid "Cluster provision steps" msgstr "클러스터 배포 단계" msgid "Cluster share update failed." msgstr "클러스터 공유를 업데이트하는 데 실패했습니다." msgid "Cluster template creation failed" msgstr "클러스터 템플릿을 생성하지 못함" msgid "Cluster template update failed" msgstr "클러스터 템플릿 업데이트에 실패" msgid "Cluster type chosen" msgstr "선택된 클러스터 타입" msgid "Clusters" msgstr "클러스터" msgid "Completed Successfully" msgstr "성공적으로 완료" msgid "Configuration" msgstr "구성" msgid "Configuration Details" msgstr "구성 세부 사항" msgid "Configuration Value" msgstr "구성 값" msgid "Configure" msgstr "구성" msgid "Configure Cluster" msgstr "클러스터 구성" msgid "Configure Cluster Template" msgstr "클러스터 템플릿 구성" msgid "Configure Node Group Template" msgstr "노드 그룹 템플릿 구성" msgid "Configure Template" msgstr "템플릿 구성" msgid "Control access to instances of the node group." msgstr "노드 그룹의 인스턴스에 대한 접근을 제어합니다." msgid "Copy Cluster Template" msgstr "클러스터 템플릿 복사" msgid "Copy Template" msgstr "템플릿 복사" msgid "Could not create" msgstr "생성할 수 없음" msgid "Could not create data source" msgstr "데이터 소스를 생성할 수 없음" msgid "Could not create job template" msgstr "작업 템플릿을 생성할 수 없음" msgid "Could not launch job" msgstr "작업을 실행할 수 없음" msgid "Could not parse template" msgstr "템플릿을 구문 분석할 수 없습니다" msgid "Could not update cluster shares" msgstr "클러스터 공유를 업데이트할 수 없음" msgid "Could not update data source" msgstr "데이터 소스를 업데이트할 수 없음" msgid "Could not update plugin" msgstr "플러그인을 업데이트할 수 없습니다" msgid "Count" msgstr "개수" msgid "Create" msgstr "생성" msgid "Create Cluster Template" msgstr "클러스터 템플릿 생성" msgid "Create Data Source" msgstr "데이터 소스 생성" msgid "Create Job Binary" msgstr "작업 바이너리 생성" msgid "Create Job Template" msgstr "작업 템플릿 생성" msgid "Create Node Group Template" msgstr "노드 그룹 템플릿 생성" msgid "Create Template" msgstr "템플릿 생성" msgid "Create a Cluster Template" msgstr "클러스터 템플릿 생성" msgid "Create a Data Source with a specified name." msgstr "지정된 이름으로 데이터 소스를 생성하십시오." msgid "Create a Master Node Group Template" msgstr "마스터 노드 그룹 템플릿 생성" msgid "Create a Worker Node Group Template" msgstr "작업자 노드 그룹 템플릿 생성" msgid "Create a data source" msgstr "데이터 소스 생성" msgid "Create a job template" msgstr "작업 템플릿 생성" msgid "Create a job template with a specified name." msgstr "지정된 이름으로 작업 템플릿을 생성하십시오." msgid "Create a script to be uploaded dynamically" msgstr "동적으로 업로드할 스크립트 생성" msgid "Create boot volume in this availability zone." msgstr "이 가용 구역에 부트 볼륨 생성" msgid "Create security group for this Node Group." msgstr "이 노드 그룹의 보안 그룹을 생성하십시오." msgid "Create time" msgstr "생성 시간" msgid "Create volumes in this availability zone." msgstr "이 가용 구역에 볼륨을 생성하십시오." msgid "Created" msgstr "생성됨" msgctxt "Created time" msgid "Created" msgstr "생성 시간" #, python-format msgid "Created Cluster Template %s" msgstr "생성된 클러스터 템플릿 %s" #, python-format msgid "Created Node Group Template %s" msgstr "작성된 노드 그룹 템플릿 %s" msgid "Created time" msgstr "생성 시간" msgid "Current choice:" msgstr "현재 선택:" msgid "Current type:" msgstr "현재 타입:" msgid "Custom Tag" msgstr "사용자 정의 태그" msgid "DNS Domain Names" msgstr "DNS 도메인 이름" msgid "Data Processing" msgstr "데이터 프로세싱" msgid "Data Processing Plugin Details" msgstr "데이터 프로세싱 플러그인 세부 사항" msgid "Data Processing Plugins" msgstr "데이터 프로세싱 플러그인" msgid "Data Processing internal database" msgstr "데이터 프로세싱 내부 데이터베이스" msgid "" "Data Processing provides different storage location options. You may choose " "Ephemeral Drive or a Cinder Volume to be attached to instances." msgstr "" "데이터 프로세싱에서는 여러 다른 스토리지 위치 옵션을 제공합니다. 인스턴스에 " "연결할 Ephemeral 드라이브 또는 Clinder 볼륨을 선택할 수 있습니다." msgid "Data Source" msgstr "데이터 소스" msgid "Data Source Type" msgstr "데이터 소스 타입" msgid "Data Sources" msgstr "데이터 소스" msgid "" "Data Sources are what your job uses for input and output. Depending on the " "type of job you will be running, you may need to define one or more data " "sources. You can create multiple data sources by repeating this step." msgstr "" "데이터 소스는 작업이 입력 및 출력에 사용하는 내용입니다. 실행하는 작업의 유형" "에 따라 하나 이상의 데이터 소스를 정의해야 할 수도 있습니다. 이 단계를 반복하" "여 여러 데이터 소스를 생성할 수 있습니다.\n" " " msgid "Data source created" msgstr "데이터 소스가 생성됨" msgid "Data source updated" msgstr "데이터 소스가 업데이트됨" msgid "Default Value" msgstr "기본값" msgid "" "Define your Job Template. This is where you choose the type of job that you " "want to run (Pig, Java Action, Spark, etc) and choose or upload the files " "necessary to run it. The inputs and outputs will be defined later." msgstr "" "작업 템플릿을 정의하십시오. 템플릿은 실행할 작업 타입(Pig, Java Action, " "Spark 등)을 선택하고 이 타입을 실행하는 데 필요한 파일을 선택하거나 업로드하" "는 위치입니다. 입력이나 출력은 나중에 정의합니다.\n" " " msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "클러스터 삭제" msgid "Delete Data Source" msgid_plural "Delete Data Sources" msgstr[0] "데이터 소스 삭제" msgid "Delete Job" msgid_plural "Delete Jobs" msgstr[0] "작업 삭제" msgid "Delete Job Binary" msgid_plural "Delete Job Binaries" msgstr[0] "작업 바이너리 삭제" msgid "Delete Job Template" msgid_plural "Delete Job Templates" msgstr[0] "작업 템플릿 삭제" msgid "Delete Template" msgid_plural "Delete Templates" msgstr[0] "템플릿 삭제" msgid "Deleted Cluster" msgid_plural "Deleted Clusters" msgstr[0] "삭제된 클러스터" msgid "Deleted Data Source" msgid_plural "Deleted Data Sources" msgstr[0] "삭제된 데이터 소스" msgid "Deleted Job" msgid_plural "Deleted Jobs" msgstr[0] "삭제된 작업" msgid "Deleted Job Binary" msgid_plural "Deleted Job Binaries" msgstr[0] "삭제된 작업 바이너리" msgid "Deleted Job Template" msgid_plural "Deleted Jobs Templates" msgstr[0] "삭제된 작업 템플릿" msgid "Deleted Template" msgid_plural "Deleted Templates" msgstr[0] "삭제된 템플릿" msgid "Description" msgstr "설명" msgid "Details" msgstr "세부 사항" msgid "Domain Name" msgstr "도메인 이름" msgid "Domain name" msgstr "도메인 이름" msgid "Done" msgstr "완료" msgctxt "Current status of a Job" msgid "Done with Error" msgstr "오류를 표시하며 완료" msgid "Download Job Binary" msgstr "작업 바이너리 다운로드" msgid "Download job binary" msgstr "작업 바이너리 다운로드" msgid "Drive type" msgstr "드라이브 유형" msgid "Duration" msgstr "기간" msgid "Edit Cluster Template" msgstr "클러스터 템플릿 편집" msgid "Edit Data Source" msgstr "데이터 소스 편집" msgid "Edit Image Tags" msgstr "이미지 태그 편집" msgid "Edit Job Binary" msgstr "작업 바이너리 편집" msgid "Edit Node Group Template" msgstr "노드 그룹 템플릿 편집" msgid "Edit Tags" msgstr "태그 편집" msgid "Edit Template" msgstr "템플릿 편집" msgid "Enable Swift Paths" msgstr "Swift 경로 활성화" msgid "Enabled Versions" msgstr "활성화된 버전" msgctxt "End time" msgid "Ended" msgstr "종료 시간" msgid "Endpoint should be specified without protocol" msgstr "엔드포인트는 프로토콜 없이 지정되어야 함" msgid "Engine Job ID" msgstr "엔진 작업 ID" msgid "Enter any custom configuration required for your job's execution." msgstr "작업 실행에 필요한 사용자 정의 구성을 입력하십시오." msgid "Enter the URL for the file" msgstr "파일의 URL 입력" msgid "Enter the access key and secret key required to access that file" msgstr "해당 파일을 접근하는 데 필요로 하는 액세스키와 비밀키를 입력합니다" msgid "Enter the endpoint of the S3 service where the file is stored" msgstr "파일이 저장되는 위치에 해당하는 S3 서비스 엔드포인트를 입력합니다" msgid "Enter the username and password required to access that file" msgstr "파일에 접근하는 데 필요한 사용자 이름과 암호 입력" msgid "Ephemeral Drive" msgstr "Ephemeral 드라이브" msgid "Ephemeral drive" msgstr "Ephemeral 드라이브" msgid "Error Details" msgstr "오류 세부 사항" msgid "Event time" msgstr "이벤트 시간" msgid "Export Template" msgstr "템플릿 내보내기" msgid "Failed" msgstr "실패함" msgctxt "Current status of a Job" msgid "Failed" msgstr "실패함" msgid "Failed to fetch internal binary list" msgstr "내부 바이너리 목록을 가져오는 데 실패" msgid "Failed to get list of internal binaries." msgstr "내부 바이너리 목록을 가져오지 못했습니다." msgid "Failed to get list of shares" msgstr "공유 목록을 가져오는 데 실패" msgid "Failed to update image." msgstr "이미지를 업데이트하지 못했습니다." msgid "Filter" msgstr "필터" msgid "" "First, select which type of job that you want to run. This choice will " "determine which other steps are required" msgstr "" "먼저, 실행할 작업 유형을 선택합니다. 이 선택을 기반으로 어떤 다른 작업을 필요" "로 하는지를 결정합니다" msgid "Flavor" msgstr "Flavor" msgid "Flavor is not specified" msgstr "Flavor가 지정되지 않음" msgid "Floating IP Pool" msgstr "Floating IP 풀" msgid "" "For Data Processing internal job binaries, you may choose from the following:" msgstr "데이터 프로세싱 내부 작업 바이너리는 다음 중에서 선택할 수 있습니다." msgid "" "For Data Sources in S3 storage, the URL should be specified in the format " "s3a://bucket/path. Also, each of the access properties may be optional if " "you have configured that property on your cluster manually." msgstr "" "S3 스토리지의 데이터 소스에서, URL은 s3a://bucket/path 포맷으로 지정되어야 합" "니다. 또한 클러스터에 속성을 수동으로 설정했다면 각 접근 속성은 선택사항일 " "수 있습니다." msgid "" "For Data Sources on a Manila share, choose the share and enter the path " "relative to the share (example: /outputdir/myinputfile.txt)" msgstr "" "Manila 공유에서 데이터 소스의 공유를 선택하고 공유의 상대적 경로를 입력하십시" "오(예: /outputdir/myinputfile.txt)." msgid "" "For MapReduce or Java Action jobs, \"mains\" are not applicable. You are " "required to add one or more \"libs\" for these jobs." msgstr "" "MapReduce 또는 자바 액션 작업은 \"mains\"에 적용되지 않습니다. 이런 작업에 대" "해서는 하나 이상의 \"라이브러리\"를 추가해야 합니다." msgid "For Object Store job binaries, you must:" msgstr "오브젝트 저장소 작업 바이너리의 경우 다음을 수행해야 합니다." msgid "For S3 job binaries, you must:" msgstr "S3 작업 바이너리에 대해, 다음을 수행해야 합니다:" msgid "" "For Shell Action jobs, any required files beyond the main script may be " "added as \"libraries\"." msgstr "" "Shell Action 작업의 경우 기본 스크립트 이외의 필수 파일을 \"라이브러리\"로 추" "가할 수 있습니다." msgid "" "For Storm, Storm Pyleus, Spark and Shell jobs, only a main is required,\"libs" "\" are optional." msgstr "" "Storm, Storm Pyleus, Spark 및 Shell 작업에 대해서는, main만 필수이고, \"libs" "\" 는 선택 사항입니다." msgid "Force Delete Cluster" msgid_plural "Force Delete Clusters" msgstr[0] "클러스터 강제 삭제" msgid "Force Deleted Cluster" msgid_plural "Force Deleted Clusters" msgstr[0] "강제로 삭제된 클러스터" msgid "General Info" msgstr "일반 정보" msgid "Guided Cluster Creation" msgstr "가이드에 따른 클러스터 생성" msgid "Guided Job Execution" msgstr "가이드에 따른 작업 실행" msgid "HDFS placement" msgstr "HDFS 배치" msgid "Health" msgstr "상태" msgid "Hide full configuration" msgstr "모든 구성 숨기기" msgid "Hive" msgstr "Hive" msgid "ID" msgstr "ID" msgid "If checked, bucket will be in path instead of host" msgstr "체크되었다면, 버킷은 호스트 대신 경로에 있습니다." #, python-format msgid "" "If selected, %s will be protected from modifications until this will be " "unselected" msgstr "선택된 경우, 선택을 취소할 때까지 %s을(를) 수정하지 못하게 보호함" #, python-format msgid "If selected, %s will be shared across the tenants" msgstr "선택된 경우, 테넌트 간에 %s을(를) 공유함" msgid "" "If selected, instances of a cluster will be automatically configured during " "creation. Otherwise you should manually specify configuration values" msgstr "" "선택한 경우, 생성 중에 클러스터 인스턴스가 자동으로 구성됩니다. 그렇지 않으" "면 수동으로 구성 값을 지정해야 합니다." msgid "" "If selected, instances of a node group will be automatically configured " "during cluster creation. Otherwise you should manually specify configuration " "values." msgstr "" "선택한 경우, 클러스터 생성시 노드 그룹의 인스턴스가 자동으로 구성됩니다. 그렇" "지 않으면 구성 값을 수동으로 지정해야 합니다." msgid "Image" msgstr "이미지" msgid "Image Registry" msgstr "이미지 저장소" msgid "" "Image Registry is used to provide additional information about images for " "Data Processing." msgstr "" "이미지 저장소는 데이터 프로세싱에 사용되는 이미지의 추가 정보를 제공하는데 사" "용됩니다." msgid "Image Registry tool:" msgstr "이미지 저장소 도구:" msgid "Import" msgstr "가져오기" msgid "Import Cluster Template" msgstr "클러스터 템플릿 가져오기" msgid "Import Node Group Template" msgstr "노드 그룹 템플릿 가져오기" msgid "Import Template" msgstr "템플릿 가져오기" msgid "In progress" msgstr "진행중" msgid "Info" msgstr "정보" msgid "Input" msgstr "입력" msgid "Input Data Source" msgstr "입력 데이터 소스" msgid "" "Input correct User Name for image. For Ubuntu images input 'ubuntu', " "'fedora' for Fedora images, 'cloud-user' for CentOS 6.x images and 'centos' " "for CentOS 7.x images." msgstr "" "이미지에 대해 올바른 사용자 이름을 입력합니다. Ubuntu 이미지에 대해서는 " "'ubuntu' 를, Fedora 이미지에는 'fedora' 를, CentOS 6.x 이미지에는 'cloud-" "user' 를, 그리고 CentOS 7.x 이미지에는 'centos' 를 입력합니다." msgid "Instance" msgstr "인스턴스" msgid "Instance and attached volumes will be created on the same physical host" msgstr "인스턴스 및 연결된 볼륨이 동일한 물리적 호스트에 작성됨" msgid "Instances" msgstr "인스턴스" msgid "Instances Count" msgstr "인스턴스 개수" msgid "Interface Arguments" msgstr "인터페이스 인수" msgid "Internal Binary" msgstr "내부 바이너리" msgid "Internal IP" msgstr "내부 IP" msgid "Internal binary" msgstr "내부 바이너리" msgid "Java" msgstr "Java" msgid "Java Action" msgstr "Java Action" msgid "Java Opts" msgstr "Java 옵션" msgid "Job" msgstr "작업" msgid "Job Binaries" msgstr "작업 바이너리" msgid "Job Configuration" msgstr "작업 구성" msgid "Job Execution ID" msgstr "작업 실행 ID" msgid "Job Guide" msgstr "작업 가이드" msgid "Job Template" msgstr "작업 템플릿" msgid "Job Templates" msgstr "작업 템플릿" msgid "Job Type" msgstr "작업 타입" msgid "Job args" msgstr "작업 인수" msgid "Job configs" msgstr "작업 구성" msgid "Job created" msgstr "작업이 생성됨" msgid "Job launched" msgstr "작업이 실행됨" msgid "Job params" msgstr "작업 매개 변수" msgid "Job template:" msgstr "작업 템플릿:" msgid "Job type chosen" msgstr "선택된 작업 타입" msgid "Jobs" msgstr "작업" msgid "Keypair" msgstr "키페어" msgctxt "Current status of a Job" msgid "Killed" msgstr "강제 종료됨" msgid "Label" msgstr "레이블" msgid "Label details" msgstr "레이블 세부 사항" msgid "Last Updated" msgstr "마지막 업데이트 날짜" msgid "Launch" msgstr "실행" msgid "Launch Cluster" msgstr "클러스터 실행" msgid "Launch Job" msgid_plural "Launch Jobs" msgstr[0] "작업 실행" msgid "Launch On Existing Cluster" msgstr "기존 클러스터에서 실행" msgid "Launch On New Cluster" msgstr "새 클러스터에서 실행" msgid "Launch a Cluster" msgstr "클러스터 실행" msgid "Launch instances in these security groups." msgstr "이 보안 그룹에서 인스턴스를 실행하십시오." msgid "" "Launch instances in these security groups. Auto security group will be " "determined by the value present in the imported template." msgstr "" "해당 보안 그룹에 해당하는 인스턴스를 구동합니다. 자동 보안 그룹이 가져온 템플" "릿 내에 존재하는 값에 의해 정해질 것입니다." msgid "Launch instances in this availability zone." msgstr "이 가용 구역에서 인스턴스를 실행합니다." msgid "Launch job" msgstr "작업 실행" msgid "Launch the given job template on a cluster." msgstr "클러스터에서 지정된 작업 템플릿을 실행하십시오." msgid "" "Launch your job. When launching, you may need to choose your input and " "output data sources. This is where you would also add any special " "configuration values, parameters, or arguments that you need to pass along " "to your job." msgstr "" "작업을 실행하십시오. 실행 시, 입력 및 출력 데이터 소스를 선택해야 할 수도 있" "습니다. 여기에서, 작업에 전달해야 하는 특수 구성 값, 매개 변수 또는 인수도 " "모두 추가합니다.\n" " " #, python-format msgid "Launched Cluster %s" msgstr "%s 클러스터가 실행됨" msgid "Launched Job" msgid_plural "Launched Jobs" msgstr[0] "실행된 작업" msgid "Libs" msgstr "Libs" msgid "Location" msgstr "위치" msgid "Main Class" msgstr "기본 클래스" msgid "Mains" msgstr "Mains" msgid "Management IP" msgstr "관리 IP" msgid "Manila share" msgstr "Manila 공유" msgid "MapReduce" msgstr "MapReduce" msgid "Mapper" msgstr "Mapper" msgid "Mapping Type" msgstr "매핑 타입" msgid "Master Node Group Template:" msgstr "마스터 노드 그룹 템플릿:" msgid "" "Modify the configuration so that swift URLs can be dereferenced through HDFS " "at runtime." msgstr "" "런타임 시 HDFS를 통해 swift URL을 역참조할 수 있도록 구성을 수정하십시오." msgid "Name" msgstr "이름" msgid "" "Name must be provided either here or in the template. If provided in both " "places, this one will be used." msgstr "" "이름은 여기 또는 템플릿 내에 명시되어야 합니다. 두 곳 모두에서 명시하는 경" "우, 여기있는 내용을 사용할 것입니다." #, python-format msgid "Name: %(node_group_name)s" msgstr "이름: %(node_group_name)s" msgid "Named Parameter" msgstr "이름 지정된 매개 변수" msgid "Neutron Management Network" msgstr "Neutron 관리 네트워크" msgid "Never" msgstr "수행하지 않음" msgid "Next" msgstr "다음" msgid "" "Next, you need to define the different types of machines in your cluster. " "This is done by defining a Node Group Template for each type of machine. A " "very common case is where you need to have one or more machines running a " "\"master\" set of processes while another set of machines need to be running " "the \"worker\" processes. Here, you will define the Node Group Template for " "your \"master\" node(s)." msgstr "" "다음으로, 클러스터에서 다른 타입의 머신을 정의해야 합니다. 이 작업은 각 머신 " "타입의 노드 그룹 템플릿을 정의하여 수행합니다. 하나 이상의 머신에서 프로세스" "의 \"마스터\" 집합을 실행하는 한편 다른 머신 집합에서는 \"작업자\" 프로세스" "가 실행 중이어야 하는 경우가 매우 일반적입니다. 여기서 \"마스터\" 노드의 노" "드 그룹 템플릿을 정의합니다.\n" " " msgid "No Cluster Template Created" msgstr "클러스터 템플릿이 생성되지 않음" msgid "No Images Available" msgstr "사용 가능한 이미지가 없음" msgid "No Master Node Group Template Created" msgstr "마스터 노드 그룹 템플릿이 생성되지 않음" msgid "No Templates Available" msgstr "템플릿을 사용할 수 없음" msgid "No Worker Node Group Template Created" msgstr "작업자 노드 그룹 템플릿이 생성되지 않음" msgid "No availability zone specified" msgstr "가용 구역이 지정되지 않음" msgid "No clusters available" msgstr "사용 가능한 클러스터가 없습니다" msgid "No configurations" msgstr "구성이 없음" msgid "No description" msgstr "설명이 없음" msgid "No domain is specified" msgstr "지정된 도메인이 없습니다" msgid "No enabled versions" msgstr "활성화된 버전이 없습니다" msgid "No image specified" msgstr "이미지가 지정되지 않음" msgid "No images available." msgstr "사용 가능한 이미지가 없습니다." msgid "No info available" msgstr "사용 가능한 정보가 없음" msgid "No job template created" msgstr "작업 템플릿이 생성되지 않음" msgid "No keypair" msgstr "키페어가 없음" msgid "No plugin chosen" msgstr "플러그인이 선택되지 않음" msgid "No type chosen" msgstr "타입이 선택되지 않음" msgid "No volume type" msgstr "볼륨 타입이 없음" msgid "Node Group" msgstr "노드 그룹" #, python-format msgid "Node Group Name: %(node_group_name)s" msgstr "노드 그룹 이름: %(node_group_name)s" msgid "Node Group Template" msgstr "노드 그룹 템플릿" #, python-format msgid "Node Group Template %s updated" msgstr "노드 그룹 템플릿 %s이(가) 업데이트됨" #, python-format msgid "Node Group Template copy %s created" msgstr "노드 그룹 템플릿 사본 %s이(가) 생성됨" msgid "Node Group Templates" msgstr "노드 그룹 템플릿" #, python-format msgid "Node Group: %(node_group_name)s" msgstr "노드 그룹: %(node_group_name)s" msgid "Node Groups" msgstr "노드 그룹" msgid "Node Groups Configuration Overview" msgstr "노드 그룹 구성 개요" msgid "Node Processes" msgstr "노드 프로세스" msgid "Node group cluster" msgstr "노드 그룹 클러스터" msgid "Node group configurations are not specified" msgstr "노드 그룹 구성이 지정되지 않음" msgid "Node processes are not specified" msgstr "노드 프로세스가 지정되지 않음" msgid "Nodes Count" msgstr "노드 개수" msgid "None" msgstr "없음" msgid "Not available" msgstr "사용할 수 없음" msgid "" "Now you need to set the layout of your cluster. By creating a Cluster " "Template, you will be choosing the number of instances of each Node Group " "Template that will appear in your cluster. Additionally, you will have a " "chance to set any cluster-specific configuration items in the additional " "tabs on the create Cluster Template form." msgstr "" "이제 클러스터 레이아웃을 설정해야 합니다. 클러스터 템플릿을 생성하여, 클러스" "터에 표시될 각 노드 그룹 템플릿의 인스턴스 개수를 선택합니다. 또한 클러스터 " "템플릿 생성 양식의 추가 탭에서 임의의 클러스터별 구성 항목을 설정할 수 있습니" "다." msgid "Number" msgstr "숫자" msgid "Number of Nodes" msgstr "노드 수" msgid "Number of clusters to launch." msgstr "실행할 클러스터 수." msgid "Oozie Job ID" msgstr "Oozie 작업 ID" msgid "OpenStack Flavor" msgstr "OpenStack Flavor" msgid "Output" msgstr "출력" msgid "Output Data Source" msgstr "출력 데이터 소스" msgid "Parameters" msgstr "매개 변수" msgid "Password" msgstr "암호" msgid "Path" msgstr "경로" msgid "Path on share" msgstr "공유 경로" msgid "Persist cluster after job exit" msgstr "작업 종료 후 클러스터 지속" msgid "Pig" msgstr "Pig" msgid "Plugin" msgstr "플러그인" msgid "Plugin Name" msgstr "플러그인 이름" msgid "Plugin and Version Tag" msgstr "플러그인 및 버전 태그" msgid "Plugin label" msgstr "플러그인 레이블" msgid "Plugin name" msgstr "플러그인 이름" msgid "Plugin update failed." msgstr "플러그인 업데이트를 실패하였습니다." #, python-format msgid "Plugin version %(version)s label" msgstr "플러그인 버전 %(version)s 레이블" #, python-format msgid "Plugin version %s" msgstr "플러그인 버전 %s" msgid "Plugin:" msgstr "플러그인:" msgid "Plugins" msgstr "플러그인" msgid "Positional Argument" msgstr "위치 인수" msgid "Progress" msgstr "진행" msgid "Project ID" msgstr "프로젝트 ID" msgid "Protected" msgstr "보호됨" msgid "Proxy Gateway" msgstr "프록시 게이트웨이" msgid "Public" msgstr "공용" msgid "Read only" msgstr "읽기 전용" msgid "Read/Write" msgstr "읽기/쓰기" msgid "Reducer" msgstr "Reducer" msgid "Register Image" msgstr "이미지 등록" msgid "Relaunch On Existing Cluster" msgstr "기존 클러스터에서 재실행" msgid "Relaunch On New Cluster" msgstr "새 클러스터에서 재실행" msgid "Remove" msgstr "제거" msgid "" "Repeat the Node Group Template creation process, but this time you are " "creating your \"worker\" Node Group Template." msgstr "" "노드 그룹 템플릿 생성 프로세스를 반복합니다. 하지만 이때는 \"작업자\" 노드 그" "룹 템플릿을 생성합니다." msgid "Required" msgstr "필수" msgid "Reset Cluster Creation Guide" msgstr "클러스터 생성 재설정 가이드" msgid "Reset Cluster Guide" msgstr "클러스터 재설정 가이드" msgid "Reset Job Execution Guide" msgstr "작업 실행 재설정 가이드" msgid "Return Code" msgstr "리턴 코드" msgid "Run HBase EDP Jobs with common HBase library on HDFS" msgstr "HDFS에서 일반적인 HBase 라이브러리로 HBase EDP 작업 실행" msgid "S3" msgstr "S3" msgid "S3 Endpoint" msgstr "S3 엔드포인트" msgid "S3 access key" msgstr "S3 접근 키" msgid "S3 accsss key" msgstr "S3 접근 키" msgid "S3 endpoint" msgstr "S3 엔드포인트" msgid "S3 secret key" msgstr "S3 비밀 키" msgid "" "Sahara will use instances of this node group to access other cluster " "instances." msgstr "" "Sahara는 이 노드 그룹의 인스턴스를 사용하여 다른 클러스터 인스턴스에 접근합니" "다." msgid "Scale" msgstr "스케일" msgid "Scale Cluster" msgstr "클러스터 스케일 지정" msgid "Scale cluster operation failed" msgstr "클러스터 스케일 조정 작업에 실패" msgid "Scaled cluster successfully started." msgstr "스케일이 조정된 클러스터가 성공적으로 시작되었습니다." msgid "Scope" msgstr "범위" msgid "Script name" msgstr "스크립트 이름" msgid "Script text" msgstr "스크립트 텍스트" msgid "Secret Key" msgstr "비밀키" msgid "Security" msgstr "보안" msgid "Security Groups" msgstr "보안 그룹" msgid "Select" msgstr "선택" msgid "Select Image" msgstr "이미지 선택" msgid "Select Node Group Processes" msgstr "노드 그룹 프로세스 선택" msgid "Select Shares" msgstr "공유 선택" msgid "Select a Node Group Template to add:" msgstr "추가할 노드 그룹 템플릿 선택:" msgid "Select a Value Type for your next argument:" msgstr "다음 매개 변수의 값 타입 선택:" msgid "Select a plugin and version for a new Cluster template." msgstr "새 클러스터 템플릿의 플러그인과 버전을 선택하십시오." msgid "Select a plugin and version for a new Cluster." msgstr "새 클러스터의 버전과 플러그인을 선택하십시오." msgid "Select a plugin and version for the new Node Group template." msgstr "새 노드 그룹 템플릿의 플러그인 및 버전을 선택하십시오." msgid "" "Select an existing node group template.\n" " " msgstr "" "기존 노드 그룹 템플릿을 선택하십시오.\n" " " msgid "Select node processes for the node group" msgstr "노드 그룹의 노드 프로세스 선택" msgid "Select plugin and hadoop version" msgstr "플러그인 및 Hadoop 버전 선택" msgid "Select plugin and hadoop version for cluster" msgstr "클러스터의 Hadoop 버전 및 플러그인 선택" msgid "Select plugin and hadoop version for cluster template" msgstr "클러스터 템플릿에 대한 플러그인 및 hadoop 버전을 선택합니다" msgid "Select property name" msgstr "등록 이름 선택" msgid "Select the domain name for internal and external hostname resolution." msgstr "내부 및 외부 호스트이름 변환을 위한 도메인 이름을 선택합니다." msgid "Select the manila shares for this cluster" msgstr "이 클러스터의 manila 공유 선택" msgid "Select the manila shares for this node group" msgstr "이 노드 그룹의 manila 공유 선택" msgid "Select the storage type for your job binary." msgstr "작업 바이너리의 스토리지 유형을 선택하십시오." msgid "Select the type of your Data Source." msgstr "데이터 소스의 타입을 선택하십시오." msgid "Select the type of your job:" msgstr "작업 타입 선택:" msgid "Select type" msgstr "타입 선택" msgid "" "Select which plugin and version that you want to use to create your cluster." msgstr "클러스터를 생성하는 데 사용할 플러그인과 버전을 선택하십시오." msgid "" "Select which type of job that you want to run. This choice will dictate " "which steps are required to successfully execute your job." msgstr "" "실행할 작업 유형을 선택합니다. 이 선택에 따라 성공적으로 작업을 실행하는 데 " "필요한 단계가 결정됩니다." msgid "" "Selected domain name should already exist in the Designate. You can check it " "in "DNS" tab on the left menu or by executing "designate " "domain-list" on the controller node." msgstr "" "선택한 도메인 이름이 Designate 내에 이미 존재하고 있어야 합니다. 왼쪽 메뉴 " "내 "DNS" 탭에서 확인하거나 컨트롤러 노드에서 "designate " "domain-list" 를 실행합니다." msgid "Service Configurations" msgstr "서비스 구성" msgid "Share" msgstr "공유" msgid "Shares" msgstr "공유" msgid "Shell" msgstr "Shell" msgid "Shell Action" msgstr "Shell Action" msgid "Show full configuration" msgstr "전체 구성 표시" msgid "Source password" msgstr "소스 암호" msgid "Source username" msgstr "소스 사용자 이름" msgid "Spark" msgstr "Spark" msgid "" "Specified User Name will be used by Data Processing to apply configs and " "manage processes on instances." msgstr "" "데이터 프로세싱에서 지정된 사용자 이름을 사용하여 구성을 적용하고 인스턴스의 " "프로세스를 관리합니다." msgid "Start Verification" msgid_plural "Start Verifications" msgstr[0] "확인 시작" msgctxt "Start time" msgid "Started" msgstr "시작 시간" msgid "Started Verification" msgid_plural "Started Verifications" msgstr[0] "확인이 시작됨" msgid "Started at" msgstr "시작" msgid "Status" msgstr "상태" msgid "Status description" msgstr "상태 설명" msgid "Step Description" msgstr "단계 설명" msgid "Storage type" msgstr "스토리지 타입" msgid "Storm" msgstr "Storm" msgid "Storm Pyleus" msgstr "Storm Pyleus" msgid "Streaming MapReduce" msgstr "스트리밍 MapReduce" msgid "String" msgstr "문자열" msgid "" "Substitute data source objects for URLs of the form datasource://name or " "uuid." msgstr "양식 데이터 소스의 URL을 데이터 소스 오브젝트로 대체://name 또는 uuid." msgctxt "Current status of a Job" msgid "Succeeded" msgstr "성공함" msgid "Successfully updated image." msgstr "성공적으로 이미지를 업데이트했습니다." msgid "Supported Versions" msgstr "지원되는 버전" msgid "Swift" msgstr "Swift" msgid "Tags" msgstr "태그" msgid "" "Tags are used for filtering images suitable for each plugin and each Data " "Processing version. To add required tags, select a plugin and a Data " "Processing version and click the "Add" button." msgstr "" "태그는 각 플러그인과 각 데이터 프로세싱 버전에 적합한 이미지를 필터링하는데 " "사용됩니다. 필수 태그를 추가하려면, 플러그인과 데이터 프로세싱 버전을 선택하" "고 "추가" 버튼을 누릅니다." msgid "Template" msgstr "템플릿" msgid "Template File" msgstr "템플릿 파일" msgid "Template JSON contained invalid key" msgstr "템플릿 JSON이 잘못된 키를 포함하였습니다" msgid "Template Name" msgstr "템플릿 이름" msgid "Template not specified" msgstr "템플릿이 지정되지 않음" msgid "" "The Cluster Template object may specify a list of processes in anti-affinity " "group. That means these processes may not be launched more than once on a " "single host." msgstr "" "클러스터 템플릿 오브젝트는 anti-affinity 그룹의 프로세스 목록에서 지정할 수 " "있습니다. 이러한 프로세스는 하나의 호스트에 두번 이상 실행되지 않음을 의미합" "니다." msgid "" "The Cluster Template object should specify Node Group Templates that will be " "used to build a Cluster. You can add Node Groups using Node Group Templates " "on a "Node Groups" tab." msgstr "" "클러스터 템플릿 객체는 클러스터를 구성에 사용할 노드 그룹 템플릿을 지정해야 " "합니다. "Node Groups" 탭에 노드 그룹 템플릿을 이용하여 노드 그룹을 " "추가할 수 있습니다." msgid "" "The Cluster object should specify OpenStack Image to boot instances for " "Cluster." msgstr "" "클러스터 오브젝트가 클러스터의 인스턴스를 부팅할 OpenStack 이미지를 지정해야 " "합니다." msgid "" "The Node Group Template object specifies the processes that will be launched " "on each instance. Check one or more processes. When processes are selected, " "you may set node scoped configurations on corresponding tabs." msgstr "" "노드 그룹 템플릿 객체는 각 인스턴스에 시작된 프로세스를 지정합니다. 하나 이" "상의 프로세스를 확인합니다.\n" " 프로세스를 선택하면, 해당 탭의 노드 범위 구성을 설정할 수 있습니다." msgid "" "The first step is to determine which type of cluster you want to run. You " "may have several choices available depending on the configuration of your " "system. Click on \"choose plugin\" to bring up the list of data processing " "plugins. There you will be able to choose the data processing plugin along " "with the version number. Choosing this up front will allow the rest of the " "cluster creation steps to focus only on options that are pertinent to your " "desired cluster type." msgstr "" "첫 번째 단계에서는 실행할 클러스터 타입을 판별합니다. 시스템 구성에 따라 사용" "할 수 있는 선택 사항이 여러 개입니다. \"플러그인 선택\"을 눌러 데이터 프로세" "싱 플러그인 목록을 표시하십시오. 여기에서 버전 번호와 함께 데이터 프로세싱 플" "러그인을 선택할 수 있습니다. 이러한 사항을 먼저 선택하면 나머지 클러스터 생" "성 단계에서 원하는 클러스터 유형에 속한 옵션에만 중점을 둘 수 있습니다." msgid "The value of shares must be a list of values" msgstr "공유 값은 값 목록이어야 함" msgid "This Cluster Template will be created for:" msgstr "다음을 위해 이 클러스터 템플릿이 생성됩니다." msgid "This Cluster will be started with:" msgstr "이 클러스터는 다음으로 시작됩니다." msgid "This Node Group Template will be created for:" msgstr "이 노드 그룹 템플리트는 다음용으로 생성됩니다." msgid "Title" msgstr "제목" msgid "Topology Name" msgstr "토폴로지 이름" msgid "Type" msgstr "타입" msgid "URL" msgstr "URL" msgid "Unable to create job binary" msgstr "작업 바이너리를 생성할 수 없음" #, python-format msgid "Unable to create job binary: %s" msgstr "작업 바이너리를 생성할 수 없습니다: %s" msgid "Unable to create new cluster for job." msgstr "작업의 새로운 클러스터를 생성할 수 없습니다." msgid "Unable to create the cluster" msgstr "클러스터를 생성할 수 없음" #, python-format msgid "Unable to fetch Base Image with id: %s." msgstr "ID가 %s인 기본 이미지를 가져올 수 없습니다." msgid "Unable to fetch available images." msgstr "사용 가능한 이미지를 가져올 수 없습니다." msgid "Unable to fetch base image details" msgstr "기반 이미지 세부 사항을 가져올 수 없습니다" msgid "Unable to fetch cluster list" msgstr "클러스터 목록을 가져올 수 없음" msgid "Unable to fetch cluster template list" msgstr "클러스터 템플릿 목록을 가져올 수 없음" msgid "Unable to fetch cluster template." msgstr "클러스터 템플릿을 가져올 수 없습니다." msgid "Unable to fetch cluster to scale" msgstr "스케일을 조정할 클러스터를 가져올 수 없음" msgid "Unable to fetch cluster to scale." msgstr "스케일을 조정할 클러스터를 가져올 수 없습니다." msgid "Unable to fetch cluster." msgstr "클러스터를 가져올 수 없습니다." msgid "Unable to fetch clusters." msgstr "클러스터를 가져올 수 없습니다." msgid "Unable to fetch data source list" msgstr "데이터 소스 목록을 가져올 수 없음" msgid "Unable to fetch data sources." msgstr "데이터 소스를 가져올 수 없습니다." msgid "Unable to fetch flavor for template." msgstr "템플릿의 flavor를 가져올 수 없습니다." msgid "Unable to fetch floating ip pools." msgstr "Floating IP 풀을 가져올 수 없습니다." msgid "Unable to fetch image choices." msgstr "이미지 선택을 가져올 수 없습니다." msgid "Unable to fetch instance details." msgstr "인스턴스 세부 사항을 가져올 수 없습니다." msgid "Unable to fetch job binary list" msgstr "작업 바이너리 목록을 가져올 수 없음" #, python-format msgid "Unable to fetch job binary: %(exc)s" msgstr "작업 바이너리를 가져올 수 없음: %(exc)s" msgid "Unable to fetch job list" msgstr "작업 목록을 가져올 수 없음" msgid "Unable to fetch job template list" msgstr "작업 템플릿 목록을 가져올 수 없음" msgid "Unable to fetch jobs." msgstr "작업을 가져올 수 없음" msgid "Unable to fetch keypair choices." msgstr "키페어 선택사항을 가져올 수 없습니다." msgid "Unable to fetch network details" msgstr "네트워크 세부 사항을 가져올 수 없습니다" msgid "Unable to fetch node group details." msgstr "노드 그룹 세부 사항을 가져올 수 없습니다." msgid "Unable to fetch node group template list" msgstr "노드 그룹 템플릿 목록을 가져올 수 없음" msgid "Unable to fetch plugin details." msgstr "플러그인 세부 사항을 가져올 수 없습니다." msgid "Unable to fetch plugin list" msgstr "플러그인 목록을 가져올 수 없음" msgid "Unable to fetch plugin object." msgstr "플러그인 개체를 가져올 수 없습니다." msgid "Unable to fetch template object." msgstr "템플릿 오브젝트를 가져올 수 없습니다." msgid "Unable to fetch template to copy." msgstr "복사할 템플릿을 가져올 수 없습니다." msgid "Unable to fetch template to edit." msgstr "편집할 템플릿을 가져올 수 없습니다." msgid "Unable to fetch the image details" msgstr "이미지 세부 사항을 가져올 수 없습니다." msgid "Unable to generate process choices." msgstr "프로세스 선택을 생성할 수 없습니다." msgid "Unable to get node group details." msgstr "노드 그룹 세부 사항을 가져올 수 없습니다." msgid "Unable to get security group list." msgstr "보안 그룹 목록을 가져올 수 없습니다." msgid "Unable to launch job." msgstr "작업을 실행할 수 없습니다." msgid "Unable to populate anti-affinity processes." msgstr "anti-affinity 프로세스를 채울 수 없습니다." msgid "Unable to process plugin tags" msgstr "프로세스 플러그인 태그를 사용할 수 없습니다." msgid "Unable to retrieve Nova availability zones." msgstr "Nova 가용 구역을 가져올 수 없습니다." msgid "Unable to retrieve data processing plugins." msgstr "데이터 프로세싱 플러그인을 가져올 수 없습니다." #, python-format msgid "Unable to retrieve details for cluster \"%s\"." msgstr "\"%s\" 클러스터의 세부 사항을 검색할 수 없습니다." #, python-format msgid "Unable to retrieve details for cluster template \"%s\"." msgstr "\"%s\" 클러스터 템플릿의 세부 사항을 찾을 수 없습니다." #, python-format msgid "Unable to retrieve details for data source \"%s\"." msgstr "데이터 소스 \"%s\"의 세부 사항을 검색할 수 없습니다." #, python-format msgid "Unable to retrieve details for job \"%s\"." msgstr "\"%s\" 작업의 세부 사항을 검색할 수 없습니다." #, python-format msgid "Unable to retrieve details for job binary \"%s\"." msgstr "작업 바이너리 \"%s\"의 세부 사항을 검색할 수 없습니다." #, python-format msgid "Unable to retrieve details for job template \"%s\"." msgstr "작업 템플릿 \"%s\"의 세부 사항을 검색할 수 없습니다." #, python-format msgid "Unable to retrieve details for node group template \"%s\"." msgstr "노드 그룹 템플릿 \"%s\"의 세부 사항을 검색할 수 없습니다." msgid "Unable to retrieve image list" msgstr "이미지 목록을 검색할 수 없습니다." #, python-format msgid "Unable to retrieve images with filter %s." msgstr "%s 필터를 사용하여 이미지를 검색할 수 없습니다." #, python-format msgid "Unable to retrieve job binary \"%s\"." msgstr "작업 바이너리 \"%s\"을(를) 검색할 수 없습니다." msgid "Unable to retrieve networks." msgstr "네트워크를 검색할 수 없습니다." msgid "Unable to retrieve plugin." msgstr "플러그인을 가져올 수 없음" #, python-format msgid "Unable to retrieve security group %(group)s." msgstr "%(group)s 보안 그룹을 검색할 수 없습니다." msgid "Unable to retrieve volumes availability zones." msgstr "볼륨 가용 구역을 가져올 수 없습니다." msgid "Unable to set cluster type" msgstr "클러스터 타입을 설정할 수 없음" msgid "Unable to set job type" msgstr "작업 유형을 설정할 수 없음" msgid "Unable to set node group template" msgstr "노드 그룹 템플릿을 설정할 수 없음" msgid "Unable to update job binary" msgstr "작업 바이너리를 업데이트할 수 없음" #, python-format msgid "Unable to update job binary: %s" msgstr "작업 바이너리를 업데이트할 수 없습니다: %s" msgid "Unable to update row" msgstr "행을 업데이트할 수 없음" msgid "Unable to upload job binary" msgstr "작업 바이너리를 업로드할 수 없음" msgid "Unknown" msgstr "알 수 없음" msgid "Unnecessary tags may be removed by clicking a cross near tag's name." msgstr "불필요한 태그는 태그 이름 근처의 십자 표시를 눌러 제거할 수 있습니다." msgid "Unregister Image" msgid_plural "Unregister Images" msgstr[0] "이미지 등록 취소" msgid "Unregistered Image" msgid_plural "Unregistered Images" msgstr[0] "등록이 취소된 이미지" msgid "Update" msgstr "업데이트" msgid "Update Cluster Shares" msgstr "클러스터 공유 업데이트" msgid "Update Plugin" msgstr "플러그인 업데이트" msgid "Update Shares" msgstr "공유 업데이트" msgid "Update the plugin labels" msgstr "플러그인 레이블을 업데이트합니다" msgid "Updated" msgstr "업데이트됨" msgid "Updated time" msgstr "업데이트된 시간" msgid "Upload" msgstr "업로드" msgid "Upload File" msgstr "파일 업로드" msgid "Upload Template" msgstr "템플릿 업로드" msgid "Upload a new file" msgstr "새 파일 업로드" msgid "Uptime" msgstr "업타임" msgid "Url" msgstr "Url" msgid "Use Data Source Substitution for Names and UUIDs" msgstr "이름과 UUID의 데이터 소스 대체 사용" msgid "Use HBase Common library" msgstr "HBase 공통 라이브러리 사용" msgid "Use SSL" msgstr "SSL 사용" msgid "Use anti-affinity groups for processes" msgstr "프로세스에 대해 anti-affinity 그룹 사용" msgid "Use anti-affinity groups for: " msgstr "다음에 대해 anti-affinity 그룹 사용: " msgid "Use auto-configuration" msgstr "자동 구성 사용" msgid "Use bucket in path" msgstr "경로에서 버킷 사용" msgid "Use the same topology name as defined in your .yaml file" msgstr ".yaml 파일에 정의한 내용과 동일한 토폴로지 이름을 사용합니다" msgid "User" msgstr "사용자" msgid "User Name" msgstr "사용자 이름" msgid "User has to choose a keypair to have access to clusters instances." msgstr "클러스터 인스턴스에 접근할 권한이 있는 키페어를 선택했습니다." msgid "Username" msgstr "사용자 이름" msgid "Value" msgstr "값" msgid "Value Type" msgstr "값 타입" msgid "Version" msgstr "버전" msgid "Version:" msgstr "버전:" #, python-format msgid "" "Version: %(hadoop_version)s of plugin %(plugin_name)s is now " "deprecated." msgstr "" "플러그인 %(plugin_name)s 에 대한 버전: %(hadoop_version)s이 이" "제 deprecated 되었습니다." msgid "Volume local to instance" msgstr "인스턴스에 로컬인 볼륨" msgid "Volumes Availability Zone" msgstr "볼륨 가용 구역" msgid "Volumes local to instance" msgstr "인스턴스의 로컬 볼륨" msgid "Volumes per node" msgstr "노드당 볼륨" msgid "Volumes size" msgstr "볼륨 크기" msgid "Volumes size (GB)" msgstr "볼륨 크기(GB)" msgid "Volumes type" msgstr "볼륨 타입" msgid "Warning!" msgstr "Warning!" msgid "Which keypair to use for authentication." msgstr "인증에 사용할 키 페어." msgid "Worker Node Group Template:" msgstr "작업자 노드 그룹 템플릿:" msgid "" "You are now ready to launch your cluster. When you click on the link below, " "you will need to give your cluster a name, choose the Cluster Template to " "use and choose which image to use to build your instances. After you click " "on \"Create\", your instances will begin to spawn. Your cluster should be " "operational in a few minutes." msgstr "" "이제 클러스터를 실행할 준비가 되었습니다. 아래 링크를 누르면 클러스터에 이름" "을 지정하고, 사용할 클러스터 템플릿을 선택하며, 인스턴스를 생성하는 데 사용" "할 이미지를 선택합니다. \"생성\"을 누르고 나면 인스턴스가 생성되기 시작합니" "다. 몇 분 안에 클러스터가 작동해야 합니다." msgid "You may also add any custom tag." msgstr "사용자 정의 태그도 추가할 수 있습니다." msgid "You may also enter an optional description for your Data Source." msgstr "데이터 소스의 선택적 설명도 입력할 수 있습니다." msgid "You may also enter an optional description for your job binary." msgstr "작업 바이너리의 선택적 설명도 입력할 수 있습니다." msgid "You may also enter an optional description for your job template." msgstr "작업 템플릿의 선택적 설명도 입력할 수 있습니다." msgid "You may need to enter the username and password for your Data Source." msgstr "데이터 소스의 사용자 이름 및 암호를 입력해야 할 수도 있습니다." msgid "You may set cluster scoped configurations on corresponding tabs." msgstr "해당 탭에서 클러스터 범위의 구성을 설정할 수 있습니다." msgid "" "You must choose a flavor to determine the size (VCPUs, memory and storage) " "of all launched VMs." msgstr "" "실행된 모든 VM의 크기(VCPU, 메모리 및 스토리지)를 판별하려면 flavor를 선택해" "야 합니다." msgid "" "You need to register an image to launch instances of your cluster. Skip this " "step if you already have a registered image for your plugin, otherwise click " "the link below. In the form you will need to choose the image, input the " "username and add tags for the chosen plugin." msgstr "" "클러스터의 인스턴스들을 동작시킬 이미지를 등록해야합니다. 플러그인에 이미 등" "록한 이미지가 있다면 이 단계를 건너뛰어도 됩니다. 그렇지 않다면, 아래 링크를 " "클릭하세요. 양식에서 이미지 선택과 username 입력, \n" "그리고 선택한 플러그 인을 위해 태그들을 추가해야 합니다." msgid "" "You've chosen a cluster that is in 'Error' state. Appropriate execution of " "the job can't be guaranteed." msgstr "" "'오류' 상태인 클러스터를 선택하였습니다. 작업에 대한 적절한 실행을 보장할 수 " "없습니다." msgid "cluster" msgstr "클러스터" msgid "cluster template" msgstr "클러스터 템플릿" msgid "data source" msgstr "데이터 소스" msgid "job" msgstr "작업" msgid "job binary" msgstr "작업 바이너리" msgid "no processes" msgstr "프로세스 없음" msgid "node group template" msgstr "노드 그룹 템플릿" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/ko_KR/LC_MESSAGES/djangojs.po0000664000175000017500000000451000000000000026443 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # Ian Y. Choi , 2016. #zanata # Ian Y. Choi , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-03-01 09:13+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2018-02-11 07:32+0000\n" "Last-Translator: Ian Y. Choi \n" "Language-Team: Korean (South Korea)\n" "Language: ko_KR\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "(show events)" msgstr "(이벤트 표시)" msgid "Configuration Value" msgstr "구성 값" msgid "Data Source" msgstr "데이터 소스" msgid "Default Value" msgstr "기본값" msgid "Description" msgstr "설명" msgid "Event log is not available." msgstr "이벤트 로그를 사용할 수 없습니다." msgid "" "For configs and params, type the key name; for args, type the index as an " "integer, starting from 0." msgstr "" "구성 및 매개 변수의 경우 키 이름을 입력하고, 인수의 경우 0부터 시작하는 정수" "인 인덱스를 입력하십시오." msgid "" "For data sources, use a data source UUID or a path (as per data source " "creation.)" msgstr "" "데이터 소스의 경우 데이터 소스 UUID 또는 경로(데이터 소스 생성별)를 사용하십" "시오." msgid "Location" msgstr "위치" msgid "Mapping Type" msgstr "매핑 타입" msgid "Name" msgstr "이름" msgid "Named Parameter" msgstr "이름 지정된 매개변수" msgid "Number" msgstr "숫자" msgid "Positional Argument" msgstr "위치 인수" msgid "Remove" msgstr "제거" msgid "Required?" msgstr "필수 여부" msgid "" "See https://docs.openstack.org/sahara/latest/user/edp.html for definitions." msgstr "" "https://docs.openstack.org/sahara/latest/user/edp.html 에서 정의를 확인합니" "다." msgid "String" msgstr "문자열" msgid "The step has completed successfully. No events to display." msgstr "이 단계는 성공적으로 완료되었습니다. 표시할 이벤트가 없습니다." msgid "Value Type" msgstr "값 타입" msgid "Verification is not available." msgstr "확인을 사용할 수 없습니다." msgid "Warning!" msgstr "경고!" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/locale/pt_BR/0000775000175000017500000000000000000000000022520 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.592073 sahara-dashboard-16.0.0/sahara_dashboard/locale/pt_BR/LC_MESSAGES/0000775000175000017500000000000000000000000024305 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/pt_BR/LC_MESSAGES/django.po0000664000175000017500000011607300000000000026117 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-22 11:41+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-04-12 06:36+0000\n" "Last-Translator: Copied by Zanata \n" "Language-Team: Portuguese (Brazil)\n" "Language: pt_BR\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid " Done" msgstr "Pronto" msgid " or " msgstr " ou " #, python-format msgid "%(conf_name)s: %(conf_val)s" msgstr "%(conf_name)s: %(conf_val)s" #, python-format msgid "%(conf_name)s: %(conf_value)s" msgstr "%(conf_name)s: %(conf_value)s" #, python-format msgid "%(group)s:" msgstr "%(group)s:" #, python-format msgid "%(key)s: %(val)s" msgstr "%(key)s: %(val)s" #, python-format msgid "%s processes: " msgstr "%s processos:" msgid "-- not selected --" msgstr "-- Não Selecionado --" msgid "Adapt For Oozie" msgstr "Adaptar para Oozie" msgid "Add" msgstr "Adicionar" msgid "Add Node Group" msgstr "Adicionar um Grupo de Nós" msgid "Add libraries to your job template." msgstr "Adicionar bibliotecas ao seu modelo de tarefa." msgid "Anti-affinity enabled for" msgstr "Anti-affinity ativada Para" msgid "Arguments" msgstr "Argumentos" msgid "Auto Security Group" msgstr "Grupo de Segurança Automática" msgid "Auto-configure" msgstr "Auto-configurar" msgid "" "Automatically modify the Hadoop configuration so that job config values are " "set and so that Oozie will handle exit codes correctly." msgstr "" "Modifica automaticamente a configuração do Hadoop para que os valores " "configurados na tarefa sejam definidos e para que o Oozie lide corretamente " "com os códigos de saída." msgid "Availability Zone" msgstr "Zona de disponibilidade" msgid "Base Image" msgstr "Imagem de Base" msgid "Cancel" msgstr "Cancelar" msgid "Checking" msgstr "Verificando" msgid "Choose" msgstr "Escolha" msgid "Choose a main binary" msgstr "Escolha um binário principal" msgid "Choose a shell script" msgstr "Escolha um script shell" msgid "Choose a storage location" msgstr "Escolha o local de armazenamento" msgid "Choose additional files" msgstr "Escolha arquivos adicionais" msgid "Choose an existing Master Node Group Template" msgstr "Selecione um existente Modelo Master de Grupo de Nó." msgid "Choose an existing Worker Node Group Template" msgstr "Escolha um existente Modelo de Grupo de Nó de Trabalho" msgid "Choose an existing file" msgstr "Escolha um arquivo existente" msgid "" "Choose from the list of binaries and click \"choose\" to add the library to " "your job template. This can be repeated for additional libraries." msgstr "" "Escolha da lista de binários e clique \"escolher\" para adicionar a " "biblioteca ao seu modelo de tarefa. Isto pode ser repetido para bibliotecas " "adicionais." msgid "Choose job type" msgstr "Escolha o tipo de tafera" msgid "Choose libraries" msgstr "Escolha bibliotecas" msgid "Choose node group template" msgstr "Escolha um modelo de grupo de nós" msgid "" "Choose or create your main binary. Additional libraries can be added from " "the \"Libs\" tab." msgstr "" "Escolha ou crie o seu binário principal. Bibliotecas adicionais podem ser " "adicionadas a partir do menu \"Bibliotecas\"." msgid "Choose plugin" msgstr "Escolha o Plugin" msgid "Choose plugin and version" msgstr "Escolha o Plugin e a versão" msgid "Choose plugin type and version" msgstr "Escolha o tipo de plugin e a versão" msgid "Choose the Input Data Source (n/a for Java and Shell jobs)." msgstr "" "Escolha a fonte de entrada de dados (n/a para tarefas de Java e Shell)." msgid "Choose the Output Data Source (n/a for Java and Shell jobs)." msgstr "Escolha a saída da fonte de dados (n/a para tarefas de Java e Shell)." msgid "Choose the binary which should be used in this Job." msgstr "Escolha o binário que deve ser utilizada nesta tarefa." msgid "Choose the cluster to use for the job." msgstr "Escolha qual cluster será utilizado para essa tarefa." msgid "Chosen Libraries" msgstr "Bibliotecas Escolhidas" msgid "Cinder volumes" msgstr "Volumes do Cinder" msgid "Cluster" msgstr "Cluster" msgid "Cluster Configuration Overview" msgstr "Visão Geral da Configuração do Cluster" msgid "Cluster Count" msgstr "Contagem de Clusters" msgid "Cluster Creation Guide" msgstr "Guia de Criação de Cluster" msgid "Cluster Events" msgstr "Eventos de Cluster" msgid "Cluster Instances" msgstr "Instâncias do Cluster" msgid "Cluster Name" msgstr "Nome do Cluster" msgid "Cluster Template" msgstr "Modelo do Cluster" #, python-format msgid "Cluster Template %s updated" msgstr "Modelo do Cluster %s atualizado" msgid "Cluster Template Configuration Overview" msgstr "Visão Geral da Configuração do Modelo do Conjunto" #, python-format msgid "Cluster Template copy %s created" msgstr "Cópia de Modelo de Cluster %s criada" msgid "Cluster Templates" msgstr "Modelos de Cluster" msgid "Cluster can be launched using existing Cluster Templates." msgstr "Cluster pode ser lançado usando modelos de cluster existente." msgid "Cluster configurations are not specified" msgstr "As configurações de Cluster não estão especificadas." msgid "Cluster health checks" msgstr "Verificações de saúde do cluster" msgid "Cluster provision steps" msgstr "Passos de provisionamento de cluster" msgid "Cluster share update failed." msgstr "Atualização dos compartilhamentos do cluster falhou." msgid "Cluster template creation failed" msgstr "Falha na criação de modelo de cluster" msgid "Cluster template update failed" msgstr "Atualização do modelo do Cluster falhou." msgid "Cluster type chosen" msgstr "Escolha o tipo de Cluster" msgid "Clusters" msgstr "Clusters" msgid "Completed Successfully" msgstr "Completado com Sucesso" msgid "Configuration" msgstr "Configuração" msgid "Configuration Details" msgstr "Detalhes de Configuração" msgid "Configuration Value" msgstr "Valor de Configuração" msgid "Configure" msgstr "Configurar" msgid "Configure Cluster" msgstr "Configurar Cluster" msgid "Configure Cluster Template" msgstr "Configurar Modelo do Cluster" msgid "Configure Node Group Template" msgstr "Configurar Modelo de Grupo de Nó" msgid "Configure Template" msgstr "Configurar Modelo" msgid "Control access to instances of the node group." msgstr "Controlar o acesso a instâncias do grupo de nós." msgid "Copy Cluster Template" msgstr "Copiar Modelo Cluster" msgid "Copy Template" msgstr "Copiar modelo" msgid "Could not create" msgstr "Não foi possível criar" msgid "Could not create data source" msgstr "Não foi possível criar fonte de dados" msgid "Could not create job template" msgstr "Não foi possível criar o modelo de tarefa" msgid "Could not launch job" msgstr "Não foi possível iniciar a tarefa" msgid "Could not update cluster shares" msgstr "Não foi possível atualizar os compartilhamentos do cluster" msgid "Could not update data source" msgstr "Não foi possível atualizar a fonte de dados" msgid "Count" msgstr "Contagem" msgid "Create" msgstr "Criar" msgid "Create Cluster Template" msgstr "Criar Modelo de Cluster" msgid "Create Data Source" msgstr "Criar uma Fonte de Dados" msgid "Create Job Binary" msgstr "Criar binário da tarefa" msgid "Create Job Template" msgstr "Criar um modelo de tarefa" msgid "Create Node Group Template" msgstr "Criar Modelo de Grupo de Nós" msgid "Create Template" msgstr "Criar modelo" msgid "Create a Cluster Template" msgstr "Criar Modelo de Cluster" msgid "Create a Data Source with a specified name." msgstr "Cria uma Fonte de Dados com um nome específico." msgid "Create a Master Node Group Template" msgstr "Criar um Modelo de Grupo de Nós principal" msgid "Create a Worker Node Group Template" msgstr "Criar um Modelo de Grupo de Nodo de Trabalho" msgid "Create a data source" msgstr "Criar uma fonte de dados" msgid "Create a job template" msgstr "Criar um modelo de tarefa" msgid "Create a job template with a specified name." msgstr "Crie um modelo de tarefa com um nome específico." msgid "Create a script to be uploaded dynamically" msgstr "Crie um script para ser enviado dinamicamente" msgid "Create security group for this Node Group." msgstr "Criar grupo de segurança para este Grupo de Nó" msgid "Create time" msgstr "Tempo de criação" msgid "Create volumes in this availability zone." msgstr "Criar volumes nesta zona de disponibilidade." msgid "Created" msgstr "Criado" msgctxt "Created time" msgid "Created" msgstr "Criado" #, python-format msgid "Created Cluster Template %s" msgstr "Modelo de Cluster %s Criado" #, python-format msgid "Created Node Group Template %s" msgstr "Criado Modelo de Grupo de Nós %s" msgid "Created time" msgstr "Hora da criação" msgid "Current choice:" msgstr "Escolha atual:" msgid "Current type:" msgstr "Tipo atual:" msgid "Data Processing" msgstr "Processamento de Dados" msgid "Data Processing Plugin Details" msgstr "Detalhes de Plugin de Processamento de Dados" msgid "Data Processing Plugins" msgstr "Plugins de Processamento de Dados" msgid "Data Processing internal database" msgstr "Banco de Dados interno do Processamento de Dados" msgid "" "Data Processing provides different storage location options. You may choose " "Ephemeral Drive or a Cinder Volume to be attached to instances." msgstr "" "Processamento de Dados oferece diferentes opções de localização de " "armazenamento. Você pode escolher Drive Efêmero ou um Volume Cinder para ser " "anexado às instâncias." msgid "Data Source" msgstr "Fonte de Dados" msgid "Data Source Type" msgstr "Tipo de Fonte de Dados" msgid "Data Sources" msgstr "Fonte de Dados" msgid "Data source created" msgstr "Fonte de Dados criada" msgid "Data source updated" msgstr "Fonte de Dados atualizada" msgid "Default Value" msgstr "Valor padrão" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Excluir Cluster" msgstr[1] "Excluir Clusters" msgid "Delete Data Source" msgid_plural "Delete Data Sources" msgstr[0] "Excluir Fonte de Dados" msgstr[1] "Excluir Fontes de Dados" msgid "Delete Job" msgid_plural "Delete Jobs" msgstr[0] "Excluir Tarefa" msgstr[1] "Excluir Tarefas" msgid "Delete Job Binary" msgid_plural "Delete Job Binaries" msgstr[0] "Remover Binário da Tarefa" msgstr[1] "Remover Binários da Tarefa" msgid "Delete Job Template" msgid_plural "Delete Job Templates" msgstr[0] "Remover Modelo de Tarefa" msgstr[1] "Remover Modelos de Tarefas" msgid "Delete Template" msgid_plural "Delete Templates" msgstr[0] "Excluir Modelo" msgstr[1] "Excluir Modelos" msgid "Deleted Cluster" msgid_plural "Deleted Clusters" msgstr[0] "Cluster Excluído" msgstr[1] "Clusters Excluídos" msgid "Deleted Data Source" msgid_plural "Deleted Data Sources" msgstr[0] "Fonte de Dados Excluída" msgstr[1] "Fontes de Dados Excluídas" msgid "Deleted Job" msgid_plural "Deleted Jobs" msgstr[0] "Tarefa Excluída" msgstr[1] "Tarefas Excluídas" msgid "Deleted Job Binary" msgid_plural "Deleted Job Binaries" msgstr[0] "Binário da Tarefa Removido" msgstr[1] "Binários da Tarefa Removidos" msgid "Deleted Job Template" msgid_plural "Deleted Jobs Templates" msgstr[0] "Modelo de Tarefa Removido" msgstr[1] "Modelos de Tarefas Removidos" msgid "Deleted Template" msgid_plural "Deleted Templates" msgstr[0] "Modelo Excluído" msgstr[1] "Modelos Excluídos" msgid "Description" msgstr "Descrição" msgid "Details" msgstr "Detalhes" msgid "Done" msgstr "Pronto" msgctxt "Current status of a Job" msgid "Done with Error" msgstr "Finalizado com erro" msgid "Download Job Binary" msgstr "Baixar Binário da Tarefa" msgid "Download job binary" msgstr "Baixar o binário da tarefa" msgid "Duration" msgstr "Duração" msgid "Edit Cluster Template" msgstr "Editar Modelo do Cluster" msgid "Edit Data Source" msgstr "Editar Fonte de Dados" msgid "Edit Image Tags" msgstr "Editar Tags de Imagem" msgid "Edit Job Binary" msgstr "Editar Binário da Tarefa" msgid "Edit Node Group Template" msgstr "Edite o Modelo de Grupo de Nós" msgid "Edit Tags" msgstr "Editar Tags" msgid "Edit Template" msgstr "Editar modelo" msgid "Enable Swift Paths" msgstr "Habilitar caminhos do Swift" msgctxt "End time" msgid "Ended" msgstr "Finalizado" msgid "Enter any custom configuration required for your job's execution." msgstr "" "Digite qualquer configuração personalizada necessária para a execução do seu " "job." msgid "Enter the URL for the file" msgstr "Digite a URL para o arquivo" msgid "Enter the username and password required to access that file" msgstr "" "Digite o nome de usuário e a senha necessários para acessar esse arquivo" msgid "Ephemeral drive" msgstr "Drive Efêmero " msgid "Error Details" msgstr "Detalhes do erro" msgid "Event time" msgstr "Horário do Evento" msgid "Failed" msgstr "Falhou" msgctxt "Current status of a Job" msgid "Failed" msgstr "Falhou" msgid "Failed to fetch internal binary list" msgstr "Falha ao buscar a lista de binários internos" msgid "Failed to get list of internal binaries." msgstr "Falaha ao obter lista de binários internos." msgid "Failed to get list of shares" msgstr "Não foi possível obter a lista de compartilhamentos" msgid "Failed to update image." msgstr "Falha ao atualizar imagem." msgid "Filter" msgstr "Filtro" msgid "Flavor" msgstr "Sabor" msgid "Flavor is not specified" msgstr "Sabor não é especificado" msgid "Floating IP Pool" msgstr "Pool de IPs flutuantes" msgid "" "For Data Processing internal job binaries, you may choose from the following:" msgstr "" "Para binários internos de tarefas de Processamento de Dados, você pode " "escolher entre os seguintes:" msgid "" "For Data Sources on a Manila share, choose the share and enter the path " "relative to the share (example: /outputdir/myinputfile.txt)" msgstr "" "Para Fontes de Dados em compartilhamentos do Manila, escolha o " "compartilhamento e digite o caminho relativo ao compartilhamento (exemplo: /" "meudir/meuarquivo.txt)" msgid "For Object Store job binaries, you must:" msgstr "Para binários de tarefas de Armazenamento de Objetos, você deve:" msgid "" "For Shell Action jobs, any required files beyond the main script may be " "added as \"libraries\"." msgstr "" "Para tarefas de ações Shell, quaisquer arquivos necessários além do script " "principal devem ser adicionados como \"bibliotecas\"." msgid "General Info" msgstr "Informações gerais" msgid "Guided Cluster Creation" msgstr "Criação de Cluster Guiada" msgid "Guided Job Execution" msgstr "Execução de Tarefa Guiada" msgid "HDFS placement" msgstr "colocação HDFS" msgid "Health" msgstr "Saúde" msgid "Hide full configuration" msgstr "Esconder configuração completa" msgid "Hive" msgstr "Hive" msgid "ID" msgstr "ID" #, python-format msgid "" "If selected, %s will be protected from modifications until this will be " "unselected" msgstr "" "Se selecionado, %s será protegido de modificações até que isto sejá " "desmarcado" #, python-format msgid "If selected, %s will be shared across the tenants" msgstr "Se selecionado, %s será compartilhado entre os locatários" msgid "" "If selected, instances of a cluster will be automatically configured during " "creation. Otherwise you should manually specify configuration values" msgstr "" "Se selecionado, instâncias de um cluster serão automaticamente configuradas " "durante a criação. Caso contrário você deve manualmente especificar valores " "de configuração" msgid "" "If selected, instances of a node group will be automatically configured " "during cluster creation. Otherwise you should manually specify configuration " "values." msgstr "" "Se selecionado, as instâncias de um grupo de nós serão configuradas " "automaticamente durante a criação do cluster. Caso contrário, você deve " "especificar manualmente os valores de configuração." msgid "Image" msgstr "Imagem" msgid "Image Registry" msgstr "Registro de Imagem" msgid "" "Image Registry is used to provide additional information about images for " "Data Processing." msgstr "" "Registro de imagem é utilizado para fornecer informações adicionais sobre as " "imagens para processamento de dados." msgid "Image Registry tool:" msgstr "Ferramenta de registro de imagem:" msgid "In progress" msgstr "Em progresso" msgid "Info" msgstr "Informação" msgid "Input" msgstr "Entrada" msgid "Input Data Source" msgstr "Fonte de Dados de Entrada" msgid "Instance" msgstr "Instância" msgid "Instance and attached volumes will be created on the same physical host" msgstr "Instâncias e volumes anexados serão criados no mesmo host físico" msgid "Instances" msgstr "Instâncias" msgid "Instances Count" msgstr "Contagem de instâncias " msgid "Interface Arguments" msgstr "Argumentos da interface" msgid "Internal Binary" msgstr "Binário Interno" msgid "Internal IP" msgstr "IP interno" msgid "Internal binary" msgstr "Binário interno" msgid "Java" msgstr "Java" msgid "Java Action" msgstr "Ação Java" msgid "Java Opts" msgstr "Java Opts" msgid "Job" msgstr "Tarefa" msgid "Job Binaries" msgstr "Binários de Tarefas" msgid "Job Configuration" msgstr "Configuração da tarefa" msgid "Job Execution ID" msgstr "ID de execução da tarefa" msgid "Job Guide" msgstr "Guia de tarefa" msgid "Job Template" msgstr "Modelo de Tarefa" msgid "Job Templates" msgstr "Modelos de Tarefa" msgid "Job Type" msgstr "Tipo de Tarefa" msgid "Job args" msgstr "Argumentos da tarefa" msgid "Job configs" msgstr "Configurações da tarefa" msgid "Job created" msgstr "Tarefa criada" msgid "Job launched" msgstr "Tarefa iniciada" msgid "Job params" msgstr "Parâmetros da tarefa" msgid "Job template:" msgstr "Modelo de tarefa:" msgid "Job type chosen" msgstr "Tipo de tarefa escolhido" msgid "Jobs" msgstr "Tarefas" msgid "Keypair" msgstr "Par de chaves" msgctxt "Current status of a Job" msgid "Killed" msgstr "Morto" msgid "Last Updated" msgstr "Última Atualização" msgid "Launch" msgstr "Iniciar" msgid "Launch Cluster" msgstr "Iniciar Cluster" #, fuzzy msgid "Launch Job" msgid_plural "Launch Jobs" msgstr[0] "Iniciar Tarefa" msgstr[1] "Iniciar Tarefas" msgid "Launch On Existing Cluster" msgstr "Iniciar Em Cluster Existente" msgid "Launch On New Cluster" msgstr "Iniciar Em Novo Cluster" msgid "Launch a Cluster" msgstr "Iniciar um Cluster" msgid "Launch instances in these security groups." msgstr "Disparar instâncias nestes grupos de segurança." msgid "Launch instances in this availability zone." msgstr "Iniciar instâncias nesta zona de disponibilidade" msgid "Launch job" msgstr "Iniciar Tarefa" msgid "Launch the given job template on a cluster." msgstr "Inicie o seguinte modelo de tarefa em um cluster." #, python-format msgid "Launched Cluster %s" msgstr "Cluster %s Iniciado" msgid "Launched Job" msgid_plural "Launched Jobs" msgstr[0] "Tarefa Iniciada" msgstr[1] "Tarefas Iniciadas" msgid "Libs" msgstr "Bibliotecas" msgid "Location" msgstr "Localização" msgid "Main Class" msgstr "Classe principal" msgid "Mains" msgstr "Mains" msgid "Management IP" msgstr "IP de gerenciamento" msgid "Manila share" msgstr "Compartilhamento do Manila" msgid "MapReduce" msgstr "MapReduce" msgid "Mapper" msgstr "Mapeador" msgid "Mapping Type" msgstr "Tipo de Mapeamento" msgid "Master Node Group Template:" msgstr "Modelo de Grupo de Nó principal:" msgid "" "Modify the configuration so that swift URLs can be dereferenced through HDFS " "at runtime." msgstr "" "Modifique a configuração para que as URLs do swift possam ser referenciadas " "através do HDFS em tempo de execução." msgid "Name" msgstr "Nome" #, python-format msgid "Name: %(node_group_name)s" msgstr "Nome: %(node_group_name)s" msgid "Named Parameter" msgstr "Parâmetro Nomeado" msgid "Neutron Management Network" msgstr "Rede de Gerenciamento" msgid "Never" msgstr "Nunca" msgid "Next" msgstr "Próximo" msgid "No Cluster Template Created" msgstr "Sem modelo de cluster criado" msgid "No Images Available" msgstr "Nenhuma Imagem Disponível" msgid "No Master Node Group Template Created" msgstr "Nenhum Modelo de Grupo de Nodo Master Criado" msgid "No Templates Available" msgstr "Nenhum Modelo Disponível" msgid "No Worker Node Group Template Created" msgstr "Nenhum Modelo de Grupo de Nodo Criado" msgid "No availability zone specified" msgstr "Nenhuma zona de disponibilidade especificada" msgid "No configurations" msgstr "Nenhuma configuração" msgid "No description" msgstr "Sem descrição" msgid "No image specified" msgstr "Nenhuma imagem especificada" msgid "No images available." msgstr "Nenhuma imagem disponível." msgid "No info available" msgstr "Sem informação disponível" msgid "No job template created" msgstr "Nenhum modelo de tarefa criado" msgid "No keypair" msgstr "Sem par de chaves." msgid "No plugin chosen" msgstr "Nenhum plugin escolhido" msgid "No type chosen" msgstr "Nenhum tipo escolhido" msgid "No volume type" msgstr "Sem tipo de volume" msgid "Node Group" msgstr "Grupo de Nós" #, python-format msgid "Node Group Name: %(node_group_name)s" msgstr "Nome do Grupo de Nó %(node_group_name)s" msgid "Node Group Template" msgstr "Modelo de Grupo de Nós" #, python-format msgid "Node Group Template %s updated" msgstr "Modelo de grupo de nós \"%s\" foi atualizado." #, python-format msgid "Node Group Template copy %s created" msgstr "Cópia do modelo do Grupo de Nó %s criado" msgid "Node Group Templates" msgstr "Modelo de Grupo de Nós" #, python-format msgid "Node Group: %(node_group_name)s" msgstr "Grupo de Nó: %(node_group_name)s" msgid "Node Groups" msgstr "Grupos de nós" msgid "Node Groups Configuration Overview" msgstr "Visão Geral de Configuração do Nó de Grupos" msgid "Node Processes" msgstr "Processos do Nó" msgid "Node group cluster" msgstr "Cluster do Grupo de Nós" msgid "Node group configurations are not specified" msgstr "As Configurações de Grupos de Nós não estão específicadas" msgid "Node processes are not specified" msgstr "Processos de Nós não estão específicados" msgid "Nodes Count" msgstr "Contagem de Nós" msgid "None" msgstr "Nenhum" msgid "Not available" msgstr "Não disponível" msgid "Number" msgstr "Número" msgid "Number of Nodes" msgstr "Número de nós" msgid "Number of clusters to launch." msgstr "Número de clusters para disparar " msgid "Oozie Job ID" msgstr "ID de tarefa Oozie" msgid "OpenStack Flavor" msgstr "Distribuição OpenStack" msgid "Output" msgstr "Saída" msgid "Output Data Source" msgstr "Fonte de Dados de Saída" msgid "Parameters" msgstr "Parâmetros" msgid "Password" msgstr "Senha" msgid "Path" msgstr "Caminho" msgid "Path on share" msgstr "Caminho no compartilhamento" msgid "Persist cluster after job exit" msgstr "Manter o cluster após o término da tarefa" msgid "Pig" msgstr "Pig" msgid "Plugin" msgstr "Plugin" msgid "Plugin Name" msgstr "Nome do Plugin" msgid "Plugin name" msgstr "Nome do Plugin" msgid "Plugin:" msgstr "Plugin:" msgid "Plugins" msgstr "Plugins" msgid "Positional Argument" msgstr "Argumento Posicional" msgid "Progress" msgstr "Progresso" msgid "Project ID" msgstr "ID do Projeto" msgid "Protected" msgstr "Protegido" msgid "Proxy Gateway" msgstr "Proxy Gateway" msgid "Public" msgstr "Público" msgid "Read only" msgstr "Somente leitura" msgid "Read/Write" msgstr "Leitura/Escrita" msgid "Reducer" msgstr "Redutor" msgid "Register Image" msgstr "Registrar Imagem" msgid "Relaunch On Existing Cluster" msgstr "Reiniciar em cluster existente." msgid "Relaunch On New Cluster" msgstr "Reiniciar em um novo cluster" msgid "Remove" msgstr "Remover" msgid "Required" msgstr "Requerido" msgid "Reset Cluster Creation Guide" msgstr "Redefinir Guia de Criação de Cluster" msgid "Reset Cluster Guide" msgstr "Guia de Reset de Cluster" msgid "Reset Job Execution Guide" msgstr "Reiniciar Guia de Execução de Tarefa" msgid "Return Code" msgstr "Código de retorno" msgid "Run HBase EDP Jobs with common HBase library on HDFS" msgstr "Execute tarefas HBase EDP com a biblioteca comum HBase no HDFS" msgid "" "Sahara will use instances of this node group to access other cluster " "instances." msgstr "" "Sahara vai usar instâncias desse grupo de nó para acessar outros clusters de " "instâncias." msgid "Scale" msgstr "Escala" msgid "Scale Cluster" msgstr "Escalar Cluster" msgid "Scale cluster operation failed" msgstr "Operação de escalar cluster falhou" msgid "Scaled cluster successfully started." msgstr "Cluster dimensionado iniciado com sucesso." msgid "Script name" msgstr "Nome do script" msgid "Script text" msgstr "Texto do script" msgid "Security" msgstr "Segurança" msgid "Security Groups" msgstr "Grupos de Segurança" msgid "Select" msgstr "Selecione" msgid "Select Image" msgstr "Selecione a Imagem" msgid "Select Node Group Processes" msgstr "Selecione um Grupo de Nós de Processos" msgid "Select Shares" msgstr "Selecione os Compartihamentos" msgid "Select a Node Group Template to add:" msgstr "Selecione um Modelo de Grupo de Nós para adicionar:" msgid "Select a Value Type for your next argument:" msgstr "Selecione um Tipo de Valor para o seu próximo argumento:" msgid "Select a plugin and version for a new Cluster template." msgstr "Selecione um plugin e versão para um novo modelo de Cluster." msgid "Select a plugin and version for a new Cluster." msgstr "Selecione um plugin e uma versão para um novo Cluster." msgid "Select a plugin and version for the new Node Group template." msgstr "Selecione um plugin e versão para o novo Modelo de Grupo de Nós." msgid "" "Select an existing node group template.\n" " " msgstr "" "Selecione um modelo de grupo de nó existente.\n" " " msgid "Select node processes for the node group" msgstr "Selecione processos de nó para o grupo de nó" msgid "Select plugin and hadoop version" msgstr "Escolha um plugin e versão do hadoop" msgid "Select plugin and hadoop version for cluster" msgstr "Escolha um plugin e versão do Hadoop para clusters" msgid "Select plugin and hadoop version for cluster template" msgstr "Escolha um plugin e versão do Hadoop para o modelo de cluster" msgid "Select property name" msgstr "Selecione o nome da propriedade" msgid "Select the manila shares for this cluster" msgstr "Selecione os compartilhamentos do manila para este cluster" msgid "Select the manila shares for this node group" msgstr "Selecione os compartilhamentos do manila para este grupo de nós" msgid "Select the storage type for your job binary." msgstr "Selecione o tipo de armazenamento para o binário da sua tarefa." msgid "Select the type of your Data Source." msgstr "Selecione o tipo da sua Fonte de Dados." msgid "Select the type of your job:" msgstr "Selecione o tipo da sua tarefa:" msgid "Select type" msgstr "Selecione o tipo" msgid "Service Configurations" msgstr "Configurações de Serviço" msgid "Share" msgstr "Compartilhamento" msgid "Shares" msgstr "Compartilhamentos" msgid "Shell" msgstr "Shell" msgid "Shell Action" msgstr "Ação Shell" msgid "Show full configuration" msgstr "Mostrar configuração completa" msgid "Source password" msgstr "Senha da Fonte" msgid "Source username" msgstr "Nome de usuário da Fonte" msgid "Spark" msgstr "Spark" msgid "" "Specified User Name will be used by Data Processing to apply configs and " "manage processes on instances." msgstr "" "Nome de usuário especificado será usado pelo Processamento de Dados para " "aplicar configurações e gerenciar os processos em instâncias." msgid "Start Verification" msgid_plural "Start Verifications" msgstr[0] "Iniciar Verificação" msgstr[1] "Iniciar Verificações" msgctxt "Start time" msgid "Started" msgstr "Iniciado" msgid "Started Verification" msgid_plural "Started Verifications" msgstr[0] "Verificação Iniciada" msgstr[1] "Verificações Iniciadas" msgid "Started at" msgstr "Iniciado em" msgid "Status" msgstr "Status" msgid "Status description" msgstr "Descrição do estado" msgid "Step Description" msgstr "Descrição dos passo" msgid "Storage type" msgstr "Tipo de Armazenamento" msgid "Storm" msgstr "Storm" msgid "Streaming MapReduce" msgstr "Transmitindo MapReduce" msgid "String" msgstr "String" msgid "" "Substitute data source objects for URLs of the form datasource://name or " "uuid." msgstr "" "Substitua objetos de fontes de dados por URLs no formato datasource://nome " "ou uuid." msgctxt "Current status of a Job" msgid "Succeeded" msgstr "Bem sucedido" msgid "Successfully updated image." msgstr "Imagem atualizada com sucesso." msgid "Supported Versions" msgstr "Versões suportadas" msgid "Swift" msgstr "Swift" msgid "Tags" msgstr "Tags" msgid "Template" msgstr "Modelo" msgid "Template Name" msgstr "Nome do Modelo" msgid "Template not specified" msgstr "Modelo não especificado" msgid "" "The Cluster object should specify OpenStack Image to boot instances for " "Cluster." msgstr "" "O objeto de Cluster deveria especificar a Imagem OpenStack para iniciar as " "instâncias do Cluster." msgid "The value of shares must be a list of values" msgstr "O valor dos compartilhamentos deve ser uma lista de valores" msgid "This Cluster Template will be created for:" msgstr "Este Modelo de Agrupamento será criado para:" msgid "This Cluster will be started with:" msgstr "Este Cluster será iniciado com:" msgid "This Node Group Template will be created for:" msgstr "Este Modelo de Grupo de Nó será criado para:" msgid "Title" msgstr "Título" msgid "Type" msgstr "Tipo" msgid "URL" msgstr "URL" msgid "Unable to create job binary" msgstr "Não foi possível criar binário da tarefa" msgid "Unable to create new cluster for job." msgstr "Não é possível criar novo cluster para a tarefa" msgid "Unable to create the cluster" msgstr "Não foi possível criar o cluster" #, python-format msgid "Unable to fetch Base Image with id: %s." msgstr "Não foi possível obter a Imagem de Base com id: %s" msgid "Unable to fetch available images." msgstr "Não foi possível obter imagens disponíveis." msgid "Unable to fetch cluster list" msgstr "Não foi possível obter a lista de cluster" msgid "Unable to fetch cluster template list" msgstr "Não foi possível obter a lista de modelo de cluster" msgid "Unable to fetch cluster template." msgstr "Não foi possível obeter modelo de cluster." msgid "Unable to fetch cluster to scale" msgstr "Não foi possível obter cluster para escalar." msgid "Unable to fetch cluster to scale." msgstr "Não foi possível obter cluster para escalar." msgid "Unable to fetch cluster." msgstr "Não foi possível obter cluster." msgid "Unable to fetch clusters." msgstr "Não foi possível obter clusters." msgid "Unable to fetch data source list" msgstr "Não foi possível buscar a lista de fontes de dados" msgid "Unable to fetch data sources." msgstr "Não foi possível buscar a fonte de dados." msgid "Unable to fetch flavor for template." msgstr "Não é possível buscar o tipo de modelo" msgid "Unable to fetch floating ip pools." msgstr "Não foi possível obter os conjuntos de IPs flutuantes." msgid "Unable to fetch image choices." msgstr "Não foi possível buscar as escolhas de imagem." msgid "Unable to fetch instance details." msgstr "Não foi possível obter detalhes da instância" msgid "Unable to fetch job binary list" msgstr "Não foi possível buscar a lista de binários da tarefa" #, python-format msgid "Unable to fetch job binary: %(exc)s" msgstr "Não foi possível buscar o binário da tarefa: %(exc)s" msgid "Unable to fetch job list" msgstr "Não foi possível obter a lista de tarefas" msgid "Unable to fetch job template list" msgstr "Não foi possível obter a lista de modelos de tarefa" msgid "Unable to fetch jobs." msgstr "Não foi possível obter jobs" msgid "Unable to fetch keypair choices." msgstr "Não foi possível obter opções de par de chaves." msgid "Unable to fetch node group details." msgstr "Não foi possível obter detalhes do grupo de nós." msgid "Unable to fetch node group template list" msgstr "Não foi possível obter a lista de modelos de grupo de nós." msgid "Unable to fetch plugin details." msgstr "Não foi possível obter detalhes do plugin." msgid "Unable to fetch plugin list" msgstr "Não foi possível buscar a lista de plugins" msgid "Unable to fetch template object." msgstr "Não foi possível obter o objeto modelo." msgid "Unable to fetch template to copy." msgstr "Não foi possível obter modelo para copiar." msgid "Unable to fetch template to edit." msgstr "Não foi possível obter o modelo para edição." msgid "Unable to fetch the image details" msgstr "Não foi possível obter os detalhes da imagem" msgid "Unable to generate process choices." msgstr "Não foi possível gerar opções de processo." msgid "Unable to get node group details." msgstr "Não foi possível obter detalhes do node group" msgid "Unable to get security group list." msgstr "Não foi possível obter a lista de grupo de segurança." msgid "Unable to launch job." msgstr "Não é possível iniciar a tarefa." msgid "Unable to populate anti-affinity processes." msgstr "Incapaz de preencher os processos anti-afinidade." msgid "Unable to process plugin tags" msgstr "Não é possível processar as tags do plugin" msgid "Unable to retrieve data processing plugins." msgstr "Não foi possível obter plugins de processamento de dados." #, python-format msgid "Unable to retrieve details for cluster \"%s\"." msgstr "Não foi possível obter detalhes para o cluster \"%s\"." #, python-format msgid "Unable to retrieve details for cluster template \"%s\"." msgstr "Não foi possível obter detalhes para o modelo de cluster \"%s\"." #, python-format msgid "Unable to retrieve details for data source \"%s\"." msgstr "Não foi possível obter detalhes da fonte de dados \"%s\"." #, python-format msgid "Unable to retrieve details for job \"%s\"." msgstr "Não foi possível obter detalhes da sua tarefa \"%s\"." #, python-format msgid "Unable to retrieve details for job binary \"%s\"." msgstr "Não foi possível obter detalhes do binário da tarefa \"%s\"." #, python-format msgid "Unable to retrieve details for job template \"%s\"." msgstr "Não foi possível obter detalhes para o modelo de tarefa \"%s\"." #, python-format msgid "Unable to retrieve details for node group template \"%s\"." msgstr "Não foi possível obter detalhes para o modelo de grupo de nós \"%s\"." msgid "Unable to retrieve image list" msgstr "Não é possível recuperar lista de imagens" #, python-format msgid "Unable to retrieve images with filter %s." msgstr "Não é possível recuperar as imagens com filtro %s." #, python-format msgid "Unable to retrieve job binary \"%s\"." msgstr "Não foi possível obter o binário da tarefa \"%s\"." msgid "Unable to retrieve networks." msgstr "Não foi possível recuperar as redes." msgid "Unable to retrieve plugin." msgstr "Não foi possível obter o plugin." #, python-format msgid "Unable to retrieve security group %(group)s." msgstr "Não foi possível obter o grupo de segurança %(group)s." msgid "Unable to set cluster type" msgstr "Não é possível definir o tipo de cluster" msgid "Unable to set job type" msgstr "Não é possível definir o tipo de tarefa" msgid "Unable to set node group template" msgstr "Não foi possível definir o modelo de grupo de nós." msgid "Unable to update job binary" msgstr "Não foi possível atualizar o binário da tarefa" msgid "Unable to update row" msgstr "Não foi possível atualizar a linha" msgid "Unable to upload job binary" msgstr "Não foi possível enviar binário da tarefa" msgid "Unknown" msgstr "Desconhecido" msgid "Unnecessary tags may be removed by clicking a cross near tag's name." msgstr "" "Etiquetas desnecessárias podem ser removidos clicando no nome de uma " "etiqueta." msgid "Unregister Image" msgid_plural "Unregister Images" msgstr[0] "Cancelar o Registro da Imagem" msgstr[1] "Cancelar o Registro das Imagens" msgid "Unregistered Image" msgid_plural "Unregistered Images" msgstr[0] "Imagem não-registrada" msgstr[1] "Imagens não-registradas" msgid "Update" msgstr "Atualizar" msgid "Update Cluster Shares" msgstr "Atualizar Compartilhamentos do Cluster" msgid "Update Shares" msgstr "Atualizar Compartilhamentos" msgid "Updated" msgstr "Atualizado" msgid "Updated time" msgstr "Hora da atualização" msgid "Upload" msgstr "Enviar" msgid "Upload File" msgstr "Enviar Arquivo" msgid "Upload Template" msgstr "Upload de modelo" msgid "Upload a new file" msgstr "Envie um novo arquivo" msgid "Url" msgstr "Url" msgid "Use Data Source Substitution for Names and UUIDs" msgstr "Utilize a substituição de Fontes de Dados para nomes e UUIDs" msgid "Use HBase Common library" msgstr "Usar biblioteca HBase Common" msgid "Use anti-affinity groups for processes" msgstr "Use grupos anti-afinidade para processos" msgid "Use anti-affinity groups for: " msgstr "Use grupos anti-afinidade para:" msgid "Use auto-configuration" msgstr "Utilizar auto-configuração" msgid "User Name" msgstr "Nome do Usuário" msgid "User has to choose a keypair to have access to clusters instances." msgstr "" "O usuário precisa escolher um par de chaves para ter acesso a instâncias de " "clusters." msgid "Username" msgstr "Nome de usuário" msgid "Value" msgstr "Valor" msgid "Value Type" msgstr "Tipo de Valor" msgid "Version" msgstr "Versão" msgid "Version:" msgstr "Versão:" msgid "Volume local to instance" msgstr "Local do volume para a instância" msgid "Volumes Availability Zone" msgstr "Zona de Disponibilidade de Volumes" msgid "Volumes local to instance" msgstr "Volumes locais para a instância" msgid "Volumes per node" msgstr "Volumes por nó." msgid "Volumes size" msgstr "Tamanho dos Volumes" msgid "Volumes size (GB)" msgstr "Tamanho dos Volumes (GB)" msgid "Volumes type" msgstr "Tipo de volumes" msgid "Which keypair to use for authentication." msgstr "Qual par de chaves utilizar para autenticação" msgid "Worker Node Group Template:" msgstr "Modelo de Grupo de Nó de trabalho" msgid "You may also add any custom tag." msgstr "Você também pode adicionar qualquer etiqueta personalizada." msgid "You may also enter an optional description for your Data Source." msgstr "" "Você pode também digitar uma descrição opcional para a sua Fonte de Dados." msgid "You may also enter an optional description for your job binary." msgstr "" "Você podem também digitar uma descrição opcional para o binário da sua " "tarefa." msgid "You may also enter an optional description for your job template." msgstr "" "Você também pode digitar uma descrição opcional para o seu modelo de tarefa." msgid "You may need to enter the username and password for your Data Source." msgstr "" "Você pode precisar digitar o nome de usuário e senha para a sua Fonte de " "Dados." msgid "You may set cluster scoped configurations on corresponding tabs." msgstr "" "Você pode definir configurações de escopo do cluster nas guias " "correspondentes." msgid "" "You must choose a flavor to determine the size (VCPUs, memory and storage) " "of all launched VMs." msgstr "" "Você precisa escolher o sabor para determinar o tamanho (VCPUs, memória e " "armazenamento) de todas as VMs criadas." msgid "cluster" msgstr "cluster" msgid "cluster template" msgstr "modelo do cluster" msgid "data source" msgstr "fonte de dados" msgid "job" msgstr "Tarefa" msgid "job binary" msgstr "binário da tarefa" msgid "no processes" msgstr "nenhum processo" msgid "node group template" msgstr "Modelo de grupo de nó" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/pt_BR/LC_MESSAGES/djangojs.po0000664000175000017500000000375600000000000026457 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-02-17 13:24+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-04-12 06:37+0000\n" "Last-Translator: Copied by Zanata \n" "Language-Team: Portuguese (Brazil)\n" "Language: pt_BR\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" msgid "(show events)" msgstr "(mostrar eventos)" msgid "Configuration Value" msgstr "Valor de configuração" msgid "Data Source" msgstr "Fonte de Dados" msgid "Default Value" msgstr "Valor padrão" msgid "Description" msgstr "Descrição" msgid "Event log is not available." msgstr "Log de eventos não está disponível." msgid "" "For configs and params, type the key name; for args, type the index as an " "integer, starting from 0." msgstr "" "Para configurações e parâmetros, digite o nome da chave; para argumentos, " "digite o índice como um número inteiro, a partir de 0." msgid "" "For data sources, use a data source UUID or a path (as per data source " "creation.)" msgstr "" "Para fontes de dados, use o UUID ou um caminho (como definido na criação da " "fonte de dados)." msgid "Location" msgstr "Localização" msgid "Mapping Type" msgstr "Tipo de Mapeamento" msgid "Name" msgstr "Nome" msgid "Named Parameter" msgstr "Parâmetro Nomeado" msgid "Number" msgstr "Número" msgid "Positional Argument" msgstr "Argumento posicional" msgid "Remove" msgstr "Remover" msgid "Required?" msgstr "Necessário?" msgid "String" msgstr "String" msgid "The step has completed successfully. No events to display." msgstr "A etapa foi concluída com sucesso. Não há eventos para exibir." msgid "Value Type" msgstr "Tipo de Valor" msgid "Verification is not available." msgstr "Verificação não está disponível." ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/locale/ru/0000775000175000017500000000000000000000000022140 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.592073 sahara-dashboard-16.0.0/sahara_dashboard/locale/ru/LC_MESSAGES/0000775000175000017500000000000000000000000023725 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/ru/LC_MESSAGES/django.po0000664000175000017500000022167100000000000025540 0ustar00zuulzuul00000000000000# Aleksey Alekseenko <9118250541@mail.ru>, 2016. #zanata # Alexander , 2016. #zanata # Andreas Jaeger , 2016. #zanata # Maxim Bozhenko , 2016. #zanata # Valentin Chikunov , 2016. #zanata # Roman Gorshunov , 2020. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-03-31 20:53+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2020-04-03 11:27+0000\n" "Last-Translator: Roman Gorshunov \n" "Language-Team: Russian\n" "Language: ru\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" msgid " Done" msgstr "Сделано" msgid " or " msgstr "или " #, python-format msgid "%(conf_name)s: %(conf_val)s" msgstr "%(conf_name)s: %(conf_val)s" #, python-format msgid "%(conf_name)s: %(conf_value)s" msgstr "%(conf_name)s: %(conf_value)s" #, python-format msgid "%(group)s:" msgstr "%(group)s:" #, python-format msgid "%(key)s: %(val)s" msgstr "%(key)s: %(val)s" #, python-format msgid "%s processes: " msgstr "%s процессов: " msgid "-- not selected --" msgstr "-- не выбрано --" msgid "" "Important: The name that you give your job binary will be the name " "used in your job execution. If your binary requires a particular name or " "extension (ie: \".jar\"), be sure to include it here." msgstr "" "Важно: Имя. которое вы даете вашим исполняемым файлам будет именем " "использованным в выполнении задачи. Если ваши исполняемые файлы требуют " "определенного имени или расширения (т.е.: \".jar\"), обязательно укажите это " "здесь." msgid "Access Key" msgstr "Ключ доступа" msgid "Adapt For Oozie" msgstr "Адаптировать для Oozie" msgid "Add" msgstr "Добавить" msgid "Add Node Group" msgstr "Добавить группу узлов" msgid "Add libraries to your job template." msgstr "Добавить библиотеки в ваш шаблон задачи." msgid "Anti-affinity enabled for" msgstr "Анти-аффинность разрешена для" msgid "Arguments" msgstr "Аргументы" msgid "Attached storage location" msgstr "Расположение подключенных дисков" msgid "Auto Security Group" msgstr "Автоматическая группа безопасности" msgid "Auto-configure" msgstr "Авто-конфигурация" msgid "" "Automatically modify the Hadoop configuration so that job config values are " "set and so that Oozie will handle exit codes correctly." msgstr "" "Автоматически изменить конфигурацию Hadoop для задания конфигурационных " "значений задач, так чтобы Oozie корректно воспринимал коды возврата." msgid "Availability Zone" msgstr "Зона доступности" msgid "Base Image" msgstr "Базовый образ" msgid "Boot Volume AZ" msgstr "AZ загрузочного тома" msgid "Boot Volume locality" msgstr "Расположение загрузочного тома" msgid "Boot Volume type" msgstr "Тип загрузочного тома" msgid "Boot from Volume" msgstr "Загрузка с тома" msgid "Boot storage location" msgstr "Расположение загрузочного диска" msgid "Boot volume availability Zone" msgstr "Зона доступности загрузочного тома" msgid "Boot volume availability zone" msgstr "Зона доступности загрузочного тома" msgid "Boot volume local to instance" msgstr "Локальный загрузочный диск для инстанса" msgid "Boot volume locality" msgstr "Расположение загрузочного тома" msgid "Boot volume type" msgstr "Тип загрузочного тома" msgid "Cancel" msgstr "Отмена" msgid "Checked?" msgstr "Проверено?" msgid "Checking" msgstr "Проверка" msgid "Choose" msgstr "Выбрать" msgid "Choose a boot mode" msgstr "Выберите режим загрузки" msgid "Choose a main binary" msgstr "Выбрать основной исполняемый файл" msgid "Choose a shell script" msgstr "Выберите скрипт shell" msgid "Choose a storage location" msgstr "Выбрать место хранения" msgid "Choose additional files" msgstr "Выберите дополнительные файлы" msgid "Choose an existing Master Node Group Template" msgstr "Выберите существующий шаблон группы узлов Master." msgid "Choose an existing Worker Node Group Template" msgstr "Выберите существующий шаблон группы узлов Worker." msgid "Choose an existing file" msgstr "Выбрать существующий файл" msgid "" "Choose from the list of binaries and click \"choose\" to add the library to " "your job template. This can be repeated for additional libraries." msgstr "" "Выберите из списка исполняемых файлов и нажмите \"выбрать\" чтобы добавить " "библиотеку в ваш шаблон. Это можно выполнить несколько раз для " "дополнительных библиотек." msgid "Choose job type" msgstr "Выберите тип задачи" msgid "Choose libraries" msgstr "Выбрать библиотеки" msgid "Choose node group template" msgstr "Выберите шаблон группы узлов" msgid "" "Choose or create your main binary. Additional libraries can be added from " "the \"Libs\" tab." msgstr "" "Выбрать или создать ваш основной исполняемый файл. Дополнительные " "библиотеки могут быть добавлены во вкладке \"Библиотеки\"." msgid "Choose plugin" msgstr "Выбрать плагин" msgid "Choose plugin and version" msgstr "Выберите плагин и версию" msgid "Choose plugin type and version" msgstr "Выберите тип и версию плагина" msgid "Choose the Input Data Source (n/a for Java and Shell jobs)." msgstr "" "Выберите входящий источник данных (недоступно для задач Java и Shell)." msgid "Choose the Output Data Source (n/a for Java and Shell jobs)." msgstr "" "Выберите исходящий источник данных (недоступно для задач Java и Shell)." msgid "Choose the binary which should be used in this Job." msgstr "Выберите исполняемые файл, который будет использован в этой задаче." msgid "Choose the cluster to use for the job." msgstr "Выберите кластер для запуска задачи." msgid "Chosen Libraries" msgstr "Выбранные библиотеки" msgid "Cinder Volume" msgstr "Том Cinder-а" msgid "Cinder service is unavailable now" msgstr "Cinder служба сейчас недоступна" msgid "Cinder volumes" msgstr "Диски Cinder" msgid "Cluster" msgstr "Кластер" msgid "Cluster Configuration Overview" msgstr "Обзор конфигурации кластера" msgid "Cluster Count" msgstr "Количество кластеров" msgid "Cluster Creation Guide" msgstr "Мастер создания кластера" msgid "Cluster Events" msgstr "События кластера" msgid "Cluster Instances" msgstr "Инстансы кластера" msgid "Cluster Name" msgstr "Имя кластера" msgid "Cluster Template" msgstr "Шаблон кластера" #, python-format msgid "Cluster Template %s updated" msgstr "Шаблон кластера %s обновлен" msgid "Cluster Template Configuration Overview" msgstr "Обзор конфигурации шаблона кластера" #, python-format msgid "Cluster Template copy %s created" msgstr "Копия шаблона кластера %s создана" msgid "Cluster Templates" msgstr "Шаблоны кластера" msgid "Cluster can be launched using existing Cluster Templates." msgstr "Кластер может быть запущен с помощью существующих шаблонов кластера." msgid "Cluster configurations are not specified" msgstr "Конфигурации кластера не заданы" msgid "Cluster health checks" msgstr "Проверки работоспособности кластера" msgid "Cluster provision steps" msgstr "Шаги создания кластера" msgid "Cluster share update failed." msgstr "Обновление разделяемых дисков кластера не удалось" msgid "Cluster template creation failed" msgstr "Не удалось создать шаблон кластера" msgid "Cluster template update failed" msgstr "Обновление шаблона кластера не удалось" msgid "Cluster type chosen" msgstr "Выбран тип кластера" msgid "Clusters" msgstr "Кластера" msgid "Completed Successfully" msgstr "Успешно завершено" msgid "Configuration" msgstr "Конфигурация" msgid "Configuration Details" msgstr "Детали конфигурации" msgid "Configuration Value" msgstr "Конфигурационное значение" msgid "Configure" msgstr "Настроить" msgid "Configure Cluster" msgstr "Настроить кластер" msgid "Configure Cluster Template" msgstr "Настроить шаблон кластера" msgid "Configure Node Group Template" msgstr "Настроить шаблон группы узлов " msgid "Configure Template" msgstr "Настроить шаблон" msgid "Control access to instances of the node group." msgstr "Управление доступом к инстансам группы узлов." msgid "Copy Cluster Template" msgstr "Копировать шаблон кластера" msgid "Copy Template" msgstr "Копировать шаблон" msgid "Could not create" msgstr "Не удалось создать" msgid "Could not create data source" msgstr "Не удалось создать источник данных" msgid "Could not create job template" msgstr "Не удалось создать шаблон задачи" msgid "Could not launch job" msgstr "Не удалось запустить задачу" msgid "Could not parse template" msgstr "Не удалось разобрать шаблон" msgid "Could not update cluster shares" msgstr "Не могу обновить разделяемые диски" msgid "Could not update data source" msgstr "Невозможно обновить источник данных" msgid "Could not update plugin" msgstr "Не получилось обновить плагин" msgid "Count" msgstr "Количество" msgid "Create" msgstr "Создать" msgid "Create Cluster Template" msgstr "Создать шаблон кластера" msgid "Create Data Source" msgstr "Создать источник данных" msgid "Create Job Binary" msgstr "Создать исполняемый файл задачи" msgid "Create Job Template" msgstr "Создать шаблон задачи" msgid "Create Node Group Template" msgstr "Создать шаблон группы узлов" msgid "Create Template" msgstr "Создать шаблон" msgid "Create a Cluster Template" msgstr "Создание шаблона кластера" msgid "Create a Data Source with a specified name." msgstr "Создать источник данных с указанным именем" msgid "Create a Master Node Group Template" msgstr "Создание шаблона группы узлов \"Master\"" msgid "Create a Worker Node Group Template" msgstr "Создание шаблона группы узлов \"Worker\"" msgid "Create a data source" msgstr "Создание источника данных" msgid "Create a job template" msgstr "Создать шаблон задачи" msgid "Create a job template with a specified name." msgstr "Создать шаблон задачи с указанным именем." msgid "Create a script to be uploaded dynamically" msgstr "Создать скрипт для динамической загрузки" msgid "Create boot volume in this availability zone." msgstr "Создать загрузочный том в этой зоне доступности." msgid "Create security group for this Node Group." msgstr "Создать группу безопасности для этой группы узлов " msgid "Create time" msgstr "Создать время" msgid "Create volumes in this availability zone." msgstr "Создать диски в этой зоне доступности" msgid "Created" msgstr "Создано" msgctxt "Created time" msgid "Created" msgstr "Создано" #, python-format msgid "Created Cluster Template %s" msgstr "Созданный шаблон кластера %s " #, python-format msgid "Created Node Group Template %s" msgstr "Создать шаблон группы узлов %s" msgid "Created time" msgstr "Время создания" msgid "Current choice:" msgstr "Текущий выбор:" msgid "Current type:" msgstr "Текущий тип:" msgid "Custom Tag" msgstr "Пользовательский тег" msgid "DNS Domain Names" msgstr "Имена DNS домена" msgid "Data Processing" msgstr "Обработка данных" msgid "Data Processing Plugin Details" msgstr "Данные плагина обработки данных" msgid "Data Processing Plugins" msgstr "Плагины обработки данных" msgid "Data Processing internal database" msgstr "Внутренняя БД обработки данных" msgid "" "Data Processing provides different storage location options. You may choose " "Ephemeral Drive or a Cinder Volume to be attached to instances." msgstr "" "Обработка данных предоставляет различные опции мест хранения. Вы можете " "выбрать эфемерный диски или диски Cinder для подключения к инстансам." msgid "Data Source" msgstr "Источник данных" msgid "Data Source Type" msgstr "Тип источника данных" msgid "Data Sources" msgstr "Источники данных" msgid "" "Data Sources are what your job uses for input and output. Depending on the " "type of job you will be running, you may need to define one or more data " "sources. You can create multiple data sources by repeating this step." msgstr "" "Источники данных используются задачей для получения входной и выдачи " "выходной информации. В зависимости от типа задачи вы можете определить один " "или более источников данных. Вы можете создать несколько источников повторив " "этот шаг." msgid "Data source created" msgstr "Источник данных создан" msgid "Data source updated" msgstr "Источник данных обновлен" msgid "Default Value" msgstr "Значение по умолчанию" msgid "" "Define your Job Template. This is where you choose the type of job that you " "want to run (Pig, Java Action, Spark, etc) and choose or upload the files " "necessary to run it. The inputs and outputs will be defined later." msgstr "" "Определите шаблон задачи. Здесь вы выбираете тип задачи которую вы хотите " "запустить (Pig, Java Action, Spark и т.д.) и выберите или загрузите файлы " "необходимые для запуска. Входные и выходные источники будут определены далее." msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Удалить кластер" msgstr[1] "Удалить кластеры" msgstr[2] "Удалить кластеры" msgid "Delete Data Source" msgid_plural "Delete Data Sources" msgstr[0] "Удалить источник данных" msgstr[1] "Удалить источники данных" msgstr[2] "Удалить источники данных" msgid "Delete Job" msgid_plural "Delete Jobs" msgstr[0] "Удалить задачу" msgstr[1] "Удалить задачи" msgstr[2] "Удалить задачи" msgid "Delete Job Binary" msgid_plural "Delete Job Binaries" msgstr[0] "Удалить исполняемый файл задачи" msgstr[1] "Удалить исполняемые файлы задачи" msgstr[2] "Удалить исполняемые файлы задачи" msgid "Delete Job Template" msgid_plural "Delete Job Templates" msgstr[0] "Удалить шаблон задачи" msgstr[1] "Удалить шаблоны задачи" msgstr[2] "Удалить шаблоны задачи" msgid "Delete Template" msgid_plural "Delete Templates" msgstr[0] "Удалить шаблон" msgstr[1] "Удалить шаблоны" msgstr[2] "Удалить шаблоны" msgid "Deleted Cluster" msgid_plural "Deleted Clusters" msgstr[0] "Удаленный кластер" msgstr[1] "Удаленные кластеры" msgstr[2] "Удаленные кластеры" msgid "Deleted Data Source" msgid_plural "Deleted Data Sources" msgstr[0] "Удаленный источник данных" msgstr[1] "Удаленые источники данных" msgstr[2] "Удаленые источники данных" msgid "Deleted Job" msgid_plural "Deleted Jobs" msgstr[0] "Удаленная задача" msgstr[1] "Удаленные задачи" msgstr[2] "Удаленные задачи" msgid "Deleted Job Binary" msgid_plural "Deleted Job Binaries" msgstr[0] "Удаленный исполняемый файл задачи" msgstr[1] "Удаленные исполняемые файлы задачи" msgstr[2] "Удаленные исполняемые файлы задачи" msgid "Deleted Job Template" msgid_plural "Deleted Jobs Templates" msgstr[0] "Удаленный шаблон задачи" msgstr[1] "Удаленные шаблоны задачи" msgstr[2] "Удаленные шаблоны задачи" msgid "Deleted Template" msgid_plural "Deleted Templates" msgstr[0] "Удаленный шаблон" msgstr[1] "Удаленные шаблоны" msgstr[2] "Удаленные шаблоны" msgid "Description" msgstr "Описание" msgid "Details" msgstr "Подробности" msgid "Domain Name" msgstr "Имя домена" msgid "Domain name" msgstr "Имя домена" msgid "Done" msgstr "Сделано" msgctxt "Current status of a Job" msgid "Done with Error" msgstr "Выполнена с ошибками" msgid "Download Job Binary" msgstr "Скачать исполняемый файл задачи" msgid "Download job binary" msgstr "Скачать исполняемый файл задачи" msgid "Drive type" msgstr "Тип диска" msgid "Duration" msgstr "Продолжительность" msgid "Edit Cluster Template" msgstr "Редактировать шаблон кластера" msgid "Edit Data Source" msgstr "Редактировать источник данных" msgid "Edit Image Tags" msgstr "Редактировать теги образа" msgid "Edit Job Binary" msgstr "Редактировать исполняемый файл задачи" msgid "Edit Node Group Template" msgstr "Редактирование шаблона группы улов" msgid "Edit Tags" msgstr "Редактировать теги" msgid "Edit Template" msgstr "Редактировать шаблон" msgid "Enable Swift Paths" msgstr "Разрешить пути Swift" msgid "Enabled Versions" msgstr "Включенные версии" msgctxt "End time" msgid "Ended" msgstr "Завершено" msgid "Endpoint should be specified without protocol" msgstr "Точка подключения должна быть задана с указанием протокола" msgid "Engine Job ID" msgstr "ID задачи в движке" msgid "Enter any custom configuration required for your job's execution." msgstr "" "Введите любую нестандартную конфигурацию необходимую для выполнения вашей " "задачи." msgid "Enter the URL for the file" msgstr "Ввести URL для файла" msgid "Enter the access key and secret key required to access that file" msgstr "Введите ключ доступа и секрет, необходимые для доступа к этому файлу" msgid "Enter the endpoint of the S3 service where the file is stored" msgstr "Введите точку подключения к сервису S3, где хранится файл" msgid "Enter the username and password required to access that file" msgstr "" "Ввести имя пользователя и пароль, необходимые для доступа к этому файлу " msgid "Ephemeral Drive" msgstr "Эфемерный диск" msgid "Ephemeral drive" msgstr "Эфемерный диск" msgid "Error Details" msgstr "Сведения об ошибке" msgid "Event time" msgstr "Время события" msgid "Export Template" msgstr "Экспортировать шаблон" msgid "Failed" msgstr "Произошла ошибка" msgctxt "Current status of a Job" msgid "Failed" msgstr "Произошла ошибка" msgid "Failed to fetch internal binary list" msgstr "Не удалось получить список внутренних исполняемых файлов" msgid "Failed to get list of internal binaries." msgstr "Не удалось получить список внутренних исполняемых файлов" msgid "Failed to get list of shares" msgstr "Не удалось получить список разделяемых дисков" msgid "Failed to update image." msgstr "Не удалось обновить образ" msgid "Filter" msgstr "Фильтр" msgid "" "First, select which type of job that you want to run. This choice will " "determine which other steps are required" msgstr "" "Сначала выберите тип задачи, которую вы хотите запустить. Этот выбор " "определит другие шаги, которые необходимо будет пройти далее" msgid "Flavor" msgstr "Тип инстанса" msgid "Flavor is not specified" msgstr "Тип инстанса не указан" msgid "Floating IP Pool" msgstr "Пул назначаемых IP" msgid "" "For Data Processing internal job binaries, you may choose from the following:" msgstr "" "Для внутренних исполняемых файлов Обработки Данных вы можете выбрать " "следующее:" msgid "" "For Data Sources in S3 storage, the URL should be specified in the format " "s3a://bucket/path. Also, each of the access properties may be optional if " "you have configured that property on your cluster manually." msgstr "" "Для источников входных данных, расположенных на S3 хранилище, URL должен " "быть задан в формате s3a://bucket/path. Если вы вручную сконфигурировали " "параметры доуступа в вашем кластере, то их указание далее будет не " "обязательным." msgid "" "For Data Sources on a Manila share, choose the share and enter the path " "relative to the share (example: /outputdir/myinputfile.txt)" msgstr "" "Для источников данных на разделяемых дисках Manila, выберите разделяемый " "диск и введите относительный путь (например: /outputdir/myinputfile.txt)" msgid "" "For MapReduce or Java Action jobs, \"mains\" are not applicable. You are " "required to add one or more \"libs\" for these jobs." msgstr "" "Для задач MapReduce или команды Java основной скрипт неприменим. Вы должны " "добавить одну или несколько библиотек для этих задач." msgid "For Object Store job binaries, you must:" msgstr "Для исполняемых файлов задач Объектного Хранилища вы должны:" msgid "For S3 job binaries, you must:" msgstr "Для исполняемых файлов задач S3 вы должны:" msgid "" "For Shell Action jobs, any required files beyond the main script may be " "added as \"libraries\"." msgstr "" "Для команд Shell любые необходимые файлы, помимо основного скрипта, могут " "быть добавлены как библиотеки." msgid "" "For Storm, Storm Pyleus, Spark and Shell jobs, only a main is required,\"libs" "\" are optional." msgstr "" "Для задач Storm, Storm Pyleus, Spark и Shell необходим только основной " "скрипт, библиотеки не обязательны." msgid "Force Delete Cluster" msgid_plural "Force Delete Clusters" msgstr[0] "Принудительно удалить кластер" msgstr[1] "Принудительно удалить кластеры" msgstr[2] "Принудительно удалить кластеры" msgid "Force Deleted Cluster" msgid_plural "Force Deleted Clusters" msgstr[0] "Принудительно удалён кластер" msgstr[1] "Принудительно удалёны кластеры" msgstr[2] "Принудительно удалёны кластеры" msgid "General Info" msgstr "Общая информация" msgid "Guided Cluster Creation" msgstr "Мастер создания кластера" msgid "Guided Job Execution" msgstr "Управляемый запуск задачи" msgid "HDFS placement" msgstr "Размещение HDFS " msgid "Health" msgstr "Работоспособность" msgid "Hide full configuration" msgstr "Скрыть полную конфигурацию" msgid "Hive" msgstr "Hive" msgid "ID" msgstr "ID" msgid "If checked, bucket will be in path instead of host" msgstr "" "Если отмечено, то в пути будет использоваться название корзины вместо имени " "сервера" #, python-format msgid "" "If selected, %s will be protected from modifications until this will be " "unselected" msgstr "" "Если выбрано, %s будет защищено от модификаций пока этот пункт не будет " "отменен" #, python-format msgid "If selected, %s will be shared across the tenants" msgstr "Если выбрано, %s будет доступно во всех тенантах" msgid "" "If selected, instances of a cluster will be automatically configured during " "creation. Otherwise you should manually specify configuration values" msgstr "" "Если эта опция выбрана, инстансы кластера будут автоматически " "сконфигурированы во время создания. В противном случае вы должны вручную " "задать конфигурационные значения." msgid "" "If selected, instances of a node group will be automatically configured " "during cluster creation. Otherwise you should manually specify configuration " "values." msgstr "" "Если выбрано, инстансы группы узлов автоматически настраиваются во время " "создания кластера. Иначе необходимо указывать конфигурационные значения " "вручную." msgid "Image" msgstr "Образ" msgid "Image Registry" msgstr "Реестр образов" msgid "" "Image Registry is used to provide additional information about images for " "Data Processing." msgstr "" "Реестр образов используется для предоставления дополнительной информации об " "образах для обработки данных. " msgid "Image Registry tool:" msgstr "Утилита для реестра образов:" msgid "Import" msgstr "Импорт" msgid "Import Cluster Template" msgstr "Импортировать шаблон кластера" msgid "Import Node Group Template" msgstr "Импортировать шаблон группы узлов" msgid "Import Template" msgstr "Импортировать шаблон" msgid "In progress" msgstr "В процессе" msgid "Info" msgstr "Информация" msgid "Input" msgstr "Ввод" msgid "Input Data Source" msgstr "Источник входных данных" msgid "" "Input correct User Name for image. For Ubuntu images input 'ubuntu', " "'fedora' for Fedora images, 'cloud-user' for CentOS 6.x images and 'centos' " "for CentOS 7.x images." msgstr "" "Введите корректное имя пользователя для образа. Для образов Ubuntu введите " "'ubuntu', 'fedora' для образов Fedora, 'cloud-user' для образов CentOS 6.x и " "'centos' для образов CentOS 7.x." msgid "Instance" msgstr "Инстанс" msgid "Instance and attached volumes will be created on the same physical host" msgstr "Инстансы и подключенные диски будут созданы на одном физическом хосте" msgid "Instances" msgstr "Инстансы" msgid "Instances Count" msgstr "Количество инстансов" msgid "Interface Arguments" msgstr "Аргументы интерфейса" msgid "Internal Binary" msgstr "Внутренний исполняемый файл" msgid "Internal IP" msgstr "Внутренний IP" msgid "Internal binary" msgstr "Внутренний исполняемый файл" msgid "Java" msgstr "Java" msgid "Java Action" msgstr "Команда Java" msgid "Java Opts" msgstr "Опции Java " msgid "Job" msgstr "Задача" msgid "Job Binaries" msgstr "Исполняемые файлы задач" msgid "Job Configuration" msgstr "Конфигурация задачи" msgid "Job Execution ID" msgstr "ID выполнения задачи" msgid "Job Guide" msgstr "Мастер задачи" msgid "Job Template" msgstr "Шаблон задачи" msgid "Job Templates" msgstr "Шаблоны задачи" msgid "Job Type" msgstr "Тип задачи" msgid "Job args" msgstr "Аргументы задачи" msgid "Job configs" msgstr "Конфигурации задачи" msgid "Job created" msgstr "Задача создана" msgid "Job launched" msgstr "Задача запущена" msgid "Job params" msgstr "Параметры задачи" msgid "Job template:" msgstr "Шаблон задачи:" msgid "Job type chosen" msgstr "Выбран типа задачи" msgid "Jobs" msgstr "Задачи" msgid "Keypair" msgstr "Ключевая пара" msgctxt "Current status of a Job" msgid "Killed" msgstr "Убита" msgid "Label" msgstr "Метка" msgid "Label details" msgstr "Детали метки" msgid "Last Updated" msgstr "Обновлено" msgid "Launch" msgstr "Запустить" msgid "Launch Cluster" msgstr "Запустить кластер" msgid "Launch Job" msgid_plural "Launch Jobs" msgstr[0] "Запустить задачу" msgstr[1] "Запустить задачи" msgstr[2] "Запустить задачи" msgid "Launch On Existing Cluster" msgstr "Запустить на существующем кластере" msgid "Launch On New Cluster" msgstr "Запустить на новом кластере" msgid "Launch a Cluster" msgstr "Запуск кластера" msgid "Launch instances in these security groups." msgstr "Запустить инстансы в этих группах безопасности" msgid "" "Launch instances in these security groups. Auto security group will be " "determined by the value present in the imported template." msgstr "" "Запустить инстансы в этих группах безопасности. Группа безопасности будет " "автоматически определена по значению параметра в импортированном шаблоне." msgid "Launch instances in this availability zone." msgstr "Запустить инстанс в этой зоне доступности." msgid "Launch job" msgstr "Запустить задачу" msgid "Launch the given job template on a cluster." msgstr "Запустить выбранный шаблон задачи на кластере." msgid "" "Launch your job. When launching, you may need to choose your input and " "output data sources. This is where you would also add any special " "configuration values, parameters, or arguments that you need to pass along " "to your job." msgstr "" "Запустите свою задачу. При запуске вам может потребоваться выбрать источники " "для входных и выходных данных. Там же вы добавите дополнительные " "конфигурационные значения, параметры или аргументы которые вам нужно " "передать вашей задаче." #, python-format msgid "Launched Cluster %s" msgstr "Запущен кластер %s" msgid "Launched Job" msgid_plural "Launched Jobs" msgstr[0] "Запущенная задача" msgstr[1] "Запущенные задачи" msgstr[2] "Запущенные задачи" msgid "Libs" msgstr "Библиотеки" msgid "Location" msgstr "Расположение" msgid "Main Class" msgstr "Основной класс" msgid "Mains" msgstr "Основные скрипты" msgid "Management IP" msgstr "IP управления" msgid "Manila share" msgstr "Разделяемые диски Manila" msgid "MapReduce" msgstr "MapReduce" msgid "Mapper" msgstr "Маппер" msgid "Mapping Type" msgstr "Тип отображения" msgid "Master Node Group Template:" msgstr "Шаблон группы узлов Master:" msgid "" "Modify the configuration so that swift URLs can be dereferenced through HDFS " "at runtime." msgstr "" "Изменить конфигурацию, чтобы во время выполнения URL Swift могли быть " "разыменованы через HDFS." msgid "Name" msgstr "Имя" msgid "" "Name must be provided either here or in the template. If provided in both " "places, this one will be used." msgstr "" "Имя должно быть указано либо здесь, либо в шаблоне. Если оно будет указано в " "двух местах сразу, то будет использоваться имя, указанное здесь." #, python-format msgid "Name: %(node_group_name)s" msgstr "Имя: %(node_group_name)s" msgid "Named Parameter" msgstr "Именованный параметр" msgid "Neutron Management Network" msgstr "Управляющая сеть Neutron" msgid "Never" msgstr "Никогда" msgid "Next" msgstr "Далее" msgid "" "Next, you need to define the different types of machines in your cluster. " "This is done by defining a Node Group Template for each type of machine. A " "very common case is where you need to have one or more machines running a " "\"master\" set of processes while another set of machines need to be running " "the \"worker\" processes. Here, you will define the Node Group Template for " "your \"master\" node(s)." msgstr "" "Далее вы должны определить различные типы машин в вашем кластере. Это " "выполняется с помощью определения шаблона группы узлов для каждого типа " "машин. В наиболее распространенном случае на одной или нескольких машинах " "запускается набор процессов \"master\" и еще один набор машин выполняет " "\"worker\" процессы. На данном шаге вы определяете шаблон группы узлов для " "вашего \"master\" узла (узлов)." msgid "No Cluster Template Created" msgstr "Не создан шаблон кластера" msgid "No Images Available" msgstr "Нет доступных образов" msgid "No Master Node Group Template Created" msgstr "Не создан шаблон группы узлов \"Master\"" msgid "No Templates Available" msgstr "Нет доступных шаблонов" msgid "No Worker Node Group Template Created" msgstr "Не создан шаблон группы узлов \"Worker\"" msgid "No availability zone specified" msgstr "Не указана зона доступности" msgid "No clusters available" msgstr "Нет доступных кластеров" msgid "No configurations" msgstr "Нет конфигураций" msgid "No description" msgstr "Нет описания" msgid "No domain is specified" msgstr "Домен не указан" msgid "No enabled versions" msgstr "Нет включенных версий" msgid "No image specified" msgstr "Образ не указан" msgid "No images available." msgstr "Нет доступных образов." msgid "No info available" msgstr "Информация недоступна" msgid "No job template created" msgstr "Не создан шаблон задачи" msgid "No keypair" msgstr "Нет ключевых пар" msgid "No plugin chosen" msgstr "Плагин не выбран" msgid "No type chosen" msgstr "Тип не выбран" msgid "No volume type" msgstr "Нет типа диска" msgid "Node Group" msgstr "Группа узлов" #, python-format msgid "Node Group Name: %(node_group_name)s" msgstr "Группа узлов: %(node_group_name)s" msgid "Node Group Template" msgstr "Шаблон группы узлов" #, python-format msgid "Node Group Template %s updated" msgstr "Шаблон группы узлов %s обновлён" #, python-format msgid "Node Group Template copy %s created" msgstr "Копия шаблона группы узлов %s создана" msgid "Node Group Templates" msgstr "Шаблоны группы узлов" #, python-format msgid "Node Group: %(node_group_name)s" msgstr "Группа узлов: %(node_group_name)s" msgid "Node Groups" msgstr "Группы нод" msgid "Node Groups Configuration Overview" msgstr "Обзор конфигурации группы узлов" msgid "Node Processes" msgstr "Процессы ноды" msgid "Node group cluster" msgstr "Кластер группы узлов " msgid "Node group configurations are not specified" msgstr "Конфигурации группы узлов не указаны" msgid "Node processes are not specified" msgstr "Процессы узла не указаны" msgid "Nodes Count" msgstr "Количество узлов" msgid "None" msgstr "Нет" msgid "Not available" msgstr "Недоступно" msgid "" "Now you need to set the layout of your cluster. By creating a Cluster " "Template, you will be choosing the number of instances of each Node Group " "Template that will appear in your cluster. Additionally, you will have a " "chance to set any cluster-specific configuration items in the additional " "tabs on the create Cluster Template form." msgstr "" "Теперь вы должны определить планировку вашего кластера. Создавая шаблон " "кластера вы выберете количество инстансов для каждого шаблона группы узлов " "вашего кластера. Дополнительно, вы сможете задать любые настройки для " "конкретного кластера в дополнительных закладках формы создания шаблона " "кластера." msgid "Number" msgstr "Число" msgid "Number of Nodes" msgstr "Количество узлов" msgid "Number of clusters to launch." msgstr "Количество кластеров для запуска." msgid "Oozie Job ID" msgstr "ID задачи в Oozie" msgid "OpenStack Flavor" msgstr "тип инстанса OpenStack " msgid "Output" msgstr "Вывод" msgid "Output Data Source" msgstr "Источник выходных данных" msgid "Parameters" msgstr "Параметры" msgid "Password" msgstr "Пароль" msgid "Path" msgstr "Путь" msgid "Path on share" msgstr "Путь к разделяемому диску" msgid "Persist cluster after job exit" msgstr "Сохранить кластер после завершения задачи" msgid "Pig" msgstr "Pig" msgid "Plugin" msgstr "Плагин" msgid "Plugin Name" msgstr "Имя плагина" msgid "Plugin and Version Tag" msgstr "Тег плагина и версии" msgid "Plugin label" msgstr "Метка плагина" msgid "Plugin name" msgstr "Имя плагина" msgid "Plugin update failed." msgstr "Обновление плагина не удалось" #, python-format msgid "Plugin version %(version)s label" msgstr "Метка версии плагина %(version)s" #, python-format msgid "Plugin version %s" msgstr "Версия плагина %s" msgid "Plugin:" msgstr "Плагин:" msgid "Plugins" msgstr "Плагины" msgid "Positional Argument" msgstr "Позиционный аргумент" msgid "Progress" msgstr "Прогресс" msgid "Project ID" msgstr " ID проекта" msgid "Protected" msgstr "Защищенный" msgid "Proxy Gateway" msgstr "Шлюз прокси" msgid "Public" msgstr "Публичный" msgid "Read only" msgstr "Только для чтения" msgid "Read/Write" msgstr "Чтение/Запись" msgid "Reducer" msgstr "Редьюсер" msgid "Register Image" msgstr "Зарегистрировать образ" msgid "Relaunch On Existing Cluster" msgstr "Перезапустить на существующем кластере" msgid "Relaunch On New Cluster" msgstr "Перезапустить на новом кластере" msgid "Remove" msgstr "Удалить" msgid "" "Repeat the Node Group Template creation process, but this time you are " "creating your \"worker\" Node Group Template." msgstr "" "Повторите процесс создания шаблона группы узлов, но в этот раз вы создаете " "шаблон для вашей группы узлов \"worker\"." msgid "Required" msgstr "Необходимо" msgid "Reset Cluster Creation Guide" msgstr "Сбросить мастер создания кластера" msgid "Reset Cluster Guide" msgstr "Сбросить мастер кластера" msgid "Reset Job Execution Guide" msgstr "Сбросить мастер запуска задачи" msgid "Return Code" msgstr "Код возврата" msgid "Run HBase EDP Jobs with common HBase library on HDFS" msgstr "Выполнить задачу HBase EDP с общей библиотекой HBase на HDFS" msgid "S3" msgstr "S3" msgid "S3 Endpoint" msgstr "Точка подключения S3" msgid "S3 access key" msgstr "Ключ доступа к S3" msgid "S3 accsss key" msgstr "Ключ доступа к S3" msgid "S3 endpoint" msgstr "Точка подключения S3" msgid "S3 secret key" msgstr "Секрет доступа к S3" msgid "" "Sahara will use instances of this node group to access other cluster " "instances." msgstr "" "Sahara будет использовать инстансы из этой группы для доступа к другим " "инстансам кластера." msgid "Scale" msgstr "Масштабировать" msgid "Scale Cluster" msgstr "Масштабировать кластер" msgid "Scale cluster operation failed" msgstr "Не удалось выполнить операцию масштабирования кластера" msgid "Scaled cluster successfully started." msgstr "Масштабированный кластер успешно запущен." msgid "Scope" msgstr "Область доступности" msgid "Script name" msgstr "Имя скрипта" msgid "Script text" msgstr "Текст скрипта" msgid "Secret Key" msgstr "Секрет доступа" msgid "Security" msgstr "Безопасность" msgid "Security Groups" msgstr "Группы безопасности" msgid "Select" msgstr "Выбрать" msgid "Select Image" msgstr "Выберите образ" msgid "Select Node Group Processes" msgstr "Выберите процессы группы узлов" msgid "Select Shares" msgstr "Выбрать разделяемые диски" msgid "Select a Node Group Template to add:" msgstr "Выберите шаблон группы узлов для добавления:" msgid "Select a Value Type for your next argument:" msgstr "Выберите тип значения для следующего аргумента:" msgid "Select a plugin and version for a new Cluster template." msgstr "Выберите плагин и версию для нового шаблона кластера." msgid "Select a plugin and version for a new Cluster." msgstr "Выберите плагин и версию для нового кластера." msgid "Select a plugin and version for the new Node Group template." msgstr "Выберите плагин и версию для нового шаблоны группы узлов." msgid "" "Select an existing node group template.\n" " " msgstr "" "Выберите существующий шаблон группы узлов.\n" " " msgid "Select node processes for the node group" msgstr "Выберите процессы узла для группы узлов" msgid "Select plugin and hadoop version" msgstr "Выбрать плагин и версию hadoop " msgid "Select plugin and hadoop version for cluster" msgstr "Выберите плагин и версию hadoop для кластера" msgid "Select plugin and hadoop version for cluster template" msgstr "Выберите плагин и версию hadoop для шаблона кластера" msgid "Select property name" msgstr "Выбрать имя свойства" msgid "Select the domain name for internal and external hostname resolution." msgstr "Выберите имя домена для внутреннего и внешнего разрешения имен." msgid "Select the manila shares for this cluster" msgstr "Выбрать разделяемые диски Manila для этого кластера" msgid "Select the manila shares for this node group" msgstr "Выбрать разделяемые диски Manila для этой группы узлов" msgid "Select the storage type for your job binary." msgstr "Выбрать тип хранилища для вашего исполняемого файла." msgid "Select the type of your Data Source." msgstr "Выбрать тип вашего источника данных" msgid "Select the type of your job:" msgstr "Выбрать тип вашей задачи:" msgid "Select type" msgstr "Выберите тип" msgid "" "Select which plugin and version that you want to use to create your cluster." msgstr "Выберите плагин и его версию для создания кластера." msgid "" "Select which type of job that you want to run. This choice will dictate " "which steps are required to successfully execute your job." msgstr "" "Выберите тип задачи который вы хотите запустить. Этот выбор определит другие " "шаги, которые необходимо будет пройти для успешного выполнения вашей задачи." msgid "" "Selected domain name should already exist in the Designate. You can check it " "in "DNS" tab on the left menu or by executing "designate " "domain-list" on the controller node." msgstr "" "Выбранное доменное имя должно уже быть в Designate. Вы можете это проверить " "это в закладке "DNS" в меню слева, либо выполнив команду "" "designate domain-list" на управляющем узле." msgid "Service Configurations" msgstr "Конфигурации сервиса" msgid "Share" msgstr "Разделяемый диск" msgid "Shares" msgstr "Разделяемые диски" msgid "Shell" msgstr "Shell" msgid "Shell Action" msgstr "Команда Shell" msgid "Show full configuration" msgstr "Показать полную конфигурацию" msgid "Source password" msgstr "Пароль источника" msgid "Source username" msgstr "Имя пользователя источника" msgid "Spark" msgstr "Spark" msgid "" "Specified User Name will be used by Data Processing to apply configs and " "manage processes on instances." msgstr "" "Указанное имя пользователя будет использоваться системой обработки данных в " "применении конфигурации и управлении процессами в инстансе." msgid "Start Verification" msgid_plural "Start Verifications" msgstr[0] "Начать верификацию" msgstr[1] "Начать верификации" msgstr[2] "Начать верификации" msgctxt "Start time" msgid "Started" msgstr "Запущено" msgid "Started Verification" msgid_plural "Started Verifications" msgstr[0] "Начатая верификация" msgstr[1] "Начатые верификации" msgstr[2] "Начатые верификации" msgid "Started at" msgstr "Запущено " msgid "Status" msgstr "Статус" msgid "Status description" msgstr "Описание статуса" msgid "Step Description" msgstr "Описание шага" msgid "Storage type" msgstr "Тип хранилища" msgid "Storm" msgstr "Storm" msgid "Storm Pyleus" msgstr "Storm Pyleus" msgid "Streaming MapReduce" msgstr "Поточный MapReduce" msgid "String" msgstr "Строка" msgid "" "Substitute data source objects for URLs of the form datasource://name or " "uuid." msgstr "" "Подставлять объекты источника данных для URL в форме <источник " "данных>://<имя> или uuid." msgctxt "Current status of a Job" msgid "Succeeded" msgstr "Успешно завершена" msgid "Successfully updated image." msgstr "Образ успешно обновлен." msgid "Supported Versions" msgstr "Поддерживаемые версии" msgid "Swift" msgstr "Swift" msgid "Tags" msgstr "Теги" msgid "" "Tags are used for filtering images suitable for each plugin and each Data " "Processing version. To add required tags, select a plugin and a Data " "Processing version and click the "Add" button." msgstr "" "Теги используются для фильтрации образов подходящих для каждого плагина и " "каждой версии обработки данных. Чтобы добавить необходимые теги выберите " "плагин и версию обработки данных и нажмите кнопку "Добавить "" msgid "Template" msgstr "Шаблон" msgid "Template File" msgstr "Файл шаблона" msgid "Template JSON contained invalid key" msgstr "JSON шаблон содержит недопустимый ключ" msgid "Template Name" msgstr "Имя шаблона" msgid "Template not specified" msgstr "Шаблон не указан" msgid "" "The Cluster Template object may specify a list of processes in anti-affinity " "group. That means these processes may not be launched more than once on a " "single host." msgstr "" "Объект шаблона кластера может указать список процессов в анти-аффинной " "группе. Это означает, что эти процессы не могут быть запущены более одного " "раза на одном хосте." msgid "" "The Cluster Template object should specify Node Group Templates that will be " "used to build a Cluster. You can add Node Groups using Node Group Templates " "on a "Node Groups" tab." msgstr "" "Шаблон кластера должен содержать шаблоны групп узлов, которые будут " "использованы при построении кластера. Вы можете добавить группы узлов " "используя шаблоны групп узлов на вкладке "Группы узлов"" msgid "" "The Cluster object should specify OpenStack Image to boot instances for " "Cluster." msgstr "" "Объект \"Кластер\" должен указывать образ OpenStack который будет " "использоваться для инстансов кластера." msgid "" "The Node Group Template object specifies the processes that will be launched " "on each instance. Check one or more processes. When processes are selected, " "you may set node scoped configurations on corresponding tabs." msgstr "" "Объект шаблона группы узлов определяет процессы которые будут запущены на " "всех машинах. Выберите один или несколько процессов. Для выбранных процессов " "вы можете установить настройки специфичные для узлов на " "соответствующих вкладках." msgid "" "The first step is to determine which type of cluster you want to run. You " "may have several choices available depending on the configuration of your " "system. Click on \"choose plugin\" to bring up the list of data processing " "plugins. There you will be able to choose the data processing plugin along " "with the version number. Choosing this up front will allow the rest of the " "cluster creation steps to focus only on options that are pertinent to your " "desired cluster type." msgstr "" "Первый шаг - определить какой тип кластера вы хотите запустить. У вас может " "быть несколько вариантов, в зависимости от конфигурации вашей системы. " "Нажмите на \"выбрать плагин\" чтобы получить список плагинов для обработки " "данных. Там вы сможете выбрать плагин обработки данных и его версию. Этот " "выбор позволит остальным шагам по создания кластера сфокусироваться только " "на опциях желаемого типа кластера." msgid "The value of shares must be a list of values" msgstr "Значение разделяемых дисков должно быть списоком значений" msgid "This Cluster Template will be created for:" msgstr "Этот шаблон кластера будет создан для:" msgid "This Cluster will be started with:" msgstr "Этот кластер будет запущен с:" msgid "This Node Group Template will be created for:" msgstr "Этот шаблон группы узлов будет создан для:" msgid "Title" msgstr "Заголовок" msgid "Topology Name" msgstr "Имя топологии" msgid "Type" msgstr "Тип" msgid "URL" msgstr "URL" msgid "Unable to create job binary" msgstr "Не удалось создать исполняемый файл задачи" #, python-format msgid "Unable to create job binary: %s" msgstr "Не удалось создать исполняемый файл задачи: %s" msgid "Unable to create new cluster for job." msgstr "Не удалось создать новый кластер для задачи" msgid "Unable to create the cluster" msgstr "Не удалось создать кластер" #, python-format msgid "Unable to fetch Base Image with id: %s." msgstr "Невзможно получить базовый образ с id: %s." msgid "Unable to fetch available images." msgstr "Не удалось получить доступные образы." msgid "Unable to fetch base image details" msgstr "Не удалось получить данные базового образа" msgid "Unable to fetch cluster list" msgstr "Не удалось получить список кластеров" msgid "Unable to fetch cluster template list" msgstr "Невозможно получить список шаблонов кластера" msgid "Unable to fetch cluster template." msgstr "Невозможно получить шаблон кластера." msgid "Unable to fetch cluster to scale" msgstr "Не удалось получить кластер для масштабирования" msgid "Unable to fetch cluster to scale." msgstr "Не удалось получить кластер для масштабирования." msgid "Unable to fetch cluster." msgstr "Невозможно получить кластер." msgid "Unable to fetch clusters." msgstr "Не удалось получить кластеры" msgid "Unable to fetch data source list" msgstr "Невозможно получить список источников данных." msgid "Unable to fetch data sources." msgstr "Не удалось получить источники данных" msgid "Unable to fetch flavor for template." msgstr "Не удалось получить тип инстансов для шаблона." msgid "Unable to fetch floating ip pools." msgstr "Не удалось получить пул назначаемых ip." msgid "Unable to fetch image choices." msgstr "Не удалось получить выбранные образы" msgid "Unable to fetch instance details." msgstr "Невозможно получить данные инстанса." msgid "Unable to fetch job binary list" msgstr "Не удалось получить список исполняемых файлов задач" #, python-format msgid "Unable to fetch job binary: %(exc)s" msgstr "Не удалось получить исполняемый файл задачи: %(exc)s" msgid "Unable to fetch job list" msgstr "Не удалось получить список шаблонов задач" msgid "Unable to fetch job template list" msgstr "Не удалось получить список шаблонов задач" msgid "Unable to fetch jobs." msgstr "Не удалось получить задачи" msgid "Unable to fetch keypair choices." msgstr "Не удалось получить доступные ключевые пары." msgid "Unable to fetch network details" msgstr "Не удалось получить данные сети" msgid "Unable to fetch node group details." msgstr "Невозможно получить подробную информации о группе нод" msgid "Unable to fetch node group template list" msgstr "Не удалось получить список шаблонов группы узлов." msgid "Unable to fetch plugin details." msgstr "Не удалось получить данные плагина" msgid "Unable to fetch plugin list" msgstr "Невозможно получить список плагинов." msgid "Unable to fetch plugin object." msgstr "Не удалось получить объект плагина" msgid "Unable to fetch template object." msgstr "Не удалось получить шаблон объекта." msgid "Unable to fetch template to copy." msgstr "Невозможно получить шаблон кластера для копирования." msgid "Unable to fetch template to edit." msgstr "Невозможно получит шаблон для редактирования" msgid "Unable to fetch the image details" msgstr "Не удалось получить данные образа" msgid "Unable to generate process choices." msgstr "Не удалось создать выбор процессов" msgid "Unable to get node group details." msgstr "Не удалось получить данные группы узлов." msgid "Unable to get security group list." msgstr "Не удалось получить список групп безопасности" msgid "Unable to launch job." msgstr "Не удалось запустить задачу." msgid "Unable to populate anti-affinity processes." msgstr "Не удалось заполнить анти-аффинные процессы" msgid "Unable to process plugin tags" msgstr "Не удалось обработать теги плагина" msgid "Unable to retrieve Nova availability zones." msgstr "Не удалось получить зоны доступности Nova." msgid "Unable to retrieve data processing plugins." msgstr "Не удалось получить плагины обработки данных" #, python-format msgid "Unable to retrieve details for cluster \"%s\"." msgstr "Не удалось получить данные кластера \"%s\"" #, python-format msgid "Unable to retrieve details for cluster template \"%s\"." msgstr "Невозможно получить подробную информацию о шаблоне кластера \"%s\"." #, python-format msgid "Unable to retrieve details for data source \"%s\"." msgstr "Не удалось получить детали источника данных «%s»." #, python-format msgid "Unable to retrieve details for job \"%s\"." msgstr "Не удалось получить детали задачи \"%s\"." #, python-format msgid "Unable to retrieve details for job binary \"%s\"." msgstr "Не удалось получить детали процесса задачи \"%s\"." #, python-format msgid "Unable to retrieve details for job template \"%s\"." msgstr "Не удалось получить детали шаблона задачи \"%s\"." #, python-format msgid "Unable to retrieve details for node group template \"%s\"." msgstr "Невозможно получить информацию для шаблона группы узлов \"%s\"." msgid "Unable to retrieve image list" msgstr "Не удалось получить список образов" #, python-format msgid "Unable to retrieve images with filter %s." msgstr "Не удалось получить образы с фильтром %s." #, python-format msgid "Unable to retrieve job binary \"%s\"." msgstr "Невозможно получить исполняемый файл задач \"%s\"." msgid "Unable to retrieve networks." msgstr "Не удалось получить сети." msgid "Unable to retrieve plugin." msgstr "Не удалось получить плагин" #, python-format msgid "Unable to retrieve security group %(group)s." msgstr "Не удалось получить группу безопасности %(group)s." msgid "Unable to retrieve volumes availability zones." msgstr "Не удалось получить зоны доступности дисков." msgid "Unable to set cluster type" msgstr "Не удалось задать тип кластера" msgid "Unable to set job type" msgstr "Не удалось задать тип задачи" msgid "Unable to set node group template" msgstr "Не удалось получить список шаблонов группы узлов." msgid "Unable to update job binary" msgstr "Невозможно обновить исполняемый файл задачи" #, python-format msgid "Unable to update job binary: %s" msgstr "Невозможно обновить исполняемый файл задачи: %s" msgid "Unable to update row" msgstr "Невозможно обновить строку" msgid "Unable to upload job binary" msgstr "Не удалось загрузить исполняемый файл задачи" msgid "Unknown" msgstr "Неизвестно" msgid "Unnecessary tags may be removed by clicking a cross near tag's name." msgstr "Ненужные теги могут быть убраны нажатием крестика возле имени тега." msgid "Unregister Image" msgid_plural "Unregister Images" msgstr[0] "Разрегистрировать образ" msgstr[1] "Разрегистрировать образы" msgstr[2] "Разрегистрировать образы" msgid "Unregistered Image" msgid_plural "Unregistered Images" msgstr[0] "Разрегистрированный образ" msgstr[1] "Разрегистрированные образы" msgstr[2] "Разрегистрированные образы" msgid "Update" msgstr "Обновить" msgid "Update Cluster Shares" msgstr "Обновить разделяемые диски кластера" msgid "Update Plugin" msgstr "Обновить плагин" msgid "Update Shares" msgstr "Обновить разделяемые диски" msgid "Update the plugin labels" msgstr "Обновите метку плагина" msgid "Updated" msgstr "Обновлено" msgid "Updated time" msgstr "Время обновления" msgid "Upload" msgstr "Загрузить" msgid "Upload File" msgstr "Загрузить файл" msgid "Upload Template" msgstr "Загрузить шаблон" msgid "Upload a new file" msgstr "Загрузить новый файл" msgid "Uptime" msgstr "Время работы" msgid "Url" msgstr "URL" msgid "Use Data Source Substitution for Names and UUIDs" msgstr "Используйте подстановку источников данных для имен и UUID" msgid "Use HBase Common library" msgstr "Использовать общую библитеку HBase" msgid "Use SSL" msgstr "Использовать SSL" msgid "Use anti-affinity groups for processes" msgstr "Использовать анти-аффинные группы для процессов" msgid "Use anti-affinity groups for: " msgstr "Использовать анти-аффинные группы для:" msgid "Use auto-configuration" msgstr "Использовать автоконфигурацию" msgid "Use bucket in path" msgstr "Использовать корзину по пути" msgid "Use the same topology name as defined in your .yaml file" msgstr "Используйте ту же топологию имени, которая указана в вашем .yaml файле" msgid "User" msgstr "Пользователь" msgid "User Name" msgstr "Имя пользователя" msgid "User has to choose a keypair to have access to clusters instances." msgstr "" "Пользователь должен выбрать ключевую пару, чтобы иметь доступ к инстансам " "кластера. " msgid "Username" msgstr "Имя пользователя" msgid "Value" msgstr "Значение" msgid "Value Type" msgstr "Тип значения" msgid "Version" msgstr "Версия" msgid "Version:" msgstr "Версия:" #, python-format msgid "" "Version: %(hadoop_version)s of plugin %(plugin_name)s is now " "deprecated." msgstr "" "Версия: %(hadoop_version)s плагина %(plugin_name)s устарела." msgid "Volume local to instance" msgstr "Локальный диск для инстанса" msgid "Volumes Availability Zone" msgstr "Зона доступности дисков" msgid "Volumes local to instance" msgstr "Локальные диски для инстанса" msgid "Volumes per node" msgstr "Дисков на узел" msgid "Volumes size" msgstr "Размер дисков" msgid "Volumes size (GB)" msgstr "Размер дисков (ГБ)" msgid "Volumes type" msgstr "Тип дисков" msgid "Warning!" msgstr "Предупреждение!" msgid "Which keypair to use for authentication." msgstr "Ключевая пара используемая для аутентификации." msgid "Worker Node Group Template:" msgstr "Шаблон группы узлов Worker:" msgid "" "You are now ready to launch your cluster. When you click on the link below, " "you will need to give your cluster a name, choose the Cluster Template to " "use and choose which image to use to build your instances. After you click " "on \"Create\", your instances will begin to spawn. Your cluster should be " "operational in a few minutes." msgstr "" "Теперь все готово для запуска кластера. После нажатия на ссылку ниже \n" "вам будет необходимо указать название кластера, выбрать шаблон и образ для " "создания инстансов. После нажатия на кнопку \"Создать\" начнется \n" "процесс запуска инстансов. Ваш кластер будет готов к работе через несколько " "минут." msgid "You may also add any custom tag." msgstr "Также вы можете добавить любой пользовательский тег." msgid "You may also enter an optional description for your Data Source." msgstr "" "Вы также можете ввести дополнительное описание для вашего источника данных" msgid "You may also enter an optional description for your job binary." msgstr "" "Вы также можете ввести необязательное описание для вашего исполняемого файла " "задачи." msgid "You may also enter an optional description for your job template." msgstr "Вы также можете ввести необязательное описание вашего шаблоны задачи." msgid "You may need to enter the username and password for your Data Source." msgstr "" "Вам может понадобиться ввести имя пользователя и пароль для вашего источника " "данных" msgid "You may set cluster scoped configurations on corresponding tabs." msgstr "" "Вы можете установить конфигурации специфичные для кластера на " "соответствующих вкладках." msgid "" "You must choose a flavor to determine the size (VCPUs, memory and storage) " "of all launched VMs." msgstr "" "Вы должны выбрать тип инстанса для определения размера (VCPUs, память и " "хранилище) всех запускаемых виртуальных машин. " msgid "" "You need to register an image to launch instances of your cluster. Skip this " "step if you already have a registered image for your plugin, otherwise click " "the link below. In the form you will need to choose the image, input the " "username and add tags for the chosen plugin." msgstr "" "Для запуска инстансов на вашем кластере вам необходимо зарегистрировать " "образы. Пропустите этот шаг, если вы уже зарегистрировали образ для вашего " "плагина. В противном случае, кликните по ссылке ниже, где в открывшейся " "форме вы сможете выбрать образ, ввести имя пользователя и добавить теги к " "выбранному плагину." msgid "" "You've chosen a cluster that is in 'Error' state. Appropriate execution of " "the job can't be guaranteed." msgstr "" "Вы выбрали кластер находящийся в состоянии \"Ошибка\". Надлежащие выполнение " "задачи не может быть гарантировано." msgid "cluster" msgstr "кластер" msgid "cluster template" msgstr "шаблон кластера" msgid "data source" msgstr "источник данных" msgid "job" msgstr "задача" msgid "job binary" msgstr "исполняемый файл задачи" msgid "no processes" msgstr "нет процессов" msgid "node group template" msgstr "шаблон группы узлов" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/ru/LC_MESSAGES/djangojs.po0000664000175000017500000000535500000000000026074 0ustar00zuulzuul00000000000000# Aleksey Alekseenko <9118250541@mail.ru>, 2016. #zanata # Andreas Jaeger , 2016. #zanata # Roman Gorshunov , 2020. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2020-03-31 20:53+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2020-04-03 11:22+0000\n" "Last-Translator: Roman Gorshunov \n" "Language-Team: Russian\n" "Language: ru\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" msgid "(show events)" msgstr "(показать события)" msgid "Configuration Value" msgstr "Конфигурационное значение" msgid "Data Source" msgstr "Источник данных" msgid "Default Value" msgstr "Значение по умолчанию" msgid "Description" msgstr "Описание" msgid "Event log is not available." msgstr "Журнал событий недоступен." msgid "" "For configs and params, type the key name; for args, type the index as an " "integer, starting from 0." msgstr "" "Для configs и params, введите имя ключа; для args, введите индекс как целое " "число начиная с 0." msgid "" "For data sources, use a data source UUID or a path (as per data source " "creation.)" msgstr "" "Для источников данных используйте UUID источника или путь (такой же как при " "создании источника)" msgid "Location" msgstr "Расположение" msgid "Mapping Type" msgstr "Тип отображения" msgid "Name" msgstr "Имя" msgid "Named Parameter" msgstr "Именованный параметр" msgid "Number" msgstr "Число" msgid "Positional Argument" msgstr "Позиционный аргумент" msgid "Remove" msgstr "Удалить" msgid "Required?" msgstr "Обязательно?" msgid "" "See https://docs.openstack.org/sahara/latest/user/edp.html for definitions." msgstr "" "Смотрите https://docs.openstack.org/sahara/latest/user/edp.html для " "определений." msgid "String" msgstr "Строка" msgid "The step has completed successfully. No events to display." msgstr "Этап успешно завершен. Нет событий для отображения." msgid "Value Type" msgstr "Тип значения" msgid "Verification is not available." msgstr "Верификация недоступна." msgid "Warning!" msgstr "Предупреждение!" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/locale/tr_TR/0000775000175000017500000000000000000000000022544 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1648641572.592073 sahara-dashboard-16.0.0/sahara_dashboard/locale/tr_TR/LC_MESSAGES/0000775000175000017500000000000000000000000024331 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/tr_TR/LC_MESSAGES/django.po0000664000175000017500000012003500000000000026134 0ustar00zuulzuul00000000000000# işbaran akçayır , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2019-04-22 11:41+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-05-24 11:10+0000\n" "Last-Translator: Copied by Zanata \n" "Language-Team: Turkish (Turkey)\n" "Language: tr_TR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Zanata 4.3.3\n" "X-POOTLE-MTIME: 1495619320.000000\n" msgid " Done" msgstr " Bitti" msgid " or " msgstr " veya " #, python-format msgid "%(conf_name)s: %(conf_val)s" msgstr "%(conf_name)s: %(conf_val)s" #, python-format msgid "%(conf_name)s: %(conf_value)s" msgstr "%(conf_name)s: %(conf_value)s" #, python-format msgid "%(group)s:" msgstr "%(group)s:" #, python-format msgid "%(key)s: %(val)s" msgstr "%(key)s: %(val)s" #, python-format msgid "%s processes: " msgstr "%s süreç: " msgid "-- not selected --" msgstr "-- seçili değil --" msgid "Adapt For Oozie" msgstr "Oozie için uyarla" msgid "Add" msgstr "Ekle" msgid "Add Node Group" msgstr "Düğüm Grubu Ekle" msgid "Add libraries to your job template." msgstr "İş şablonunuz için kitaplıklar ekleyin." msgid "Anti-affinity enabled for" msgstr "Anti-benzeşim etkin" msgid "Arguments" msgstr "Değişkenler" msgid "Auto Security Group" msgstr "Oto Güvenlik Grubu" msgid "Auto-configure" msgstr "Oto-yapılandır" msgid "" "Automatically modify the Hadoop configuration so that job config values are " "set and so that Oozie will handle exit codes correctly." msgstr "" "Hadoop yapılandırmasını Oozie'nin çıkış kodlarını düzgün ele alması için iş " "yapılandırma değerleri ayarlanacak şekilde otomatik olarak değiştir." msgid "Availability Zone" msgstr "Kullanılırlık Bölgesi" msgid "Base Image" msgstr "Taban İmaj" msgid "Cancel" msgstr "İptal" msgid "Checked?" msgstr "İşaretli mi?" msgid "Checking" msgstr "Kontrol ediliyor" msgid "Choose" msgstr "Seç" msgid "Choose a main binary" msgstr "Bir ana ikilik seçin" msgid "Choose a shell script" msgstr "Bir kabuk betiği seçin" msgid "Choose a storage location" msgstr "Bir depolama konumu seçin" msgid "Choose additional files" msgstr "Ek dosyaları seçin" msgid "Choose an existing Master Node Group Template" msgstr "Var olan bir Ana Düğüm Grup Şablonu seç" msgid "Choose an existing Worker Node Group Template" msgstr "Mevcut İşçi Düğüm Grup Şablonu seçin" msgid "Choose an existing file" msgstr "Mevcut bir dosya seç" msgid "" "Choose from the list of binaries and click \"choose\" to add the library to " "your job template. This can be repeated for additional libraries." msgstr "" "Kitaplığı iş şablonunuza eklemek için ikilik listesinden seçim yapın ve \"Seç" "\"e tıklayın. Ek kitaplıklar için bu işlem tekrarlanabilir." msgid "Choose job type" msgstr "İş türünü seçin" msgid "Choose libraries" msgstr "Kitaplıkları seçin" msgid "Choose node group template" msgstr "Düğüm grup şablonu seçin" msgid "" "Choose or create your main binary. Additional libraries can be added from " "the \"Libs\" tab." msgstr "" "Ana ikiliğinizi seçin ya da oluşturun. Ek kitaplıklar \"Kitaplıklar\" " "sekmesinden eklenebilir." msgid "Choose plugin" msgstr "Eklenti seç" msgid "Choose plugin and version" msgstr "Eklenti ve sürüm seçin" msgid "Choose plugin type and version" msgstr "Eklenti türü ve sürümü seçin" msgid "Choose the Input Data Source (n/a for Java and Shell jobs)." msgstr "Girdi Veri Kaynağını seçin (Java ve Betik işlerinde kullanılamaz)." msgid "Choose the Output Data Source (n/a for Java and Shell jobs)." msgstr "Çıktı Veri Kaynağını seçin (Java ve Betik işlerinde kullanılamaz)." msgid "Choose the binary which should be used in this Job." msgstr "Bu işte kullanılması gereken ikiliği seçin." msgid "Choose the cluster to use for the job." msgstr "İş için kullanılacak kümeyi seçin." msgid "Chosen Libraries" msgstr "Seçilen Kitaplıklar" msgid "Cinder Volume" msgstr "Cinder Birimi" msgid "Cinder service is unavailable now" msgstr "Cinder servisi şu an kullanılabilir değil" msgid "Cinder volumes" msgstr "Cinder birimleri" msgid "Cluster" msgstr "Küme" msgid "Cluster Configuration Overview" msgstr "Küme Yapılandırma Genel Görünümü" msgid "Cluster Count" msgstr "Küme Sayısı" msgid "Cluster Creation Guide" msgstr "Küme Oluşturma Kılavuzu" msgid "Cluster Events" msgstr "Küme Olayları" msgid "Cluster Instances" msgstr "Küme Sunucuları" msgid "Cluster Name" msgstr "Küme İsmi" msgid "Cluster Template" msgstr "Küme Şablonu" #, python-format msgid "Cluster Template %s updated" msgstr "Küme Şablonu %s güncellendi" msgid "Cluster Template Configuration Overview" msgstr "Küme Şablon Yapılandırma Genel Görünümü" #, python-format msgid "Cluster Template copy %s created" msgstr "Küme Şablon kopyası %s oluşturuldu" msgid "Cluster Templates" msgstr "Küme Şablonları" msgid "Cluster can be launched using existing Cluster Templates." msgstr "Küme mevcut Küme Şablonlarıyla başlatılabilir." msgid "Cluster configurations are not specified" msgstr "Küme yapılandırmaları belirtilmemiş" msgid "Cluster health checks" msgstr "Küme sağlık kontrolleri" msgid "Cluster provision steps" msgstr "Küme hazırlık adımları" msgid "Cluster share update failed." msgstr "Küme paylaşım güncelleme başarısız." msgid "Cluster template creation failed" msgstr "Küme şablonu oluşturma başarısız" msgid "Cluster template update failed" msgstr "Küme şablonu güncellemesi başarısız" msgid "Cluster type chosen" msgstr "Seçilen küme türü" msgid "Clusters" msgstr "Kümeler" msgid "Completed Successfully" msgstr "Başarıyla Tamamlandı" msgid "Configuration" msgstr "Yapılandırma" msgid "Configuration Details" msgstr "Yapılandırma Ayrıntıları" msgid "Configuration Value" msgstr "Yapılandırma Değeri" msgid "Configure" msgstr "Yapılandır" msgid "Configure Cluster" msgstr "Kümeyi Yapılandır" msgid "Configure Cluster Template" msgstr "Küme Şablonunu Yapılandır" msgid "Configure Node Group Template" msgstr "Düğüm Grup Şablonunu Yapılandır" msgid "Configure Template" msgstr "Şablonu Yapılandır" msgid "Control access to instances of the node group." msgstr "Düğüm grubu sunucularına erişimi kontrol et." msgid "Copy Cluster Template" msgstr "Küme Şablonunu Kopyala" msgid "Copy Template" msgstr "Şablonu Kopyala" msgid "Could not create" msgstr "Oluşturulamadı" msgid "Could not create data source" msgstr "Veri kaynağı oluşturulamadı" msgid "Could not create job template" msgstr "İş şablonu oluşturulamadı" msgid "Could not launch job" msgstr "İş başlatılamadı" msgid "Could not update cluster shares" msgstr "Küme paylaşımları güncellenemedi" msgid "Could not update data source" msgstr "Veri kaynağı güncellenemiyor" msgid "Could not update plugin" msgstr "Eklenti güncellenemiyor" msgid "Count" msgstr "Sayı" msgid "Create" msgstr "Oluştur" msgid "Create Cluster Template" msgstr "Küme Şablonu Oluştur" msgid "Create Data Source" msgstr "Veri Kaynağı Oluştur" msgid "Create Job Binary" msgstr "İş İkiliği Oluştur" msgid "Create Job Template" msgstr "İş Şablonu Oluştur" msgid "Create Node Group Template" msgstr "Düğüm Grup Şablonu Oluştur" msgid "Create Template" msgstr "Şablon Oluştur" msgid "Create a Cluster Template" msgstr "Küme Şablonu Oluştur" msgid "Create a Data Source with a specified name." msgstr "Belirtilen isimde bir Veri Kaynağı oluştur." msgid "Create a Master Node Group Template" msgstr "Ana Düğüm Grup Şablonu Oluştur" msgid "Create a Worker Node Group Template" msgstr "İşçi Düğüm Grup Şablonu Oluştur" msgid "Create a data source" msgstr "Veri kaynağı oluştur" msgid "Create a job template" msgstr "Bir iş şablonu oluştur" msgid "Create a job template with a specified name." msgstr "Belirtilen isimde bir iş şablonu oluştur." msgid "Create a script to be uploaded dynamically" msgstr "Dinamik olarak yüklenecek bir betik oluştur" msgid "Create security group for this Node Group." msgstr "Bu Düğüm Grubu için güvenlik grubu oluştur." msgid "Create time" msgstr "Oluşturma zamanı" msgid "Create volumes in this availability zone." msgstr "Birimleri bu kullanılırlık bölgesinde oluştur." msgid "Created" msgstr "Oluşturuldu" msgctxt "Created time" msgid "Created" msgstr "Oluşturuldu" #, python-format msgid "Created Cluster Template %s" msgstr "Küme Şablonu %s Oluşturuldu" #, python-format msgid "Created Node Group Template %s" msgstr "Düğüm Grup Şablonu %s Oluştur" msgid "Created time" msgstr "Oluşturulma zamanı" msgid "Current choice:" msgstr "Şu anki seçim:" msgid "Current type:" msgstr "Mevcut tür:" msgid "Custom Tag" msgstr "Özel Etiket" msgid "DNS Domain Names" msgstr "DNS Alan Adları" msgid "Data Processing" msgstr "Veri İşleniyor" msgid "Data Processing Plugin Details" msgstr "Veri İşleme Eklenti Ayrıntıları" msgid "Data Processing Plugins" msgstr "Veri İşleme Eklentileri" msgid "Data Processing internal database" msgstr "Veri İşleme dahili veri tabanı" msgid "" "Data Processing provides different storage location options. You may choose " "Ephemeral Drive or a Cinder Volume to be attached to instances." msgstr "" "Veri İşleme değişik depolama konumu seçenekleri sağlar. Sunuculara eklemek " "için Geçici Sürücü veya Cinder Birimi seçebilirsiniz." msgid "Data Source" msgstr "Veri Kaynağı" msgid "Data Source Type" msgstr "Veri Kaynağı Türü" msgid "Data Sources" msgstr "Veri Kaynakları" msgid "Data source created" msgstr "Veri kaynağı oluşturuldu" msgid "Data source updated" msgstr "Veri kaynağı güncellendi" msgid "Default Value" msgstr "Öntanımlı Değer" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "Kümeyi Sil" msgstr[1] "Kümeleri Sil" msgid "Delete Data Source" msgid_plural "Delete Data Sources" msgstr[0] "Veri Kaynağı Sil" msgstr[1] "Veri Kaynaklarını Sil" msgid "Delete Job" msgid_plural "Delete Jobs" msgstr[0] "İşi Sil" msgstr[1] "İşleri Sil" msgid "Delete Job Binary" msgid_plural "Delete Job Binaries" msgstr[0] "İş İkiliğini Sil" msgstr[1] "İş İkiliklerini Sil" msgid "Delete Job Template" msgid_plural "Delete Job Templates" msgstr[0] "İş Şablonunu Sil" msgstr[1] "İş Şablonlarını Sil" msgid "Delete Template" msgid_plural "Delete Templates" msgstr[0] "Şablonu Sil" msgstr[1] "Şablonları Sil" msgid "Deleted Cluster" msgid_plural "Deleted Clusters" msgstr[0] "Küme Silindi" msgstr[1] "Kümeler Silindi" msgid "Deleted Data Source" msgid_plural "Deleted Data Sources" msgstr[0] "Veri Kaynağı Silindi" msgstr[1] "Veri Kaynakları Silindi" msgid "Deleted Job" msgid_plural "Deleted Jobs" msgstr[0] "İş Silindi" msgstr[1] "İşler Silindi" msgid "Deleted Job Binary" msgid_plural "Deleted Job Binaries" msgstr[0] "İş İkiliği Silindi" msgstr[1] "İş İkilikleri Silindi" msgid "Deleted Job Template" msgid_plural "Deleted Jobs Templates" msgstr[0] "İş Şablonu Silindi" msgstr[1] "İş Şablonları Silindi" msgid "Deleted Template" msgid_plural "Deleted Templates" msgstr[0] "Şablon Silindi" msgstr[1] "Şablonlar Silindi" msgid "Description" msgstr "Tanım" msgid "Details" msgstr "Ayrıntılar" msgid "Domain Name" msgstr "Alan Adı" msgid "Domain name" msgstr "Alan adı" msgid "Done" msgstr "Bitti" msgctxt "Current status of a Job" msgid "Done with Error" msgstr "Hata ile Bitti" msgid "Download Job Binary" msgstr "İş İkiliğini İndir" msgid "Download job binary" msgstr "İş ikiliğini indir" msgid "Drive type" msgstr "Sürücü türü" msgid "Duration" msgstr "Süre" msgid "Edit Cluster Template" msgstr "Küme Şablonunu Düzenle" msgid "Edit Data Source" msgstr "Veri Kaynağını Düzenle" msgid "Edit Image Tags" msgstr "İmaj Etiketlerini Düzenle" msgid "Edit Job Binary" msgstr "İş İkiliğini Düzenle" msgid "Edit Node Group Template" msgstr "Düğüm Grup Şablonunu Düzenle" msgid "Edit Tags" msgstr "Etiketleri Düzenle" msgid "Edit Template" msgstr "Şamblonu Düzenle" msgid "Enable Swift Paths" msgstr "Swift Yollarını Etkinleştir" msgid "Enabled Versions" msgstr "Etkin Sürümler" msgctxt "End time" msgid "Ended" msgstr "Bitti" msgid "Enter any custom configuration required for your job's execution." msgstr "" "İşinizin çalıştırılması için gerekli herhangi özel yapılandırma varsa girin." msgid "Enter the URL for the file" msgstr "Dosya için URL girin" msgid "Enter the username and password required to access that file" msgstr "Bu dosyaya erişim için gerekli kullanıcı adı ve parolayı girin" msgid "Ephemeral Drive" msgstr "Geçici Sürücü" msgid "Ephemeral drive" msgstr "Geçici sürücü" msgid "Error Details" msgstr "Hata Ayrıntıları" msgid "Event time" msgstr "Olay zamanı" msgid "Failed" msgstr "Başarısız" msgctxt "Current status of a Job" msgid "Failed" msgstr "Başarısız" msgid "Failed to fetch internal binary list" msgstr "Dahili ikilik listesi getirilemiyor" msgid "Failed to get list of internal binaries." msgstr "Dahili ikiliklerin listesi alınamadı." msgid "Failed to get list of shares" msgstr "Paylaşım listesi alma başarısız" msgid "Failed to update image." msgstr "İmaj güncellenemedi." msgid "Filter" msgstr "Süzgeç" msgid "Flavor" msgstr "Nitelik" msgid "Flavor is not specified" msgstr "Nitelik belirtilmemiş" msgid "Floating IP Pool" msgstr "Değişken IP Havuzu" msgid "" "For Data Processing internal job binaries, you may choose from the following:" msgstr "Veri İşleme dahili iş ikilikleri için, şunlardan seçim yapabilirsiniz:" msgid "" "For Data Sources on a Manila share, choose the share and enter the path " "relative to the share (example: /outputdir/myinputfile.txt)" msgstr "" "Manila paylaşımındaki Veri Kaynakları için, paylaşımı seçin ve paylaşıma " "göre yolu girin (örneğin: /çıktı/dizini/girdidosyam.txt)" msgid "For Object Store job binaries, you must:" msgstr "Nesne Depolama iş ikilikleri için yapmanız gereken:" msgid "" "For Shell Action jobs, any required files beyond the main script may be " "added as \"libraries\"." msgstr "" "Kabuk Eylem işleri için, ana betikten başka gerekli dosyalar \"kitaplık\" " "olarak eklenebilir." msgid "" "For Storm, Storm Pyleus, Spark and Shell jobs, only a main is required,\"libs" "\" are optional." msgstr "" "Storm, Storm Pyleus, Spark ve Kabuk işleri için, yalnızca bir ana ikilik " "gereklidir, \"kitaplıklar\" isteğe bağlıdır." msgid "General Info" msgstr "Genel Bilgi" msgid "Guided Cluster Creation" msgstr "Kılavuzlu Küme Oluşturma" msgid "Guided Job Execution" msgstr "Kılavuzlu İş Çalıştırma" msgid "HDFS placement" msgstr "HDFS yerleştirme" msgid "Health" msgstr "Sağlık" msgid "Hide full configuration" msgstr "Tam yapılandırmayı gizle" msgid "Hive" msgstr "Hive" msgid "ID" msgstr "Kimlik" #, python-format msgid "" "If selected, %s will be protected from modifications until this will be " "unselected" msgstr "" "Seçiliyse, %s seçim kaldırılana kadar tüm değişikliklerden korunacaktır" #, python-format msgid "If selected, %s will be shared across the tenants" msgstr "Seçiliyse, %s tüm kiracılar arasında paylaşılır" msgid "" "If selected, instances of a cluster will be automatically configured during " "creation. Otherwise you should manually specify configuration values" msgstr "" "Seçiliyse, kümenin sunucuları oluşturma sırasında otomatik yapılandırılır. " "Aksi hale elle yapılandırma değerlerini belirtmeniz gerekir" msgid "" "If selected, instances of a node group will be automatically configured " "during cluster creation. Otherwise you should manually specify configuration " "values." msgstr "" "Seçiliyse, bir düğüm grubunun sunucuları küme oluşturulurken otomatik " "yapılandırılacak. Aksi halde yapılandırma değerlerini elle belirtmelisiniz." msgid "Image" msgstr "İmaj" msgid "Image Registry" msgstr "İmaj Kayıtları" msgid "" "Image Registry is used to provide additional information about images for " "Data Processing." msgstr "" "İmaj Kaydı Veri İşleme için imajlar hakkında ek bilgi sağlamak için " "kullanılır." msgid "Image Registry tool:" msgstr "İmaj Kayıt aracı:" msgid "In progress" msgstr "Devam ediyor" msgid "Info" msgstr "Bilgi" msgid "Input" msgstr "Girdi" msgid "Input Data Source" msgstr "Girdİ Veri Kaynağı" msgid "Instance" msgstr "Sunucu" msgid "Instance and attached volumes will be created on the same physical host" msgstr "Sunucu ve ekli birimler aynı fiziksel sunucu üzerinde oluşturulacak." msgid "Instances" msgstr "Sunucular" msgid "Instances Count" msgstr "Sunucu Sayısı" msgid "Interface Arguments" msgstr "Arayüz Değişkenleri" msgid "Internal Binary" msgstr "Dahiki İkilik" msgid "Internal IP" msgstr "Dahili IP" msgid "Internal binary" msgstr "Dahili ikilik" msgid "Java" msgstr "Java" msgid "Java Action" msgstr "Java Eylemi" msgid "Java Opts" msgstr "Java Seçenekleri" msgid "Job" msgstr "İş" msgid "Job Binaries" msgstr "İş İkilikleri" msgid "Job Configuration" msgstr "İş Yapılandırması" msgid "Job Execution ID" msgstr "İş Çalıştırma Kimliği" msgid "Job Guide" msgstr "İş Kılavuzu" msgid "Job Template" msgstr "İş Şablonu" msgid "Job Templates" msgstr "İş Şablonları" msgid "Job Type" msgstr "İş Türü" msgid "Job args" msgstr "İş değişkenleri" msgid "Job configs" msgstr "İş yapılandırmaları" msgid "Job created" msgstr "İş oluşturuldu" msgid "Job launched" msgstr "İş başlatıldı" msgid "Job params" msgstr "İş parametreleri" msgid "Job template:" msgstr "İş şablonu:" msgid "Job type chosen" msgstr "Seçilen iş türü" msgid "Jobs" msgstr "İşler" msgid "Keypair" msgstr "Anahtar çifti" msgctxt "Current status of a Job" msgid "Killed" msgstr "Öldürüldü" msgid "Label" msgstr "Etiket" msgid "Label details" msgstr "Etiket ayrıntıları" msgid "Last Updated" msgstr "Son Güncelleme" msgid "Launch" msgstr "Çalıştır" msgid "Launch Cluster" msgstr "Küme Başlat" msgid "Launch Job" msgid_plural "Launch Jobs" msgstr[0] "İşi Başlat" msgstr[1] "İşleri Başlat" msgid "Launch On Existing Cluster" msgstr "Mevcut Kümede Başlat" msgid "Launch On New Cluster" msgstr "Yeni Kümede Başlat" msgid "Launch a Cluster" msgstr "Bir Küme Başlat" msgid "Launch instances in these security groups." msgstr "Sunucuları bu güvenlik gruplarında başlat." msgid "Launch instances in this availability zone." msgstr "Sunucuları bu kullanılırlık bölgesinde başlat." msgid "Launch job" msgstr "İşi başlat" msgid "Launch the given job template on a cluster." msgstr "Verilen iş şablonunu bir kümede başlat." #, python-format msgid "Launched Cluster %s" msgstr "%s Kümesi Başlatıldı" msgid "Launched Job" msgid_plural "Launched Jobs" msgstr[0] "İş Başlatıldı" msgstr[1] "İşler Başlatıldı" msgid "Libs" msgstr "Kitaplıklar" msgid "Location" msgstr "Konum" msgid "Main Class" msgstr "Ana Sınıf" msgid "Mains" msgstr "Ana ikilikler" msgid "Management IP" msgstr "Yönetim IP'si" msgid "Manila share" msgstr "Manila paylaşımı" msgid "MapReduce" msgstr "MapReduce" msgid "Mapper" msgstr "Mapper" msgid "Mapping Type" msgstr "Eşleştirme Türü" msgid "Master Node Group Template:" msgstr "Ana Düğüm Grup Şablonu:" msgid "" "Modify the configuration so that swift URLs can be dereferenced through HDFS " "at runtime." msgstr "" "Çalışma zamanında HDFS üzerinden swift URL'lerini referanstan ayırmak için " "yapılandırmayı değiştir." msgid "Name" msgstr "İsim" #, python-format msgid "Name: %(node_group_name)s" msgstr "İsim: %(node_group_name)s" msgid "Named Parameter" msgstr "Adlandırılmış Parametre" msgid "Neutron Management Network" msgstr "Neutron Yönetim Ağı" msgid "Never" msgstr "Asla" msgid "Next" msgstr "Sonraki" msgid "No Cluster Template Created" msgstr "Küme Şablonu Oluşturulmadı" msgid "No Images Available" msgstr "Kullanılabilir İmaj Yok" msgid "No Master Node Group Template Created" msgstr "Ana Düğüm Grup Şablonu Oluşturulmamış" msgid "No Templates Available" msgstr "Kullanılabilir Şablon Yok" msgid "No Worker Node Group Template Created" msgstr "İşçi Düğüm Grup Şablonu Oluşturulmadı" msgid "No availability zone specified" msgstr "Kullanılırlık bölgesi belirtilmemiş" msgid "No clusters available" msgstr "Kullanılabilir küme yok" msgid "No configurations" msgstr "Yapılandırma yok" msgid "No description" msgstr "Tanım yok" msgid "No domain is specified" msgstr "Alan belirtilmemiş" msgid "No enabled versions" msgstr "Etkin sürüm yok" msgid "No image specified" msgstr "İmaj belirtilmemiş" msgid "No images available." msgstr "Kullanılabilir imaj yok." msgid "No info available" msgstr "Kullanılabilir bilgi yok" msgid "No job template created" msgstr "İş şablonu oluşturulmadı" msgid "No keypair" msgstr "Anahtar çifti yok" msgid "No plugin chosen" msgstr "Eklenti seçilmemiş" msgid "No type chosen" msgstr "Tür seçilmemiş" msgid "No volume type" msgstr "Birim türü yok" msgid "Node Group" msgstr "Düğüm Grubu" #, python-format msgid "Node Group Name: %(node_group_name)s" msgstr "Düğüm Grubu İsmi: %(node_group_name)s" msgid "Node Group Template" msgstr "Düğüm Grup Şablonu" #, python-format msgid "Node Group Template %s updated" msgstr "Düğüm Grup Şablonu %s güncellendi" #, python-format msgid "Node Group Template copy %s created" msgstr "Düğüm Grup Şablon kopyası %s oluşturuldu" msgid "Node Group Templates" msgstr "Düğüm Grup Şablonları" #, python-format msgid "Node Group: %(node_group_name)s" msgstr "Düğüm Grubu: %(node_group_name)s" msgid "Node Groups" msgstr "Düğüm Grupları" msgid "Node Groups Configuration Overview" msgstr "Düğüm Grupları Yapılandırma Genel Görünümü" msgid "Node Processes" msgstr "Düğüm Süreçleri" msgid "Node group cluster" msgstr "Düğüm grup kümesi" msgid "Node group configurations are not specified" msgstr "Düğüm grup yapılandırmaları belirtilmemiş" msgid "Node processes are not specified" msgstr "Düğüm süreçleri belirtilmemiş" msgid "Nodes Count" msgstr "Düğüm Sayısı" msgid "None" msgstr "Hiçbiri" msgid "Not available" msgstr "Kullanılabilir değil" msgid "Number" msgstr "Sayı" msgid "Number of Nodes" msgstr "Düğüm Sayısı" msgid "Number of clusters to launch." msgstr "Başlatılacak küme sayısı." msgid "Oozie Job ID" msgstr "Oozie İş Kimliği" msgid "OpenStack Flavor" msgstr "OpenStack Niteliği" msgid "Output" msgstr "Çıktı" msgid "Output Data Source" msgstr "Çıktı Veri Kaynağı" msgid "Parameters" msgstr "Parametreler" msgid "Password" msgstr "Parola" msgid "Path" msgstr "Yol" msgid "Path on share" msgstr "Paylaşımdaki yol" msgid "Persist cluster after job exit" msgstr "İş bitiminde kümeyi koru" msgid "Pig" msgstr "Pig" msgid "Plugin" msgstr "Eklenti" msgid "Plugin Name" msgstr "Eklenti İsmi" msgid "Plugin and Version Tag" msgstr "Eklenti ve Sürüm Etiketi" msgid "Plugin label" msgstr "Eklenti etiketi" msgid "Plugin name" msgstr "Eklenti ismi" msgid "Plugin update failed." msgstr "Eklenti güncelleme başarısız." #, python-format msgid "Plugin version %(version)s label" msgstr "Eklenti sürüm %(version)s etiketi" #, python-format msgid "Plugin version %s" msgstr "Eklenti sürümü %s" msgid "Plugin:" msgstr "Eklenti:" msgid "Plugins" msgstr "Eklentiler" msgid "Positional Argument" msgstr "Konumsal Değişken" msgid "Progress" msgstr "Süreç" msgid "Project ID" msgstr "Proje Kimliği" msgid "Protected" msgstr "Korumalı" msgid "Proxy Gateway" msgstr "Vekil Ağ Geçidi" msgid "Public" msgstr "Açık" msgid "Read only" msgstr "Yalnızca okunur" msgid "Read/Write" msgstr "Oku/Yaz" msgid "Reducer" msgstr "Reducer" msgid "Register Image" msgstr "İmajı Kaydet" msgid "Relaunch On Existing Cluster" msgstr "Mevcut Kümede Yeniden Başlat" msgid "Relaunch On New Cluster" msgstr "Yeni Kümede Yeniden Başlat" msgid "Remove" msgstr "Kaldır" msgid "Required" msgstr "Gerekli" msgid "Reset Cluster Creation Guide" msgstr "Küme Oluşturma Kılavuzunu Sıfırla" msgid "Reset Cluster Guide" msgstr "Küme Kılavuzunu Sıfırla" msgid "Reset Job Execution Guide" msgstr "İş Çalıştırma Kılavuzunu Sıfırla" msgid "Return Code" msgstr "Dönüş Kodu" msgid "Run HBase EDP Jobs with common HBase library on HDFS" msgstr "HDFS üzerinde genel HBase kitaplığı ile HBase EDP İşleri çalıştır" msgid "" "Sahara will use instances of this node group to access other cluster " "instances." msgstr "" "Sahara diğer küme sunucularına erişmek için bu düğüm grubu sunucularını " "kullanacak." msgid "Scale" msgstr "Ölçek" msgid "Scale Cluster" msgstr "Kümeyi Ölçeklendir" msgid "Scale cluster operation failed" msgstr "Küme ölçeklendirme işlemi başarısız" msgid "Scaled cluster successfully started." msgstr "Ölçeklenmiş küme başarıyla başlatıldı." msgid "Scope" msgstr "Kapsam" msgid "Script name" msgstr "Betik ismi" msgid "Script text" msgstr "Betik metni" msgid "Security" msgstr "Güvenlik" msgid "Security Groups" msgstr "Güvenlik Grupları" msgid "Select" msgstr "Seç" msgid "Select Image" msgstr "İmaj Seçin" msgid "Select Node Group Processes" msgstr "Düğüm Grup Süreçlerini Seç" msgid "Select Shares" msgstr "Paylaşımları Seç" msgid "Select a Node Group Template to add:" msgstr "Eklemek için bir Düğüm Grup Şablonu seçin:" msgid "Select a Value Type for your next argument:" msgstr "Sonraki değişkeniniz için bir Değer Türü seçin:" msgid "Select a plugin and version for a new Cluster template." msgstr "Yeni Küme şablonu için bir eklenti ve sürüm seçin." msgid "Select a plugin and version for a new Cluster." msgstr "Yeni Küme için bir eklenti ve sürüm seçin." msgid "Select a plugin and version for the new Node Group template." msgstr "Yeni Düğüm Grup şablonu için bir eklenti ve sürüm seçin." msgid "" "Select an existing node group template.\n" " " msgstr "" "Mevcut bir düğüm grup şablonu seçin.\n" " " msgid "Select node processes for the node group" msgstr "Düğüm grubu için düğüm süreçlerini seç" msgid "Select plugin and hadoop version" msgstr "Eklenti ve hadoop sürümü seçin" msgid "Select plugin and hadoop version for cluster" msgstr "Küme için eklenti ve hadoop sürümü seç" msgid "Select plugin and hadoop version for cluster template" msgstr "Küme şablonu için eklenti ve hadoop sürümü seçin" msgid "Select property name" msgstr "Özellik ismini seçin" msgid "Select the domain name for internal and external hostname resolution." msgstr "Dahili ve harici alan adı çözümü için alan ismini seçin." msgid "Select the manila shares for this cluster" msgstr "Bu küme için manila paylaşımlarını seçin" msgid "Select the manila shares for this node group" msgstr "Bu düğüm grubu için manila paylaşımlarını seç" msgid "Select the storage type for your job binary." msgstr "İş ikiliğiniz için depolama türü seçin." msgid "Select the type of your Data Source." msgstr "Veri Kaynağınızın türünü seçin." msgid "Select the type of your job:" msgstr "İşinizin türünü seçin:" msgid "Select type" msgstr "Tür seçin" msgid "Service Configurations" msgstr "Servis Yapılandırmaları" msgid "Share" msgstr "Paylaşım" msgid "Shares" msgstr "Paylaşımlar" msgid "Shell" msgstr "Kabuk" msgid "Shell Action" msgstr "Kabuk Eylemi" msgid "Show full configuration" msgstr "Tam yapılandırmayı göster" msgid "Source password" msgstr "Kaynak parolası" msgid "Source username" msgstr "Kaynak kullanıcı adı" msgid "Spark" msgstr "Spark" msgid "" "Specified User Name will be used by Data Processing to apply configs and " "manage processes on instances." msgstr "" "Belirtilen Kullanıcı Adı Veri İşleme tarafından sunuculardaki süreçleri " "yönetme ve yapılandırmaları uygulama amacıyla kullanılacak." msgid "Start Verification" msgid_plural "Start Verifications" msgstr[0] "Onaylamayı Başlat" msgstr[1] "Onaylamaları Başlat" msgctxt "Start time" msgid "Started" msgstr "Başlatılma" msgid "Started Verification" msgid_plural "Started Verifications" msgstr[0] "Onaylama Başlatıldı" msgstr[1] "Onaylamalar Başlatıldı" msgid "Started at" msgstr "Başlama zamanı" msgid "Status" msgstr "Durum" msgid "Status description" msgstr "Durum tanımı" msgid "Step Description" msgstr "Adım Tanımlaması" msgid "Storage type" msgstr "Depolama türü" msgid "Storm" msgstr "Storm" msgid "Storm Pyleus" msgstr "Storm Pyleus" msgid "Streaming MapReduce" msgstr "Duraksız MapReduce" msgid "String" msgstr "Karakter Dizisi" msgid "" "Substitute data source objects for URLs of the form datasource://name or " "uuid." msgstr "" "Veri kaynağı nesnelerini verikaynağı://isim veya uuid biçiminde URL'ler ile " "değiştir." msgctxt "Current status of a Job" msgid "Succeeded" msgstr "Başarılı" msgid "Successfully updated image." msgstr "İmaj başarıyla güncellendi." msgid "Supported Versions" msgstr "Desteklenen Sürümler" msgid "Swift" msgstr "Swift" msgid "Tags" msgstr "Etiketler" msgid "Template" msgstr "Şablon" msgid "Template Name" msgstr "Şablon Adı" msgid "Template not specified" msgstr "Şablon belirtilmemiş" msgid "" "The Cluster object should specify OpenStack Image to boot instances for " "Cluster." msgstr "" "Küme nesnesi Küme için ön yüklenecek sunucular için OpenStack İmajını " "belirtmeli." msgid "The value of shares must be a list of values" msgstr "Paylaşım listesi bir değerler listesi olmalı" msgid "This Cluster Template will be created for:" msgstr "Bu Küme Şablonu şunun için oluşturulacak:" msgid "This Cluster will be started with:" msgstr "Bu Küme şunlarla başlatılacak:" msgid "This Node Group Template will be created for:" msgstr "Bu Düğüm Grup Şablonu şunun için oluşturulacak:" msgid "Title" msgstr "Başlık" msgid "Topology Name" msgstr "Topoloji İsmi" msgid "Type" msgstr "Tür" msgid "URL" msgstr "URL" msgid "Unable to create job binary" msgstr "İş ikiliği oluşturulamıyor" #, python-format msgid "Unable to create job binary: %s" msgstr "İş ikiliği oluşturulamıyor: %s" msgid "Unable to create new cluster for job." msgstr "İş için yeni bir küme oluşturulamıyor." msgid "Unable to create the cluster" msgstr "Küme oluşturulamıyor" #, python-format msgid "Unable to fetch Base Image with id: %s." msgstr "Bu kimliğe sahip Taban İmaj getirilemedi: %s." msgid "Unable to fetch available images." msgstr "Kullanılabilir imajlar getirilemedi." msgid "Unable to fetch base image details" msgstr "Taban imaj ayrıntıları getirilemiyor" msgid "Unable to fetch cluster list" msgstr "Küme listesi getirilemedi" msgid "Unable to fetch cluster template list" msgstr "Küme şablon listesi getirilemiyor" msgid "Unable to fetch cluster template." msgstr "Küme şablonu getirilemiyor." msgid "Unable to fetch cluster to scale" msgstr "Ölçeklenecek küme getirilemedi" msgid "Unable to fetch cluster to scale." msgstr "Ölçeklenecek küme getirilemedi." msgid "Unable to fetch cluster." msgstr "Küme getirilemedi." msgid "Unable to fetch clusters." msgstr "Kümeler alınamıyor." msgid "Unable to fetch data source list" msgstr "Veri kaynağı listesi getirilemedi" msgid "Unable to fetch data sources." msgstr "Veri kaynakları getirilemiyor." msgid "Unable to fetch flavor for template." msgstr "Şablon için nitelik getirilemedi." msgid "Unable to fetch floating ip pools." msgstr "Değişken ip havuzları getirilemedi." msgid "Unable to fetch image choices." msgstr "İmaj seçimleri getirilemedi." msgid "Unable to fetch instance details." msgstr "Sunucu ayrıntıları getirilemiyor." msgid "Unable to fetch job binary list" msgstr "İş ikiliği listesi getirilemedi" #, python-format msgid "Unable to fetch job binary: %(exc)s" msgstr "İş ikiliği getirilemiyor: %(exc)s" msgid "Unable to fetch job list" msgstr "İş listesi getirilemiyor" msgid "Unable to fetch job template list" msgstr "İş şablon listesi getirilemiyor" msgid "Unable to fetch jobs." msgstr "İşler getirilemiyor." msgid "Unable to fetch keypair choices." msgstr "Anahtar çifti seçimleri getirilemiyor." msgid "Unable to fetch network details" msgstr "Ağ ayrıntıları getirilemiyor" msgid "Unable to fetch node group details." msgstr "Düğüm grup ayrıntıları getirilemiyor." msgid "Unable to fetch node group template list" msgstr "Düğüm grup şablon listesi getirilemedi" msgid "Unable to fetch plugin details." msgstr "Eklenti ayrıntıları getirilemedi." msgid "Unable to fetch plugin list" msgstr "Eklenti listesi getirilemedi" msgid "Unable to fetch plugin object." msgstr "Eklenti nesnesi getirilemedi." msgid "Unable to fetch template object." msgstr "Şablon nesnesi getirilemedi." msgid "Unable to fetch template to copy." msgstr "Şablon kopyalamak için getirilemiyor." msgid "Unable to fetch template to edit." msgstr "Şablon düzenlenmek için getirilemiyor." msgid "Unable to fetch the image details" msgstr "İmaj ayrıntıları getirilemiyor" msgid "Unable to generate process choices." msgstr "Süreç seçenekleri üretilemiyor." msgid "Unable to get node group details." msgstr "Düğüm grup ayrıntıları alınamıyor." msgid "Unable to get security group list." msgstr "Güvenlik grubu listesi alınamadı." msgid "Unable to launch job." msgstr "İş başlatılamıyor." msgid "Unable to populate anti-affinity processes." msgstr "Anti-benzeşim süreçleri doldurulamıyor." msgid "Unable to process plugin tags" msgstr "Eklenti etiketleri işlenemiyor" msgid "Unable to retrieve data processing plugins." msgstr "Veri işleme eklentiler alınamadı." #, python-format msgid "Unable to retrieve details for cluster \"%s\"." msgstr "\"%s\" kümesinin ayrıntıları alınamıyor." #, python-format msgid "Unable to retrieve details for cluster template \"%s\"." msgstr "Küme şablonu \"%s\" için ayrıntılar alınamıyor." #, python-format msgid "Unable to retrieve details for data source \"%s\"." msgstr "Veri kaynağı \"%s\" için ayrıntılar alınamadı." #, python-format msgid "Unable to retrieve details for job \"%s\"." msgstr "\"%s\" işi için ayrıntılar alınamıyor." #, python-format msgid "Unable to retrieve details for job binary \"%s\"." msgstr "İş ikiliği \"%s\" için ayrıntılar alınamadı." #, python-format msgid "Unable to retrieve details for job template \"%s\"." msgstr "İş şablonu \"%s\" için ayrıntılar alınamıyor." #, python-format msgid "Unable to retrieve details for node group template \"%s\"." msgstr "Düğüm grup şablonu \"%s\" için ayrıntılar alınamadı." msgid "Unable to retrieve image list" msgstr "İmaj listesi alınamıyor" #, python-format msgid "Unable to retrieve images with filter %s." msgstr "%s süzgeciyle imaj alınamadı." #, python-format msgid "Unable to retrieve job binary \"%s\"." msgstr "İş ikiliği \"%s\" alınamadı." msgid "Unable to retrieve networks." msgstr "Ağlar alınamıyor." msgid "Unable to retrieve plugin." msgstr "Eklenti alınamadı." #, python-format msgid "Unable to retrieve security group %(group)s." msgstr "Güvenlik grubu %(group)s alınamadı." msgid "Unable to set cluster type" msgstr "Küme türü ayarlanamadı" msgid "Unable to set job type" msgstr "İş türü ayarlanamadı" msgid "Unable to set node group template" msgstr "Düğüm grup şablonu ayarlanamadı" msgid "Unable to update job binary" msgstr "İş ikiliği güncellenemiyor" #, python-format msgid "Unable to update job binary: %s" msgstr "İş ikiliği güncellenemiyor: %s" msgid "Unable to update row" msgstr "Satır güncellenemiyor" msgid "Unable to upload job binary" msgstr "İş ikiliği yüklenemiyor" msgid "Unknown" msgstr "Bilinmiyor" msgid "Unnecessary tags may be removed by clicking a cross near tag's name." msgstr "" "Gereksiz etiketler etiket isminin yanındaki çarpıya tıklayarak " "kaldırılabilir." msgid "Unregister Image" msgid_plural "Unregister Images" msgstr[0] "İmajı Kayıttan Çıkar" msgstr[1] "İmajları Kayıttan Çıkar" msgid "Unregistered Image" msgid_plural "Unregistered Images" msgstr[0] "İmaj Kayıttan Çıkarıldı" msgstr[1] "İmajlar Kayıttan Çıkarıldı" msgid "Update" msgstr "Güncelle" msgid "Update Cluster Shares" msgstr "Küme Paylaşımlarını Güncelle" msgid "Update Plugin" msgstr "Eklentiyi Güncelle" msgid "Update Shares" msgstr "Paylaşımları Güncelle" msgid "Update the plugin labels" msgstr "Eklenti etiketlerini güncelle" msgid "Updated" msgstr "Güncellendi" msgid "Updated time" msgstr "Güncellenme zamanı" msgid "Upload" msgstr "Yükle" msgid "Upload File" msgstr "Dosya Yükle" msgid "Upload Template" msgstr "Şablon Yükle" msgid "Upload a new file" msgstr "Yeni bir dosya yükle" msgid "Uptime" msgstr "Çalışma süresi" msgid "Url" msgstr "Url" msgid "Use Data Source Substitution for Names and UUIDs" msgstr "İsimler ve UUID'ler için Veri Kaynağı Yerdeğiştirmesi Kullan" msgid "Use HBase Common library" msgstr "HBase Genel kitaplığını kullan" msgid "Use anti-affinity groups for processes" msgstr "Süreçler için anti-benzeşim gruplarını kullan" msgid "Use anti-affinity groups for: " msgstr "Anti-benzeşim gruplarını kullan: " msgid "Use auto-configuration" msgstr "Oto-yapılandırma kullan" msgid "Use the same topology name as defined in your .yaml file" msgstr ".yaml dosyanızda olanla aynı topoloji ismini kullanın" msgid "User" msgstr "Kullanıcı" msgid "User Name" msgstr "Kullanıcı Adı" msgid "User has to choose a keypair to have access to clusters instances." msgstr "Küme sunucularına erişim için kullanıcı bir anahtar çifti seçmeli." msgid "Username" msgstr "Kullanıcı adı" msgid "Value" msgstr "Değer" msgid "Value Type" msgstr "Değer Türü" msgid "Version" msgstr "Sürüm" msgid "Version:" msgstr "Sürüm:" msgid "Volume local to instance" msgstr "Birim sunucuya yerel" msgid "Volumes Availability Zone" msgstr "Birimin Kullanılırlık Bölgesi" msgid "Volumes local to instance" msgstr "Birimler sunucuya yerel" msgid "Volumes per node" msgstr "Düğüm başına birim" msgid "Volumes size" msgstr "Birim boyutu" msgid "Volumes size (GB)" msgstr "Birim boyutu (GB)" msgid "Volumes type" msgstr "Birim türü" msgid "Warning!" msgstr "Uyarı!" msgid "Which keypair to use for authentication." msgstr "Kimlik doğrulama için hangi anahtar çiftinin kullanılacağı." msgid "Worker Node Group Template:" msgstr "İşçi Düğüm Grup Şablonu:" msgid "You may also add any custom tag." msgstr "Herhangi bir özel etiketi de ekleyebilirsiniz." msgid "You may also enter an optional description for your Data Source." msgstr "Veri Kaynağınız için isteğe bağlı bir tanım girebilirsiniz." msgid "You may also enter an optional description for your job binary." msgstr "İş ikiliğinize isteğe bağlı bir tanım girebilirsiniz." msgid "You may also enter an optional description for your job template." msgstr "İş şablonunuz için isteğe bağlı olarak tanım da girebilirsiniz." msgid "You may need to enter the username and password for your Data Source." msgstr "Veri Kaynağınız için kullanıcı adı ve parola girmeniz gerekebilir." msgid "You may set cluster scoped configurations on corresponding tabs." msgstr "" "İlgili sekmelerden küme kapsamlı yapılandırmaları ayarlayabilirsiniz." msgid "" "You must choose a flavor to determine the size (VCPUs, memory and storage) " "of all launched VMs." msgstr "" "Başlatılan tüm sanal makinelerin boyutuna karar vermek için (VCPU'lar, " "hafıza ve depolama) bir nitelik seçmelisiniz." msgid "" "You've chosen a cluster that is in 'Error' state. Appropriate execution of " "the job can't be guaranteed." msgstr "" "'Hata' durumundaki bir kümeyi seçtiniz. İşin düzgün çalışacağı garanti " "edilemez." msgid "cluster" msgstr "küme" msgid "cluster template" msgstr "küme şablonu" msgid "data source" msgstr "veri kaynağı" msgid "job" msgstr "iş" msgid "job binary" msgstr "iş ikiliği" msgid "no processes" msgstr "süreç yok" msgid "node group template" msgstr "düğüm grup şablonu" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/tr_TR/LC_MESSAGES/djangojs.po0000664000175000017500000000405600000000000026475 0ustar00zuulzuul00000000000000# işbaran akçayır , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2018-02-17 13:24+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-05-24 11:10+0000\n" "Last-Translator: Copied by Zanata \n" "Language-Team: Turkish (Turkey)\n" "Language: tr_TR\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Zanata 4.3.3\n" "X-POOTLE-MTIME: 1495548113.000000\n" msgid "(show events)" msgstr "(olayları göster)" msgid "Configuration Value" msgstr "Yapılandırma Değeri" msgid "Data Source" msgstr "Veri Kaynağı" msgid "Default Value" msgstr "Öntanımlı Değer" msgid "Description" msgstr "Tanım" msgid "Event log is not available." msgstr "Olay kaydı kullanılabilir değil." msgid "" "For configs and params, type the key name; for args, type the index as an " "integer, starting from 0." msgstr "" "Yapılandırma ve parametreler için, anahtar ismini girin; değişkenler için, " "indisi tam sayı olarak 0'dan başlayacak şekilde girin." msgid "" "For data sources, use a data source UUID or a path (as per data source " "creation.)" msgstr "" "Veri kaynakları için, bir veri kaynağı UUID'si ya da yolu girin (veri " "kaynağı oluşturmada da.)" msgid "Location" msgstr "Konum" msgid "Mapping Type" msgstr "Eşleştirme Türü" msgid "Name" msgstr "İsim" msgid "Named Parameter" msgstr "Adlı Paremetre" msgid "Number" msgstr "Sayı" msgid "Positional Argument" msgstr "Konumsal Değişkenler" msgid "Remove" msgstr "Kaldır" msgid "Required?" msgstr "Gerekli?" msgid "String" msgstr "Karakter Dizisi" msgid "The step has completed successfully. No events to display." msgstr "Adım başarıyla tamamlandı. Gösterilecek olay yok." msgid "Value Type" msgstr "Değer Türü" msgid "Verification is not available." msgstr "Doğrulama kullanılabilir değil." msgid "Warning!" msgstr "Uyarı!" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5360706 sahara-dashboard-16.0.0/sahara_dashboard/locale/zh_Hans/0000775000175000017500000000000000000000000023104 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5960732 sahara-dashboard-16.0.0/sahara_dashboard/locale/zh_Hans/LC_MESSAGES/0000775000175000017500000000000000000000000024671 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/zh_Hans/LC_MESSAGES/django.po0000664000175000017500000011153600000000000026502 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # Shengjing Zhu , 2016. #zanata # sunanchen , 2016. #zanata # zzxwill , 2016. #zanata # Bin , 2017. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2021-03-05 16:11+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2017-07-24 03:48+0000\n" "Last-Translator: Bin \n" "Language-Team: Chinese (China)\n" "Language: zh_CN\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid " Done" msgstr "完成" msgid " or " msgstr "或者" #, python-format msgid "%(conf_name)s: %(conf_val)s" msgstr "%(conf_name)s: %(conf_val)s" #, python-format msgid "%(conf_name)s: %(conf_value)s" msgstr "%(conf_name)s: %(conf_value)s" #, python-format msgid "%(group)s:" msgstr "%(group)s:" #, python-format msgid "%(key)s: %(val)s" msgstr "%(key)s: %(val)s" #, python-format msgid "%s processes: " msgstr "%s 进程: " msgid "-- not selected --" msgstr "-- 未选择 --" msgid "Adapt For Oozie" msgstr "适应 Oozie" msgid "Add" msgstr "添加" msgid "Add Node Group" msgstr "增加节点组" msgid "Add libraries to your job template." msgstr "为您的任务模板添加类库。" msgid "Anti-affinity enabled for" msgstr "Anti-affinity 已启用在" msgid "Arguments" msgstr "参数" msgid "Auto Security Group" msgstr "自动安全组" msgid "Auto-configure" msgstr "自动配置" msgid "" "Automatically modify the Hadoop configuration so that job config values are " "set and so that Oozie will handle exit codes correctly." msgstr "" "自动修改 Hadoop 的配置,以修改任务的设置值,这样的话 Oozie 能正确处理任务的退" "出代码。" msgid "Availability Zone" msgstr "可用域" msgid "Base Image" msgstr "基础镜像" msgid "Cancel" msgstr "取消" msgid "Checked?" msgstr "已选中?" msgid "Checking" msgstr "检查" msgid "Choose" msgstr "选择" msgid "Choose a main binary" msgstr "选择一个主要的二进制文件" msgid "Choose a shell script" msgstr "选择一个 shell 脚本" msgid "Choose a storage location" msgstr "选择一个存储位置" msgid "Choose additional files" msgstr "选择其他文件" msgid "Choose an existing Master Node Group Template" msgstr "选择一个存在的主节点组模板" msgid "Choose an existing Worker Node Group Template" msgstr "选择一个存在的工作节点组模板" msgid "Choose an existing file" msgstr "选择一个现有的文件" msgid "" "Choose from the list of binaries and click \"choose\" to add the library to " "your job template. This can be repeated for additional libraries." msgstr "" "在二进制文件列表中进行选择,然后点击“选择”将该文件加到您的任务模板中。这里可" "以多次添加额外的类库。" msgid "Choose job type" msgstr "选择任务类型" msgid "Choose libraries" msgstr "选择库文件" msgid "Choose node group template" msgstr "选择节点组模板" msgid "" "Choose or create your main binary. Additional libraries can be added from " "the \"Libs\" tab." msgstr "选择或创建你的主要的二进制文件。额外的库可以在“库”选项卡里添加。" msgid "Choose plugin" msgstr "选择插件" msgid "Choose plugin and version" msgstr "选择插件和版本" msgid "Choose plugin type and version" msgstr "选择插件类型和版本" msgid "Choose the Input Data Source (n/a for Java and Shell jobs)." msgstr "选择输入数据源(Java 和 Shell 任务请选择 n/a)" msgid "Choose the Output Data Source (n/a for Java and Shell jobs)." msgstr "选择输出数据源(Java 和 Shell 任务请选择 n/a)" msgid "Choose the binary which should be used in this Job." msgstr "选择任务使用的二进制文件。" msgid "Choose the cluster to use for the job." msgstr "选择用于任务的集群" msgid "Chosen Libraries" msgstr "选择库文件" msgid "Cinder Volume" msgstr "Cinder卷" msgid "Cinder service is unavailable now" msgstr "块存储服务当前不可用" msgid "Cinder volumes" msgstr "Cinder 卷" msgid "Cluster" msgstr "集群" msgid "Cluster Configuration Overview" msgstr "集群配置概览" msgid "Cluster Count" msgstr "集群数量" msgid "Cluster Creation Guide" msgstr "集群创建向导" msgid "Cluster Events" msgstr "集群事件" msgid "Cluster Instances" msgstr "集群实例" msgid "Cluster Name" msgstr "集群名称" msgid "Cluster Template" msgstr "集群模板" #, python-format msgid "Cluster Template %s updated" msgstr "集群模板 %s 已更新" msgid "Cluster Template Configuration Overview" msgstr "集群模板配置概览" #, python-format msgid "Cluster Template copy %s created" msgstr "已创建集群模板副本 %s" msgid "Cluster Templates" msgstr "集群模板" msgid "Cluster can be launched using existing Cluster Templates." msgstr "集群可以通过已有的模板来创建。" msgid "Cluster configurations are not specified" msgstr "没有指定集群配置" msgid "Cluster health checks" msgstr "集群健康监控" msgid "Cluster provision steps" msgstr "集群配置步骤" msgid "Cluster share update failed." msgstr "集群共享共享失败。" msgid "Cluster template creation failed" msgstr "集群模板创建失败" msgid "Cluster template update failed" msgstr "集群模板更新失败" msgid "Cluster type chosen" msgstr "选择集群类型" msgid "Clusters" msgstr "集群" msgid "Completed Successfully" msgstr "成功完成" msgid "Configuration" msgstr "配置" msgid "Configuration Details" msgstr "配置详情" msgid "Configuration Value" msgstr "配置值" msgid "Configure" msgstr "配置" msgid "Configure Cluster" msgstr "配置集群" msgid "Configure Cluster Template" msgstr "配置集群模板" msgid "Configure Node Group Template" msgstr "配置节点组模板" msgid "Configure Template" msgstr "配置模板" msgid "Control access to instances of the node group." msgstr "节点组实例访问控制。" msgid "Copy Cluster Template" msgstr "复制集群模板" msgid "Copy Template" msgstr "复制模板" msgid "Could not create" msgstr "无法创建" msgid "Could not create data source" msgstr "无法创建数据源" msgid "Could not create job template" msgstr "无法创建任务模板" msgid "Could not launch job" msgstr "无法启动任务" msgid "Could not update cluster shares" msgstr "无法更新集群共享" msgid "Could not update data source" msgstr "无法更新数据源" msgid "Could not update plugin" msgstr "无法更新插件" msgid "Count" msgstr "数量" msgid "Create" msgstr "创建" msgid "Create Cluster Template" msgstr "创建集群模板" msgid "Create Data Source" msgstr "创建数据源" msgid "Create Job Binary" msgstr "创建任务的二进制文件" msgid "Create Job Template" msgstr "创建任务模板" msgid "Create Node Group Template" msgstr "创建节点组模板" msgid "Create Template" msgstr "创建模板" msgid "Create a Cluster Template" msgstr "创建一个集群模板" msgid "Create a Data Source with a specified name." msgstr "通过指定的名字创建数据源。" msgid "Create a Master Node Group Template" msgstr "创建一个主节点组模板" msgid "Create a Worker Node Group Template" msgstr "创建一个工作节点组的模板" msgid "Create a data source" msgstr "创建一个数据源" msgid "Create a job template" msgstr "创建一个任务模板" msgid "Create a job template with a specified name." msgstr "指定一个名字来创建任务模板。" msgid "Create a script to be uploaded dynamically" msgstr "创建一个可以动态上传的脚本" msgid "Create security group for this Node Group." msgstr "为该节点组创建安全组" msgid "Create time" msgstr "创建时间" msgid "Create volumes in this availability zone." msgstr "在此可用域创建卷。" msgid "Created" msgstr "已创建" msgctxt "Created time" msgid "Created" msgstr "已创建" #, python-format msgid "Created Cluster Template %s" msgstr "创建集群模板 %s" #, python-format msgid "Created Node Group Template %s" msgstr "创建节点组模板%s" msgid "Created time" msgstr "创建时间" msgid "Current choice:" msgstr "当前选择:" msgid "Current type:" msgstr "当前类型:" msgid "Custom Tag" msgstr "自定义标签" msgid "DNS Domain Names" msgstr "DNS域名" msgid "Data Processing" msgstr "数据处理" msgid "Data Processing Plugin Details" msgstr "数据处理插件的详细信息" msgid "Data Processing Plugins" msgstr "数据处理插件" msgid "Data Processing internal database" msgstr "大数据处理内部数据库" msgid "" "Data Processing provides different storage location options. You may choose " "Ephemeral Drive or a Cinder Volume to be attached to instances." msgstr "" "数据处理可以使用不同的存储路径。你可以选择临时驱动或者实例绑定的 Cinder 卷" msgid "Data Source" msgstr "数据源" msgid "Data Source Type" msgstr "数据源类型" msgid "Data Sources" msgstr "数据源" msgid "Data source created" msgstr "数据源已创建" msgid "Data source updated" msgstr "数据源已更新" msgid "Default Value" msgstr "默认值" msgid "Delete Cluster" msgid_plural "Delete Clusters" msgstr[0] "删除集群" msgid "Delete Data Source" msgid_plural "Delete Data Sources" msgstr[0] "删除数据源" msgid "Delete Job" msgid_plural "Delete Jobs" msgstr[0] "删除任务" msgid "Delete Job Binary" msgid_plural "Delete Job Binaries" msgstr[0] "删除任务的二进制文件" msgid "Delete Job Template" msgid_plural "Delete Job Templates" msgstr[0] "删除任务模板" msgid "Delete Template" msgid_plural "Delete Templates" msgstr[0] "删除模板" msgid "Deleted Cluster" msgid_plural "Deleted Clusters" msgstr[0] "已删除的集群" msgid "Deleted Data Source" msgid_plural "Deleted Data Sources" msgstr[0] "已删除的数据源" msgid "Deleted Job" msgid_plural "Deleted Jobs" msgstr[0] "已删除的任务" msgid "Deleted Job Binary" msgid_plural "Deleted Job Binaries" msgstr[0] "已删除任务的二进制文件" msgid "Deleted Job Template" msgid_plural "Deleted Jobs Templates" msgstr[0] "已删除的任务模板" msgid "Deleted Template" msgid_plural "Deleted Templates" msgstr[0] "已删除的模板" msgid "Description" msgstr "描述" msgid "Details" msgstr "详情" msgid "Domain Name" msgstr "域名" msgid "Domain name" msgstr "域名" msgid "Done" msgstr "完成" msgctxt "Current status of a Job" msgid "Done with Error" msgstr "完成但有错误发生" msgid "Download Job Binary" msgstr "下载任务的二进制文件" msgid "Download job binary" msgstr "下载任务的二进制文件" msgid "Drive type" msgstr "驱动类型" msgid "Duration" msgstr "持续时间" msgid "Edit Cluster Template" msgstr "编辑集群模板" msgid "Edit Data Source" msgstr "编辑数据源" msgid "Edit Image Tags" msgstr "编辑镜像标签" msgid "Edit Job Binary" msgstr "编辑任务的二进制文件" msgid "Edit Node Group Template" msgstr "编辑节点组模板" msgid "Edit Tags" msgstr "编辑标签" msgid "Edit Template" msgstr "编辑模板" msgid "Enable Swift Paths" msgstr "启用 Swift 路径" msgid "Enabled Versions" msgstr "已启用的版本" msgctxt "End time" msgid "Ended" msgstr "已结束" msgid "Enter any custom configuration required for your job's execution." msgstr "输入执行您的任务需要的自定义配置。" msgid "Enter the URL for the file" msgstr "输入文件的 URL" msgid "Enter the username and password required to access that file" msgstr "输入获取文件所需的用户名和密码" msgid "Ephemeral Drive" msgstr "临时存储" msgid "Ephemeral drive" msgstr "临时驱动" msgid "Error Details" msgstr "错误详情" msgid "Event time" msgstr "事件时间" msgid "Failed" msgstr "失败" msgctxt "Current status of a Job" msgid "Failed" msgstr "已失败" msgid "Failed to fetch internal binary list" msgstr "获取内部二进制文件列表失败" msgid "Failed to get list of internal binaries." msgstr "获取内部二进制文件列表失败。" msgid "Failed to get list of shares" msgstr "无法获取共享列表" msgid "Failed to update image." msgstr "更新镜像失败。" msgid "Filter" msgstr "过滤" msgid "Flavor" msgstr "云主机类型" msgid "Flavor is not specified" msgstr "没有指定云主机类型" msgid "Floating IP Pool" msgstr "浮动 IP 池" msgid "" "For Data Processing internal job binaries, you may choose from the following:" msgstr "数据处理的内部二进制文件,你可以选择:" msgid "" "For Data Sources on a Manila share, choose the share and enter the path " "relative to the share (example: /outputdir/myinputfile.txt)" msgstr "" "对于使用 Manila 共享系统的数据源,请选择共享系统并输入共享的相对路径。(如 /" "outputdir/myinputfile.txt)" msgid "For Object Store job binaries, you must:" msgstr "对于对象存储上的任务二进制文件,你必须:" msgid "" "For Shell Action jobs, any required files beyond the main script may be " "added as \"libraries\"." msgstr "对于 Shell 任务,除主脚本之外的文件都可以作为库添加。" msgid "" "For Storm, Storm Pyleus, Spark and Shell jobs, only a main is required,\"libs" "\" are optional." msgstr "" "对于Storm, Storm Pyleus, Spark and Shell类型的任务,只需要“main”,“libs”是可" "选的。" msgid "General Info" msgstr "一般信息" msgid "Guided Cluster Creation" msgstr "创建集群向导" msgid "Guided Job Execution" msgstr "任务执行向导" msgid "HDFS placement" msgstr "HDFS 位置" msgid "Health" msgstr "健康" msgid "Hide full configuration" msgstr "隐藏所有配置项" msgid "Hive" msgstr "Hive" msgid "ID" msgstr "ID" #, python-format msgid "" "If selected, %s will be protected from modifications until this will be " "unselected" msgstr "如果选择,%s会被保护而不能再修改,除非不再选择这个。" #, python-format msgid "If selected, %s will be shared across the tenants" msgstr "如果选择,%s会在所有租户之间共享。" msgid "" "If selected, instances of a cluster will be automatically configured during " "creation. Otherwise you should manually specify configuration values" msgstr "选择后,将在创建集群实例时进行自动配置,否则你需要手动配置。" msgid "" "If selected, instances of a node group will be automatically configured " "during cluster creation. Otherwise you should manually specify configuration " "values." msgstr "" "如果已选择,节点组的实例将自动在集群创建的时候被配置。否则你需要手动配置。" msgid "Image" msgstr "镜像" msgid "Image Registry" msgstr "镜像注册" msgid "" "Image Registry is used to provide additional information about images for " "Data Processing." msgstr "镜像注册是用来为数据处理提供镜像的额外信息。" msgid "Image Registry tool:" msgstr "镜像注册工具:" msgid "In progress" msgstr "进行中" msgid "Info" msgstr "信息" msgid "Input" msgstr "输入" msgid "Input Data Source" msgstr "输入数据源" msgid "Instance" msgstr "实例" msgid "Instance and attached volumes will be created on the same physical host" msgstr "实例和它所挂载的卷将被创建在同一台物理主机上" msgid "Instances" msgstr "实例" msgid "Instances Count" msgstr "实例数量" msgid "Interface Arguments" msgstr "接口参数" msgid "Internal Binary" msgstr "内部二进制" msgid "Internal IP" msgstr "内网 IP" msgid "Internal binary" msgstr "内部二进制" msgid "Java" msgstr "Java" msgid "Java Action" msgstr "Java 命令" msgid "Java Opts" msgstr "Java 参数" msgid "Job" msgstr "任务" msgid "Job Binaries" msgstr "任务二进制" msgid "Job Configuration" msgstr "任务配置" msgid "Job Execution ID" msgstr "任务执行 ID" msgid "Job Guide" msgstr "任务指南" msgid "Job Template" msgstr "任务模板" msgid "Job Templates" msgstr "任务模板" msgid "Job Type" msgstr "任务类型" msgid "Job args" msgstr "任务参数" msgid "Job configs" msgstr "任务配置" msgid "Job created" msgstr "任务已创建" msgid "Job launched" msgstr "任务已启动" msgid "Job params" msgstr "任务参数" msgid "Job template:" msgstr "任务模板:" msgid "Job type chosen" msgstr "任务类型选择" msgid "Jobs" msgstr "任务" msgid "Keypair" msgstr "密钥对" msgctxt "Current status of a Job" msgid "Killed" msgstr "已杀死" msgid "Label" msgstr "标签" msgid "Label details" msgstr "标签详情" msgid "Last Updated" msgstr "最近更新" msgid "Launch" msgstr "启动" msgid "Launch Cluster" msgstr "启动集群" msgid "Launch Job" msgid_plural "Launch Jobs" msgstr[0] "启动任务" msgid "Launch On Existing Cluster" msgstr "在已存在集群上启动" msgid "Launch On New Cluster" msgstr "在新集群上启动" msgid "Launch a Cluster" msgstr "启动一个集群" msgid "Launch instances in these security groups." msgstr "在这些安全组中启动云主机。" msgid "Launch instances in this availability zone." msgstr "在此可用域中启动实例。" msgid "Launch job" msgstr "启动任务" msgid "Launch the given job template on a cluster." msgstr "在一个集群上启动给定的任务模板。" #, python-format msgid "Launched Cluster %s" msgstr "启动集群 %s" msgid "Launched Job" msgid_plural "Launched Jobs" msgstr[0] "已启动的任务" msgid "Libs" msgstr "库" msgid "Location" msgstr "位置" msgid "Main Class" msgstr "主类" msgid "Mains" msgstr "主方法" msgid "Management IP" msgstr "管理网络 IP" msgid "Manila share" msgstr "共享系统(Manila)" msgid "MapReduce" msgstr "MapReduce" msgid "Mapper" msgstr "映射" msgid "Mapping Type" msgstr "映射类型" msgid "Master Node Group Template:" msgstr "主节点组模板:" msgid "" "Modify the configuration so that swift URLs can be dereferenced through HDFS " "at runtime." msgstr "更改配置,使得在运行时通过 HDFS 不再引用 swift 的 URL。" msgid "Name" msgstr "名称" #, python-format msgid "Name: %(node_group_name)s" msgstr "名称:%(node_group_name)s" msgid "Named Parameter" msgstr "命名参数" msgid "Neutron Management Network" msgstr "Neutron 管理网络" msgid "Never" msgstr "从不" msgid "Next" msgstr "下一步" msgid "No Cluster Template Created" msgstr "没有创建集群模板" msgid "No Images Available" msgstr "没有可用的镜像" msgid "No Master Node Group Template Created" msgstr "没有创建主节点组模板" msgid "No Templates Available" msgstr "没有可用的模板" msgid "No Worker Node Group Template Created" msgstr "没有创建工作节点组模板" msgid "No availability zone specified" msgstr "未指定可用域" msgid "No clusters available" msgstr "没有可用的集群" msgid "No configurations" msgstr "没有配置" msgid "No description" msgstr "没有可用的描述" msgid "No domain is specified" msgstr "未指定域" msgid "No enabled versions" msgstr "没有已启用的版本" msgid "No image specified" msgstr "未指定镜像" msgid "No images available." msgstr "没有可用的镜像。" msgid "No info available" msgstr "没有可用的信息" msgid "No job template created" msgstr "没有创建任务模板" msgid "No keypair" msgstr "没有密钥对" msgid "No plugin chosen" msgstr "没有选择插件" msgid "No type chosen" msgstr "没有选择类型" msgid "No volume type" msgstr "未设置卷类型" msgid "Node Group" msgstr "节点组" #, python-format msgid "Node Group Name: %(node_group_name)s" msgstr "节点组名称:%(node_group_name)s" msgid "Node Group Template" msgstr "节点组模板" #, python-format msgid "Node Group Template %s updated" msgstr "节点组模板 %s 已更新" #, python-format msgid "Node Group Template copy %s created" msgstr "已创建节点组模板副本 %s" msgid "Node Group Templates" msgstr "节点组模板" #, python-format msgid "Node Group: %(node_group_name)s" msgstr "节点组:%(node_group_name)s" msgid "Node Groups" msgstr "节点组" msgid "Node Groups Configuration Overview" msgstr "节点组配置概览" msgid "Node Processes" msgstr "运行于该节点上的服务进程" msgid "Node group cluster" msgstr "节点组集群" msgid "Node group configurations are not specified" msgstr "没有指定节点组配置" msgid "Node processes are not specified" msgstr "没有指定结点进程" msgid "Nodes Count" msgstr "节点数量" msgid "None" msgstr "无" msgid "Not available" msgstr "不可用" msgid "Number" msgstr "数字" msgid "Number of Nodes" msgstr "节点数量" msgid "Number of clusters to launch." msgstr "启动集群的数量。" msgid "Oozie Job ID" msgstr "Oozie 任务 ID" msgid "OpenStack Flavor" msgstr "OpenStack 虚拟机类型" msgid "Output" msgstr "输出" msgid "Output Data Source" msgstr "输出数据源" msgid "Parameters" msgstr "参数" msgid "Password" msgstr "密码" msgid "Path" msgstr "路径" msgid "Path on share" msgstr "共享路径" msgid "Persist cluster after job exit" msgstr "任务退出后保留集群" msgid "Pig" msgstr "Pig" msgid "Plugin" msgstr "插件" msgid "Plugin Name" msgstr "插件名称" msgid "Plugin and Version Tag" msgstr "插件类型和版本标签" msgid "Plugin label" msgstr "插件标签" msgid "Plugin name" msgstr "插件名称" msgid "Plugin update failed." msgstr "插件更新失败。" #, python-format msgid "Plugin version %(version)s label" msgstr "插件版本%(version)s的标签" #, python-format msgid "Plugin version %s" msgstr "插件版本%s" msgid "Plugin:" msgstr "插件:" msgid "Plugins" msgstr "插件" msgid "Positional Argument" msgstr "位置参数" msgid "Progress" msgstr "进行" msgid "Project ID" msgstr "项目ID" msgid "Protected" msgstr "受保护的" msgid "Proxy Gateway" msgstr "网关代理" msgid "Public" msgstr "公有" msgid "Read only" msgstr "只读" msgid "Read/Write" msgstr "读/写" msgid "Reducer" msgstr "化简" msgid "Register Image" msgstr "注册镜像" msgid "Relaunch On Existing Cluster" msgstr "在现有的集群上重新启动" msgid "Relaunch On New Cluster" msgstr "在新的集群上重新启动" msgid "Remove" msgstr "移除" msgid "Required" msgstr "必须" msgid "Reset Cluster Creation Guide" msgstr "重置集群创建向导" msgid "Reset Cluster Guide" msgstr "重置集群向导" msgid "Reset Job Execution Guide" msgstr "重置任务执行向导" msgid "Return Code" msgstr "返回代码" msgid "Run HBase EDP Jobs with common HBase library on HDFS" msgstr "在HDFS上使用HBase库来运行HBase EDP任务" msgid "" "Sahara will use instances of this node group to access other cluster " "instances." msgstr "Sahara 将使用这个节点组中的实例以访问其它集群中的实例。" msgid "Scale" msgstr "规模" msgid "Scale Cluster" msgstr "集群扩容" msgid "Scale cluster operation failed" msgstr "扩容集群失败" msgid "Scaled cluster successfully started." msgstr "已扩容的集群启动成功" msgid "Scope" msgstr "范围" msgid "Script name" msgstr "脚本名称" msgid "Script text" msgstr "脚本文本" msgid "Security" msgstr "安全" msgid "Security Groups" msgstr "安全组" msgid "Select" msgstr "选择" msgid "Select Image" msgstr "选择镜像" msgid "Select Node Group Processes" msgstr "选择节点组进程" msgid "Select Shares" msgstr "选择是否共享" msgid "Select a Node Group Template to add:" msgstr "选择一个节点组模板来使用:" msgid "Select a Value Type for your next argument:" msgstr "选择你下一个参数值的类型:" msgid "Select a plugin and version for a new Cluster template." msgstr "为新的集群模板选择插件和版本。" msgid "Select a plugin and version for a new Cluster." msgstr "为新的集群选择插件和版本。" msgid "Select a plugin and version for the new Node Group template." msgstr "为新的节点组模板选择插件和版本" msgid "" "Select an existing node group template.\n" " " msgstr "" "选择一个存在的节点组模板。\n" " " msgid "Select node processes for the node group" msgstr "为节点组选择节点进程" msgid "Select plugin and hadoop version" msgstr "选择插件和 Hadoop 的版本" msgid "Select plugin and hadoop version for cluster" msgstr "为集群选择插件和 Hadoop 的版本" msgid "Select plugin and hadoop version for cluster template" msgstr "为集群模板选择插件和 Hadoop 的版本" msgid "Select property name" msgstr "选择属性名称" msgid "Select the domain name for internal and external hostname resolution." msgstr "为解析内部和外部的主机名选择域名" msgid "Select the manila shares for this cluster" msgstr "为集群选择文件共享(manila)" msgid "Select the manila shares for this node group" msgstr "为节点组选择文件共享(manila)" msgid "Select the storage type for your job binary." msgstr "为你的任务的二进制文件选择存储类型。" msgid "Select the type of your Data Source." msgstr "选择你的数据源类型。" msgid "Select the type of your job:" msgstr "请选择你的任务类型:" msgid "Select type" msgstr "选择类型" msgid "Service Configurations" msgstr "服务配置" msgid "Share" msgstr "共享" msgid "Shares" msgstr "共享" msgid "Shell" msgstr "Shell" msgid "Shell Action" msgstr "Shell 命令" msgid "Show full configuration" msgstr "显示所有配置项" msgid "Source password" msgstr "源密码" msgid "Source username" msgstr "源用户名" msgid "Spark" msgstr "Spark" msgid "" "Specified User Name will be used by Data Processing to apply configs and " "manage processes on instances." msgstr "数据处理过程中,用户名会被用在实例的配置和任务管理上。" msgid "Start Verification" msgid_plural "Start Verifications" msgstr[0] "开始验证" msgctxt "Start time" msgid "Started" msgstr "已开始" msgid "Started Verification" msgid_plural "Started Verifications" msgstr[0] "已开始的验证" msgid "Started at" msgstr "开始于" msgid "Status" msgstr "状态" msgid "Status description" msgstr "状态说明" msgid "Step Description" msgstr "步骤说明" msgid "Storage type" msgstr "存储类型" msgid "Storm" msgstr "Storm" msgid "Storm Pyleus" msgstr "Storm Pyleus开源框架" msgid "Streaming MapReduce" msgstr "MapReduce 流" msgid "String" msgstr "字符串" msgid "" "Substitute data source objects for URLs of the form datasource://name or " "uuid." msgstr "使用数据源对象来代替 datasource://name 格式的 URL 和 UUID。" msgctxt "Current status of a Job" msgid "Succeeded" msgstr "已成功" msgid "Successfully updated image." msgstr "成功更新了镜像。" msgid "Supported Versions" msgstr "支持的版本" msgid "Swift" msgstr "Swift" msgid "Tags" msgstr "标签" msgid "Template" msgstr "模板" msgid "Template Name" msgstr "模板名称" msgid "Template not specified" msgstr "没有指定模板" msgid "" "The Cluster object should specify OpenStack Image to boot instances for " "Cluster." msgstr "集群对象应该指定用于创建集群中实例的 OpenStack 镜像。" msgid "The value of shares must be a list of values" msgstr "共享信息的值必须是列表值" msgid "This Cluster Template will be created for:" msgstr "这个集群模板将被创建给:" msgid "This Cluster will be started with:" msgstr "这个集群将开始启动:" msgid "This Node Group Template will be created for:" msgstr "这个节点组模板将被创建给:" msgid "Title" msgstr "标题" msgid "Topology Name" msgstr "拓扑名称" msgid "Type" msgstr "类型" msgid "URL" msgstr "URL" msgid "Unable to create job binary" msgstr "无法创建任务的二进制文件" #, python-format msgid "Unable to create job binary: %s" msgstr "无法创建任务二进制:%s" msgid "Unable to create new cluster for job." msgstr "无法为任务创建新的集群。" msgid "Unable to create the cluster" msgstr "无法创建集群" #, python-format msgid "Unable to fetch Base Image with id: %s." msgstr "无法获取 id 为 %s 的基础镜像。" msgid "Unable to fetch available images." msgstr "无法获取可用的镜像。" msgid "Unable to fetch base image details" msgstr "无法获取镜像详情" msgid "Unable to fetch cluster list" msgstr "无法获取集群列表" msgid "Unable to fetch cluster template list" msgstr "无法获取集群模板列表" msgid "Unable to fetch cluster template." msgstr "无法获取集群模板。" msgid "Unable to fetch cluster to scale" msgstr "无法获取集群信息进行扩展" msgid "Unable to fetch cluster to scale." msgstr "无法获取集群信息进行扩展" msgid "Unable to fetch cluster." msgstr "无法获取集群。" msgid "Unable to fetch clusters." msgstr "无法获取集群。" msgid "Unable to fetch data source list" msgstr "无法获取数据源列表" msgid "Unable to fetch data sources." msgstr "无法获取数据源。" msgid "Unable to fetch flavor for template." msgstr "无法获取模板的实例类型。" msgid "Unable to fetch floating ip pools." msgstr "无法获取浮动 IP 池。" msgid "Unable to fetch image choices." msgstr "无法获取镜像选项。" msgid "Unable to fetch instance details." msgstr "无法获取实例的详细信息。" msgid "Unable to fetch job binary list" msgstr "无法获取任务的二进制文件列表" #, python-format msgid "Unable to fetch job binary: %(exc)s" msgstr "无法获取任务的二进制文件: %(exc)s" msgid "Unable to fetch job list" msgstr "无法获取任务列表" msgid "Unable to fetch job template list" msgstr "无法获取任务模板列表" msgid "Unable to fetch jobs." msgstr "无法获取任务。" msgid "Unable to fetch keypair choices." msgstr "无法获取密钥对的选项。" msgid "Unable to fetch network details" msgstr "无法获取网络详情" msgid "Unable to fetch node group details." msgstr "无法获取节点组的详细信息。" msgid "Unable to fetch node group template list" msgstr "无法获取节点组模板列表" msgid "Unable to fetch plugin details." msgstr "无法获取插件的详细信息。" msgid "Unable to fetch plugin list" msgstr "无法获取插件列表" msgid "Unable to fetch plugin object." msgstr "无法获取插件对象。" msgid "Unable to fetch template object." msgstr "无法获取模板对象。" msgid "Unable to fetch template to copy." msgstr "无法获取模板进行复制。" msgid "Unable to fetch template to edit." msgstr "无法获取模板进行编辑。" msgid "Unable to fetch the image details" msgstr "无法获取镜像的详细信息" msgid "Unable to generate process choices." msgstr "无法生成处理选项。" msgid "Unable to get node group details." msgstr "无法获取节点组的详细信息。" msgid "Unable to get security group list." msgstr "无法获取安全组列表。" msgid "Unable to launch job." msgstr "无法启动任务。" msgid "Unable to populate anti-affinity processes." msgstr "无法给节点组启用 anti-affinity。" msgid "Unable to process plugin tags" msgstr "无法编辑插件标签" msgid "Unable to retrieve data processing plugins." msgstr "无法获取数据处理插件。" #, python-format msgid "Unable to retrieve details for cluster \"%s\"." msgstr "无法获取集群 \"%s\" 的详细信息。" #, python-format msgid "Unable to retrieve details for cluster template \"%s\"." msgstr "无法获取集群模板\"%s\"的详细信息。" #, python-format msgid "Unable to retrieve details for data source \"%s\"." msgstr "无法获取数据源“%s”的详细信息。" #, python-format msgid "Unable to retrieve details for job \"%s\"." msgstr "无法获取任务“%s”的详细信息。" #, python-format msgid "Unable to retrieve details for job binary \"%s\"." msgstr "无法获取任务的二进制文件 \"%s\" 的详细信息。" #, python-format msgid "Unable to retrieve details for job template \"%s\"." msgstr "无法获取任务模板“%s”的详细信息。" #, python-format msgid "Unable to retrieve details for node group template \"%s\"." msgstr "无法获取节点组模板 \"%s\" 的详细信息。" msgid "Unable to retrieve image list" msgstr "无法获取镜像列表" #, python-format msgid "Unable to retrieve images with filter %s." msgstr "过滤器 %s 匹配不到任何镜像。" #, python-format msgid "Unable to retrieve job binary \"%s\"." msgstr "无法获取任务的二进制文件 \"%s\"。" msgid "Unable to retrieve networks." msgstr "无法获取网络。" msgid "Unable to retrieve plugin." msgstr "无法获取插件。" #, python-format msgid "Unable to retrieve security group %(group)s." msgstr "无法获取安全组 %(group)s。" msgid "Unable to set cluster type" msgstr "无法设置集群类型" msgid "Unable to set job type" msgstr "无法设置任务类型" msgid "Unable to set node group template" msgstr "无法设置节点组模板" msgid "Unable to update job binary" msgstr "无法更新任务的二进制文件" #, python-format msgid "Unable to update job binary: %s" msgstr "无法更新任务二进制:%s" msgid "Unable to update row" msgstr "无法更新行" msgid "Unable to upload job binary" msgstr "无法上传任务的二进制文件" msgid "Unknown" msgstr "未知" msgid "Unnecessary tags may be removed by clicking a cross near tag's name." msgstr "不必要的标签可以通过点击标签名称旁边的“×”来删除。" msgid "Unregister Image" msgid_plural "Unregister Images" msgstr[0] "注销镜像" msgid "Unregistered Image" msgid_plural "Unregistered Images" msgstr[0] "已注销的镜像" msgid "Update" msgstr "更新" msgid "Update Cluster Shares" msgstr "更新集群共享" msgid "Update Plugin" msgstr "更新插件" msgid "Update Shares" msgstr "更新共享" msgid "Update the plugin labels" msgstr "更新插件标签" msgid "Updated" msgstr "已更新" msgid "Updated time" msgstr "更新时间" msgid "Upload" msgstr "上传" msgid "Upload File" msgstr "上传文件" msgid "Upload Template" msgstr "上传模板" msgid "Upload a new file" msgstr "上传新文件" msgid "Uptime" msgstr "正常运行时间" msgid "Url" msgstr "Url" msgid "Use Data Source Substitution for Names and UUIDs" msgstr "使用数据源来代替名称和UUID" msgid "Use HBase Common library" msgstr "使用 HBase 公共库" msgid "Use anti-affinity groups for processes" msgstr "为节点组使用 anti-affinity 组" msgid "Use anti-affinity groups for: " msgstr "使用 anti-affinity 组:" msgid "Use auto-configuration" msgstr "使用自动配置" msgid "Use the same topology name as defined in your .yaml file" msgstr "使用和你在yaml文件中定义的相同名称的拓扑" msgid "User" msgstr "用户" msgid "User Name" msgstr "用户名" msgid "User has to choose a keypair to have access to clusters instances." msgstr "用户必须选择一个密钥对去连接集群中的实例。" msgid "Username" msgstr "用户名" msgid "Value" msgstr "值" msgid "Value Type" msgstr "值类型" msgid "Version" msgstr "版本" msgid "Version:" msgstr "版本:" msgid "Volume local to instance" msgstr "实例的本地卷" msgid "Volumes Availability Zone" msgstr "卷的可用域" msgid "Volumes local to instance" msgstr "卷存储挂载到实例的本地存储" msgid "Volumes per node" msgstr "每个节点的卷存储" msgid "Volumes size" msgstr "卷大小" msgid "Volumes size (GB)" msgstr "卷大小 (GB)" msgid "Volumes type" msgstr "卷类型" msgid "Warning!" msgstr "警告!" msgid "Which keypair to use for authentication." msgstr "使用哪个密钥对进行认证?" msgid "Worker Node Group Template:" msgstr "工作节点组模板:" msgid "You may also add any custom tag." msgstr "你还可以增加任意的自定义标签。" msgid "You may also enter an optional description for your Data Source." msgstr "你还可以为你的数据源输入描述。" msgid "You may also enter an optional description for your job binary." msgstr "你还可以为你的任务的二进制文件添加描述。" msgid "You may also enter an optional description for your job template." msgstr "你还可以输入你的任务模板的描述。" msgid "You may need to enter the username and password for your Data Source." msgstr "你要为你的数据源输入用户名和密码。" msgid "You may set cluster scoped configurations on corresponding tabs." msgstr "你可以在相应的选项卡中设置 集群辖域的配置。" msgid "" "You must choose a flavor to determine the size (VCPUs, memory and storage) " "of all launched VMs." msgstr "您必须对所有的虚拟机的实例类型进行配置(虚拟 CPU 、内存、存储)。" msgid "" "You've chosen a cluster that is in 'Error' state. Appropriate execution of " "the job can't be guaranteed." msgstr "你选择了一个处于错误状态的集群。无法保证任务的正确执行" msgid "cluster" msgstr "集群" msgid "cluster template" msgstr "集群模板" msgid "data source" msgstr "数据源" msgid "job" msgstr "任务" msgid "job binary" msgstr "任务二进制文件" msgid "no processes" msgstr "没有进程" msgid "node group template" msgstr "节点组模板" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/locale/zh_Hans/LC_MESSAGES/djangojs.po0000664000175000017500000000363500000000000027037 0ustar00zuulzuul00000000000000# Andreas Jaeger , 2016. #zanata # sunanchen , 2016. #zanata msgid "" msgstr "" "Project-Id-Version: sahara-dashboard VERSION\n" "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" "POT-Creation-Date: 2021-03-05 16:11+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "PO-Revision-Date: 2016-07-30 12:46+0000\n" "Last-Translator: sunanchen \n" "Language-Team: Chinese (China)\n" "Language: zh_CN\n" "X-Generator: Zanata 4.3.3\n" "Plural-Forms: nplurals=1; plural=0\n" msgid "(show events)" msgstr "(显示事件)" msgid "Configuration Value" msgstr "配置值" msgid "Data Source" msgstr "数据源" msgid "Default Value" msgstr "默认值" msgid "Description" msgstr "描述" msgid "Event log is not available." msgstr "事件日志不可用。" msgid "" "For configs and params, type the key name; for args, type the index as an " "integer, starting from 0." msgstr "" "对于配置和参数,定义键名类型;对于参数,定义索引类型为从 0 开始的整数。" msgid "" "For data sources, use a data source UUID or a path (as per data source " "creation.)" msgstr "对于数据源,使用数据源 UUID 或者路径(根据每个数据源创建)。" msgid "Location" msgstr "位置" msgid "Mapping Type" msgstr "映射类型" msgid "Name" msgstr "名称" msgid "Named Parameter" msgstr "命名参数" msgid "Number" msgstr "数字" msgid "Positional Argument" msgstr "定位参数" msgid "Remove" msgstr "移除" msgid "Required?" msgstr "必须?" msgid "String" msgstr "字符串" msgid "The step has completed successfully. No events to display." msgstr "这个步骤已成功完成。没有可以显示的事件。" msgid "Value Type" msgstr "值类型" msgid "Verification is not available." msgstr "不能进行验证。" msgid "Warning!" msgstr "警告!" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5960732 sahara-dashboard-16.0.0/sahara_dashboard/test/0000775000175000017500000000000000000000000021232 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/__init__.py0000664000175000017500000000000000000000000023331 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5960732 sahara-dashboard-16.0.0/sahara_dashboard/test/api_tests/0000775000175000017500000000000000000000000023225 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/api_tests/__init__.py0000664000175000017500000000000000000000000025324 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/api_tests/test_sahara.py0000664000175000017500000000255000000000000026077 0ustar00zuulzuul00000000000000# Copyright 2015, Telles Nobrega # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from sahara_dashboard import api from sahara_dashboard.test import helpers as test class SaharaApiTest(test.SaharaAPITestCase): # # Cluster # def test_cluster_create_count(self): saharaclient = self.stub_saharaclient() saharaclient.clusters.create.return_value = \ {"Clusters": ['cluster1', 'cluster2']} ret_val = api.sahara.cluster_create(self.request, 'name', 'fake_plugin', '1.0.0', count=2, is_public=False, is_protected=False) self.assertEqual(2, len(ret_val['Clusters'])) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/helpers.py0000664000175000017500000000357700000000000023262 0ustar00zuulzuul00000000000000# # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from unittest import mock from openstack_dashboard.test import helpers from sahara_dashboard import api from sahara_dashboard.test.test_data import utils # Shortcuts to avoid importing openstack_dashboard.test.helper and # for backwards compatibility. create_mocks = helpers.create_mocks IsA = helpers.IsA IsHttpRequest = helpers.IsHttpRequest class SaharaTestsMixin(object): def _setup_test_data(self): super(SaharaTestsMixin, self)._setup_test_data() utils.load_test_data(self) self.policy_patcher = mock.patch( 'openstack_auth.policy.check', lambda action, request: True) self.policy_check = self.policy_patcher.start() class TestCase(SaharaTestsMixin, helpers.TestCase): pass class BaseAdminViewTests(SaharaTestsMixin, helpers.TestCase): pass class SaharaAPITestCase(helpers.APITestCase): def setUp(self): super(SaharaAPITestCase, self).setUp() self._original_saharaclient = api.sahara.client api.sahara.client = lambda request: self.stub_saharaclient() def tearDown(self): super(SaharaAPITestCase, self).tearDown() api.sahara.client = self._original_saharaclient def stub_saharaclient(self): if not hasattr(self, "saharaclient"): self.saharaclient = mock.Mock() return self.saharaclient ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5960732 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/0000775000175000017500000000000000000000000024777 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/__init__.py0000664000175000017500000000000000000000000027076 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/helpers.py0000664000175000017500000000521000000000000027011 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from datetime import datetime from oslo_config import cfg from openstack_dashboard.test.integration_tests import helpers class SaharaTestCase(helpers.AdminTestCase): @classmethod def setUpClass(cls): sahara_group = cfg.OptGroup( 'sahara', help='Sahara specific tests config group') cls.CONFIG.register_group(sahara_group) fake_image_location = cfg.StrOpt('fake_image_location') cls.CONFIG.register_opt(fake_image_location, group=sahara_group) ssh_user = cfg.StrOpt('fake_image_ssh_user') cls.CONFIG.register_opt(ssh_user, group=sahara_group) project_name = cfg.StrOpt('project_name', default='demo') cls.CONFIG.register_opt(project_name, group=sahara_group) ip_pool = cfg.StrOpt('ip_pool', default="public") cls.CONFIG.register_opt(ip_pool, group=sahara_group) launch_timeout = cfg.IntOpt('launch_timeout', default=1200) cls.CONFIG.register_opt(launch_timeout, group=sahara_group) flavor_vcpus = cfg.IntOpt('flavor_vcpus', default=1) cls.CONFIG.register_opt(flavor_vcpus, group=sahara_group) flavor_ram = cfg.IntOpt('flavor_ram', default=256) cls.CONFIG.register_opt(flavor_ram, group=sahara_group) flavor_root_disk = cfg.IntOpt('flavor_root_disk', default=3) cls.CONFIG.register_opt(flavor_root_disk, group=sahara_group) flavor_ephemeral_disk = cfg.IntOpt('flavor_ephemeral_disk', default=0) cls.CONFIG.register_opt(flavor_ephemeral_disk, group=sahara_group) flavor_swap_disk = cfg.IntOpt('flavor_swap_disk', default=0) cls.CONFIG.register_opt(flavor_swap_disk, group=sahara_group) def setUp(self): super(SaharaTestCase, self).setUp() self._suffix = datetime.now().strftime('%H-%M-%S-%f')[:12] # select project driver = self.home_pg.driver driver.find_element_by_css_selector('li.dropdown').click() driver.find_element_by_link_text( self.CONFIG.sahara.project_name).click() def gen_name(self, name): return '{}-{}'.format(name, self._suffix) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/horizon.conf0000664000175000017500000000625300000000000027344 0ustar00zuulzuul00000000000000# # Configuration filed based on Tempest's tempest.conf.sample # [dashboard] # Where the dashboard can be found (string value) dashboard_url=http://localhost/dashboard/ # Login page for the dashboard (string value) login_url=http://localhost/dashboard/auth/login/ # Dashboard help page url (string value) help_url=http://docs.openstack.org/ [selenium] # Timeout in seconds to wait for a page to become available # (integer value) page_timeout=30 # Output directory for screenshots. # (string value) screenshots_directory=integration_tests_screenshots # Implicit timeout to wait until element become available, # this timeout is used for every find_element, find_elements call. # (integer value) implicit_wait=10 # Explicit timeout is used for long lasting operations, # methods using explicit timeout are usually prefixed with 'wait', # those methods ignore implicit_wait when looking up web elements. # (integer value) explicit_wait=300 [image] # http accessible image (string value) http_image=https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img [sahara] # http accessible image (string value) fake_image_location=/tmp/xenial-server-cloudimg-amd64-disk1.img # ssh username for image (string value) fake_image_ssh_user=ubuntu # Floating IP pool name (string value) ip_pool=public # Cluster launch timeout in seconds (integer value) launch_timeout=1200 [identity] # Username to use for non-admin API requests. (string value) username=demo # API key to use when authenticating. (string value) password=secretadmin # Administrative Username to use for admin API requests. # (string value) admin_username=admin # API key to use when authenticating as admin. (string value) admin_password=secretadmin [scenario] # ssh username for image file (string value) ssh_user=cirros [launch_instances] #available zone to launch instances available_zone=nova #image_name to launch instances image_name=cirros-0.3.4-x86_64-uec (24.0 MB) [plugin] is_plugin=True plugin_page_path=sahara_dashboard.test.integration_tests.pages plugin_page_structure={ "Project": { "Data Processing": { "Clusters": { "_": [ "Clusters", "Cluster Templates", "Node Group Templates", "Image Registry" ] }, "Jobs": { "_": [ "Jobs", "Job Templates", "Data Sources", "Job Binaries", "Plugins" ] } } } } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5960732 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/0000775000175000017500000000000000000000000026076 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/__init__.py0000664000175000017500000000000000000000000030175 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/basepage.py0000664000175000017500000000353500000000000030225 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from openstack_dashboard.test.integration_tests.pages import basepage from openstack_dashboard.test.integration_tests.regions import messages from openstack_dashboard.test.integration_tests.regions import tables class BaseDataProcessingPage(basepage.BaseNavigationPage): TABLE_NAME = "" # index of name column in binary jobs table TABLE_NAME_COLUMN = 'name' def __new__(cls, *args, **kwargs): table_bases = (tables.TableRegion,) + cls.get_table_mixins() cls.TableRegion = type('PageTableRegion', table_bases, {'name': cls.TABLE_NAME}) return super(BaseDataProcessingPage, cls).__new__(cls, *args, **kwargs) @classmethod def get_table_mixins(cls): return () def _get_row_with_name(self, name, name_column=TABLE_NAME_COLUMN): try: return self.table.get_row(name_column, name) except Exception: return None @property def table(self): return self.TableRegion(self.driver, self.conf) def is_present(self, name): return bool(self._get_row_with_name(name)) def has_success_message(self): return self.find_message_and_dismiss(messages.SUCCESS) def has_error_message(self): return self.find_message_and_dismiss(messages.ERROR) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/mixins.py0000664000175000017500000000474700000000000027773 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from openstack_dashboard.test.integration_tests.regions import forms from openstack_dashboard.test.integration_tests.regions import tables class TableCreateWithPluginMixin(object): PLUGIN_CHOOSE_FORM_FIELDS = ( 'vanilla_version', 'cdh_version', 'plugin_name', 'spark_version', 'fake_version', 'storm_version', 'mapr_version' ) @tables.bind_table_action('create') def get_create_form(self, button): button.click() return forms.FormRegion(self.driver, self.conf, field_mappings=self.PLUGIN_CHOOSE_FORM_FIELDS) class PluginSelectMixin(object): @classmethod def get_table_mixins(cls): return (super(PluginSelectMixin, cls).get_table_mixins() + (TableCreateWithPluginMixin,)) def choose_plugin(self, plugin_name, plugin_version): form = self.table.get_create_form() form.plugin_name.text = plugin_name for f_name, field in form.fields.items(): if not f_name.endswith('version'): continue if field.is_displayed(): field.text = plugin_version break else: raise Exception("Can't find element to set version") form.submit() class TableDeleteMixin(object): @tables.bind_table_action('delete') def get_delete_form(self, button): button.click() return forms.BaseFormRegion(self.driver, self.conf) class DeleteMixin(object): @classmethod def get_table_mixins(cls): return (super(DeleteMixin, cls).get_table_mixins() + (TableDeleteMixin,)) def delete_many(self, names=()): for name in names: row = self._get_row_with_name(name) if row is not None: row.mark() self.table.get_delete_form().submit() def delete(self, name): return self.delete_many([name]) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5960732 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/0000775000175000017500000000000000000000000027544 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/__init__.py0000664000175000017500000000000000000000000031643 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5960732 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/0000775000175000017500000000000000000000000032711 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021100000000000011447 xustar0000000000000000115 path=sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/__init__.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/__init0000664000175000017500000000000000000000000034063 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021500000000000011453 xustar0000000000000000113 path=sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/clusters/ 28 mtime=1648641572.5960732 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/cluste0000775000175000017500000000000000000000000034131 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022200000000000011451 xustar0000000000000000124 path=sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/clusters/__init__.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/cluste0000664000175000017500000000000000000000000034121 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022600000000000011455 xustar0000000000000000128 path=sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/clusters/clusterspage.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/cluste0000664000175000017500000001004400000000000034132 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from openstack_dashboard.test.integration_tests.regions import forms from openstack_dashboard.test.integration_tests.regions import tables from selenium.common.exceptions import NoSuchElementException from sahara_dashboard.test.integration_tests.pages import basepage from sahara_dashboard.test.integration_tests.pages import mixins class ScaleForm(forms.BaseFormRegion): def scale(self, node_name, new_count): table = self.src_elem.find_element_by_id('groups_table') count_input_xpath = ('.//input[@value="{}"]/ancestor::tr//' 'input[starts-with(@name, "count_")]'.format( node_name)) count_input = table.find_element_by_xpath(count_input_xpath) count_input.clear() count_input.send_keys(str(new_count)) class ScaleMixin(object): @tables.bind_row_action('scale') def get_scale_form(self, button, row): button.click() return ScaleForm(self.driver, self.conf) class ClustersPage(mixins.PluginSelectMixin, mixins.DeleteMixin, basepage.BaseDataProcessingPage): TABLE_NAME = "clusters" CREATE_FIELD_MAPPING = ('cluster_name', 'description', 'cluster_template', 'cluster_count', 'image', 'keypair') TABLE_NAME_COLUMN = 'name' @classmethod def get_table_mixins(cls): return super(ClustersPage, cls).get_table_mixins() + (ScaleMixin,) @property def create_form(self): return forms.FormRegion(self.driver, self.conf, field_mappings=self.CREATE_FIELD_MAPPING) def is_cluster_active(self, name): row = self._get_row_with_name(name) if not row: return False status_cell = row.cells['status'] if status_cell.text.startswith('Error'): msg = status_cell.text try: msg = '{}\n{}'.format( msg, status_cell.find_element_by_tag_name('span').get_attribute( 'title') ) except NoSuchElementException: pass raise Exception(msg) return status_cell.text == "Active" def get_cluster_instances_count(self, name): row = self._get_row_with_name(name) return int(row.cells['instances_count'].text) def create(self, plugin_name, plugin_version, name, description=None, cluster_template=None, cluster_count=1, image=None, keypair=None): self.choose_plugin(plugin_name, plugin_version) form = self.create_form form.cluster_name.text = name if description is not None: form.description.text = description if cluster_template is not None: form.cluster_template.text = cluster_template form.cluster_count.text = cluster_count if image is not None: form.image.text = image if keypair is not None: form.keypair.text = keypair form.submit() def scale(self, cluster_name, node_name, new_count): row = self._get_row_with_name(cluster_name) form = self.table.get_scale_form(row) form.scale(node_name, new_count) form.submit() def wait_until_cluster_active(self, name, timeout=None): self._wait_until(lambda x: self.is_cluster_active(name), timeout=timeout) def wait_until_cluster_deleted(self, name): self._wait_until(lambda x: not self.is_present(name)) ././@PaxHeader0000000000000000000000000000023600000000000011456 xustar0000000000000000136 path=sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/clusters/clustertemplatespage.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/cluste0000664000175000017500000001360000000000000034133 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from openstack_dashboard.test.integration_tests.regions import tables from sahara_dashboard.test.integration_tests.pages import basepage from sahara_dashboard.test.integration_tests.pages import mixins from sahara_dashboard.test.integration_tests.regions import forms class ClusterTemplateForm(forms.TabbedFormRegion): CREATE_FIELD_MAPPING = ( ('cluster_template_name', 'description', 'use_autoconfig', 'anti_affinity'), (), ('CONF:general:Timeout for disk preparing', 'CONF:general:Enable NTP service', 'CONF:general:URL of NTP server', 'CONF:general:Heat Wait Condition timeout', 'CONF:general:Enable XFS') ) def __init__(self, *args, **kwargs): kwargs['field_mappings'] = self.CREATE_FIELD_MAPPING super(ClusterTemplateForm, self).__init__(*args, **kwargs) def set_nodegroup_templates(self, node_group_templates): self.switch_to(1) template_el = self.src_elem.find_element_by_name('template') add_button = self.src_elem.find_element_by_id('add_group_button') to_add_templates = list(node_group_templates) groups_table = self.src_elem.find_element_by_id('groups_table') if groups_table.is_displayed(): for row in groups_table.find_elements_by_css_selector( 'tr.data-template-row' ): name = row.find_element_by_xpath('.//input[1]').get_attribute( 'value') if name in to_add_templates: to_add_templates.remove(name) else: row.find_element_by_css_selector( 'input[type=button]').click() for template_name in to_add_templates: for option in template_el.find_elements_by_tag_name('option'): if option.text == template_name: option.click() add_button.click() break class UpdateMixin(object): @tables.bind_row_action('edit') def get_edit_form(self, button, row): button.click() return ClusterTemplateForm(self.driver, self.conf) class ClustertemplatesPage(mixins.PluginSelectMixin, mixins.DeleteMixin, basepage.BaseDataProcessingPage): TABLE_NAME = "cluster_templates" @classmethod def get_table_mixins(cls): return (super(ClustertemplatesPage, cls).get_table_mixins() + (UpdateMixin,)) @property def create_form(self): return ClusterTemplateForm(self.driver, self.conf) def create(self, plugin_name, plugin_version, name, node_group_templates, **kwargs): self.choose_plugin(plugin_name, plugin_version) form = self.create_form kwargs.update({ 'cluster_template_name': name }) form.set_values(**kwargs) form.set_nodegroup_templates(node_group_templates) form.submit() def update(self, name, node_group_templates=(), **kwargs): row = self._get_row_with_name(name) form = self.table.get_edit_form(row) form.set_values(**kwargs) form.set_nodegroup_templates(node_group_templates) form.submit() def get_details(self, name): details = {'node_groups': {}} row = self._get_row_with_name(name) for node_group in row.cells['node_groups'].text.split('\n'): key, delimiter, value = node_group.partition(':') if delimiter == ':': details['node_groups'][key] = value.strip() self.table.src_elem.find_element_by_link_text(name).click() items = self.driver.find_elements_by_css_selector('div.detail dt') for item in items: key = item.text value_elem = item.find_element_by_xpath('./following-sibling::*') if value_elem.tag_name != "dd": continue value = value_elem.text details[key] = value self.driver.find_element_by_link_text('Configuration Details').click() items = self.driver.find_elements_by_css_selector('div.detail > dl li') for item in items: key, delimiter, value = item.text.partition(':') if delimiter == ':': details[key] = value.strip() for key, value in details.items(): if '\n' in value: details[key] = set(value.split('\n')) return details def get_nodegroup_details(self, cluster_tpl_name, node_group_name): self.table.src_elem.find_element_by_link_text(cluster_tpl_name).click() self.driver.find_element_by_link_text('Node Groups').click() details = {} groups = self.driver.find_elements_by_css_selector( 'div.tab-pane.active dl') for group in groups: if node_group_name not in group.text: continue for item in group.find_elements_by_tag_name('dt'): key = item.text value_elem = item.find_element_by_xpath( './following-sibling::*') if value_elem.tag_name != "dd": continue value = value_elem.text details[key] = value for key, value in details.items(): if '\n' in value: details[key] = set(value.split('\n')) return details ././@PaxHeader0000000000000000000000000000023300000000000011453 xustar0000000000000000133 path=sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/clusters/imageregistrypage.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/cluste0000664000175000017500000000534600000000000034143 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from openstack_dashboard.test.integration_tests.pages import basepage from openstack_dashboard.test.integration_tests.regions import forms from openstack_dashboard.test.integration_tests.regions import tables class ImageRegistryTable(tables.TableRegion): name = "image_registry" REGISTER_FORM_FIELDS = ('image_id', 'user_name', 'description') @tables.bind_table_action('register') def register_image(self, register_button): register_button.click() return forms.FormRegion(self.driver, self.conf, field_mappings=self.REGISTER_FORM_FIELDS) @tables.bind_table_action('unregister') def unregister_image(self, unregister_button): unregister_button.click() return forms.BaseFormRegion(self.driver, self.conf) class ImageregistryPage(basepage.BaseNavigationPage): TABLE_IMAGE_COLUMN = 'name' def __init__(self, driver, conf): super(ImageregistryPage, self).__init__(driver, conf) self._page_title = "Clusters" def _get_row_with_image_name(self, name): return self.image_table.get_row(self.TABLE_IMAGE_COLUMN, name) @property def image_table(self): return ImageRegistryTable(self.driver, self.conf) def is_image_registered(self, name): return bool(self._get_row_with_image_name(name)) def unregister_image(self, name): self._get_row_with_image_name(name).mark() unregister_form = self.image_table.unregister_image() unregister_form.submit() def register_image(self, image, user_name, description, tags=()): register_form = self.image_table.register_image() register_form.image_id.text = image register_form.user_name.text = user_name register_form.description.text = description tag_input = register_form.src_elem.find_element_by_id( "_sahara_image_tag") tag_add_btn = register_form.src_elem.find_element_by_id("add_tag_btn") for tag in tags: tag_input.send_keys(tag) tag_add_btn.click() register_form.submit() def wait_until_image_registered(self, name): self._wait_until(lambda x: self.is_image_registered(name)) ././@PaxHeader0000000000000000000000000000024000000000000011451 xustar0000000000000000138 path=sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/clusters/nodegrouptemplatespage.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/cluste0000664000175000017500000001066000000000000034136 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from openstack_dashboard.test.integration_tests.regions import forms from openstack_dashboard.test.integration_tests.regions import tables from sahara_dashboard.test.integration_tests.pages import basepage from sahara_dashboard.test.integration_tests.pages import mixins CREATE_FIELD_MAPPING = ( ('nodegroup_name', 'description', 'flavor', 'availability_zone', 'storage', 'volumes_per_node', 'volumes_size', 'volume_type', 'volume_local_to_instance', 'volumes_availability_zone', 'floating_ip_pool', 'use_autoconfig', 'proxygateway'), ('processes',), ('security_autogroup', 'security_groups'), ) class UpdateMixin(object): @tables.bind_row_action('edit') def get_edit_form(self, button, row): button.click() return forms.TabbedFormRegion( self.driver, self.conf, field_mappings=CREATE_FIELD_MAPPING) class NodegrouptemplatesPage(mixins.PluginSelectMixin, mixins.DeleteMixin, basepage.BaseDataProcessingPage): TABLE_NAME = "nodegroup_templates" @classmethod def get_table_mixins(cls): return (super(NodegrouptemplatesPage, cls).get_table_mixins() + (UpdateMixin,)) @property def create_form(self): return forms.TabbedFormRegion( self.driver, self.conf, field_mappings=CREATE_FIELD_MAPPING) def _set_checkbox_group(self, form, group_name, values=()): for el in form.src_elem.find_elements_by_xpath( './/input[@name="{}"]'.format(group_name) ): elem_id = el.get_attribute('id') label_text = form.src_elem.find_element_by_css_selector( 'label[for={}]'.format(elem_id)).text if (label_text in values) != el.is_selected(): el.click() def _fill_form(self, form, **kwargs): for tab_num, fields in enumerate(CREATE_FIELD_MAPPING): form.switch_to(tab_num) for key in fields: value = kwargs.get(key) if value is None: continue if isinstance(value, (list, tuple)): self._set_checkbox_group(form, key, value) continue field = getattr(form, key, None) if (field.src_elem.get_attribute('type') in ('checkbox', 'radio')): if value: field.mark() else: field.unmark() else: field.text = value def create(self, plugin_name, plugin_version, nodegroup_name, flavor, floating_ip_pool=None, availability_zone='nova', proxygateway=False, processes=(), **kwargs): self.choose_plugin(plugin_name, plugin_version) form = self.create_form kwargs.update({ 'nodegroup_name': nodegroup_name, 'flavor': flavor, 'floating_ip_pool': floating_ip_pool, 'availability_zone': availability_zone, 'proxygateway': proxygateway, 'processes': processes, }) self._fill_form(form, **kwargs) form.submit() def update(self, group_name, **kwargs): row = self._get_row_with_name(group_name) form = self.table.get_edit_form(row) self._fill_form(form, **kwargs) form.submit() def get_details(self, name): self.table.src_elem.find_element_by_link_text(name).click() items = self.driver.find_elements_by_css_selector('div.detail > dl') self._turn_off_implicit_wait() details = {} for item in items: names = [x.text for x in item.find_elements_by_tag_name('dt')] values = [x.text for x in item.find_elements_by_tag_name('dd')] details.update(zip(names, values)) self._turn_on_implicit_wait() return details ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.6000733 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/0000775000175000017500000000000000000000000033646 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000021600000000000011454 xustar0000000000000000120 path=sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/__init__.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/_0000664000175000017500000000000000000000000033775 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000022500000000000011454 xustar0000000000000000127 path=sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/datasourcespage.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/d0000664000175000017500000000545300000000000034023 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from openstack_dashboard.test.integration_tests.regions import forms from openstack_dashboard.test.integration_tests.regions import tables from sahara_dashboard.test.integration_tests.pages import basepage from sahara_dashboard.test.integration_tests.pages import mixins class CreateMixin(object): CREATE_FIELD_MAPPING = ( "data_source_name", "data_source_type", "data_source_url", "data_source_credential_user", "data_source_credential_pass", "data_source_description" ) @tables.bind_table_action('create data source') def get_create_form(self, button): button.click() return forms.FormRegion(self.driver, self.conf, field_mappings=self.CREATE_FIELD_MAPPING) @tables.bind_row_action('edit data source') def get_update_form(self, button, row): button.click() return forms.FormRegion(self.driver, self.conf, field_mappings=self.CREATE_FIELD_MAPPING) class DatasourcesPage(mixins.DeleteMixin, basepage.BaseDataProcessingPage): TABLE_NAME = "data_sources" @classmethod def get_table_mixins(cls): return super(DatasourcesPage, cls).get_table_mixins() + (CreateMixin,) def create(self, name, source_type, url): form = self.table.get_create_form() form.data_source_name.text = name form.data_source_type.text = source_type form.data_source_url.text = url form.submit() def update(self, name, **kwargs): row = self._get_row_with_name(name) form = self.table.get_update_form(row) for key in CreateMixin.CREATE_FIELD_MAPPING: if key in kwargs: getattr(form, key).text = kwargs[key] form.submit() def get_details(self, name): details = {} self.table.src_elem.find_element_by_link_text(name).click() items = self.driver.find_elements_by_css_selector('div.detail dt') for item in items: key = item.text value_elem = item.find_element_by_xpath('./following-sibling::*') if value_elem.tag_name != "dd": continue value = value_elem.text details[key] = value return details ././@PaxHeader0000000000000000000000000000022500000000000011454 xustar0000000000000000127 path=sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/jobbinariespage.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/j0000664000175000017500000001066200000000000034027 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from openstack_dashboard.test.integration_tests.pages import basepage from openstack_dashboard.test.integration_tests.regions import forms from openstack_dashboard.test.integration_tests.regions import messages from openstack_dashboard.test.integration_tests.regions import tables class JobBinariesTable(tables.TableRegion): name = 'job_binaries' CREATE_BINARY_FORM_FIELDS = ( "job_binary_name", "job_binary_type", "job_binary_url", "job_binary_username", "job_binary_password", "job_binary_internal", "job_binary_file", "job_binary_script_name", "job_binary_script", "job_binary_description" ) @tables.bind_table_action('create') def get_create_form(self, button): button.click() return forms.FormRegion( self.driver, self.conf, field_mappings=self.CREATE_BINARY_FORM_FIELDS) @tables.bind_table_action('delete') def get_delete_form(self, button): button.click() return forms.BaseFormRegion(self.driver, self.conf) @tables.bind_row_action('edit_job_binary') def get_update_form(self, button, row): button.click() return forms.FormRegion( self.driver, self.conf, field_mappings=self.CREATE_BINARY_FORM_FIELDS) class JobbinariesPage(basepage.BaseNavigationPage): JOB_BINARIES_TABLE_NAME_COLUMN = 'name' def __init__(self, driver, conf): super(JobbinariesPage, self).__init__(driver, conf) self._page_title = "Data Processing" def _get_row_with_name(self, name): return self.table.get_row( self.JOB_BINARIES_TABLE_NAME_COLUMN, name) @property def table(self): return JobBinariesTable(self.driver, self.conf) def delete_job_binary(self, name): row = self._get_row_with_name(name) row.mark() confirm_delete_form = self.table.get_delete_form() confirm_delete_form.submit() def create_job_binary(self, binary_name, script_name): form = self.table.get_create_form() form.job_binary_name.text = binary_name form.job_binary_type.text = "Internal database" form.job_binary_internal.text = "*Create a script" form.job_binary_script_name.text = script_name form.job_binary_script.text = "test_script_text" form.job_binary_description.text = "test description" form.submit() def create_job_binary_from_file(self, binary_name, path): form = self.table.get_create_form() form.job_binary_name.text = binary_name form.job_binary_type.text = "Internal database" form.job_binary_internal.text = "*Upload a new file" form.job_binary_file.src_elem.send_keys(path) form.job_binary_description.text = "test description" form.submit() def update_job_binary(self, name, **kwargs): row = self._get_row_with_name(name) form = self.table.get_update_form(row) for key in JobBinariesTable.CREATE_BINARY_FORM_FIELDS: if key in kwargs: getattr(form, key).text = kwargs[key] form.submit() def get_details(self, name): details = {} self.table.src_elem.find_element_by_link_text(name).click() items = self.driver.find_elements_by_css_selector('div.detail dt') for item in items: key = item.text value_elem = item.find_element_by_xpath('./following-sibling::*') if value_elem.tag_name != "dd": continue value = value_elem.text details[key] = value return details def is_job_binary_present(self, name): return bool(self._get_row_with_name(name)) def has_success_message(self): return self.find_message_and_dismiss(messages.SUCCESS) def has_error_message(self): return self.find_message_and_dismiss(messages.ERROR) ././@PaxHeader0000000000000000000000000000021600000000000011454 xustar0000000000000000120 path=sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/jobspage.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/j0000664000175000017500000000535300000000000034030 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from sahara_dashboard.test.integration_tests.pages import basepage from sahara_dashboard.test.integration_tests.pages import mixins class JobsPage(mixins.DeleteMixin, basepage.BaseDataProcessingPage): TABLE_NAME = "jobs" def _get_row_by_template_name(self, name): return self.table.get_row('job_name', name) def is_job_succeeded(self, name): row = self._get_row_by_template_name(name) status = row.cells['status'].text if status.startswith('Error'): raise Exception('Job {} status is {}'.format(name, status)) return status == "Succeeded" def delete_many(self, names=()): for name in names: row = self._get_row_by_template_name(name) if row is not None: row.mark() self.table.get_delete_form().submit() def delete(self, name): self.delete_many([name]) def wait_until_job_succeeded(self, name, timeout=None): self._wait_until(lambda x: self.is_job_succeeded(name), timeout=timeout) def get_details(self, template_name): row = self._get_row_by_template_name(template_name) row.cells['name'].find_element_by_tag_name('a').click() details = {} self.driver.implicitly_wait(0) items = self.driver.find_elements_by_css_selector('div.detail dt') for item in items: key = item.text value_elem = item.find_element_by_xpath('./following-sibling::*') if value_elem.tag_name != "dd": continue sub_elements = value_elem.find_elements_by_css_selector( 'li > span') if sub_elements: value = {} for sub_element in sub_elements: sub_key = sub_element.text.strip(':') value[sub_key] = set() for elem in sub_element.find_elements_by_xpath( './following-sibling::ul/li' ): value[sub_key].add(elem.text) else: value = value_elem.text details[key] = value self.driver.implicitly_wait(30) return details ././@PaxHeader0000000000000000000000000000022600000000000011455 xustar0000000000000000128 path=sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/jobtemplatespage.py 22 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/j0000664000175000017500000001175500000000000034033 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from openstack_dashboard.test.integration_tests.regions import forms from openstack_dashboard.test.integration_tests.regions import tables from selenium.webdriver.common import by from sahara_dashboard.test.integration_tests.pages import basepage from sahara_dashboard.test.integration_tests.pages import mixins class CreateMixin(object): CREATE_FIELD_MAPPING = ( ('job_name', 'job_type', 'main_binary', 'job_description'), ('lib_binaries',), ) LAUNCH_ON_EXIST_CLUSTER_FIELD_MAPPING = ( ('job_input', 'job_output', 'cluster'), ('adapt_spark_swift', 'datasource_substitute', 'streaming_mapper', 'streaming_reducer'), (), ) @tables.bind_table_action('create job') def get_create_form(self, button): button.click() return forms.TabbedFormRegion(self.driver, self.conf, field_mappings=self.CREATE_FIELD_MAPPING) @tables.bind_row_action('launch-job-existing') def get_launch_on_exists_form(self, button, row): button.click() return forms.TabbedFormRegion( self.driver, self.conf, field_mappings=self.LAUNCH_ON_EXIST_CLUSTER_FIELD_MAPPING) class JobtemplatesPage(mixins.DeleteMixin, basepage.BaseDataProcessingPage): TABLE_NAME = "job_templates" @classmethod def get_table_mixins(cls): return super(JobtemplatesPage, cls).get_table_mixins() + (CreateMixin,) def create(self, name, job_type, binary_name, libs=()): form = self.table.get_create_form() form.job_name.text = name form.job_type.text = job_type if binary_name is not None: form.main_binary.text = binary_name form.switch_to(1) for lib in libs: form.lib_binaries.text = lib form.src_elem.find_element_by_id("add_lib_button").click() form.submit() def launch_on_exists(self, job_name, input_name, output_name, cluster_name, adapt_swift=True, datasource_substitution=True, configuration=None, parameters=None, arguments=(), mapper=None, reducer=None): configuration = configuration or {} parameters = parameters or {} row = self._get_row_with_name(job_name) form = self.table.get_launch_on_exists_form(row) if input_name is not None: form.job_input.text = input_name if output_name is not None: form.job_output.text = output_name form.cluster.text = cluster_name form.switch_to(1) if adapt_swift: form.adapt_spark_swift.mark() else: form.adapt_spark_swift.unmark() if datasource_substitution: form.datasource_substitute.mark() else: form.datasource_substitute.unmark() if mapper is not None: form.streaming_mapper.text = mapper if reducer is not None: form.streaming_reducer.text = reducer locator = (by.By.ID, 'configs') if form._is_element_visible(*locator): config_block = form.src_elem.find_element(*locator) add_btn = config_block.find_element_by_link_text('Add') for key, value in configuration.items(): add_btn.click() inputs = config_block.find_elements_by_css_selector( 'input[type=text]')[-2:] inputs[0].send_keys(key) inputs[1].send_keys(value) locator = (by.By.ID, 'params') if form._is_element_visible(*locator): params_block = form.src_elem.find_element(*locator) add_btn = params_block.find_element_by_link_text('Add') for key, value in parameters.items(): add_btn.click() inputs = params_block.find_elements_by_css_selector( 'input[type=text]')[-2:] inputs[0].send_keys(key) inputs[1].send_keys(value) locator = (by.By.ID, 'args_array') if form._is_element_visible(*locator): args_block = form.src_elem.find_element(*locator) add_btn = args_block.find_element_by_link_text('Add') for value in arguments: add_btn.click() input_el = args_block.find_elements_by_css_selector( 'input[type=text]')[-1] input_el.send_keys(value) form.submit() ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.6000733 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/regions/0000775000175000017500000000000000000000000026445 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/regions/__init__.py0000664000175000017500000000000000000000000030544 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/regions/forms.py0000664000175000017500000000404400000000000030147 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from openstack_dashboard.test.integration_tests.regions import forms class TabbedFormRegion(forms.TabbedFormRegion): def __init__(self, driver, conf, field_mappings=None, default_tab=0): self.original_field_mappings = field_mappings super(TabbedFormRegion, self).__init__(driver, conf, field_mappings=field_mappings) def _set_checkbox_group(self, group_name, values=()): for el in self.src_elem.find_elements_by_xpath( './/input[@name="{}"]'.format(group_name) ): elem_id = el.get_attribute('id') label = self.src_elem.find_element_by_css_selector( 'label[for={}]'.format(elem_id)) if (label.text in values) != el.is_selected(): label.click() def set_values(self, **kwargs): for tab_num, fields in enumerate(self.original_field_mappings): self.switch_to(tab_num) for key in fields: value = kwargs.get(key) if value is None: continue if isinstance(value, (list, tuple)): self._set_checkbox_group(key, value) continue field = getattr(self, key) if hasattr(field, 'mark'): if value: field.mark() else: field.unmark() else: field.text = value ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.6000733 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/tests/0000775000175000017500000000000000000000000026141 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/tests/__init__.py0000664000175000017500000000000000000000000030240 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/tests/test_crud.py0000664000175000017500000006430000000000000030512 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from sahara_dashboard.test.integration_tests.helpers import SaharaTestCase PLUGIN_NAME = 'Fake Plugin' PLUGIN_VERSION = '0.1' IMAGE_TAGS = ('fake', PLUGIN_VERSION) class TestCRUDBase(SaharaTestCase): def setUp(self): super(TestCRUDBase, self).setUp() self.flavor_name = self.gen_name('flavor') self.image_name = self.gen_name("image") self.master_name = self.gen_name("master") self.worker_name = self.gen_name("worker") self.template_name = self.gen_name("template") self.cluster_name = self.gen_name("cluster") self.ds_input_name = self.gen_name('input') self.ds_output_name = self.gen_name('output') self.job_binary_name = self.gen_name('function') self.jobtemplate_name = self.gen_name('test-job') def create_flavor(self): flavors_page = self.home_pg.go_to_admin_compute_flavorspage() flavors_page.create_flavor( name=self.flavor_name, vcpus=self.CONFIG.sahara.flavor_vcpus, ram=self.CONFIG.sahara.flavor_ram, root_disk=self.CONFIG.sahara.flavor_root_disk, ephemeral_disk=self.CONFIG.sahara.flavor_ephemeral_disk, swap_disk=self.CONFIG.sahara.flavor_swap_disk) self.assertTrue(flavors_page.is_flavor_present(self.flavor_name)) def delete_flavor(self): flavors_page = self.home_pg.go_to_admin_compute_flavorspage() flavors_page.delete_flavor_by_row(self.flavor_name) self.assertFalse(flavors_page.is_flavor_present(self.flavor_name)) def create_image(self): image_pg = self.home_pg.go_to_project_compute_imagespage() image_pg.create_image( self.image_name, image_file=self.CONFIG.sahara.fake_image_location) image_pg._wait_until( lambda x: image_pg.is_image_active(self.image_name), timeout=10 * 60) def delete_image(self): image_pg = self.home_pg.go_to_project_compute_imagespage() image_pg.delete_image(self.image_name) def register_image(self): image_reg_pg = ( self.home_pg.go_to_dataprocessing_clusters_imageregistrypage()) image_ssh_user = self.CONFIG.sahara.fake_image_ssh_user image_reg_pg.register_image(self.image_name, image_ssh_user, "Test description", tags=IMAGE_TAGS) image_reg_pg.wait_until_image_registered(self.image_name) def unregister_image(self): image_reg_pg = ( self.home_pg.go_to_dataprocessing_clusters_imageregistrypage()) image_reg_pg.unregister_image(self.image_name) def create_cluster(self): nodegrouptpls_pg = ( self.home_pg.go_to_dataprocessing_clusters_nodegrouptemplatespage() ) nodegrouptpls_pg.create( PLUGIN_NAME, PLUGIN_VERSION, nodegroup_name=self.worker_name, floating_ip_pool=self.CONFIG.sahara.ip_pool, flavor=self.flavor_name, processes=['tasktracker', 'datanode']) self.assertTrue(nodegrouptpls_pg.has_success_message()) self.assertFalse(nodegrouptpls_pg.has_error_message()) self.assertTrue(nodegrouptpls_pg.is_present(self.worker_name), "Worker template was not created.") clustertpls_pg = ( self.home_pg.go_to_dataprocessing_clusters_clustertemplatespage()) clustertpls_pg.create( PLUGIN_NAME, PLUGIN_VERSION, name=self.template_name, node_group_templates=[self.master_name, self.worker_name]) self.assertTrue(clustertpls_pg.has_success_message()) self.assertFalse(clustertpls_pg.has_error_message()) self.assertTrue(clustertpls_pg.is_present(self.template_name), "Cluster template was not created.") cluster_pg = self.home_pg.go_to_dataprocessing_clusters_clusterspage() cluster_pg.create(PLUGIN_NAME, PLUGIN_VERSION, name=self.cluster_name, image=self.image_name, cluster_template=self.template_name) self.assertTrue(cluster_pg.has_success_message()) self.assertFalse(cluster_pg.has_error_message()) cluster_pg.refresh_page() self.assertTrue(cluster_pg.is_present(self.cluster_name), "Cluster was not created.") cluster_pg.wait_until_cluster_active( self.cluster_name, timeout=self.CONFIG.sahara.launch_timeout) self.assertTrue(cluster_pg.is_cluster_active(self.cluster_name), "Cluster is not active") def cluster_scale(self): cluster_pg = self.home_pg.go_to_dataprocessing_clusters_clusterspage() cluster_pg.scale(self.cluster_name, self.worker_name, 2) self.assertTrue(cluster_pg.has_success_message()) self.assertFalse(cluster_pg.has_error_message()) cluster_pg.wait_until_cluster_active( self.cluster_name, timeout=self.CONFIG.sahara.launch_timeout) self.assertTrue(cluster_pg.is_cluster_active(self.cluster_name), "Cluster is not active") self.assertEqual( cluster_pg.get_cluster_instances_count(self.cluster_name), 2, "Cluster was not scaled") def create_datasources(self): datasource_pg = ( self.home_pg.go_to_dataprocessing_jobs_datasourcespage()) datasource_pg.create(name=self.ds_input_name, source_type="HDFS", url="hdfs://user/input") datasource_pg.create(name=self.ds_output_name, source_type="Swift", url="swift://container/output") def delete_datasources(self): datasource_pg = ( self.home_pg.go_to_dataprocessing_jobs_datasourcespage()) datasource_pg.delete(self.ds_input_name) datasource_pg.delete(self.ds_output_name) def create_job_binary(self): job_binary_pg = ( self.home_pg.go_to_dataprocessing_jobs_jobbinariespage()) job_binary_pg.create_job_binary_from_file( self.job_binary_name, __file__) self.assertTrue( job_binary_pg.is_job_binary_present(self.job_binary_name), "Job binary is not in the binaries job table after its creation.") def delete_job_binary(self): job_binary_pg = ( self.home_pg.go_to_dataprocessing_jobs_jobbinariespage()) job_binary_pg.delete_job_binary(self.job_binary_name) self.assertFalse( job_binary_pg.is_job_binary_present(self.job_binary_name), "Job binary was not removed from binaries job table.") def create_job_template(self): jobtemplates_pg = ( self.home_pg.go_to_dataprocessing_jobs_jobtemplatespage()) jobtemplates_pg.create(name=self.jobtemplate_name, job_type='Pig', binary_name=self.job_binary_name) def delete_job_template(self): jobtemplates_pg = ( self.home_pg.go_to_dataprocessing_jobs_jobtemplatespage()) jobtemplates_pg.delete(self.jobtemplate_name) def run_edp_job(self): jobtemplates_pg = ( self.home_pg.go_to_dataprocessing_jobs_jobtemplatespage()) jobtemplates_pg.launch_on_exists(job_name=self.jobtemplate_name, input_name=self.ds_input_name, output_name=self.ds_output_name, cluster_name=self.cluster_name) jobs_pg = self.home_pg.go_to_dataprocessing_jobs_jobspage() jobs_pg.wait_until_job_succeeded(self.jobtemplate_name) def run_edp_job_with_parameters(self): jobtemplates_pg = ( self.home_pg.go_to_dataprocessing_jobs_jobtemplatespage()) jobtemplates_pg.launch_on_exists(job_name=self.jobtemplate_name, input_name=self.ds_input_name, output_name=self.ds_output_name, cluster_name=self.cluster_name, adapt_swift=False, datasource_substitution=False, configuration={'foo': 'bar'}, parameters={'key': 'value'}, arguments=('one', 'two')) jobs_pg = self.home_pg.go_to_dataprocessing_jobs_jobspage() details = jobs_pg.get_details(self.jobtemplate_name) expected = { 'Job Configuration': { 'configs': set([ 'edp.substitute_data_source_for_name = False', 'foo = bar', 'edp.substitute_data_source_for_uuid = False' ]), 'params': set(['key = value']), 'args': set(['one', 'two']), 'job_execution_info': set([]), }, 'Job Template': self.jobtemplate_name, } details = {k: v for k, v in details.items() if k in expected} self.assertEqual(expected, details) def delete_job(self): jobs_pg = self.home_pg.go_to_dataprocessing_jobs_jobspage() jobs_pg.delete(self.jobtemplate_name) def delete_cluster(self): cluster_pg = self.home_pg.go_to_dataprocessing_clusters_clusterspage() cluster_pg.delete(self.cluster_name) self.assertTrue(cluster_pg.has_success_message()) self.assertFalse(cluster_pg.has_error_message()) cluster_pg.wait_until_cluster_deleted(self.cluster_name) self.assertFalse(cluster_pg.is_present(self.cluster_name), "Cluster was not deleted.") def tearDown(self): clustertpls_pg = ( self.home_pg.go_to_dataprocessing_clusters_clustertemplatespage()) if clustertpls_pg.is_present(self.template_name): clustertpls_pg.delete(self.template_name) nodegrouptpls_pg = ( self.home_pg.go_to_dataprocessing_clusters_nodegrouptemplatespage() ) nodegrouptpls_pg.delete_many((self.worker_name, self.master_name)) super(TestCRUDBase, self).tearDown() class TestCRUD(TestCRUDBase): def setUp(self): super(TestCRUD, self).setUp() self.create_flavor() self.create_image() self.register_image() def run_many_edp_jobs(self): jobtemplates_pg = ( self.home_pg.go_to_dataprocessing_jobs_jobtemplatespage()) job_names = {} for job_type in ("Hive", "Java", "MapReduce", "Streaming MapReduce", "Pig", "Shell", "Spark", "Storm"): job_name = "{0}-{1}".format(self.jobtemplate_name, job_type) job_name = job_name.replace(' ', '-') job_names[job_type] = job_name binary_name = self.job_binary_name libs = [] if job_type in ("Java", "MapReduce", "Streaming MapReduce"): binary_name = None libs.append(self.job_binary_name) jobtemplates_pg.create(name=job_name, job_type=job_type, binary_name=binary_name, libs=libs) for job_type, job_name in job_names.items(): jobtemplates_pg = ( self.home_pg.go_to_dataprocessing_jobs_jobtemplatespage()) input_name = self.ds_input_name output_name = self.ds_output_name mapper = None reducer = None if job_type in ("Java", "Shell", "Storm", "Spark"): input_name = None output_name = None if job_type == "Streaming MapReduce": mapper = "mapper" reducer = "reducer" jobtemplates_pg.launch_on_exists(job_name=job_name, input_name=input_name, output_name=output_name, cluster_name=self.cluster_name, mapper=mapper, reducer=reducer) jobs_pg = self.home_pg.go_to_dataprocessing_jobs_jobspage() jobs_pg.wait_until_job_succeeded(job_name) jobs_pg.delete_many(job_names.values()) jobtemplates_pg = ( self.home_pg.go_to_dataprocessing_jobs_jobtemplatespage()) jobtemplates_pg.delete_many(job_names.values()) def test_cluster_operate(self): self.create_cluster() self.create_datasources() self.create_job_binary() self.create_job_template() self.run_edp_job() self.delete_job() self.run_edp_job_with_parameters() self.delete_job() self.run_many_edp_jobs() self.delete_job_template() self.delete_job_binary() self.delete_datasources() self.cluster_scale() self.delete_cluster() def tearDown(self): self.unregister_image() self.delete_image() self.delete_flavor() super(TestCRUD, self).tearDown() class TestUpdateNodeGroupTemplate(SaharaTestCase): def setUp(self): super(TestUpdateNodeGroupTemplate, self).setUp() self.old_name = self.gen_name("old-name") self.new_name = self.gen_name("new-name") nodegrouptpls_pg = ( self.home_pg.go_to_dataprocessing_clusters_nodegrouptemplatespage() ) nodegrouptpls_pg.create( PLUGIN_NAME, PLUGIN_VERSION, nodegroup_name=self.old_name, flavor='m1.tiny', processes=['tasktracker', 'datanode']) self.assertTrue(nodegrouptpls_pg.has_success_message()) self.assertFalse(nodegrouptpls_pg.has_error_message()) self.assertTrue(nodegrouptpls_pg.is_present(self.old_name), "Worker template was not created.") def test_update(self): nodegrouptpls_pg = ( self.home_pg.go_to_dataprocessing_clusters_nodegrouptemplatespage() ) kwargs = { 'nodegroup_name': self.new_name, 'description': '{} description'.format(self.new_name), 'flavor': 'm1.small', 'availability_zone': 'No availability zone specified', 'storage': 'Cinder Volume', 'volumes_per_node': 2, 'volumes_size': 3, 'volume_type': 'lvmdriver-1', 'volume_local_to_instance': True, 'volumes_availability_zone': 'nova', 'floating_ip_pool': self.CONFIG.sahara.ip_pool, 'use_autoconfig': False, 'proxygateway': True, 'processes': ['jobtracker', 'namenode'], 'security_autogroup': False, 'security_groups': ['default'] } nodegrouptpls_pg.update(group_name=self.old_name, **kwargs) details = nodegrouptpls_pg.get_details(self.new_name) expected = { 'Auto Security Group': 'False', 'Description': kwargs['description'], 'Flavor': 'm1.small', 'Floating IP Pool': self.CONFIG.sahara.ip_pool, 'Name': self.new_name, 'Node Processes': 'namenode\njobtracker', 'Plugin': 'fake', 'Proxy Gateway': 'True', 'Security Groups': 'default', 'Use auto-configuration': 'False', 'Version': '0.1', 'Volumes Availability Zone': 'nova', 'Volumes local to instance': 'True', 'Volumes per node': '2', 'Volumes size': '3', 'Volumes type': 'lvmdriver-1' } details = {k: v for k, v in details.items() if k in expected} self.assertEqual(expected, details) def tearDown(self): nodegrouptpls_pg = ( self.home_pg.go_to_dataprocessing_clusters_nodegrouptemplatespage() ) nodegrouptpls_pg.delete_many((self.old_name, self.new_name)) super(TestUpdateNodeGroupTemplate, self).tearDown() class TestUpdateClusterTemplate(SaharaTestCase): def setUp(self): super(TestUpdateClusterTemplate, self).setUp() self.flavor_name = self.gen_name('flavor') self.image_name = self.gen_name("image") self.worker_name = self.gen_name("worker") self.new_worker_name = self.gen_name("new-worker") self.master_name = self.gen_name("master") self.cluster_template_name = self.gen_name("old-name") self.new_cluster_template_name = self.gen_name("new-name") nodegrouptpls_pg = ( self.home_pg.go_to_dataprocessing_clusters_nodegrouptemplatespage() ) nodegrouptpls_pg.create( PLUGIN_NAME, PLUGIN_VERSION, nodegroup_name=self.worker_name, flavor='m1.tiny', processes=['tasktracker', 'datanode']) self.assertTrue(nodegrouptpls_pg.has_success_message()) self.assertFalse(nodegrouptpls_pg.has_error_message()) self.assertTrue(nodegrouptpls_pg.is_present(self.worker_name), "Worker template was not created.") nodegrouptpls_pg.create( PLUGIN_NAME, PLUGIN_VERSION, nodegroup_name=self.master_name, flavor='m1.tiny', proxygateway=True, floating_ip_pool=self.CONFIG.sahara.ip_pool, processes=['jobtracker', 'namenode']) self.assertTrue(nodegrouptpls_pg.has_success_message()) self.assertFalse(nodegrouptpls_pg.has_error_message()) self.assertTrue(nodegrouptpls_pg.is_present(self.master_name), "Worker template was not created.") clustertpls_pg = ( self.home_pg.go_to_dataprocessing_clusters_clustertemplatespage()) clustertpls_pg.create( PLUGIN_NAME, PLUGIN_VERSION, name=self.cluster_template_name, node_group_templates=[self.worker_name]) self.assertTrue(clustertpls_pg.has_success_message()) self.assertFalse(clustertpls_pg.has_error_message()) self.assertTrue(clustertpls_pg.is_present(self.cluster_template_name), "Cluster template was not created.") def test_update(self): clustertpls_pg = ( self.home_pg.go_to_dataprocessing_clusters_clustertemplatespage()) kwargs = { 'cluster_template_name': self.new_cluster_template_name, 'description': '{} description'.format( self.new_cluster_template_name), 'use_autoconfig': False, 'anti_affinity': ['namenode', 'datanode', 'tasktracker', 'jobtracker'], 'node_group_templates': [self.master_name], 'CONF:general:Timeout for disk preparing': 152, 'CONF:general:Enable NTP service': False, 'CONF:general:URL of NTP server': 'http://ntp.org/', 'CONF:general:Heat Wait Condition timeout': 123, 'CONF:general:Enable XFS': False, } clustertpls_pg.update(name=self.cluster_template_name, **kwargs) self.assertTrue(clustertpls_pg.has_success_message()) self.assertFalse(clustertpls_pg.has_error_message()) self.assertTrue( clustertpls_pg.is_present(self.new_cluster_template_name), "Cluster template was not updated.") details = clustertpls_pg.get_details(self.new_cluster_template_name) expected = { 'Name': self.new_cluster_template_name, 'Description': kwargs['description'], 'Plugin': 'fake', 'Version': '0.1', 'Use auto-configuration': 'False', 'Anti-affinity enabled for': set(['namenode', 'datanode', 'tasktracker', 'jobtracker']), 'Enable NTP service': 'False', 'Enable XFS': 'False', 'Heat Wait Condition timeout': '123', 'Timeout for disk preparing': '152', 'URL of NTP server': 'http://ntp.org/', 'node_groups': { self.master_name: '1' } } details = {k: v for k, v in details.items() if k in expected} self.assertEqual(expected, details) def test_update_nodegroup(self): nodegrouptpls_pg = ( self.home_pg.go_to_dataprocessing_clusters_nodegrouptemplatespage() ) kwargs = { 'nodegroup_name': self.new_worker_name, 'description': '{} description'.format(self.new_worker_name), 'flavor': 'm1.small', 'availability_zone': 'No availability zone specified', 'floating_ip_pool': 'public', 'use_autoconfig': False, 'proxygateway': True, 'processes': ['jobtracker', 'namenode'], 'security_autogroup': False, 'security_groups': ['default'] } nodegrouptpls_pg.update(group_name=self.worker_name, **kwargs) self.assertTrue(nodegrouptpls_pg.has_success_message()) self.assertFalse(nodegrouptpls_pg.has_error_message()) self.assertTrue(nodegrouptpls_pg.is_present(self.new_worker_name), "Node group template was not updated.") clustertpls_pg = ( self.home_pg.go_to_dataprocessing_clusters_clustertemplatespage()) details = clustertpls_pg.get_nodegroup_details( self.cluster_template_name, self.new_worker_name) expected = { 'Auto Security Group': 'no', 'Flavor': '2', 'Node Processes': {'namenode', 'jobtracker'}, 'Nodes Count': '1', 'Proxy Gateway': 'yes', 'Security Groups': 'default', 'Template': self.new_worker_name, 'Use auto-configuration': 'False' } details = {k: v for k, v in details.items() if k in expected} self.assertEqual(expected, details) def tearDown(self): clustertpls_pg = ( self.home_pg.go_to_dataprocessing_clusters_clustertemplatespage()) clustertpls_pg.delete_many((self.cluster_template_name, self.new_cluster_template_name)) nodegrouptpls_pg = ( self.home_pg.go_to_dataprocessing_clusters_nodegrouptemplatespage() ) nodegrouptpls_pg.delete_many((self.worker_name, self.master_name, self.new_worker_name)) super(TestUpdateClusterTemplate, self).tearDown() class TestUpdateDataSource(SaharaTestCase): def setUp(self): super(TestUpdateDataSource, self).setUp() datasource_pg = ( self.home_pg.go_to_dataprocessing_jobs_datasourcespage()) self.name = self.gen_name('input') self.new_name = '{}-new'.format(self.name) datasource_pg.create(name=self.name, source_type="HDFS", url="hdfs://user/input") def test_update(self): datasource_pg = ( self.home_pg.go_to_dataprocessing_jobs_datasourcespage()) kwargs = { 'data_source_name': self.new_name, 'data_source_type': 'Swift', 'data_source_url': 'swift://container.sahara/object', 'data_source_credential_user': 'test-user', 'data_source_credential_pass': 'test-password', 'data_source_description': '{} description'.format(self.new_name), } datasource_pg.update(self.name, **kwargs) self.assertTrue(datasource_pg.has_success_message()) self.assertFalse(datasource_pg.has_error_message()) self.assertTrue(datasource_pg.is_present(self.new_name), "Node group template was not updated.") details = datasource_pg.get_details(self.new_name) expected = { 'Description': kwargs['data_source_description'], 'Name': self.new_name, 'Type': 'swift', 'URL': 'swift://container.sahara/object' } details = {k: v for k, v in details.items() if k in expected} self.assertEqual(expected, details) def tearDown(self): datasource_pg = ( self.home_pg.go_to_dataprocessing_jobs_datasourcespage()) datasource_pg.delete_many([self.name, self.new_name]) super(TestUpdateDataSource, self).tearDown() class TestUpdateJobBinaries(SaharaTestCase): def setUp(self): super(TestUpdateJobBinaries, self).setUp() # create job binary job_binary_pg = ( self.home_pg.go_to_dataprocessing_jobs_jobbinariespage()) self.name = self.gen_name('function') self.new_name = '{}-new'.format(self.name) job_binary_pg.create_job_binary_from_file(self.name, __file__) def test_update(self): job_binary_pg = ( self.home_pg.go_to_dataprocessing_jobs_jobbinariespage()) kwargs = { "job_binary_name": self.new_name, "job_binary_type": "Internal database", "job_binary_internal": "*Create a script", "job_binary_script_name": "script-name", "job_binary_script": "script-text", "job_binary_description": "{} description".format(self.new_name), } job_binary_pg.update_job_binary(self.name, **kwargs) self.assertTrue(job_binary_pg.has_success_message()) self.assertFalse(job_binary_pg.has_error_message()) self.assertTrue(job_binary_pg.is_job_binary_present(self.new_name), "Job binary was not updated.") details = job_binary_pg.get_details(self.new_name) expected = { 'Description': kwargs['job_binary_description'], 'Name': self.new_name, } details = {k: v for k, v in details.items() if k in expected} self.assertEqual(expected, details) def tearDown(self): job_binary_pg = ( self.home_pg.go_to_dataprocessing_jobs_jobbinariespage()) for name in (self.name, self.new_name): try: job_binary_pg.delete_job_binary(name) except Exception: pass super(TestUpdateJobBinaries, self).tearDown() ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/tests/test_sahara_image_registry.py0000664000175000017500000000501400000000000034103 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from openstack_dashboard.test.integration_tests import helpers from openstack_dashboard.test.integration_tests.regions import messages from sahara_dashboard.test.integration_tests.helpers import SaharaTestCase IMAGE_NAME = helpers.gen_random_resource_name("image") class TestSaharaImageRegistry(SaharaTestCase): def setUp(self): super(TestSaharaImageRegistry, self).setUp() image_pg = self.home_pg.go_to_project_compute_imagespage() image_pg.create_image( IMAGE_NAME, image_file=self.CONFIG.sahara.fake_image_location) image_pg.find_message_and_dismiss(messages.SUCCESS) image_pg.wait_until_image_active(IMAGE_NAME) def test_image_register_unregister(self): """Test the image registration in Sahara.""" image_reg_pg = \ self.home_pg.go_to_dataprocessing_clusters_imageregistrypage() image_reg_pg.register_image(IMAGE_NAME, self.CONFIG.scenario.ssh_user, "Test description") image_reg_pg.wait_until_image_registered(IMAGE_NAME) self.assertTrue(image_reg_pg.is_image_registered(IMAGE_NAME), "Image was not registered.") self.assertTrue( image_reg_pg.find_message_and_dismiss(messages.SUCCESS)) self.assertFalse( image_reg_pg.find_message_and_dismiss(messages.ERROR), "Error message occurred during image creation.") image_reg_pg.unregister_image(IMAGE_NAME) self.assertTrue( image_reg_pg.find_message_and_dismiss(messages.SUCCESS)) self.assertFalse( image_reg_pg.find_message_and_dismiss(messages.ERROR)) self.assertFalse(image_reg_pg.is_image_registered(IMAGE_NAME), "Image was not unregistered.") def tearDown(self): image_pg = self.home_pg.go_to_project_compute_imagespage() image_pg.delete_image(IMAGE_NAME) super(TestSaharaImageRegistry, self).tearDown() ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/integration_tests/tests/test_sahara_job_binaries.py0000664000175000017500000000527300000000000033526 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from openstack_dashboard.test.integration_tests import helpers from openstack_dashboard.test.integration_tests.regions import messages # Size of binary name is limited to 50 characters BINARY_NAME = helpers.gen_random_resource_name(resource='jobbinary', timestamp=False)[0:50] SCRIPT_NAME = helpers.gen_random_resource_name(resource='scriptname', timestamp=False) class TestSaharaJobBinary(helpers.TestCase): def _sahara_create_delete_job_binary(self, job_name): # create job binary job_binary_pg = ( self.home_pg.go_to_dataprocessing_jobs_jobbinariespage()) self.assertFalse(job_binary_pg.is_job_binary_present(job_name), "Job binary was present in the binaries table" " before its creation.") job_binary_pg.create_job_binary(job_name, SCRIPT_NAME) # verify that job is created without problems self.assertTrue( job_binary_pg.find_message_and_dismiss(messages.SUCCESS)) self.assertFalse( job_binary_pg.find_message_and_dismiss(messages.ERROR), "Error message occurred during binary job creation.") self.assertTrue(job_binary_pg.is_job_binary_present(job_name), "Job binary is not in the binaries job table after" " its creation.") # delete binary job job_binary_pg.delete_job_binary(job_name) # verify that job was successfully deleted self.assertTrue( job_binary_pg.find_message_and_dismiss(messages.SUCCESS)) self.assertFalse( job_binary_pg.find_message_and_dismiss(messages.ERROR), "Error message occurred during binary job deletion.") self.assertFalse(job_binary_pg.is_job_binary_present(job_name), "Job binary was not removed from binaries job table.") def test_sahara_create_delete_job_binary_internaldb(self): """Test the creation of a Job Binary in the Internal DB.""" self._sahara_create_delete_job_binary(BINARY_NAME) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/settings.py0000664000175000017500000000163400000000000023450 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from horizon.test.settings import * # noqa from openstack_dashboard.test.settings import * # noqa INSTALLED_APPS = list(INSTALLED_APPS) # noqa: F405 INSTALLED_APPS.append('sahara_dashboard.content.data_processing.clusters') INSTALLED_APPS.append('sahara_dashboard.content.data_processing.jobs') INSTALLED_APPS.append('sahara_dashboard.content.data_processing.data_plugins') ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.6000733 sahara-dashboard-16.0.0/sahara_dashboard/test/test_data/0000775000175000017500000000000000000000000023202 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/test_data/__init__.py0000664000175000017500000000000000000000000025301 0ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/test_data/keystone_data.py0000664000175000017500000000202200000000000026402 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. def data(TEST): # Add sahara to the keystone data TEST.service_catalog.append( {"type": "data-processing", "name": "Sahara", "endpoints_links": [], "endpoints": [ {"region": "RegionOne", "adminURL": "http://admin.sahara.example.com:8386/v1.1", "publicURL": "http://public.sahara.example.com:8386/v1.1", "internalURL": "http://int.sahara.example.com:8386/v1.1"}]} ) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/test_data/sahara_data.py0000664000175000017500000006041700000000000026014 0ustar00zuulzuul00000000000000# Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import copy from saharaclient.api import cluster_templates from saharaclient.api import clusters from saharaclient.api import data_sources from saharaclient.api import job_binaries from saharaclient.api import job_executions from saharaclient.api import job_types from saharaclient.api import jobs from saharaclient.api import node_group_templates from saharaclient.api import plugins from openstack_dashboard.test.test_data import utils def data(TEST): TEST.plugins = utils.TestDataContainer() TEST.plugins_configs = utils.TestDataContainer() TEST.nodegroup_templates = utils.TestDataContainer() TEST.cluster_templates = utils.TestDataContainer() TEST.clusters = utils.TestDataContainer() TEST.data_sources = utils.TestDataContainer() TEST.job_binaries = utils.TestDataContainer() TEST.jobs = utils.TestDataContainer() TEST.job_executions = utils.TestDataContainer() TEST.registered_images = copy.copy(TEST.images) TEST.job_types = utils.TestDataContainer() plugin1_dict = { "description": "vanilla plugin", "name": "vanilla", "title": "Vanilla Apache Hadoop", "versions": ["2.3.0", "1.2.1"], 'version_labels': { '2.3.0': { 'enabled': { 'status': True } }, '1.2.1': { 'enabled': { 'status': True } } }, 'plugin_labels': { 'enabled': { 'status': True } } } plugin1 = plugins.Plugin(plugins.PluginManager(None), plugin1_dict) TEST.plugins.add(plugin1) plugin_config1_dict = { "node_processes": { "HDFS": [ "namenode", "datanode", "secondarynamenode" ], "MapReduce": [ "tasktracker", "jobtracker" ] }, "description": "This plugin provides an ability to launch vanilla " "Apache Hadoop cluster without any management " "consoles.", "versions": [ "1.2.1" ], "required_image_tags": [ "vanilla", "1.2.1" ], "configs": [ { "default_value": "/tmp/hadoop-${user.name}", "name": "hadoop.tmp.dir", "priority": 2, "config_type": "string", "applicable_target": "HDFS", "is_optional": True, "scope": "node", "description": "A base for other temporary directories." }, { "default_value": True, "name": "hadoop.native.lib", "priority": 2, "config_type": "bool", "applicable_target": "HDFS", "is_optional": True, "scope": "node", "description": "Should native hadoop libraries, if present, " "be used." }, ], "title": "Vanilla Apache Hadoop", "name": "vanilla", 'version_labels': { '1.2.1': { 'enabled': { 'status': True } } }, 'plugin_labels': { 'enabled': { 'status': True } } } TEST.plugins_configs.add(plugins.Plugin(plugins.PluginManager(None), plugin_config1_dict)) # Nodegroup_Templates. ngt1_dict = { "created_at": "2014-06-04T14:01:03", "description": "", "flavor_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "availability_zone": None, "floating_ip_pool": None, "auto_security_group": True, "hadoop_version": "1.2.1", "id": "c166dfcc-9cc7-4b48-adc9-f0946169bb36", "image_id": None, "name": "sample-template", "node_configs": {}, "node_processes": [ "namenode", "jobtracker", "secondarynamenode", "hiveserver", "oozie" ], "plugin_name": "vanilla", "tenant_id": "429ad8447c2d47bc8e0382d244e1d1df", "updated_at": None, "volume_mount_prefix": "/volumes/disk", "volumes_per_node": 0, "volumes_size": 0, "volume_type": None, "volume_local_to_instance": False, "security_groups": [], "volumes_availability_zone": None, "is_proxy_gateway": False, "use_autoconfig": True, "shares": [], 'is_public': False, 'is_protected': False, } ngt1 = node_group_templates.NodeGroupTemplate( node_group_templates.NodeGroupTemplateManager(None), ngt1_dict) TEST.nodegroup_templates.add(ngt1) # Cluster_templates. ct1_dict = { "anti_affinity": [], "cluster_configs": {}, "created_at": "2014-06-04T14:01:06", "default_image_id": None, "description": "Sample description", "hadoop_version": "1.2.1", "id": "a2c3743f-31a2-4919-8d02-792138a87a98", "name": "sample-cluster-template", "neutron_management_network": None, "use_autoconfig": True, 'is_public': False, 'is_protected': False, "node_groups": [ { "count": 1, "created_at": "2014-06-04T14:01:06", "flavor_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "floating_ip_pool": None, "image_id": None, "name": "master", "node_configs": {}, "node_group_template_id": "c166dfcc-9cc7-4b48-adc9", "node_processes": [ "namenode", "jobtracker", "secondarynamenode", "hiveserver", "oozie" ], "updated_at": None, "volume_mount_prefix": "/volumes/disk", "volumes_per_node": 0, "volumes_size": 0, "volume_type": None, "volume_local_to_instance": False, "volumes_availability_zone": None, "use_autoconfig": True, "is_proxy_gateway": False, 'is_public': False, 'is_protected': False, }, { "count": 2, "created_at": "2014-06-04T14:01:06", "flavor_id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "floating_ip_pool": None, "image_id": None, "name": "workers", "node_configs": {}, "node_group_template_id": "4eb5504c-94c9-4049-a440", "node_processes": [ "datanode", "tasktracker" ], "updated_at": None, "volume_mount_prefix": "/volumes/disk", "volumes_per_node": 0, "volumes_size": 0, "volume_type": None, "volume_local_to_instance": False, "volumes_availability_zone": None, "use_autoconfig": True, "is_proxy_gateway": False, 'is_public': False, 'is_protected': False, } ], "shares": [], "plugin_name": "vanilla", "tenant_id": "429ad8447c2d47bc8e0382d244e1d1df", "updated_at": None, "domain_name": None } ct1 = cluster_templates.ClusterTemplate( cluster_templates.ClusterTemplateManager(None), ct1_dict) TEST.cluster_templates.add(ct1) # Clusters. cluster1_dict = { "anti_affinity": [], "cluster_configs": {}, "cluster_template_id": "a2c3743f-31a2-4919-8d02-792138a87a98", "created_at": "2014-06-04T20:02:14", "default_image_id": "9eb4643c-dca8-4ea7-92d2-b773f88a8dc6", "description": "", "hadoop_version": "1.2.1", "id": "ec9a0d28-5cfb-4028-a0b5-40afe23f1533", "info": {}, "is_transient": False, "management_public_key": "fakekey", "name": "cercluster", "neutron_management_network": None, "use_autoconfig": True, "is_public": False, "is_protected": False, "node_groups": [ { "count": 1, "created_at": "2014-06-04T20:02:14", "flavor_id": "0", "floating_ip_pool": None, "image_id": None, "instances": [ { "created_at": "2014-06-04T20:02:14", "id": "c3b8004b-7063-4b99-a082-820cdc6e961c", "instance_id": "a45f5495-4a10-4f17-8fae", "instance_name": "cercluster-master-001", "internal_ip": None, "management_ip": None, "updated_at": None, "volumes": [] } ], "name": "master", "node_configs": {}, "node_group_template_id": "c166dfcc-9cc7-4b48-adc9", "node_processes": [ "namenode", "jobtracker", "secondarynamenode", "hiveserver", "oozie" ], "updated_at": "2014-06-04T20:02:14", "volume_mount_prefix": "/volumes/disk", "volumes_per_node": 0, "volumes_size": 0, "volume_type": None, "volume_local_to_instance": False, "security_groups": [], "volumes_availability_zone": None, "id": "ng1", "use_autoconfig": True, "is_proxy_gateway": False }, { "count": 2, "created_at": "2014-06-04T20:02:14", "flavor_id": "0", "floating_ip_pool": None, "image_id": None, "instances": [ { "created_at": "2014-06-04T20:02:15", "id": "6a8ae0b1-bb28-4de2-bfbb-bdd3fd2d72b2", "instance_id": "38bf8168-fb30-483f-8d52", "instance_name": "cercluster-workers-001", "internal_ip": None, "management_ip": None, "updated_at": None, "volumes": [] }, { "created_at": "2014-06-04T20:02:15", "id": "17b98ed3-a776-467a-90cf-9f46a841790b", "instance_id": "85606938-8e53-46a5-a50b", "instance_name": "cercluster-workers-002", "internal_ip": None, "management_ip": None, "updated_at": None, "volumes": [] } ], "name": "workers", "node_configs": {}, "node_group_template_id": "4eb5504c-94c9-4049-a440", "node_processes": [ "datanode", "tasktracker" ], "updated_at": "2014-06-04T20:02:15", "volume_mount_prefix": "/volumes/disk", "volumes_per_node": 0, "volumes_size": 0, "volume_type": None, "volume_local_to_instance": False, "security_groups": ["b7857890-09bf-4ee0-a0d5-322d7a6978bf"], "volumes_availability_zone": None, "id": "ng2", "use_autoconfig": True, "is_proxy_gateway": False } ], "plugin_name": "vanilla", "status": "Active", "status_description": "", "tenant_id": "429ad8447c2d47bc8e0382d244e1d1df", "trust_id": None, "updated_at": "2014-06-04T20:02:15", "user_keypair_id": "stackboxkp" } cluster1_dict.update({ 'verification': { 'status': 'CHECKING', 'checks': [ { 'status': 'CHECKING', 'name': "Stupid check", 'description': "Stupid description", "created_at": "2015-03-27T15:51:54", "updated_at": "2015-03-27T15:59:34", }, { 'status': 'RED', 'name': "Stupid check", 'description': "Houston, we have a problem", "created_at": "2015-03-27T15:51:54", "updated_at": "2015-03-27T15:59:34", }, ] } }) cluster1 = clusters.Cluster( clusters.ClusterManager(None), cluster1_dict) TEST.clusters.add(cluster1) cluster2_dict = copy.deepcopy(cluster1_dict) cluster2_dict.update({ "id": "cl2", "name": "cl2_name", 'verification': { 'status': 'RED', 'checks': [ { 'status': 'GREEN', 'name': "Stupid check", 'description': "Stupid description", "created_at": "2015-03-27T15:51:54", "updated_at": "2015-03-27T15:59:34", }, { 'status': 'RED', 'name': "Stupid check", 'description': "Houston, we have a problem", "created_at": "2015-03-27T15:51:54", "updated_at": "2015-03-27T15:59:34", }, ] }, "provision_progress": [ { "created_at": "2015-03-27T15:51:54", "updated_at": "2015-03-27T15:59:34", "step_name": "first_step", "step_type": "some_type", "successful": True, "events": [], "total": 3 }, { "created_at": "2015-03-27T16:01:54", "updated_at": "2015-03-27T16:10:22", "step_name": "second_step", "step_type": "some_other_type", "successful": None, "events": [ { "id": "evt1", "created_at": "2015-03-27T16:01:22", "node_group_id": "ng1", "instance_name": "cercluster-master-001", "successful": True, "event_info": None }, { "id": "evt2", "created_at": "2015-03-27T16:04:51", "node_group_id": "ng2", "instance_name": "cercluster-workers-001", "successful": True, "event_info": None } ], "total": 3 } ] }) cluster2 = clusters.Cluster( clusters.ClusterManager(None), cluster2_dict) TEST.clusters.add(cluster2) # Data Sources. data_source1_dict = { "created_at": "2014-06-04T14:01:10", "description": "sample output", "id": "426fb01c-5c7e-472d-bba2-b1f0fe7e0ede", "name": "sampleOutput", "tenant_id": "429ad8447c2d47bc8e0382d244e1d1df", "type": "swift", "updated_at": None, "url": "swift://example.sahara/output", 'is_public': False, 'is_protected': False } data_source2_dict = { "created_at": "2014-06-05T15:01:12", "description": "second sample output", "id": "ab3413-adfb-bba2-123456785675", "name": "sampleOutput2", "tenant_id": "429ad8447c2d47bc8e0382d244e1d1df", "type": "hdfs", "updated_at": None, "url": "hdfs://example.sahara/output", 'is_public': False, 'is_protected': False } data_source1 = data_sources.DataSources( data_sources.DataSourceManager(None), data_source1_dict) data_source2 = data_sources.DataSources( data_sources.DataSourceManager(None), data_source2_dict) TEST.data_sources.add(data_source1) TEST.data_sources.add(data_source2) # Job Binaries. job_binary1_dict = { "created_at": "2014-06-05T18:15:15", "description": "", "id": "3f3a07ac-7d6f-49e8-8669-40b25ee891b7", "name": "example.pig", "tenant_id": "429ad8447c2d47bc8e0382d244e1d1df", "updated_at": None, "url": "internal-db://80121dea-f8bd-4ad3-bcc7-096f4bfc722d", 'is_public': False, 'is_protected': False } job_binary2_dict = { "created_at": "2014-10-10T13:12:15", "description": "Test for spaces in name", "id": "abcdef56-1234-abcd-abcd-defabcdaedcb", "name": "example with spaces.pig", "tenant_id": "429ad8447c2d47bc8e0382d244e1d1df", "updated_at": None, "url": "internal-db://abcdef56-1234-abcd-abcd-defabcdaedcb", 'is_public': False, 'is_protected': False } job_binary3_dict = { "created_at": "2015-10-10T13:12:15", "description": "Test Manila", "id": "abcdef56-1234-abcd-1345-defabcdaedcb", "name": "manilashared", "tenant_id": "429ad8447c2d47bc8e0382d244e1d1df", "updated_at": None, "url": "manila://tuvwxy56-1234-abcd-abcd-defabcdaedcb/testfile.bin" } job_binary1 = job_binaries.JobBinaries( job_binaries.JobBinariesManager(None), job_binary1_dict) job_binary2 = job_binaries.JobBinaries( job_binaries.JobBinariesManager(None), job_binary2_dict) job_binary3 = job_binaries.JobBinaries( job_binaries.JobBinariesManager(None), job_binary3_dict) TEST.job_binaries.add(job_binary1) TEST.job_binaries.add(job_binary2) TEST.job_binaries.add(job_binary3) # Jobs. job1_dict = { "created_at": "2014-06-05T19:23:59", "description": "", "id": "a077b851-46be-4ad7-93c3-2d83894546ef", "libs": [ { "created_at": "2014-06-05T19:23:42", "description": "", "id": "ab140807-59f8-4235-b4f2-e03daf946256", "name": "udf.jar", "tenant_id": "429ad8447c2d47bc8e0382d244e1d1df", "updated_at": None, "url": "internal-db://d186e2bb-df93-47eb-8c0e-ce21e7ecb78b" } ], "mains": [ { "created_at": "2014-06-05T18:15:15", "description": "", "id": "3f3a07ac-7d6f-49e8-8669-40b25ee891b7", "name": "example.pig", "tenant_id": "429ad8447c2d47bc8e0382d244e1d1df", "updated_at": None, "url": "internal-db://80121dea-f8bd-4ad3-bcc7-096f4bfc722d" } ], "interface": [], "name": "pigjob", "tenant_id": "429ad8447c2d47bc8e0382d244e1d1df", "type": "Pig", "updated_at": None, "job_config": {"configs": {}} } job1 = jobs.Job(jobs.JobsManager(None), job1_dict) TEST.jobs.add(job1) # Job Executions. jobex1_dict = { "cluster_id": "ec9a0d28-5cfb-4028-a0b5-40afe23f1533", "created_at": "2014-06-05T20:03:06", "end_time": None, "id": "4b6c1cbf-c713-49d3-8025-808a87c514a6", "info": { "acl": None, "actions": [ { "consoleUrl": "-", "cred": "None", "data": None, "endTime": "Thu,05 Jun 2014 20:03:32 GMT", "errorCode": None, "errorMessage": None, "externalChildIDs": None, "externalId": "-", "externalStatus": "OK", "id": "0000000-140604200538581-oozie-hado-W@:start:", "name": ":start:", "retries": 0, "startTime": "Thu,05 Jun 2014 20:03:32 GMT", "stats": None, "status": "OK", "toString": "Action name[:start:] status[OK]", "trackerUri": "-", "transition": "job-node", "type": ":START:" }, { "consoleUrl": "fake://console.url", "cred": "None", "data": None, "endTime": None, "errorCode": None, "errorMessage": None, "externalChildIDs": None, "externalId": "job_201406042004_0001", "externalStatus": "RUNNING", "id": "0000000-140604200538581-oozie-hado-W@job-node", "name": "job-node", "retries": 0, "startTime": "Thu,05 Jun 2014 20:03:33 GMT", "stats": None, "status": "RUNNING", "toString": "Action name[job-node] status[RUNNING]", "trackerUri": "cercluster-master-001:8021", "transition": None, "type": "pig" } ], "appName": "job-wf", "appPath": "hdfs://fakepath/workflow.xml", "conf": "fakeconfig", "consoleUrl": "fake://consoleURL", "createdTime": "Thu,05 Jun 2014 20:03:32 GMT", "endTime": None, "externalId": None, "group": None, "id": "0000000-140604200538581-oozie-hado-W", "lastModTime": "Thu,05 Jun 2014 20:03:35 GMT", "parentId": None, "run": 0, "startTime": "Thu,05 Jun 2014 20:03:32 GMT", "status": "RUNNING", "toString": "Workflow ...status[RUNNING]", "user": "hadoop" }, "input_id": "85884883-3083-49eb-b442-71dd3734d02c", "job_configs": { "args": [], "configs": {}, "params": {} }, "interface": {}, "job_id": "a077b851-46be-4ad7-93c3-2d83894546ef", "oozie_job_id": "0000000-140604200538581-oozie-hado-W", "output_id": "426fb01c-5c7e-472d-bba2-b1f0fe7e0ede", "progress": None, "return_code": None, "start_time": "2014-06-05T16:03:32", "tenant_id": "429ad8447c2d47bc8e0382d244e1d1df", "updated_at": "2014-06-05T20:03:46", "cluster_name_set": True, "job_name_set": True, "cluster_name": "cluster-1", "job_name": "job-1", "data_source_urls": { "85884883-3083-49eb-b442-71dd3734d02c": "swift://a.sahara/input", "426fb01c-5c7e-472d-bba2-b1f0fe7e0ede": "hdfs://a.sahara/output" } } jobex1 = job_executions.JobExecution( job_executions.JobExecutionsManager(None), jobex1_dict) TEST.job_executions.add(jobex1) augmented_image = TEST.registered_images.first() augmented_image.tags = {} augmented_image.username = 'myusername' augmented_image.description = 'mydescription' job_type1_dict = { "name": "Pig", "plugins": [ { "description": "Fake description", "versions": { "2.6.0": { }, "1.2.1": { } }, "name": "vanilla", "title": "Vanilla Apache Hadoop" }, ] } job_types1 = job_types.JobType( job_types.JobTypesManager(None), job_type1_dict) TEST.job_types.add(job_types1) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/test_data/utils.py0000664000175000017500000000333100000000000024714 0ustar00zuulzuul00000000000000# # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from openstack_dashboard.test.test_data import utils def load_test_data(load_onto=None): from openstack_dashboard.test.test_data import cinder_data from openstack_dashboard.test.test_data import exceptions from openstack_dashboard.test.test_data import glance_data from openstack_dashboard.test.test_data import keystone_data from openstack_dashboard.test.test_data import neutron_data from openstack_dashboard.test.test_data import nova_data from openstack_dashboard.test.test_data import swift_data from sahara_dashboard.test.test_data import keystone_data \ as sahara_keystone_data from sahara_dashboard.test.test_data import sahara_data # The order of these loaders matters, some depend on others. loaders = ( exceptions.data, keystone_data.data, glance_data.data, nova_data.data, cinder_data.data, neutron_data.data, swift_data.data, sahara_data.data, sahara_keystone_data.data, ) if load_onto: for data_func in loaders: data_func(load_onto) return load_onto else: return utils.TestData(*loaders) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/test/urls.py0000664000175000017500000000131100000000000022565 0ustar00zuulzuul00000000000000# # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. from django.conf import urls import openstack_dashboard.urls urlpatterns = [ urls.url(r'', urls.include(openstack_dashboard.urls)) ] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/utils.py0000664000175000017500000000527000000000000021771 0ustar00zuulzuul00000000000000# Copyright (c) 2016 Mirantis Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import base64 import copy from urllib import parse def serialize(obj): """Serialize the given object :param obj: string representation of the object :return: encoded object (its type is unicode string) """ result = base64.urlsafe_b64encode(obj) # this workaround is needed because in case of python 3 the # urlsafe_b64encode method returns string of 'bytes' class. result = result.decode() return result def deserialize(obj): """Deserialize the given object :param obj: string representation of the encoded object :return: decoded object (its type is unicode string) """ result = base64.urlsafe_b64decode(obj) # this workaround is needed because in case of python 3 the # urlsafe_b64decode method returns string of 'bytes' class result = result.decode() return result def delete_pagination_params_from_request(request, save_limit=None): """Delete marker and limit parameters from GET requests :param request: instance of GET request :param save_limit: if True, 'limit' will not be deleted :return: instance of GET request without marker or limit """ request = copy.copy(request) request.GET = request.GET.copy() params = ['marker'] if not save_limit: params.append('limit') for param in ['marker', 'limit']: if param in request.GET: del(request.GET[param]) query_string = request.META.get('QUERY_STRING', '') query_dict = parse.parse_qs(query_string) if param in query_dict: del(query_dict[param]) query_string = parse.urlencode(query_dict, doseq=True) request.META['QUERY_STRING'] = query_string return request def smart_sort_helper(version): """Allows intelligent sorting of plugin versions, for example when minor version of a plugin is 11, sort numerically so that 11 > 10, instead of alphabetically so that 2 > 11 """ def _safe_cast_to_int(obj): try: return int(obj) except ValueError: return obj return [_safe_cast_to_int(part) for part in version.split('.')] ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/sahara_dashboard/version.py0000664000175000017500000000122700000000000022314 0ustar00zuulzuul00000000000000# Copyright (c) 2016 Mirantis Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. from pbr import version version_info = version.VersionInfo('sahara_dashboard') ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5520713 sahara-dashboard-16.0.0/sahara_dashboard.egg-info/0000775000175000017500000000000000000000000021745 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641572.0 sahara-dashboard-16.0.0/sahara_dashboard.egg-info/PKG-INFO0000664000175000017500000000574500000000000023055 0ustar00zuulzuul00000000000000Metadata-Version: 1.2 Name: sahara-dashboard Version: 16.0.0 Summary: Sahara Management Dashboard Home-page: https://docs.openstack.org/sahara/latest/ Author: OpenStack Author-email: openstack-discuss@lists.openstack.org License: UNKNOWN Description: ======================== Team and repository tags ======================== .. image:: https://governance.openstack.org/tc/badges/sahara-dashboard.svg :target: https://governance.openstack.org/tc/reference/tags/index.html .. Change things from this point on OpenStack Dashboard plugin for Sahara project ============================================= How to use with Horizon on server: ---------------------------------- Use pip to install the package on the server running Horizon. Then either copy or link the files in sahara_dashboard/enabled to openstack_dashboard/local/enabled. This step will cause the Horizon service to pick up the Sahara plugin when it starts. How to use with devstack: ------------------------- Add the following to your devstack ``local.conf`` file:: enable_plugin sahara-dashboard https://opendev.org/openstack/sahara-dashboard To run unit tests: ------------------ ./run_tests.sh NOTE: ===== As of the Mitaka release, the dashboard for sahara is now maintained outside of the horizon codebase, in the repository. Links: ------ Sahara project: https://opendev.org/openstack/sahara Storyboard project: https://storyboard.openstack.org/#!/project/936 Sahara docs site: https://docs.openstack.org/sahara/latest/ Quickstart guide: https://docs.openstack.org/sahara/latest/user/quickstart.html How to participate: https://docs.openstack.org/sahara/latest/contributor/how-to-participate.html Release notes: https://docs.openstack.org/releasenotes/sahara-dashboard/ License ------- Apache License Version 2.0 http://www.apache.org/licenses/LICENSE-2.0 Platform: UNKNOWN Classifier: Environment :: OpenStack Classifier: Intended Audience :: Information Technology Classifier: Intended Audience :: System Administrators Classifier: License :: OSI Approved :: Apache Software License Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: Implementation :: CPython Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Requires-Python: >=3.6 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641572.0 sahara-dashboard-16.0.0/sahara_dashboard.egg-info/SOURCES.txt0000664000175000017500000005350300000000000023637 0ustar00zuulzuul00000000000000.coveragerc .zuul.yaml AUTHORS CONTRIBUTING.rst ChangeLog HACKING.rst LICENSE MANIFEST.in README.rst babel-django.cfg babel-djangojs.cfg bindep.txt lower-constraints.txt manage.py requirements.txt setup.cfg setup.py test-requirements.txt tox.ini devstack/plugin.sh devstack/settings doc/requirements.txt playbooks/sahara-dashboard-integration/pre.yaml playbooks/sahara-dashboard-integration/run.yaml releasenotes/notes/.placeholder releasenotes/notes/apiv2-dashboard-dd3f97bc15ea609e.yaml releasenotes/notes/cluster-details-fix-4c53edfa60500d8a.yaml releasenotes/notes/designate-integration-0c11bb8cc115cf60.yaml releasenotes/notes/django_data_upload_max_number-3fe39c838c275587.yaml releasenotes/notes/drop-py-2-7-0812be5ce1752d7c.yaml releasenotes/notes/increase-max-fields-91b921991f1e8978.yaml releasenotes/notes/more-apiv2-features-7e02b39be1b875fd.yaml releasenotes/notes/rename-SAHARA_AUTO_IP_ALLOCATION_ENABLED-config-parameter.yaml releasenotes/notes/start-using-reno-c29d489e7e7dafc9.yaml releasenotes/source/conf.py releasenotes/source/index.rst releasenotes/source/mitaka.rst releasenotes/source/newton.rst releasenotes/source/ocata.rst releasenotes/source/pike.rst releasenotes/source/queens.rst releasenotes/source/rocky.rst releasenotes/source/stein.rst releasenotes/source/train.rst releasenotes/source/unreleased.rst releasenotes/source/ussuri.rst releasenotes/source/victoria.rst releasenotes/source/wallaby.rst releasenotes/source/xena.rst releasenotes/source/_static/.placeholder releasenotes/source/_templates/.placeholder releasenotes/source/locale/de/LC_MESSAGES/releasenotes.po releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po releasenotes/source/locale/id/LC_MESSAGES/releasenotes.po releasenotes/source/locale/ja/LC_MESSAGES/releasenotes.po releasenotes/source/locale/ko_KR/LC_MESSAGES/releasenotes.po releasenotes/source/locale/zh_CN/LC_MESSAGES/releasenotes.po roles/post-devstack-sahara-ui-integration/defaults/main.yaml roles/post-devstack-sahara-ui-integration/files/fake_config.json roles/post-devstack-sahara-ui-integration/tasks/main.yaml roles/setup-sahara-ui-integration/defaults/main.yaml roles/setup-sahara-ui-integration/files/legacy_panels.conf roles/setup-sahara-ui-integration/tasks/main.yaml sahara_dashboard/__init__.py sahara_dashboard/exceptions.py sahara_dashboard/utils.py sahara_dashboard/version.py sahara_dashboard.egg-info/PKG-INFO sahara_dashboard.egg-info/SOURCES.txt sahara_dashboard.egg-info/dependency_links.txt sahara_dashboard.egg-info/not-zip-safe sahara_dashboard.egg-info/pbr.json sahara_dashboard.egg-info/requires.txt sahara_dashboard.egg-info/top_level.txt sahara_dashboard/api/__init__.py sahara_dashboard/api/designate.py sahara_dashboard/api/manila.py sahara_dashboard/api/sahara.py sahara_dashboard/content/__init__.py sahara_dashboard/content/data_processing/__init__.py sahara_dashboard/content/data_processing/tables.py sahara_dashboard/content/data_processing/tabs.py sahara_dashboard/content/data_processing/clusters/__init__.py sahara_dashboard/content/data_processing/clusters/panel.py sahara_dashboard/content/data_processing/clusters/urls.py sahara_dashboard/content/data_processing/clusters/views.py sahara_dashboard/content/data_processing/clusters/cluster_templates/__init__.py sahara_dashboard/content/data_processing/clusters/cluster_templates/tables.py sahara_dashboard/content/data_processing/clusters/cluster_templates/tabs.py sahara_dashboard/content/data_processing/clusters/cluster_templates/tests.py sahara_dashboard/content/data_processing/clusters/cluster_templates/views.py sahara_dashboard/content/data_processing/clusters/cluster_templates/forms/__init__.py sahara_dashboard/content/data_processing/clusters/cluster_templates/forms/import_forms.py sahara_dashboard/content/data_processing/clusters/cluster_templates/workflows/__init__.py sahara_dashboard/content/data_processing/clusters/cluster_templates/workflows/copy.py sahara_dashboard/content/data_processing/clusters/cluster_templates/workflows/create.py sahara_dashboard/content/data_processing/clusters/cluster_templates/workflows/edit.py sahara_dashboard/content/data_processing/clusters/clusters/__init__.py sahara_dashboard/content/data_processing/clusters/clusters/tables.py sahara_dashboard/content/data_processing/clusters/clusters/tabs.py sahara_dashboard/content/data_processing/clusters/clusters/tests.py sahara_dashboard/content/data_processing/clusters/clusters/views.py sahara_dashboard/content/data_processing/clusters/clusters/workflows/__init__.py sahara_dashboard/content/data_processing/clusters/clusters/workflows/create.py sahara_dashboard/content/data_processing/clusters/clusters/workflows/scale.py sahara_dashboard/content/data_processing/clusters/clusters/workflows/update.py sahara_dashboard/content/data_processing/clusters/image_registry/__init__.py sahara_dashboard/content/data_processing/clusters/image_registry/forms.py sahara_dashboard/content/data_processing/clusters/image_registry/tables.py sahara_dashboard/content/data_processing/clusters/image_registry/tabs.py sahara_dashboard/content/data_processing/clusters/image_registry/tests.py sahara_dashboard/content/data_processing/clusters/image_registry/views.py sahara_dashboard/content/data_processing/clusters/nodegroup_templates/__init__.py sahara_dashboard/content/data_processing/clusters/nodegroup_templates/tables.py sahara_dashboard/content/data_processing/clusters/nodegroup_templates/tabs.py sahara_dashboard/content/data_processing/clusters/nodegroup_templates/tests.py sahara_dashboard/content/data_processing/clusters/nodegroup_templates/views.py sahara_dashboard/content/data_processing/clusters/nodegroup_templates/forms/__init__.py sahara_dashboard/content/data_processing/clusters/nodegroup_templates/forms/import_forms.py sahara_dashboard/content/data_processing/clusters/nodegroup_templates/workflows/__init__.py sahara_dashboard/content/data_processing/clusters/nodegroup_templates/workflows/copy.py sahara_dashboard/content/data_processing/clusters/nodegroup_templates/workflows/create.py sahara_dashboard/content/data_processing/clusters/nodegroup_templates/workflows/edit.py sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_cluster_template_configs_details.html sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_config_domain_names_help.html sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_configure_general_help.html sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_create_general_help.html sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_details.html sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_import.html sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_import_nodegroups.html sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_nodegroups_details.html sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/_upload_file.html sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/cluster_node_groups_template.html sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/configure.html sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/create.html sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/import.html sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/import_nodegroups.html sahara_dashboard/content/data_processing/clusters/templates/cluster_templates/upload_file.html sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/_ngt_select.html sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/_ngt_select_help.html sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/_plugin_select.html sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/_plugin_select_help.html sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/cluster_guide.html sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/ngt_select.html sahara_dashboard/content/data_processing/clusters/templates/cluster_wizard/plugin_select.html sahara_dashboard/content/data_processing/clusters/templates/clusters/_cluster_configs_details.html sahara_dashboard/content/data_processing/clusters/templates/clusters/_configure_general_help.html sahara_dashboard/content/data_processing/clusters/templates/clusters/_create_cluster.html sahara_dashboard/content/data_processing/clusters/templates/clusters/_create_general_help.html sahara_dashboard/content/data_processing/clusters/templates/clusters/_details.html sahara_dashboard/content/data_processing/clusters/templates/clusters/_event_log.html sahara_dashboard/content/data_processing/clusters/templates/clusters/_health_checks_table.html sahara_dashboard/content/data_processing/clusters/templates/clusters/_health_status.html sahara_dashboard/content/data_processing/clusters/templates/clusters/_in_progress.html sahara_dashboard/content/data_processing/clusters/templates/clusters/_instances_details.html sahara_dashboard/content/data_processing/clusters/templates/clusters/_nodegroups_details.html sahara_dashboard/content/data_processing/clusters/templates/clusters/_rich_status.html sahara_dashboard/content/data_processing/clusters/templates/clusters/configure.html sahara_dashboard/content/data_processing/clusters/templates/clusters/create.html sahara_dashboard/content/data_processing/clusters/templates/clusters/create_cluster.html sahara_dashboard/content/data_processing/clusters/templates/clusters/index.html sahara_dashboard/content/data_processing/clusters/templates/clusters/scale.html sahara_dashboard/content/data_processing/clusters/templates/clusters/update.html sahara_dashboard/content/data_processing/clusters/templates/image_registry/_edit_tags.html sahara_dashboard/content/data_processing/clusters/templates/image_registry/_help.html sahara_dashboard/content/data_processing/clusters/templates/image_registry/_list_tags.html sahara_dashboard/content/data_processing/clusters/templates/image_registry/_register_image.html sahara_dashboard/content/data_processing/clusters/templates/image_registry/_tag_form.html sahara_dashboard/content/data_processing/clusters/templates/image_registry/edit_tags.html sahara_dashboard/content/data_processing/clusters/templates/image_registry/register_image.html sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/_configure_general_help.html sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/_create_general_help.html sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/_details.html sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/_fields_help.html sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/_import.html sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/_service_confs.html sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/configure.html sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/create.html sahara_dashboard/content/data_processing/clusters/templates/nodegroup_templates/import.html sahara_dashboard/content/data_processing/clusters/wizard/__init__.py sahara_dashboard/content/data_processing/clusters/wizard/forms.py sahara_dashboard/content/data_processing/clusters/wizard/tests.py sahara_dashboard/content/data_processing/clusters/wizard/views.py sahara_dashboard/content/data_processing/data_plugins/__init__.py sahara_dashboard/content/data_processing/data_plugins/panel.py sahara_dashboard/content/data_processing/data_plugins/tables.py sahara_dashboard/content/data_processing/data_plugins/tabs.py sahara_dashboard/content/data_processing/data_plugins/tests.py sahara_dashboard/content/data_processing/data_plugins/urls.py sahara_dashboard/content/data_processing/data_plugins/views.py sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins/_details.html sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins/_label_details.html sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins/_list_versions.html sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins/plugins.html sahara_dashboard/content/data_processing/data_plugins/templates/data_plugins/update.html sahara_dashboard/content/data_processing/data_plugins/workflows/__init__.py sahara_dashboard/content/data_processing/data_plugins/workflows/update.py sahara_dashboard/content/data_processing/jobs/__init__.py sahara_dashboard/content/data_processing/jobs/panel.py sahara_dashboard/content/data_processing/jobs/urls.py sahara_dashboard/content/data_processing/jobs/views.py sahara_dashboard/content/data_processing/jobs/data_sources/__init__.py sahara_dashboard/content/data_processing/jobs/data_sources/tables.py sahara_dashboard/content/data_processing/jobs/data_sources/tabs.py sahara_dashboard/content/data_processing/jobs/data_sources/tests.py sahara_dashboard/content/data_processing/jobs/data_sources/views.py sahara_dashboard/content/data_processing/jobs/data_sources/workflows/__init__.py sahara_dashboard/content/data_processing/jobs/data_sources/workflows/create.py sahara_dashboard/content/data_processing/jobs/data_sources/workflows/edit.py sahara_dashboard/content/data_processing/jobs/job_binaries/__init__.py sahara_dashboard/content/data_processing/jobs/job_binaries/forms.py sahara_dashboard/content/data_processing/jobs/job_binaries/tables.py sahara_dashboard/content/data_processing/jobs/job_binaries/tabs.py sahara_dashboard/content/data_processing/jobs/job_binaries/tests.py sahara_dashboard/content/data_processing/jobs/job_binaries/views.py sahara_dashboard/content/data_processing/jobs/job_templates/__init__.py sahara_dashboard/content/data_processing/jobs/job_templates/tables.py sahara_dashboard/content/data_processing/jobs/job_templates/tabs.py sahara_dashboard/content/data_processing/jobs/job_templates/tests.py sahara_dashboard/content/data_processing/jobs/job_templates/views.py sahara_dashboard/content/data_processing/jobs/job_templates/workflows/__init__.py sahara_dashboard/content/data_processing/jobs/job_templates/workflows/create.py sahara_dashboard/content/data_processing/jobs/job_templates/workflows/launch.py sahara_dashboard/content/data_processing/jobs/jobs/__init__.py sahara_dashboard/content/data_processing/jobs/jobs/tables.py sahara_dashboard/content/data_processing/jobs/jobs/tabs.py sahara_dashboard/content/data_processing/jobs/jobs/tests.py sahara_dashboard/content/data_processing/jobs/jobs/views.py sahara_dashboard/content/data_processing/jobs/templates/data_sources/_create_data_source_help.html sahara_dashboard/content/data_processing/jobs/templates/data_sources/_details.html sahara_dashboard/content/data_processing/jobs/templates/data_sources/create.html sahara_dashboard/content/data_processing/jobs/templates/job_binaries/_create.html sahara_dashboard/content/data_processing/jobs/templates/job_binaries/_create_job_binary_help.html sahara_dashboard/content/data_processing/jobs/templates/job_binaries/_details.html sahara_dashboard/content/data_processing/jobs/templates/job_binaries/create.html sahara_dashboard/content/data_processing/jobs/templates/job_templates/_create_job_help.html sahara_dashboard/content/data_processing/jobs/templates/job_templates/_create_job_libs_help.html sahara_dashboard/content/data_processing/jobs/templates/job_templates/_details.html sahara_dashboard/content/data_processing/jobs/templates/job_templates/_launch_job_configure_help.html sahara_dashboard/content/data_processing/jobs/templates/job_templates/_launch_job_help.html sahara_dashboard/content/data_processing/jobs/templates/job_templates/config_template.html sahara_dashboard/content/data_processing/jobs/templates/job_templates/create.html sahara_dashboard/content/data_processing/jobs/templates/job_templates/job_interface_arguments_template.html sahara_dashboard/content/data_processing/jobs/templates/job_templates/launch.html sahara_dashboard/content/data_processing/jobs/templates/job_templates/launch_ajax.html sahara_dashboard/content/data_processing/jobs/templates/job_templates/library_template.html sahara_dashboard/content/data_processing/jobs/templates/job_wizard/_job_type_select.html sahara_dashboard/content/data_processing/jobs/templates/job_wizard/_job_type_select_help.html sahara_dashboard/content/data_processing/jobs/templates/job_wizard/job_type_select.html sahara_dashboard/content/data_processing/jobs/templates/job_wizard/jobex_guide.html sahara_dashboard/content/data_processing/jobs/templates/jobs/_details.html sahara_dashboard/content/data_processing/jobs/templates/jobs/index.html sahara_dashboard/content/data_processing/jobs/templates/jobs/job_executions.html sahara_dashboard/content/data_processing/jobs/templatetags/__init__.py sahara_dashboard/content/data_processing/jobs/wizard/__init__.py sahara_dashboard/content/data_processing/jobs/wizard/forms.py sahara_dashboard/content/data_processing/jobs/wizard/tests.py sahara_dashboard/content/data_processing/jobs/wizard/views.py sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/css/clusters.scss sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/css/jobs.scss sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/js/data_processing.event_log.js sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/js/data_processing.job_interface_arguments.js sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/js/data_processing.job_launching.js sahara_dashboard/content/data_processing/static/dashboard/project/data_processing/js/data_processing.verifications.js sahara_dashboard/content/data_processing/utils/__init__.py sahara_dashboard/content/data_processing/utils/acl.py sahara_dashboard/content/data_processing/utils/anti_affinity.py sahara_dashboard/content/data_processing/utils/helpers.py sahara_dashboard/content/data_processing/utils/neutron_support.py sahara_dashboard/content/data_processing/utils/workflow_helpers.py sahara_dashboard/enabled/_1810_data_processing_panel_group.py sahara_dashboard/enabled/_1820_data_processing_clusters_panel.py sahara_dashboard/enabled/_1830_data_processing_plugins_panel.py sahara_dashboard/enabled/_1840_data_processing_jobs_panel.py sahara_dashboard/enabled/__init__.py sahara_dashboard/local_settings.d/_12_toggle_data_upload_max_number_fields.py sahara_dashboard/locale/cs/LC_MESSAGES/django.po sahara_dashboard/locale/cs/LC_MESSAGES/djangojs.po sahara_dashboard/locale/de/LC_MESSAGES/django.po sahara_dashboard/locale/de/LC_MESSAGES/djangojs.po sahara_dashboard/locale/en_GB/LC_MESSAGES/django.po sahara_dashboard/locale/en_GB/LC_MESSAGES/djangojs.po sahara_dashboard/locale/fr/LC_MESSAGES/django.po sahara_dashboard/locale/fr/LC_MESSAGES/djangojs.po sahara_dashboard/locale/id/LC_MESSAGES/django.po sahara_dashboard/locale/id/LC_MESSAGES/djangojs.po sahara_dashboard/locale/ja/LC_MESSAGES/django.po sahara_dashboard/locale/ja/LC_MESSAGES/djangojs.po sahara_dashboard/locale/ko_KR/LC_MESSAGES/django.po sahara_dashboard/locale/ko_KR/LC_MESSAGES/djangojs.po sahara_dashboard/locale/pt_BR/LC_MESSAGES/django.po sahara_dashboard/locale/pt_BR/LC_MESSAGES/djangojs.po sahara_dashboard/locale/ru/LC_MESSAGES/django.po sahara_dashboard/locale/ru/LC_MESSAGES/djangojs.po sahara_dashboard/locale/tr_TR/LC_MESSAGES/django.po sahara_dashboard/locale/tr_TR/LC_MESSAGES/djangojs.po sahara_dashboard/locale/zh_Hans/LC_MESSAGES/django.po sahara_dashboard/locale/zh_Hans/LC_MESSAGES/djangojs.po sahara_dashboard/test/__init__.py sahara_dashboard/test/helpers.py sahara_dashboard/test/settings.py sahara_dashboard/test/urls.py sahara_dashboard/test/api_tests/__init__.py sahara_dashboard/test/api_tests/test_sahara.py sahara_dashboard/test/integration_tests/__init__.py sahara_dashboard/test/integration_tests/helpers.py sahara_dashboard/test/integration_tests/horizon.conf sahara_dashboard/test/integration_tests/pages/__init__.py sahara_dashboard/test/integration_tests/pages/basepage.py sahara_dashboard/test/integration_tests/pages/mixins.py sahara_dashboard/test/integration_tests/pages/project/__init__.py sahara_dashboard/test/integration_tests/pages/project/data_processing/__init__.py sahara_dashboard/test/integration_tests/pages/project/data_processing/clusters/__init__.py sahara_dashboard/test/integration_tests/pages/project/data_processing/clusters/clusterspage.py sahara_dashboard/test/integration_tests/pages/project/data_processing/clusters/clustertemplatespage.py sahara_dashboard/test/integration_tests/pages/project/data_processing/clusters/imageregistrypage.py sahara_dashboard/test/integration_tests/pages/project/data_processing/clusters/nodegrouptemplatespage.py sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/__init__.py sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/datasourcespage.py sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/jobbinariespage.py sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/jobspage.py sahara_dashboard/test/integration_tests/pages/project/data_processing/jobs/jobtemplatespage.py sahara_dashboard/test/integration_tests/regions/__init__.py sahara_dashboard/test/integration_tests/regions/forms.py sahara_dashboard/test/integration_tests/tests/__init__.py sahara_dashboard/test/integration_tests/tests/test_crud.py sahara_dashboard/test/integration_tests/tests/test_sahara_image_registry.py sahara_dashboard/test/integration_tests/tests/test_sahara_job_binaries.py sahara_dashboard/test/test_data/__init__.py sahara_dashboard/test/test_data/keystone_data.py sahara_dashboard/test/test_data/sahara_data.py sahara_dashboard/test/test_data/utils.py tools/install_venv.py tools/with_venv.sh tools/gate/integration/commons tools/gate/integration/post_test_hook.sh tools/gate/integration/pre_test_hook.sh././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641572.0 sahara-dashboard-16.0.0/sahara_dashboard.egg-info/dependency_links.txt0000664000175000017500000000000100000000000026013 0ustar00zuulzuul00000000000000 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641572.0 sahara-dashboard-16.0.0/sahara_dashboard.egg-info/not-zip-safe0000664000175000017500000000000100000000000024173 0ustar00zuulzuul00000000000000 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641572.0 sahara-dashboard-16.0.0/sahara_dashboard.egg-info/pbr.json0000664000175000017500000000005600000000000023424 0ustar00zuulzuul00000000000000{"git_version": "da7235b", "is_release": true}././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641572.0 sahara-dashboard-16.0.0/sahara_dashboard.egg-info/requires.txt0000664000175000017500000000044200000000000024345 0ustar00zuulzuul00000000000000horizon>=17.1.0 keystoneauth1>=3.8.0 oslo.log>=3.36.0 oslo.serialization!=2.19.1,>=2.18.0 pbr!=2.1.0,>=2.0.0 python-designateclient>=2.7.0 python-keystoneclient>=3.22.0 python-manilaclient>=1.16.0 python-neutronclient>=6.7.0 python-novaclient>=9.1.0 python-saharaclient>=2.2.0 pytz>=2013.6 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641572.0 sahara-dashboard-16.0.0/sahara_dashboard.egg-info/top_level.txt0000664000175000017500000000002100000000000024470 0ustar00zuulzuul00000000000000sahara_dashboard ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.6040735 sahara-dashboard-16.0.0/setup.cfg0000664000175000017500000000156100000000000016631 0ustar00zuulzuul00000000000000[metadata] name = sahara-dashboard summary = Sahara Management Dashboard description-file = README.rst author = OpenStack author-email = openstack-discuss@lists.openstack.org home-page = https://docs.openstack.org/sahara/latest/ python-requires = >=3.6 classifier = Environment :: OpenStack Intended Audience :: Information Technology Intended Audience :: System Administrators License :: OSI Approved :: Apache Software License Operating System :: POSIX :: Linux Programming Language :: Python Programming Language :: Python :: Implementation :: CPython Programming Language :: Python :: 3 :: Only Programming Language :: Python :: 3 Programming Language :: Python :: 3.6 Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 [files] packages = sahara_dashboard [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/setup.py0000664000175000017500000000127100000000000016520 0ustar00zuulzuul00000000000000# Copyright (c) 2013 Hewlett-Packard Development Company, L.P. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import setuptools setuptools.setup( setup_requires=['pbr>=2.0.0'], pbr=True) ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/test-requirements.txt0000664000175000017500000000105100000000000021243 0ustar00zuulzuul00000000000000# The order of packages is significant, because pip processes them in the order # of appearance. Changing the order has an impact on the overall integration # process, which may cause wedges in the gate later. hacking>=3.0.1,<3.1.0 # Apache-2.0 coverage!=4.4,>=4.0 # Apache-2.0 ddt>=1.0.1 # MIT netifaces>=0.10.4 # MIT pytest>=5.3.5 # MIT python-subunit>=1.0.0 # Apache-2.0/BSD selenium>=2.50.1 # Apache-2.0 testscenarios>=0.4 # Apache-2.0/BSD testtools>=2.2.0 # MIT # This also needs xvfb library installed on your OS xvfbwrapper>=0.1.3 #license: MIT ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.6000733 sahara-dashboard-16.0.0/tools/0000775000175000017500000000000000000000000016145 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.5400708 sahara-dashboard-16.0.0/tools/gate/0000775000175000017500000000000000000000000017065 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1648641572.6000733 sahara-dashboard-16.0.0/tools/gate/integration/0000775000175000017500000000000000000000000021410 5ustar00zuulzuul00000000000000././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/tools/gate/integration/commons0000664000175000017500000000043300000000000023006 0ustar00zuulzuul00000000000000#!/bin/bash set -ex export DEST=${DEST:-$BASE/new} export DEVSTACK_DIR=${DEVSTACK_DIR:-$DEST/devstack} export SAHARA_DASHBOARD_SCREENSHOTS_DIR=/opt/stack/new/sahara-dashboard/.tox/py27integration/src/horizon/openstack_dashboard/test/integration_tests/integration_tests_screenshots ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/tools/gate/integration/post_test_hook.sh0000775000175000017500000000161400000000000025015 0ustar00zuulzuul00000000000000#!/bin/bash # This script will be executed inside post_test_hook function in devstack gate set -x . commons $@ set +e cd /opt/stack/new/sahara-dashboard sudo wget -q -O firefox.deb https://sourceforge.net/projects/ubuntuzilla/files/mozilla/apt/pool/main/f/firefox-mozilla-build/firefox-mozilla-build_46.0.1-0ubuntu1_amd64.deb/download sudo apt-get -y purge firefox sudo dpkg -i firefox.deb sudo rm firefox.deb cat >> /tmp/fake_config.json < /opt/stack/new/horizon/openstack_dashboard/test/integration_tests/local-horizon.conf <> sys.stderr, message % args sys.exit(1) def run_command(cmd, redirect_output=True, check_exit_code=True, cwd=ROOT, die_message=None): """ Runs a command in an out-of-process shell, returning the output of that command. Working directory is ROOT. """ if redirect_output: stdout = subprocess.PIPE else: stdout = None proc = subprocess.Popen(cmd, cwd=cwd, stdout=stdout) output = proc.communicate()[0] if check_exit_code and proc.returncode != 0: if die_message is None: die('Command "%s" failed.\n%s', ' '.join(cmd), output) else: die(die_message) return output HAS_EASY_INSTALL = bool(run_command(['which', 'easy_install'], check_exit_code=False).strip()) HAS_VIRTUALENV = bool(run_command(['which', 'virtualenv'], check_exit_code=False).strip()) def check_dependencies(): """Make sure virtualenv is in the path.""" print 'Checking dependencies...' if not HAS_VIRTUALENV: print 'Virtual environment not found.' # Try installing it via easy_install... if HAS_EASY_INSTALL: print 'Installing virtualenv via easy_install...', run_command(['easy_install', 'virtualenv'], die_message='easy_install failed to install virtualenv' '\ndevelopment requires virtualenv, please' ' install it using your favorite tool') if not run_command(['which', 'virtualenv']): die('ERROR: virtualenv not found in path.\n\ndevelopment ' ' requires virtualenv, please install it using your' ' favorite package management tool and ensure' ' virtualenv is in your path') print 'virtualenv installation done.' else: die('easy_install not found.\n\nInstall easy_install' ' (python-setuptools in ubuntu) or virtualenv by hand,' ' then rerun.') print 'dependency check done.' def create_virtualenv(venv=VENV): """Creates the virtual environment and installs PIP only into the virtual environment """ print 'Creating venv...', run_command(['virtualenv', '-q', '--no-site-packages', VENV]) print 'done.' print 'Installing pip in virtualenv...', if not run_command([WITH_VENV, 'easy_install', 'pip']).strip(): die("Failed to install pip.") print 'done.' print 'Installing distribute in virtualenv...' pip_install('distribute>=0.6.24') print 'done.' def pip_install(*args): constraints_url = os.environ.get('UPPER_CONSTRAINTS_FILE') args = [WITH_VENV, 'pip', 'install', '-c', constraints_url, '--upgrade'] + list(args) run_command(args, redirect_output=False) def pip_install_with_horizon(*args): constraints_url = os.environ.get('UPPER_CONSTRAINTS_FILE') args = [WITH_VENV, PIP_INSTALL_WRAPPER, constraints_url] + list(args) run_command(args, redirect_output=False) def install_dependencies(venv=VENV): print "Installing dependencies..." print "(This may take several minutes, don't panic)" pip_install_with_horizon('-r', TEST_REQUIRES) pip_install_with_horizon('-r', PIP_REQUIRES) # Tell the virtual env how to "import dashboard" py = 'python%d.%d' % (sys.version_info[0], sys.version_info[1]) pthfile = os.path.join(venv, "lib", py, "site-packages", "dashboard.pth") f = open(pthfile, 'w') f.write("%s\n" % ROOT) def install_horizon(): print 'Installing horizon module in development mode...' run_command([WITH_VENV, 'python', 'setup.py', 'develop'], cwd=ROOT) def print_summary(): summary = """ Horizon development environment setup is complete. To activate the virtualenv for the extent of your current shell session you can run: $ . .venv/bin/activate """ print summary def main(): check_dependencies() create_virtualenv() install_dependencies() install_horizon() print_summary() if __name__ == '__main__': main() ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/tools/with_venv.sh0000775000175000017500000000055700000000000020524 0ustar00zuulzuul00000000000000#!/bin/bash TOOLS_PATH=${TOOLS_PATH:-$(dirname $0)} VENV_PATH=${VENV_PATH:-${TOOLS_PATH}} VENV_DIR=${VENV_NAME:-/../.venv} TOOLS=${TOOLS_PATH} VENV=${VENV:-${VENV_PATH}/${VENV_DIR}} # tools/tox_install.sh looks for VIRTUAL_ENV evrythign else looks for VENV # so for now make them the same. VIRTUAL_ENV=${VENV:-${VENV_PATH}/${VENV_DIR}} . ${VENV}/bin/activate && "$@" ././@PaxHeader0000000000000000000000000000002600000000000011453 xustar000000000000000022 mtime=1648641539.0 sahara-dashboard-16.0.0/tox.ini0000664000175000017500000000476600000000000016335 0ustar00zuulzuul00000000000000[tox] minversion = 3.1.1 envlist = py38,py39,pep8 skipsdist = True ignore_basepython_conflict = True [testenv] basepython = python3 usedevelop = True deps = -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt whitelist_externals = /bin/bash commands = {envpython} {toxinidir}/manage.py test --settings=sahara_dashboard.test.settings --exclude-tag integration {posargs} [testenv:py36] basepython = python3.6 setenv = DJANGO_SETTINGS_MODULE=sahara_dashboard.test.settings [testenv:py37] basepython = python3.7 setenv = DJANGO_SETTINGS_MODULE=sahara_dashboard.test.settings [testenv:pep8] commands = flake8 [testenv:venv] commands = {posargs} [testenv:integration] passenv = AVCONV_INSTALLED setenv = INTEGRATION_TESTS=1 SELENIUM_HEADLESS=1 HORIZON_INTEGRATION_TESTS_CONFIG_FILE={toxinidir}/sahara_dashboard/test/integration_tests/horizon.conf commands = {envpython} {toxinidir}/manage.py test --settings=sahara_dashboard.test.settings --verbosity 2 --tag integration {posargs} [testenv:releasenotes] deps = -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} -r{toxinidir}/doc/requirements.txt commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html [testenv:cover] commands = coverage erase coverage run {toxinidir}/manage.py test --settings=sahara_dashboard.test.settings --exclude-tag integration {posargs} coverage html -d cover coverage xml -o cover/coverage.xml [testenv:debug] commands = oslo_debug_helper -t sahara_dashboard/test {posargs} [flake8] show-source = True # E123, E125 skipped as they are invalid PEP-8. # H405 multi line docstring summary not separated with an empty line # W503 line break before binary operator # W504 line break after binary operator ignore = E123,E125,H405,W503,W504 enable-extensions = H203,H106 builtins = _ exclude=.venv,.git,.tox,dist,doc,*lib/python*,*egg,build,.ropeproject,tools,.tmp [testenv:bindep] # Do not install any requirements. We want this to be fast and work even if # system dependencies are missing, since it's used to tell you what system # dependencies are missing! This also means that bindep must be installed # separately, outside of the requirements files. deps = bindep commands = bindep test [testenv:lower-constraints] deps = -c{toxinidir}/lower-constraints.txt -r{toxinidir}/test-requirements.txt -r{toxinidir}/requirements.txt