├── ironic_ui ├── api │ └── __init__.py ├── test │ ├── __init__.py │ ├── tests │ │ ├── __init__.py │ │ └── test_registration.py │ ├── integration │ │ ├── __init__.py │ │ ├── pages │ │ │ ├── __init__.py │ │ │ └── admin │ │ │ │ ├── __init__.py │ │ │ │ └── system │ │ │ │ ├── __init__.py │ │ │ │ └── ironicbaremetalprovisioningpage.py │ │ ├── horizon.conf │ │ └── test_basic.py │ ├── urls.py │ └── settings.py ├── enabled │ ├── __init__.py │ └── _2200_ironic.py ├── content │ ├── ironic │ │ ├── __init__.py │ │ ├── templates │ │ │ └── ironic │ │ │ │ ├── index.html │ │ │ │ └── node_detail.html │ │ ├── views.py │ │ ├── urls.py │ │ └── panel.py │ └── __init__.py ├── __init__.py ├── locale │ ├── ko_KR │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── zh_Hans │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── id │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── de │ │ └── LC_MESSAGES │ │ │ └── django.po │ ├── en_GB │ │ └── LC_MESSAGES │ │ │ └── django.po │ └── ru │ │ └── LC_MESSAGES │ │ └── django.po └── static │ └── dashboard │ └── admin │ └── ironic │ ├── node-details │ ├── sections │ │ ├── portgroup-details.html │ │ ├── port-details.html │ │ └── overview.html │ └── node-details.html │ ├── maintenance │ ├── maintenance.html │ ├── maintenance.controller.js │ └── maintenance.service.js │ ├── auto-focus.directive.js │ ├── property-collection-editor.directive.js │ ├── empty-to-pristine.directive.js │ ├── clean-node │ ├── clean-node.html │ ├── clean-node.service.js │ └── clean-node.controller.js │ ├── modal-draggable.directive.js │ ├── edit-node │ ├── edit-node.service.js │ └── edit-node.controller.spec.js │ ├── base-portgroup │ ├── base-portgroup.html │ ├── base-portgroup.controller.spec.js │ └── base-portgroup.controller.js │ ├── enroll-node │ ├── enroll-node.service.js │ ├── enroll-node.controller.spec.js │ └── enroll-node.controller.js │ ├── form-field.directive.js │ ├── base-port │ └── base-port.html │ ├── create-port │ ├── create-port.service.js │ ├── create-port.controller.js │ └── create-port.controller.spec.js │ ├── edit-portgroup │ ├── edit-portgroup.service.js │ ├── edit-portgroup.controller.js │ └── edit-portgroup.controller.spec.js │ ├── edit-port │ └── edit-port.service.js │ ├── create-portgroup │ ├── create-portgroup.service.js │ └── create-portgroup.controller.js │ ├── form-field.html │ ├── bootdevice │ ├── bootdevice.html │ ├── bootdevice.controller.js │ ├── bootdevice.service.js │ └── bootdevice.controller.spec.js │ ├── test-data.spec.js │ ├── property-collection-editor.html │ ├── raidconfig │ ├── raidconfig.service.js │ ├── raidconfig.html │ ├── raidconfig.controller.spec.js │ ├── raidconfig.controller.js │ └── raidconfig.service.spec.js │ ├── node-error.service.js │ ├── form-field.service.spec.js │ ├── ironic.module.js │ ├── base-node │ ├── base-node.service.js │ └── base-node.spec.js │ ├── property-collection.service.js │ ├── property-collection.service.spec.js │ ├── form-field.service.js │ └── driver-property.service.spec.js ├── releasenotes ├── notes │ ├── .placeholder │ ├── bug-1671567-a95d7cb0d21470e4.yaml │ ├── remove-py38-bc44dcb4625e380f.yaml │ ├── remove-py39-5e9906a5b6156250.yaml │ ├── get-client-e30e3b05eb9901ca.yaml │ ├── bug-1648550-32e28cf2a401bb02.yaml │ ├── inject-nmi-0320453eaf1bda9b.yaml │ ├── drop-python2-0bf548c3946068af.yaml │ ├── bug-1648548-6e846a0c1e1574aa.yaml │ ├── bug-1672709-b485a7a59ea1c129.yaml │ ├── bug-1648563-e2bc262985873122.yaml │ ├── edit-portgroup-92c62b1ae0cf5e54.yaml │ ├── bug-1648557-462ebfdf39efee1f.yaml │ ├── adding-driver-interfaces-while-node-enrollment-7cb82d6753074629.yaml │ ├── wallaby-release-note-f502b2ba09932e4c.yaml │ ├── 2.1.0-release-3391dfbcf087c883.yaml │ ├── unit-test-framework-f61ad7926413bf91.yaml │ ├── add-console-support-ccffcedc845ca214.yaml │ ├── 2.0-release-3d8acae7c8de429b.yaml │ └── view-portgroups-a3efb4407536caf2.yaml └── source │ ├── unreleased.rst │ ├── zed.rst │ ├── train.rst │ ├── xena.rst │ ├── yoga.rst │ ├── 2023.2.rst │ ├── 2024.2.rst │ ├── 2025.1.rst │ ├── 2025.2.rst │ ├── ussuri.rst │ ├── 2023.1.rst │ ├── 2024.1.rst │ ├── pike.rst │ ├── rocky.rst │ ├── stein.rst │ ├── wallaby.rst │ ├── queens.rst │ ├── victoria.rst │ ├── ocata.rst │ ├── newton.rst │ ├── index.rst │ └── locale │ ├── fr │ └── LC_MESSAGES │ │ └── releasenotes.po │ └── ko_KR │ └── LC_MESSAGES │ └── releasenotes.po ├── .eslintignore ├── babel-djangojs.cfg ├── .gitreview ├── babel-django.cfg ├── .mailmap ├── pyproject.toml ├── .coveragerc ├── HACKING.rst ├── devstack ├── settings └── plugin.sh ├── MANIFEST.in ├── doc ├── source │ ├── install │ │ ├── index.rst │ │ ├── uninstallation.rst │ │ └── installation.rst │ ├── contributor │ │ ├── index.rst │ │ └── contributing.rst │ └── index.rst └── requirements.txt ├── bindep.txt ├── requirements.txt ├── test-requirements.txt ├── .eslintrc ├── CONTRIBUTING.rst ├── README.rst ├── setup.py ├── .gitignore ├── manage.py ├── setup.cfg ├── package.json ├── .zuul.yaml ├── tox.ini └── test-shim.js /ironic_ui/api/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ironic_ui/test/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ironic_ui/enabled/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ironic_ui/test/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /releasenotes/notes/.placeholder: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist -------------------------------------------------------------------------------- /ironic_ui/content/ironic/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ironic_ui/test/integration/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ironic_ui/test/integration/pages/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ironic_ui/test/integration/pages/admin/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ironic_ui/test/integration/pages/admin/system/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /babel-djangojs.cfg: -------------------------------------------------------------------------------- 1 | [javascript: **.js] 2 | [angular: **/static/**.html] 3 | -------------------------------------------------------------------------------- /.gitreview: -------------------------------------------------------------------------------- 1 | [gerrit] 2 | host=review.opendev.org 3 | port=29418 4 | project=openstack/ironic-ui.git 5 | -------------------------------------------------------------------------------- /babel-django.cfg: -------------------------------------------------------------------------------- 1 | [python: **.py] 2 | [django: **/templates/**.html] 3 | [django: **/templates/**.csv] 4 | -------------------------------------------------------------------------------- /.mailmap: -------------------------------------------------------------------------------- 1 | # Format is: 2 | # 3 | # 4 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["pbr>=6.0.0", "setuptools>=64.0.0"] 3 | build-backend = "pbr.build" 4 | -------------------------------------------------------------------------------- /.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | branch = True 3 | source = ironic_ui 4 | omit = ironic_ui/tests/* 5 | 6 | [report] 7 | ignore_errors = True 8 | -------------------------------------------------------------------------------- /releasenotes/notes/bug-1671567-a95d7cb0d21470e4.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | The Node Details/Configuration tab now shows the node's boot device. 5 | -------------------------------------------------------------------------------- /HACKING.rst: -------------------------------------------------------------------------------- 1 | ironic-ui Style Commandments 2 | ============================ 3 | 4 | Read the OpenStack Style Commandments https://docs.openstack.org/hacking/latest/ 5 | -------------------------------------------------------------------------------- /releasenotes/source/unreleased.rst: -------------------------------------------------------------------------------- 1 | ============================== 2 | Current Series Release Notes 3 | ============================== 4 | 5 | .. release-notes:: 6 | -------------------------------------------------------------------------------- /devstack/settings: -------------------------------------------------------------------------------- 1 | # settings file for ironic-ui plugin 2 | enable_service ironic-ui 3 | 4 | # set up default directories 5 | IRONIC_UI_DIR=${IRONIC_UI_DIR:=$DEST/ironic-ui} -------------------------------------------------------------------------------- /releasenotes/source/zed.rst: -------------------------------------------------------------------------------- 1 | ======================== 2 | Zed Series Release Notes 3 | ======================== 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/zed 7 | -------------------------------------------------------------------------------- /releasenotes/source/train.rst: -------------------------------------------------------------------------------- 1 | ========================== 2 | Train Series Release Notes 3 | ========================== 4 | 5 | .. release-notes:: 6 | :branch: stable/train 7 | -------------------------------------------------------------------------------- /releasenotes/source/xena.rst: -------------------------------------------------------------------------------- 1 | ========================= 2 | Xena Series Release Notes 3 | ========================= 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/xena 7 | -------------------------------------------------------------------------------- /releasenotes/source/yoga.rst: -------------------------------------------------------------------------------- 1 | ========================= 2 | Yoga Series Release Notes 3 | ========================= 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/yoga 7 | -------------------------------------------------------------------------------- /releasenotes/source/2023.2.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | 2023.2 Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: stable/2023.2 7 | -------------------------------------------------------------------------------- /releasenotes/source/2024.2.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | 2024.2 Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: stable/2024.2 7 | -------------------------------------------------------------------------------- /releasenotes/source/2025.1.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | 2025.1 Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: stable/2025.1 7 | -------------------------------------------------------------------------------- /releasenotes/source/2025.2.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | 2025.2 Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: stable/2025.2 7 | -------------------------------------------------------------------------------- /releasenotes/source/ussuri.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | Ussuri Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: stable/ussuri 7 | -------------------------------------------------------------------------------- /releasenotes/notes/remove-py38-bc44dcb4625e380f.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | Support for Python 3.8 has been removed. Now the minimum python version 5 | supported is 3.9 . 6 | -------------------------------------------------------------------------------- /releasenotes/notes/remove-py39-5e9906a5b6156250.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | Support for Python 3.9 has been removed. Now Python 3.10 is the minimum 5 | version supported. 6 | -------------------------------------------------------------------------------- /releasenotes/source/2023.1.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | 2023.1 Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/2023.1 7 | -------------------------------------------------------------------------------- /releasenotes/source/2024.1.rst: -------------------------------------------------------------------------------- 1 | =========================== 2 | 2024.1 Series Release Notes 3 | =========================== 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/2024.1 7 | -------------------------------------------------------------------------------- /releasenotes/notes/get-client-e30e3b05eb9901ca.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixed ``_construct_http_client() takes at least 1 argument`` when creating 5 | an ironic client instance. 6 | -------------------------------------------------------------------------------- /releasenotes/source/pike.rst: -------------------------------------------------------------------------------- 1 | =================================== 2 | Pike Series Release Notes 3 | =================================== 4 | 5 | .. release-notes:: 6 | :branch: stable/pike 7 | -------------------------------------------------------------------------------- /releasenotes/source/rocky.rst: -------------------------------------------------------------------------------- 1 | =================================== 2 | Rocky Series Release Notes 3 | =================================== 4 | 5 | .. release-notes:: 6 | :branch: stable/rocky 7 | -------------------------------------------------------------------------------- /releasenotes/source/stein.rst: -------------------------------------------------------------------------------- 1 | =================================== 2 | Stein Series Release Notes 3 | =================================== 4 | 5 | .. release-notes:: 6 | :branch: stable/stein 7 | -------------------------------------------------------------------------------- /releasenotes/source/wallaby.rst: -------------------------------------------------------------------------------- 1 | ============================ 2 | Wallaby Series Release Notes 3 | ============================ 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/wallaby 7 | -------------------------------------------------------------------------------- /releasenotes/source/queens.rst: -------------------------------------------------------------------------------- 1 | =================================== 2 | Queens Series Release Notes 3 | =================================== 4 | 5 | .. release-notes:: 6 | :branch: stable/queens 7 | -------------------------------------------------------------------------------- /releasenotes/source/victoria.rst: -------------------------------------------------------------------------------- 1 | ============================= 2 | Victoria Series Release Notes 3 | ============================= 4 | 5 | .. release-notes:: 6 | :branch: unmaintained/victoria 7 | -------------------------------------------------------------------------------- /releasenotes/notes/bug-1648550-32e28cf2a401bb02.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | The current cleaning step is displayed in the Provisioning Status 5 | section of the node-details/overview page 6 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include AUTHORS 2 | include ChangeLog 3 | exclude .gitignore 4 | exclude .gitreview 5 | include setup.py 6 | 7 | recursive-include ironic_ui *.js *.html *.scss 8 | 9 | global-exclude *.pyc 10 | -------------------------------------------------------------------------------- /ironic_ui/test/integration/horizon.conf: -------------------------------------------------------------------------------- 1 | [plugin] 2 | is_plugin=True 3 | plugin_page_path=ironic_ui.test.integration.pages 4 | plugin_page_structure='{"Admin": {"System": {"_": ["Ironic Bare Metal Provisioning"]}}}' 5 | 6 | -------------------------------------------------------------------------------- /doc/source/install/index.rst: -------------------------------------------------------------------------------- 1 | ============================ 2 | ironic-ui installation guide 3 | ============================ 4 | 5 | .. toctree:: 6 | :maxdepth: 1 7 | 8 | installation 9 | uninstallation 10 | -------------------------------------------------------------------------------- /bindep.txt: -------------------------------------------------------------------------------- 1 | # selenium tests 2 | firefox [selenium] 3 | libfontconfig1 [nodejs platform:dpkg] 4 | xvfb [selenium platform:dpkg] 5 | # already part of xorg-x11-server on openSUSE 6 | xorg-x11-server-Xvfb [selenium platform:redhat] 7 | 8 | -------------------------------------------------------------------------------- /releasenotes/source/ocata.rst: -------------------------------------------------------------------------------- 1 | ============================================ 2 | Ocata Series Release Notes (2.2.0 - 2.2.x) 3 | ============================================ 4 | 5 | .. release-notes:: 6 | :branch: origin/stable/ocata 7 | -------------------------------------------------------------------------------- /releasenotes/source/newton.rst: -------------------------------------------------------------------------------- 1 | ============================================= 2 | Newton Series Release Notes (2.0.0 - 2.1.x) 3 | ============================================= 4 | 5 | .. release-notes:: 6 | :branch: origin/stable/newton 7 | -------------------------------------------------------------------------------- /releasenotes/notes/inject-nmi-0320453eaf1bda9b.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds support for injecting non-maskable interrupts into a node. A new 5 | action ``Inject NMI`` has been added to the node actions dropdown menu 6 | in the ``Node Details`` page. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/drop-python2-0bf548c3946068af.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | upgrade: 3 | - | 4 | Python 2.7 support has been dropped. Last release of ironic-ui to 5 | support Python 2.7 is OpenStack Train. The minimum version of Python 6 | now supported by ironic-ui is Python 3.6. 7 | -------------------------------------------------------------------------------- /releasenotes/notes/bug-1648548-6e846a0c1e1574aa.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Support has been added for inspecting nodes. For a node that is in the 5 | ``manageable`` state, its action menu will include an ``Inspect`` button. 6 | Node action menus are located in the node-list and node-detail pages. 7 | -------------------------------------------------------------------------------- /doc/source/install/uninstallation.rst: -------------------------------------------------------------------------------- 1 | .. _unstallation: 2 | 3 | Uninstallation 4 | ============== 5 | 6 | To uninstall, use ``pip uninstall ironic-ui`` from with-in the horizon 7 | virtual environment. You will also need to remove the 8 | ``openstack_dashboard/enabled/_2200_ironic.py`` file from the horizon 9 | installation. 10 | -------------------------------------------------------------------------------- /releasenotes/notes/bug-1672709-b485a7a59ea1c129.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds the ability to view and edit the node's ``resource_class`` field on 5 | the node-details/configuration page. 6 | - | 7 | Adds support for a user to be able to edit the ``resource_class`` field 8 | when enrolling/updating a node. 9 | -------------------------------------------------------------------------------- /doc/requirements.txt: -------------------------------------------------------------------------------- 1 | sphinx>=2.0.0,!=2.1.0 # BSD 2 | openstackdocstheme>=2.2.1 # Apache-2.0 3 | reno>=3.1.0 # Apache-2.0 4 | testtools>=2.2.0 # MIT 5 | testscenarios>=0.4 # Apache-2.0/BSD 6 | 7 | # The below is rewquired to build testing module reference 8 | 9 | selenium>=2.50.1 # Apache-2.0 10 | xvfbwrapper>=0.1.3 #license: MIT 11 | -------------------------------------------------------------------------------- /releasenotes/notes/bug-1648563-e2bc262985873122.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | The node-details/configuration page has been extended to enable the 5 | user to edit ports after initial creation. 6 | - | 7 | The user is now able to specify the pxe_enabled and 8 | local-link-connection attributes as part of defining/editing ports. 9 | -------------------------------------------------------------------------------- /releasenotes/notes/edit-portgroup-92c62b1ae0cf5e54.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds support for editing portgroups from the node-details/configuration 5 | page. Each entry in the portgroups table has an associated 6 | ``Edit portgroup`` button that when clicked will launch a modal dialog 7 | that guides the user in making changes. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/bug-1648557-462ebfdf39efee1f.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | The user is now able to abort a node cleaning operation. When 5 | cleaning is aborted the node is moved from the ``CLEAN WAIT`` state 6 | to the ``CLEAN FAIL`` state. When appropriate an "Abort cleaning" 7 | action will be present in individual node action menu. 8 | -------------------------------------------------------------------------------- /releasenotes/notes/adding-driver-interfaces-while-node-enrollment-7cb82d6753074629.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds support for selecting driver interfaces for dynamic drivers 5 | while creating nodes. The support for driver interfaces is not compatible 6 | with classic drivers. This feature is supported with Pike and further 7 | versions of ironic. 8 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # Requirements lower bounds listed here are our best effort to keep them up to 2 | # date but we do not test them so no guarantee of having them all correct. If 3 | # you find any incorrect lower bounds, let us know or propose a fix. 4 | 5 | pbr!=2.1.0,>=2.0.0 # Apache-2.0 6 | python-ironicclient!=2.5.2,!=2.7.1,>=2.3.0 # Apache-2.0 7 | horizon>=17.1.0 # Apache-2.0 8 | -------------------------------------------------------------------------------- /test-requirements.txt: -------------------------------------------------------------------------------- 1 | hacking>=6.1.0,<6.2.0 # Apache-2.0 2 | 3 | coverage!=4.4,>=4.0 # Apache-2.0 4 | nodeenv>=0.9.4 # BSD 5 | python-subunit>=1.0.0 # Apache-2.0/BSD 6 | oslotest>=3.2.0 # Apache-2.0 7 | testscenarios>=0.4 # Apache-2.0/BSD 8 | testtools>=2.2.0 # MIT 9 | 10 | # integration tests requirements 11 | selenium>=2.50.1 # Apache-2.0 12 | xvfbwrapper>=0.1.3 #license: MIT 13 | -------------------------------------------------------------------------------- /releasenotes/notes/wallaby-release-note-f502b2ba09932e4c.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | fixes: 3 | - | 4 | Fixes an issue where ``ironic-ui`` could fail when starting the 5 | Baremetal Service's API client when a user's authentication provider 6 | does not immediately support returning a ``project_id``. The remote 7 | Baremetal API service will retrieve this value from the Identity 8 | service. 9 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | # Enable eslint-plugin-angular 2 | plugins: 3 | - angular 4 | 5 | extends: openstack 6 | 7 | # Set up globals 8 | globals: 9 | angular: false 10 | module: false 11 | 12 | env: 13 | browser: true 14 | jasmine: true 15 | 16 | rules: 17 | angular/no-private-call: 0 18 | angular/no-services: 19 | - 2 20 | - - $http 21 | - $resource 22 | - Restangular 23 | angular/no-service-method: 0 -------------------------------------------------------------------------------- /releasenotes/source/index.rst: -------------------------------------------------------------------------------- 1 | ======================== 2 | Ironic UI Release Notes 3 | ======================== 4 | 5 | .. toctree:: 6 | :maxdepth: 1 7 | 8 | unreleased 9 | 2025.2 10 | 2025.1 11 | 2024.2 12 | 2024.1 13 | 2023.2 14 | 2023.1 15 | zed 16 | yoga 17 | xena 18 | wallaby 19 | victoria 20 | ussuri 21 | train 22 | stein 23 | rocky 24 | queens 25 | pike 26 | ocata 27 | newton 28 | -------------------------------------------------------------------------------- /doc/source/contributor/index.rst: -------------------------------------------------------------------------------- 1 | ========================= 2 | Contributing to Ironic UI 3 | ========================= 4 | 5 | If you're interested in contributing to the Ironic UI project, 6 | the following will help get you started. 7 | 8 | .. toctree:: 9 | :maxdepth: 1 10 | 11 | contributing 12 | 13 | Autogenerated API Documentation 14 | =============================== 15 | 16 | .. toctree:: 17 | :maxdepth: 1 18 | 19 | api/autoindex 20 | -------------------------------------------------------------------------------- /releasenotes/notes/2.1.0-release-3391dfbcf087c883.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | prelude: > 3 | This release adds support for editing nodes and 4 | moving those nodes between enroll, manageable, available 5 | and active states. It is now possible to enroll a node 6 | without all required fields for moving to manageable state 7 | being present due to the facility for editing the node once 8 | it has been created. 9 | features: 10 | - Edit nodes after creation 11 | - Move nodes between enroll, manageable, available and active states 12 | - Ability to enroll a node without all required fields for other states 13 | -------------------------------------------------------------------------------- /releasenotes/notes/unit-test-framework-f61ad7926413bf91.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | A backend mock has been added that enables better unit testing of the 5 | ironic-ui application by mocking the ironic API service. The mock utilizes 6 | angular $httpbackend handlers to intercept requests targeted at the 7 | ironic-ui server-side REST endpoints, and returns simulated responses. 8 | 9 | A number of unit tests have been developed that illustrate the use 10 | of the backend mock functionality. 11 | 12 | Although the backend mock is a work in progress, enough 13 | functionality already exists to support test development for 14 | the current set of in-progress features. 15 | -------------------------------------------------------------------------------- /ironic_ui/__init__.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 2 | # not use this file except in compliance with the License. You may obtain 3 | # a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10 | # License for the specific language governing permissions and limitations 11 | # under the License. 12 | 13 | import pbr.version 14 | 15 | 16 | __version__ = pbr.version.VersionInfo( 17 | 'ironic-ui').version_string() 18 | -------------------------------------------------------------------------------- /ironic_ui/content/ironic/templates/ironic/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load i18n %} 3 | {% block title %}{% trans "Ironic Bare Metal Provisioning" %}{% endblock %} 4 | 5 | {% block breadcrumb_nav %} 6 | 11 | {% endblock %} 12 | 13 | {% block page_header %} 14 | 15 | {% endblock %} 16 | 17 | {% block main %} 18 | 19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /CONTRIBUTING.rst: -------------------------------------------------------------------------------- 1 | If you would like to contribute to the development of OpenStack, you must 2 | follow the steps in this page: 3 | 4 | http://docs.openstack.org/infra/manual/developers.html 5 | 6 | If you already have a good understanding of how the system works and your 7 | OpenStack accounts are set up, you can skip to the development workflow 8 | section of this documentation to learn how changes to OpenStack should be 9 | submitted for review via the Gerrit tool: 10 | 11 | http://docs.openstack.org/infra/manual/developers.html#development-workflow 12 | 13 | Pull requests submitted through GitHub will be ignored. 14 | 15 | Bugs should be filed in Launchpad, not GitHub: 16 | 17 | https://bugs.launchpad.net/ironic-ui 18 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | ========= 2 | Ironic UI 3 | ========= 4 | 5 | .. image:: https://governance.openstack.org/tc/badges/ironic-ui.svg 6 | 7 | .. Change things from this point on 8 | 9 | The Ironic UI is a Horizon plugin that will allow users to view and manage bare 10 | metal nodes, ports and drivers. 11 | 12 | * Free software: Apache license 13 | * Documentation: https://docs.openstack.org/ironic-ui/latest 14 | * Release notes: https://docs.openstack.org/releasenotes/ironic-ui/ 15 | * Source: https://opendev.org/openstack/ironic-ui 16 | * Bugs: https://bugs.launchpad.net/ironic-ui 17 | 18 | Features 19 | -------- 20 | 21 | * View bare metal nodes 22 | * View node details 23 | * Apply maintenance and power on/off actions to the nodes 24 | -------------------------------------------------------------------------------- /ironic_ui/content/__init__.py: -------------------------------------------------------------------------------- 1 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 2 | # not use this file except in compliance with the License. You may obtain 3 | # a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 9 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 10 | # License for the specific language governing permissions and limitations 11 | # under the License. 12 | 13 | import pbr.version 14 | 15 | 16 | __version__ = pbr.version.VersionInfo( 17 | 'ironic-ui').version_string() 18 | -------------------------------------------------------------------------------- /ironic_ui/content/ironic/templates/ironic/node_detail.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | {% load i18n %} 3 | {% block title %}{% trans "Node Details" %}{% endblock %} 4 | 5 | {% block breadcrumb_nav %} 6 | 12 | {% endblock %} 13 | 14 | {% block page_header %} 15 | 16 | {% endblock %} 17 | 18 | {% block main %} 19 | 20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /releasenotes/notes/add-console-support-ccffcedc845ca214.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Support has been added for starting, stopping, and accessing the 5 | console associated with a node. 6 | - | 7 | The action dropdown menu in the node-details panel has a new item 8 | ``Enable|Disable console``. 9 | - | 10 | The node-details/overview panel has a new ``Console info`` item in the 11 | ``General`` section. The value of this field is dependent on the console 12 | type. 13 | 14 | For ``shellinabox``, the value is an anchor with the URL required 15 | to access the web console and title ``shellinabox``. For others, the 16 | value is a string representation of the ``console_info`` object returned 17 | by the ``get_console api`` call. 18 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2013 Hewlett-Packard Development Company, L.P. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 12 | # implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | 16 | import setuptools 17 | 18 | setuptools.setup( 19 | setup_requires=['pbr>=2.0.0'], 20 | pbr=True) 21 | -------------------------------------------------------------------------------- /ironic_ui/test/urls.py: -------------------------------------------------------------------------------- 1 | # 2 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 3 | # not use this file except in compliance with the License. You may obtain 4 | # a copy of the License at 5 | # 6 | # http://www.apache.org/licenses/LICENSE-2.0 7 | # 8 | # Unless required by applicable law or agreed to in writing, software 9 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 10 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 11 | # License for the specific language governing permissions and limitations 12 | # under the License. 13 | 14 | from django.conf.urls import include 15 | from django.urls import re_path 16 | import openstack_dashboard.urls 17 | 18 | urlpatterns = [ 19 | re_path(r'', include(openstack_dashboard.urls)) 20 | ] 21 | -------------------------------------------------------------------------------- /ironic_ui/locale/ko_KR/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # Eunseop Shin , 2016. #zanata 2 | # ByungYeol Woo , 2019. #zanata 3 | msgid "" 4 | msgstr "" 5 | "Project-Id-Version: ironic-ui VERSION\n" 6 | "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" 7 | "POT-Creation-Date: 2019-04-25 10:13+0000\n" 8 | "MIME-Version: 1.0\n" 9 | "Content-Type: text/plain; charset=UTF-8\n" 10 | "Content-Transfer-Encoding: 8bit\n" 11 | "PO-Revision-Date: 2019-05-01 10:51+0000\n" 12 | "Last-Translator: ByungYeol Woo \n" 13 | "Language-Team: Korean (South Korea)\n" 14 | "Language: ko_KR\n" 15 | "X-Generator: Zanata 4.3.3\n" 16 | "Plural-Forms: nplurals=1; plural=0\n" 17 | 18 | msgid "Admin" 19 | msgstr "관리자" 20 | 21 | msgid "Ironic Bare Metal Provisioning" 22 | msgstr "Ironic 베어메탈 프로비저닝" 23 | 24 | msgid "Node Details" 25 | msgstr "노드 세부사항" 26 | 27 | msgid "System" 28 | msgstr "시스템" 29 | -------------------------------------------------------------------------------- /ironic_ui/locale/zh_Hans/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # Shengjing Zhu , 2016. #zanata 2 | # Franco Tseng , 2019. #zanata 3 | msgid "" 4 | msgstr "" 5 | "Project-Id-Version: ironic-ui VERSION\n" 6 | "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" 7 | "POT-Creation-Date: 2021-01-24 09:54+0000\n" 8 | "MIME-Version: 1.0\n" 9 | "Content-Type: text/plain; charset=UTF-8\n" 10 | "Content-Transfer-Encoding: 8bit\n" 11 | "PO-Revision-Date: 2019-03-30 01:32+0000\n" 12 | "Last-Translator: Franco Tseng \n" 13 | "Language-Team: Chinese (China)\n" 14 | "Language: zh_CN\n" 15 | "X-Generator: Zanata 4.3.3\n" 16 | "Plural-Forms: nplurals=1; plural=0\n" 17 | 18 | msgid "Admin" 19 | msgstr "管理员" 20 | 21 | msgid "Ironic Bare Metal Provisioning" 22 | msgstr "裸金属 Ironic 配置向导" 23 | 24 | msgid "Node Details" 25 | msgstr "节点详情" 26 | 27 | msgid "System" 28 | msgstr "系统" 29 | -------------------------------------------------------------------------------- /ironic_ui/locale/id/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # suhartono , 2017. #zanata 2 | # suhartono , 2019. #zanata 3 | msgid "" 4 | msgstr "" 5 | "Project-Id-Version: ironic-ui VERSION\n" 6 | "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" 7 | "POT-Creation-Date: 2019-04-25 10:13+0000\n" 8 | "MIME-Version: 1.0\n" 9 | "Content-Type: text/plain; charset=UTF-8\n" 10 | "Content-Transfer-Encoding: 8bit\n" 11 | "PO-Revision-Date: 2019-04-30 02:25+0000\n" 12 | "Last-Translator: suhartono \n" 13 | "Language-Team: Indonesian\n" 14 | "Language: id\n" 15 | "X-Generator: Zanata 4.3.3\n" 16 | "Plural-Forms: nplurals=1; plural=0\n" 17 | 18 | msgid "Admin" 19 | msgstr "Admin" 20 | 21 | msgid "Ironic Bare Metal Provisioning" 22 | msgstr "Ironic Bare Metal Provisioning" 23 | 24 | msgid "Node Details" 25 | msgstr "Node Details" 26 | 27 | msgid "System" 28 | msgstr "System" 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.py[cod] 2 | 3 | # C extensions 4 | *.so 5 | 6 | # Packages 7 | *.egg 8 | *.egg-info 9 | dist 10 | build 11 | cover 12 | .eggs 13 | eggs 14 | parts 15 | bin 16 | var 17 | sdist 18 | develop-eggs 19 | .installed.cfg 20 | lib 21 | lib64 22 | 23 | # Installer logs 24 | pip-log.txt 25 | 26 | # Unit test / coverage reports 27 | .coverage* 28 | coverage.xml 29 | nosetests.xml 30 | .tox 31 | .venv 32 | 33 | # Translations 34 | *.mo 35 | 36 | # Mr Developer 37 | .mr.developer.cfg 38 | .project 39 | .pydevproject 40 | 41 | # Complexity 42 | output/*.html 43 | output/*/index.html 44 | 45 | # Sphinx 46 | doc/build 47 | doc/source/contributor/api/* 48 | 49 | # pbr generates these 50 | AUTHORS 51 | ChangeLog 52 | 53 | # Editors 54 | *~ 55 | .*.swp 56 | .*sw? 57 | 58 | .secret_key_store 59 | *.lock 60 | 61 | # Node generated files 62 | package/ 63 | node_modules/ 64 | npm-debug.log 65 | 66 | # release notes build 67 | releasenotes/build 68 | -------------------------------------------------------------------------------- /doc/source/contributor/contributing.rst: -------------------------------------------------------------------------------- 1 | ================= 2 | How to Contribute 3 | ================= 4 | 5 | Contributor License Agreement 6 | ----------------------------- 7 | 8 | .. index:: 9 | single: license; agreement 10 | 11 | In order to contribute to the Ironic UI project, you need to have 12 | signed OpenStack's contributor's agreement. 13 | 14 | .. seealso:: 15 | 16 | * https://docs.openstack.org/infra/manual/developers.html 17 | * https://wiki.openstack.org/CLA 18 | 19 | Project Hosting Details 20 | ------------------------- 21 | 22 | Bug tracker 23 | https://bugs.launchpad.net/ironic-ui 24 | 25 | Mailing list (prefix subjects with ``[ironic]`` for faster responses) 26 | http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-discuss 27 | 28 | Code Hosting 29 | https://opendev.org/openstack/ironic-ui 30 | 31 | Code Review 32 | https://review.opendev.org/#/q/status:open+project:openstack/ironic-ui,n,z 33 | -------------------------------------------------------------------------------- /ironic_ui/locale/de/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # Robert Simai , 2016. #zanata 2 | # Robert Simai , 2019. #zanata 3 | msgid "" 4 | msgstr "" 5 | "Project-Id-Version: ironic-ui VERSION\n" 6 | "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" 7 | "POT-Creation-Date: 2019-04-25 10:13+0000\n" 8 | "MIME-Version: 1.0\n" 9 | "Content-Type: text/plain; charset=UTF-8\n" 10 | "Content-Transfer-Encoding: 8bit\n" 11 | "PO-Revision-Date: 2019-05-03 02:16+0000\n" 12 | "Last-Translator: Robert Simai \n" 13 | "Language-Team: German\n" 14 | "Language: de\n" 15 | "X-Generator: Zanata 4.3.3\n" 16 | "Plural-Forms: nplurals=2; plural=(n != 1)\n" 17 | 18 | msgid "Admin" 19 | msgstr "Admin" 20 | 21 | msgid "Ironic Bare Metal Provisioning" 22 | msgstr "Ironic Bare Metal Provisionierung" 23 | 24 | msgid "Node Details" 25 | msgstr "Knoten Details" 26 | 27 | msgid "System" 28 | msgstr "System" 29 | -------------------------------------------------------------------------------- /ironic_ui/locale/en_GB/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # Andi Chandler , 2016. #zanata 2 | # Andi Chandler , 2019. #zanata 3 | msgid "" 4 | msgstr "" 5 | "Project-Id-Version: ironic-ui VERSION\n" 6 | "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" 7 | "POT-Creation-Date: 2019-10-29 15:16+0000\n" 8 | "MIME-Version: 1.0\n" 9 | "Content-Type: text/plain; charset=UTF-8\n" 10 | "Content-Transfer-Encoding: 8bit\n" 11 | "PO-Revision-Date: 2019-11-14 11:18+0000\n" 12 | "Last-Translator: Andi Chandler \n" 13 | "Language-Team: English (United Kingdom)\n" 14 | "Language: en_GB\n" 15 | "X-Generator: Zanata 4.3.3\n" 16 | "Plural-Forms: nplurals=2; plural=(n != 1)\n" 17 | 18 | msgid "Admin" 19 | msgstr "Admin" 20 | 21 | msgid "Ironic Bare Metal Provisioning" 22 | msgstr "Ironic Bare Metal Provisioning" 23 | 24 | msgid "Node Details" 25 | msgstr "Node Details" 26 | 27 | msgid "System" 28 | msgstr "System" 29 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # Copyright 2016 Cisco Systems, Inc. 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 6 | # not use this file except in compliance with the License. You may obtain 7 | # a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | # License for the specific language governing permissions and limitations 15 | # under the License. 16 | 17 | import os 18 | import sys 19 | 20 | from django.core.management import execute_from_command_line # noqa 21 | 22 | if __name__ == "__main__": 23 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", 24 | "ironic_ui.test.settings") 25 | execute_from_command_line(sys.argv) 26 | -------------------------------------------------------------------------------- /ironic_ui/locale/ru/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # Dmitriy Chubinidze , 2025. #zanata 2 | msgid "" 3 | msgstr "" 4 | "Project-Id-Version: ironic-ui VERSION\n" 5 | "Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n" 6 | "POT-Creation-Date: 2025-08-06 22:50+0000\n" 7 | "MIME-Version: 1.0\n" 8 | "Content-Type: text/plain; charset=UTF-8\n" 9 | "Content-Transfer-Encoding: 8bit\n" 10 | "PO-Revision-Date: 2025-08-06 04:55+0000\n" 11 | "Last-Translator: Dmitriy Chubinidze \n" 12 | "Language-Team: Russian\n" 13 | "Language: ru\n" 14 | "X-Generator: Zanata 4.3.3\n" 15 | "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " 16 | "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" 17 | 18 | msgid "Admin" 19 | msgstr "Администратор" 20 | 21 | msgid "Ironic Bare Metal Provisioning" 22 | msgstr "Подготовка выделенных серверов Ironic" 23 | 24 | msgid "Node Details" 25 | msgstr "Детали узла" 26 | 27 | msgid "System" 28 | msgstr "Система" 29 | -------------------------------------------------------------------------------- /releasenotes/notes/2.0-release-3d8acae7c8de429b.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | prelude: > 3 | This release adds support for adding and deleting 4 | nodes. Support has also been added for adding and 5 | deleting ports. The panel will now be hidden if the 6 | baremetal service is not present in the scenario where 7 | the collection of running services differs between 8 | multiple keystone regions. 9 | features: 10 | - Add and delete nodes 11 | - Add and delete ports 12 | - Panel hidden if baremetal service or admin rights are not present 13 | - UX improvements across the interface 14 | - Breadcrumbs have been added 15 | issues: 16 | - Currently it is not possible to edit a node via the UI 17 | once it has been enrolled. Therefore, the enrollment must 18 | be done accurately to ensure the node is enrolled accurately 19 | and can then be made available. At present, any errors 20 | made during enrollment can only be corrected by deleting 21 | the node and enrolling it again. 22 | -------------------------------------------------------------------------------- /ironic_ui/test/integration/pages/admin/system/ironicbaremetalprovisioningpage.py: -------------------------------------------------------------------------------- 1 | # 2 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 3 | # not use this file except in compliance with the License. You may obtain 4 | # a copy of the License at 5 | # 6 | # http://www.apache.org/licenses/LICENSE-2.0 7 | # 8 | # Unless required by applicable law or agreed to in writing, software 9 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 10 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 11 | # License for the specific language governing permissions and limitations 12 | # under the License. 13 | 14 | 15 | from openstack_dashboard.test.integration_tests.pages import basepage 16 | 17 | 18 | class IronicbaremetalprovisioningPage(basepage.BaseNavigationPage): 19 | def __init__(self, driver, conf): 20 | super(IronicbaremetalprovisioningPage, self).__init__(driver, conf) 21 | self._page_title = "Ironic Bare Metal Provisioning" 22 | -------------------------------------------------------------------------------- /ironic_ui/content/ironic/views.py: -------------------------------------------------------------------------------- 1 | # Copyright 2016 Cisco Systems, Inc. 2 | # Copyright (c) 2016 Hewlett Packard Enterprise Development Company LP 3 | # Copyright (c) 2016 Cray Inc. 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 6 | # not use this file except in compliance with the License. You may obtain 7 | # a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 | # License for the specific language governing permissions and limitations 15 | # under the License. 16 | 17 | from django.views import generic 18 | 19 | 20 | class IndexView(generic.TemplateView): 21 | template_name = 'admin/ironic/index.html' 22 | 23 | 24 | class DetailView(generic.TemplateView): 25 | template_name = 'admin/ironic/node_detail.html' 26 | -------------------------------------------------------------------------------- /ironic_ui/content/ironic/urls.py: -------------------------------------------------------------------------------- 1 | # Copyright 2016 Cisco Systems, Inc. 2 | # Copyright (c) 2016 Hewlett Packard Enterprise Development Company LP 3 | # Copyright (c) 2016 Cray Inc. 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | from django.urls import re_path 18 | 19 | import ironic_ui.api.ironic_rest_api # noqa 20 | from ironic_ui.content.ironic import views 21 | 22 | urlpatterns = [ 23 | re_path(r'^$', views.IndexView.as_view(), name='index'), 24 | re_path(r'^([^/]+)/$', views.DetailView.as_view(), name='detail'), 25 | ] 26 | -------------------------------------------------------------------------------- /ironic_ui/static/dashboard/admin/ironic/node-details/sections/portgroup-details.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
Attributes
4 |
5 |
6 |
Mode
7 |
{$ portgroup.mode $}
8 |
SA ports
9 |
{$ portgroup.standalone_ports_supported $}
10 |
11 |
12 |
13 |
Properties
14 |
15 |
16 |
{$ id $}
17 |
{$ value $}
18 |
19 |
20 |
21 |
Extra
22 |
23 |
24 |
{$ id $}
25 |
{$ value $}
26 |
27 |
28 |
29 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | name = ironic-ui 3 | summary = Ironic plugin UI for Horizon to allow users to view and manage bare metal nodes, ports and drivers. 4 | description_file = 5 | README.rst 6 | author = OpenStack 7 | author_email = openstack-discuss@lists.openstack.org 8 | home_page = https://docs.openstack.org/ironic-ui/latest/ 9 | python_requires = >=3.10 10 | classifier = 11 | Environment :: OpenStack 12 | Intended Audience :: Information Technology 13 | Intended Audience :: System Administrators 14 | License :: OSI Approved :: Apache Software License 15 | Operating System :: POSIX :: Linux 16 | Programming Language :: Python 17 | Programming Language :: Python :: Implementation :: CPython 18 | Programming Language :: Python :: 3 :: Only 19 | Programming Language :: Python :: 3 20 | Programming Language :: Python :: 3.10 21 | Programming Language :: Python :: 3.11 22 | Programming Language :: Python :: 3.12 23 | 24 | [files] 25 | packages = 26 | ironic_ui 27 | 28 | [codespell] 29 | quiet-level = 4 30 | skip = *.po,*.pot 31 | -------------------------------------------------------------------------------- /ironic_ui/test/integration/test_basic.py: -------------------------------------------------------------------------------- 1 | # 2 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 3 | # not use this file except in compliance with the License. You may obtain 4 | # a copy of the License at 5 | # 6 | # http://www.apache.org/licenses/LICENSE-2.0 7 | # 8 | # Unless required by applicable law or agreed to in writing, software 9 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 10 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 11 | # License for the specific language governing permissions and limitations 12 | # under the License. 13 | 14 | 15 | from openstack_dashboard.test.integration_tests import helpers 16 | 17 | 18 | class TestIronicDashboardInstalled(helpers.AdminTestCase): 19 | def test_ironic_bare_metal_provisioning_page_opened(self): 20 | ironic_page = ( 21 | self.home_pg.go_to_admin_system_ironicbaremetalprovisioningpage()) 22 | title = 'Ironic Bare Metal Provisioning - OpenStack Dashboard' 23 | self.assertEqual(ironic_page.page_title, title) 24 | -------------------------------------------------------------------------------- /ironic_ui/static/dashboard/admin/ironic/maintenance/maintenance.html: -------------------------------------------------------------------------------- 1 | 4 | 18 | 32 | -------------------------------------------------------------------------------- /doc/source/index.rst: -------------------------------------------------------------------------------- 1 | ===================================== 2 | Welcome to Ironic UI's documentation! 3 | ===================================== 4 | 5 | Introduction 6 | ============ 7 | 8 | The ironic UI is an OpenStack Horizon plugin that will allow users to view and 9 | manage their ironic bare metal nodes, ports and drivers. 10 | 11 | The documentation provided here is continually kept up-to-date based 12 | on the latest code that has been committed, and may not represent the state of 13 | the project at any specific prior release. 14 | 15 | For information on any current or prior version of Ironic, see `the release 16 | notes`_. 17 | 18 | .. _the release notes: https://docs.openstack.org/releasenotes/ironic-ui/ 19 | 20 | For more information on ironic, see `the ironic documentation`_. 21 | 22 | .. _the ironic documentation: https://docs.openstack.org/ironic/latest/ 23 | 24 | .. toctree:: 25 | :maxdepth: 1 26 | 27 | Introduction to ironic 28 | Installing the ironic UI 29 | Contributing 30 | Release notes 31 | -------------------------------------------------------------------------------- /ironic_ui/content/ironic/panel.py: -------------------------------------------------------------------------------- 1 | # Copyright 2016 Cisco Systems, Inc. 2 | # Copyright (c) 2016 Hewlett Packard Enterprise Development Company LP 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 5 | # not use this file except in compliance with the License. You may obtain 6 | # a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | # License for the specific language governing permissions and limitations 14 | # under the License. 15 | 16 | from django.utils.translation import gettext_lazy as _ 17 | 18 | import horizon 19 | 20 | from openstack_dashboard.dashboards.admin import dashboard 21 | 22 | 23 | class Ironic(horizon.Panel): 24 | name = _("Ironic Bare Metal Provisioning") 25 | slug = 'ironic' 26 | permissions = ('openstack.roles.admin', 'openstack.services.baremetal',) 27 | 28 | 29 | dashboard.Admin.register(Ironic) 30 | -------------------------------------------------------------------------------- /ironic_ui/static/dashboard/admin/ironic/auto-focus.directive.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 Cray Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | (function () { 17 | 'use strict'; 18 | 19 | angular 20 | .module('horizon.dashboard.admin.ironic') 21 | .directive('autoFocus', AutoFocus); 22 | 23 | AutoFocus.$inject = ['$timeout']; 24 | 25 | function AutoFocus($timeout) { 26 | return { 27 | restrict: 'AC', 28 | link: function(scope, elem) { 29 | $timeout(function() { 30 | elem[0].focus(); 31 | }, 1000); 32 | } 33 | }; 34 | } 35 | })(); 36 | -------------------------------------------------------------------------------- /ironic_ui/test/tests/test_registration.py: -------------------------------------------------------------------------------- 1 | # Copyright 2015 Cisco Systems, Inc. 2 | # Copyright (c) 2016 Hewlett Packard Enterprise Development Company LP 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you may 5 | # not use this file except in compliance with the License. You may obtain 6 | # a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 | # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 | # License for the specific language governing permissions and limitations 14 | # under the License. 15 | 16 | import horizon 17 | from ironic_ui.content.ironic import panel as i_panel 18 | from openstack_dashboard.test import helpers as test 19 | 20 | 21 | class RegistrationTests(test.TestCase): 22 | def test_registered(self): 23 | dashboard = horizon.get_dashboard('admin') 24 | panel = dashboard.get_panel('ironic') 25 | 26 | self.assertEqual(panel.__class__, i_panel.Ironic) 27 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ironic-ui", 3 | "version": "0.0.0", 4 | "description": "Horizon plugin for OpenStack Ironic.", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://opendev.org/openstack/ironic-ui" 8 | }, 9 | "author": "Openstack ", 10 | "license": "Apache-2.0", 11 | "devDependencies": { 12 | "eslint": "1.10.3", 13 | "eslint-config-openstack": "1.2.4", 14 | "eslint-plugin-angular": "1.0.1", 15 | "jasmine-core": "^2.4.1", 16 | "karma": "^1.1.2", 17 | "karma-cli": "1.0.1", 18 | "karma-coverage": "^1.1.1", 19 | "karma-jasmine": "^1.0.2", 20 | "karma-jasmine-matchers": "^3.7.0", 21 | "karma-ng-html2js-preprocessor": "^1.0.0", 22 | "karma-firefox-launcher": "2.1.0", 23 | "karma-threshold-reporter": "^0.1.15" 24 | }, 25 | "scripts": { 26 | "postinstall": "if [ ! -d .tox/npm ]; then tox -e npm --notest; fi", 27 | "test": "karma start ironic_ui/karma.conf.js --single-run", 28 | "lint": "eslint --no-color ironic_ui/static", 29 | "lintq": "eslint --quiet ironic_ui/static" 30 | }, 31 | "dependencies": { 32 | "string.prototype.endswith": "^0.2.0" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /ironic_ui/static/dashboard/admin/ironic/node-details/sections/port-details.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
Attributes
4 |
5 |
6 |
UUID
7 |
{$ port.uuid $} 8 |
9 |
10 |
11 |
Local Link Connection
12 |
13 |
14 |
{$ id $}
15 |
{$ value $}
16 |
17 |
18 |
19 |
Extra
20 |
21 |
22 |
{$ id $}
23 |
24 | 25 | {$ value $} 27 | {$ value $} 28 | 29 |
30 |
31 |
32 |
33 | -------------------------------------------------------------------------------- /releasenotes/notes/view-portgroups-a3efb4407536caf2.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | features: 3 | - | 4 | Adds support for viewing and managing the portgroups associated 5 | with an ironic node. 6 | 7 | A portgroup table has been added to the node-details/configuration tab. 8 | 9 | Each row in the table displays a single portgroup, and has column entries 10 | for its UUID, MAC address, name, and number of ports. A dropdown menu 11 | is also provided that contains actions that can be applied to the 12 | portgroup. 13 | 14 | Detailed information for a portgroup is obtained by clicking the 15 | detail-toggle-selector (right-chevron) located in its table row. 16 | The additional information is displayed in a row expansion. 17 | - | 18 | The port table in node-details/configuration tab has been modified 19 | as follows: 20 | 21 | * A column has been added that displays the UUID of the portgroup 22 | to which the port belongs. 23 | * The ``Properties`` column has been replaced with a column that 24 | displays only the boolean value of the ``pxe_enabled`` property. 25 | * Additional properties are displayed by clicking the 26 | detail-toggle-selector for that port in a similar manner to the 27 | portgroup table. 28 | -------------------------------------------------------------------------------- /ironic_ui/static/dashboard/admin/ironic/property-collection-editor.directive.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2017 Cray Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | (function () { 17 | 'use strict'; 18 | 19 | angular 20 | .module('horizon.dashboard.admin.ironic') 21 | .directive('propertyCollectionEditor', PropertyCollectionEditor); 22 | 23 | PropertyCollectionEditor.$inject = [ 24 | 'horizon.dashboard.admin.ironic.basePath' 25 | ]; 26 | 27 | function PropertyCollectionEditor(basePath) { 28 | return { 29 | restrict: 'E', 30 | scope: { 31 | collection: '=' 32 | }, 33 | templateUrl: basePath + '/property-collection-editor.html' 34 | }; 35 | } 36 | })(); 37 | -------------------------------------------------------------------------------- /ironic_ui/static/dashboard/admin/ironic/empty-to-pristine.directive.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 Cray Inc. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | (function () { 17 | 'use strict'; 18 | 19 | angular 20 | .module('horizon.dashboard.admin.ironic') 21 | .directive('emptyToPristine', EmptyToPristine); 22 | 23 | function EmptyToPristine() { 24 | return { 25 | restrict: 'A', 26 | require: 'ngModel', 27 | link: function(scope, elem, attrs, ctrl) { 28 | ctrl.$parsers.push(function(viewValue) { 29 | if (viewValue === "") { 30 | ctrl.$setPristine(); 31 | } 32 | return viewValue; 33 | }); 34 | } 35 | }; 36 | } 37 | })(); 38 | -------------------------------------------------------------------------------- /.zuul.yaml: -------------------------------------------------------------------------------- 1 | - job: 2 | name: ironic-ui-integration-tests 3 | parent: horizon-integration-tests 4 | required-projects: 5 | - name: openstack/horizon 6 | - name: openstack/ironic 7 | - name: openstack/python-ironicclient 8 | - name: openstack/ironic-ui 9 | roles: 10 | - zuul: openstack-infra/devstack 11 | - zuul: openstack/horizon 12 | irrelevant-files: 13 | - ^.*\.rst$ 14 | - ^doc/.*$ 15 | - ^releasenotes/.*$ 16 | vars: 17 | devstack_plugins: 18 | ironic: https://opendev.org/openstack/ironic 19 | ironic-ui: https://opendev.org/openstack/ironic-ui 20 | devstack_services: 21 | horizon: true 22 | tox_envlist: integration 23 | 24 | - job: 25 | name: ironic-ui-tox-codespell 26 | parent: openstack-tox 27 | timeout: 7200 28 | vars: 29 | tox_envlist: codespell 30 | 31 | - project: 32 | templates: 33 | - check-requirements 34 | - openstack-cover-jobs 35 | - horizon-nodejs-jobs 36 | - horizon-non-primary-django-jobs 37 | - openstack-python3-jobs 38 | - publish-openstack-docs-pti 39 | - release-notes-jobs-python3 40 | check: 41 | jobs: 42 | - ironic-ui-integration-tests: 43 | voting: false 44 | - ironic-ui-tox-codespell: 45 | voting: false 46 | -------------------------------------------------------------------------------- /ironic_ui/static/dashboard/admin/ironic/clean-node/clean-node.html: -------------------------------------------------------------------------------- 1 | 4 |