summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.zuul.d/cross-jobs.yaml2
-rw-r--r--.zuul.d/project.yaml3
-rw-r--r--.zuul.d/xstatic-master.yaml2
-rw-r--r--doc/source/configuration/settings.rst43
-rw-r--r--doc/source/locale/en_GB/LC_MESSAGES/doc-configuration.po78
-rw-r--r--doc/source/locale/id/LC_MESSAGES/doc-configuration.po24
-rw-r--r--horizon/static/framework/widgets/load-edit/load-edit.directive.js8
-rw-r--r--horizon/static/framework/widgets/load-edit/load-edit.directive.spec.js14
-rw-r--r--horizon/static/framework/widgets/panel/hz-resource-panel.controller.js6
-rw-r--r--horizon/static/framework/widgets/panel/hz-resource-panel.controller.spec.js1
-rw-r--r--horizon/test/webdriver.py3
-rw-r--r--lower-constraints.txt155
-rw-r--r--openstack_dashboard/api/cinder.py2
-rw-r--r--openstack_dashboard/api/neutron.py7
-rw-r--r--openstack_dashboard/api/rest/config.py14
-rw-r--r--openstack_dashboard/dashboards/admin/backups/tabs.py8
-rw-r--r--openstack_dashboard/dashboards/admin/backups/templates/backups/_detail_overview.html4
-rw-r--r--openstack_dashboard/dashboards/admin/snapshots/tabs.py2
-rw-r--r--openstack_dashboard/dashboards/project/backups/tables.py18
-rw-r--r--openstack_dashboard/dashboards/project/backups/tabs.py26
-rw-r--r--openstack_dashboard/dashboards/project/backups/templates/backups/_detail_overview.html4
-rw-r--r--openstack_dashboard/dashboards/project/backups/tests.py36
-rw-r--r--openstack_dashboard/dashboards/project/network_topology/templates/network_topology/index.html2
-rw-r--r--openstack_dashboard/dashboards/project/snapshots/tabs.py2
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers-model.service.js2
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers-model.service.spec.js2
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers.controller.js6
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/configuration/configuration.html1
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/flavor/flavor.controller.js6
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.js5
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.spec.js9
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-workflow.service.js6
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network-details.html23
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.controller.js39
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.controller.spec.js3
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.html175
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.controller.js5
-rw-r--r--openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.spec.js1
-rw-r--r--openstack_dashboard/defaults.py5
-rw-r--r--openstack_dashboard/locale/cs/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/cs/LC_MESSAGES/djangojs.po17
-rw-r--r--openstack_dashboard/locale/de/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/de/LC_MESSAGES/djangojs.po19
-rw-r--r--openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/en_AU/LC_MESSAGES/djangojs.po18
-rw-r--r--openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po13
-rw-r--r--openstack_dashboard/locale/en_GB/LC_MESSAGES/djangojs.po30
-rw-r--r--openstack_dashboard/locale/eo/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/eo/LC_MESSAGES/djangojs.po22
-rw-r--r--openstack_dashboard/locale/es/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/es/LC_MESSAGES/djangojs.po21
-rw-r--r--openstack_dashboard/locale/fr/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/fr/LC_MESSAGES/djangojs.po20
-rw-r--r--openstack_dashboard/locale/id/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/id/LC_MESSAGES/djangojs.po17
-rw-r--r--openstack_dashboard/locale/it/LC_MESSAGES/djangojs.po17
-rw-r--r--openstack_dashboard/locale/ja/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/ja/LC_MESSAGES/djangojs.po20
-rw-r--r--openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/ko_KR/LC_MESSAGES/djangojs.po19
-rw-r--r--openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/pt_BR/LC_MESSAGES/djangojs.po17
-rw-r--r--openstack_dashboard/locale/ru/LC_MESSAGES/django.po9
-rw-r--r--openstack_dashboard/locale/ru/LC_MESSAGES/djangojs.po224
-rw-r--r--openstack_dashboard/locale/tr_TR/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/tr_TR/LC_MESSAGES/djangojs.po17
-rw-r--r--openstack_dashboard/locale/zh_Hans/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/zh_Hans/LC_MESSAGES/djangojs.po17
-rw-r--r--openstack_dashboard/locale/zh_Hant/LC_MESSAGES/django.po5
-rw-r--r--openstack_dashboard/locale/zh_Hant/LC_MESSAGES/djangojs.po17
-rw-r--r--openstack_dashboard/settings.py11
-rw-r--r--openstack_dashboard/static/app/core/openstack-service-api/swift.service.js2
-rw-r--r--openstack_dashboard/static/app/core/openstack-service-api/swift.service.spec.js1
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_instances.py321
-rw-r--r--openstack_dashboard/test/integration_tests/tests/test_volumes.py9
-rw-r--r--openstack_dashboard/test/test_data/cinder_data.py14
-rw-r--r--releasenotes/notes/add_default_user_data-76d9c17e474fc34e.yaml7
-rw-r--r--releasenotes/notes/add_enable_metadata_and_enable_net_ports_options-8213bb18558031a8.yaml6
-rw-r--r--releasenotes/notes/cinder-backup-cinder-messages-2127d04da3c82033.yaml4
-rw-r--r--releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po65
-rw-r--r--requirements.txt4
-rw-r--r--setup.cfg3
-rw-r--r--setup.py8
-rw-r--r--tox.ini13
84 files changed, 885 insertions, 934 deletions
diff --git a/.zuul.d/cross-jobs.yaml b/.zuul.d/cross-jobs.yaml
index b6341b31b..5904d5247 100644
--- a/.zuul.d/cross-jobs.yaml
+++ b/.zuul.d/cross-jobs.yaml
@@ -19,7 +19,7 @@
- job:
name: horizon-cross-ironic-ui-npm
- parent: horizon-nodejs10-run-test
+ parent: horizon-nodejs16-run-test
pre-run: playbooks/cross-jobs/phantomjs-deps.yaml
vars:
zuul_work_dir: "{{ zuul.projects['opendev.org/openstack/ironic-ui'].src_dir }}"
diff --git a/.zuul.d/project.yaml b/.zuul.d/project.yaml
index 4b11f59c9..40642b897 100644
--- a/.zuul.d/project.yaml
+++ b/.zuul.d/project.yaml
@@ -1,10 +1,10 @@
- project:
+ queue: horizon
templates:
- check-requirements
- horizon-cross-jobs
- horizon-nodejs-jobs
- horizon-non-primary-django-jobs
- - openstack-lower-constraints-jobs
- openstack-python3-zed-jobs
- periodic-stable-jobs
- publish-openstack-docs-pti
@@ -17,7 +17,6 @@
- horizon-tox-bandit-baseline
- horizon-tempest-plugin-ipv6
gate:
- queue: horizon
jobs:
- horizon-dsvm-tempest-plugin
- horizon-selenium-headless
diff --git a/.zuul.d/xstatic-master.yaml b/.zuul.d/xstatic-master.yaml
index 0482fe88c..b638ab6f0 100644
--- a/.zuul.d/xstatic-master.yaml
+++ b/.zuul.d/xstatic-master.yaml
@@ -27,7 +27,7 @@
- job:
name: horizon-tox-py36-xstatic-master
- parent: openstack-tox-py36
+ parent: openstack-tox-py39
required-projects: *xstatic-projects
- job:
diff --git a/doc/source/configuration/settings.rst b/doc/source/configuration/settings.rst
index e2cbf0c6e..512858256 100644
--- a/doc/source/configuration/settings.rst
+++ b/doc/source/configuration/settings.rst
@@ -593,9 +593,7 @@ OPENSTACK_ENDPOINT_TYPE
Default: ``"publicURL"``
A string which specifies the endpoint type to use for the endpoints in the
-Keystone service catalog. The default value for all services except for
-identity is ``"publicURL"`` . The default value for the identity service is
-``"internalURL"``.
+Keystone service catalog.
OPENSTACK_HOST
--------------
@@ -2174,6 +2172,10 @@ LAUNCH_INSTANCE_DEFAULTS
Added the ``default_availability_zone`` option.
+.. versionchanged:: 22.3.0(Zed)
+
+ Added the ``enable_metadata``, ``enable_net_ports`` options.
+
Default:
.. code-block:: python
@@ -2187,6 +2189,8 @@ Default:
"disable_volume": False,
"disable_volume_snapshot": False,
"enable_scheduler_hints": True,
+ "enable_metadata": True,
+ "enable_net_ports": True,
"default_availability_zone": "Any",
}
@@ -2220,7 +2224,7 @@ hide_create_volume
Default: ``False``
-This setting allow your to hide the "Create New Volume" option and rely on the
+This setting allows you to hide the "Create New Volume" option and rely on the
default value you select with ``create_volume`` to be the most suitable for your
users.
@@ -2274,6 +2278,26 @@ Default: ``True``
This setting specifies whether or not Scheduler Hints can be provided when
launching an instance.
+enable_metadata
+###############
+
+.. versionadded:: 22.3.0(Zed)
+
+Default: ``True``
+
+This setting specifies whether or not Metadata can be provided when launching
+an instance.
+
+enable_net_ports
+################
+
+.. versionadded:: 22.3.0(Zed)
+
+Default: ``True``
+
+This setting specifies whether or not Network Ports can be selected when
+launching an instance.
+
default_availability_zone
#########################
@@ -2290,6 +2314,17 @@ specified in this setting is not found in the availability zone list,
the setting will be ignored and the behavior will be same as when ``Any``
is specified.
+OPENSTACK_SERVER_DEFAULT_USER_DATA
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. versionadded:: 22.3.0(Zed)
+
+Default: ``""``
+
+An administrator can specify a default user data (e.g. comments or instructions
+for cloudinit) via this settings. It can be a string or template string that
+accepts a request object.
+
OPENSTACK_ENABLE_PASSWORD_RETRIEVE
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/source/locale/en_GB/LC_MESSAGES/doc-configuration.po b/doc/source/locale/en_GB/LC_MESSAGES/doc-configuration.po
index 686eeed2f..f2b5063b0 100644
--- a/doc/source/locale/en_GB/LC_MESSAGES/doc-configuration.po
+++ b/doc/source/locale/en_GB/LC_MESSAGES/doc-configuration.po
@@ -5,13 +5,13 @@
# Andi Chandler <andi@gowling.com>, 2022. #zanata
msgid ""
msgstr ""
-"Project-Id-Version: horizon 22.1.0.dev22\n"
+"Project-Id-Version: horizon 22.2.1.dev25\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-19 10:45+0000\n"
+"POT-Creation-Date: 2022-09-06 04:29+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2022-05-25 09:06+0000\n"
+"PO-Revision-Date: 2022-09-05 10:27+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>\n"
"Language-Team: English (United Kingdom)\n"
"Language: en_GB\n"
@@ -334,14 +334,10 @@ msgstr ""
msgid ""
"A string which specifies the endpoint type to use for the endpoints in the "
-"Keystone service catalog. The default value for all services except for "
-"identity is ``\"publicURL\"`` . The default value for the identity service "
-"is ``\"internalURL\"``."
+"Keystone service catalog."
msgstr ""
"A string which specifies the endpoint type to use for the endpoints in the "
-"Keystone service catalogue. The default value for all services except for "
-"identity is ``\"publicURL\"`` . The default value for the identity service "
-"is ``\"internalURL\"``."
+"Keystone service catalogue."
msgid ""
"A template name for a custom user's ``clouds.yaml`` file. ``None`` means the "
@@ -481,6 +477,9 @@ msgstr ""
"Added the ``disable_image``, ``disable_instance_snapshot``, "
"``disable_volume`` and ``disable_volume_snapshot`` options."
+msgid "Added the ``enable_metadata``, ``enable_net_ports`` options."
+msgstr "Added the ``enable_metadata``, ``enable_net_ports`` options."
+
msgid "Added the ``hide_create_volume`` option."
msgstr "Added the ``hide_create_volume`` option."
@@ -618,6 +617,15 @@ msgstr ""
"WEBSSO_DEFAULT_REDIRECT is set to True"
msgid ""
+"An administrator can specify a default user data (e.g. comments or "
+"instructions for cloudinit) via this settings. It can be a string or "
+"template string that accepts a request object."
+msgstr ""
+"An administrator can specify default user data (e.g. comments or "
+"instructions for cloud-init) via these settings. It can be a string or "
+"template string that accepts a request object."
+
+msgid ""
"Angular Templates are cached using this duration (in seconds) if `DEBUG`_ is "
"set to ``False``. Default value is ``2592000`` (or 30 days)."
msgstr ""
@@ -2175,6 +2183,9 @@ msgstr "OPENSTACK_NEUTRON_NETWORK"
msgid "OPENSTACK_PROFILER"
msgstr "OPENSTACK_PROFILER"
+msgid "OPENSTACK_SERVER_DEFAULT_USER_DATA"
+msgstr "OPENSTACK_SERVER_DEFAULT_USER_DATA"
+
msgid "OPENSTACK_SSL_CACERT"
msgstr "OPENSTACK_SSL_CACERT"
@@ -2652,6 +2663,17 @@ msgstr ""
"instance on a subnet with no router if your Neutron backend allows it."
msgid ""
+"The Django version of the Images, Keypairs, and Roles panels are deprecated. "
+"As a result, \"images_panel\", \"key_pairs_panel\" and \"roles_panel\" keys "
+"in this setting are deprecated. Consider switching to the AngujarJS version "
+"by setting corresponding entries to True (the default value)."
+msgstr ""
+"The Django version of the Images, Keypairs, and Roles panels are deprecated. "
+"As a result, \"images_panel\", \"key_pairs_panel\" and \"roles_panel\" keys "
+"in this setting are deprecated. Consider switching to the AngujarJS version "
+"by setting corresponding entries to True (the default value)."
+
+msgid ""
"The Keystone Provider drop down uses Keystone to Keystone federation to "
"switch between Keystone service providers. This sets the display name for "
"the Identity Provider (dropdown display name)."
@@ -3352,15 +3374,6 @@ msgstr ""
"through other means."
msgid ""
-"This setting allow your to hide the \"Create New Volume\" option and rely on "
-"the default value you select with ``create_volume`` to be the most suitable "
-"for your users."
-msgstr ""
-"This setting allow your to hide the \"Create New Volume\" option and rely on "
-"the default value you select with ``create_volume`` to be the most suitable "
-"for your users."
-
-msgid ""
"This setting allows an administrator to specify a default availability zone "
"for a new server creation. The valid value is ``Any`` or availability zone "
"list. If ``Any`` is specified, the default availability zone is decided by "
@@ -3406,6 +3419,15 @@ msgstr ""
"``local_settings.py``."
msgid ""
+"This setting allows you to hide the \"Create New Volume\" option and rely on "
+"the default value you select with ``create_volume`` to be the most suitable "
+"for your users."
+msgstr ""
+"This setting allows you to hide the \"Create New Volume\" option and rely on "
+"the default value you select with ``create_volume`` to be the most suitable "
+"for your users."
+
+msgid ""
"This setting allows you to set rules for passwords if your organization "
"requires them."
msgstr ""
@@ -3564,6 +3586,20 @@ msgstr ""
"\"``, ``\"SERIAL\"``, ``\"MKS\"``, and ``None``."
msgid ""
+"This setting specifies whether or not Metadata can be provided when "
+"launching an instance."
+msgstr ""
+"This setting specifies whether or not Metadata can be provided when "
+"launching an instance."
+
+msgid ""
+"This setting specifies whether or not Network Ports can be selected when "
+"launching an instance."
+msgstr ""
+"This setting specifies whether or not Network Ports can be selected when "
+"launching an instance."
+
+msgid ""
"This setting specifies whether or not Scheduler Hints can be provided when "
"launching an instance."
msgstr ""
@@ -4597,6 +4633,12 @@ msgstr "enable_ha_router"
msgid "enable_ipv6"
msgstr "enable_ipv6"
+msgid "enable_metadata"
+msgstr "enable_metadata"
+
+msgid "enable_net_ports"
+msgstr "enable_net_ports"
+
msgid "enable_quotas"
msgstr "enable_quotas"
diff --git a/doc/source/locale/id/LC_MESSAGES/doc-configuration.po b/doc/source/locale/id/LC_MESSAGES/doc-configuration.po
index 65433cd34..27bdaa217 100644
--- a/doc/source/locale/id/LC_MESSAGES/doc-configuration.po
+++ b/doc/source/locale/id/LC_MESSAGES/doc-configuration.po
@@ -3,9 +3,9 @@
# suhartono <cloudsuhartono@gmail.com>, 2020. #zanata
msgid ""
msgstr ""
-"Project-Id-Version: horizon 21.0.1.dev22\n"
+"Project-Id-Version: horizon 22.2.1.dev24\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -318,17 +318,6 @@ msgstr ""
"``BASE_XSTATIC_MODULES`` dalam openstack_dashboard/utils/settings.py."
msgid ""
-"A string which specifies the endpoint type to use for the endpoints in the "
-"Keystone service catalog. The default value for all services except for "
-"identity is ``\"publicURL\"`` . The default value for the identity service "
-"is ``\"internalURL\"``."
-msgstr ""
-"String yang menentukan tipe endpoint yang digunakan untuk titik akhir dalam "
-"katalog layanan Keystone. Nilai default untuk semua layanan kecuali untuk "
-"identitas adalah `` \"publicURL\" ``. Nilai standar untuk layanan identitas "
-"adalah `` \"internalURL\" ``."
-
-msgid ""
"A template name for a custom user's ``clouds.yaml`` file. ``None`` means the "
"default template for ``clouds.yaml`` is used."
msgstr ""
@@ -3237,15 +3226,6 @@ msgstr ""
"melalui cara lain."
msgid ""
-"This setting allow your to hide the \"Create New Volume\" option and rely on "
-"the default value you select with ``create_volume`` to be the most suitable "
-"for your users."
-msgstr ""
-"Pengaturan ini memungkinkan Anda untuk menyembunyikan opsi \"Create New "
-"Volume\" dan bergantung pada nilai default yang Anda pilih dengan "
-"``create_volume`` menjadi yang paling cocok untuk pengguna Anda."
-
-msgid ""
"This setting allows deployers to control whether a token is deleted on log "
"out. This can be helpful when there are often long running processes being "
"run in the Horizon environment."
diff --git a/horizon/static/framework/widgets/load-edit/load-edit.directive.js b/horizon/static/framework/widgets/load-edit/load-edit.directive.js
index 7b5e94bab..4f33ebfff 100644
--- a/horizon/static/framework/widgets/load-edit/load-edit.directive.js
+++ b/horizon/static/framework/widgets/load-edit/load-edit.directive.js
@@ -26,6 +26,7 @@
*
* @param {object} title
* @param {object} model
+ * @param {object} modelDefaultValue
* @param {object} maxBytes
* @param {object} key
* @param {object} required
@@ -49,6 +50,7 @@
scope: {
title: '@',
model: '=',
+ modelDefaultValue: '=',
maxBytes: '@',
key: '@',
required: '=',
@@ -141,6 +143,12 @@
textarea.focus();
}
+ $scope.$watch('modelDefaultValue', function(newValue, oldValue) {
+ if (newValue !== undefined && oldValue !== newValue) {
+ updateTextArea(newValue);
+ }
+ });
+
/* The length property for string shows only number of character.
* If text includes multibyte string, it doesn't mean number of bytes.
* So to count bytes, convert to Blob object and get its size.
diff --git a/horizon/static/framework/widgets/load-edit/load-edit.directive.spec.js b/horizon/static/framework/widgets/load-edit/load-edit.directive.spec.js
index b08514040..c5031b96c 100644
--- a/horizon/static/framework/widgets/load-edit/load-edit.directive.spec.js
+++ b/horizon/static/framework/widgets/load-edit/load-edit.directive.spec.js
@@ -39,8 +39,9 @@
$compile = $injector.get('$compile');
key = 'elementKey';
element = $compile(
- '<load-edit title="{}" model="{}" max-bytes="{}" key="' + key + '" ' +
- 'required="true" rows="8"></load-edit>'
+ '<load-edit title="{}" model="{}" model-default-value="{}"' +
+ 'max-bytes="{}" key="' + key + '" ' + 'required="true" rows="8">' +
+ '</load-edit>'
)($scope);
$scope.$apply();
}));
@@ -75,6 +76,15 @@
expect(element.isolateScope().model).toBe('user input');
});
+
+ it('should update text area with default user data', function () {
+ element.isolateScope().modelDefaultValue = 'default user data';
+ $scope.$apply();
+ textarea.trigger('input');
+ $scope.$apply();
+
+ expect(element.isolateScope().model).toBe('default user data');
+ });
});
describe('onFileLoadListener', function() {
diff --git a/horizon/static/framework/widgets/panel/hz-resource-panel.controller.js b/horizon/static/framework/widgets/panel/hz-resource-panel.controller.js
index 59ff9c220..1e97a56bd 100644
--- a/horizon/static/framework/widgets/panel/hz-resource-panel.controller.js
+++ b/horizon/static/framework/widgets/panel/hz-resource-panel.controller.js
@@ -27,8 +27,10 @@
function controller(registry) {
var ctrl = this;
- ctrl.resourceType = registry.getResourceType(ctrl.resourceTypeName);
- ctrl.pageName = ctrl.resourceType.getName();
+ this.$onInit = function init() {
+ ctrl.resourceType = registry.getResourceType(ctrl.resourceTypeName);
+ ctrl.pageName = ctrl.resourceType.getName();
+ };
}
})();
diff --git a/horizon/static/framework/widgets/panel/hz-resource-panel.controller.spec.js b/horizon/static/framework/widgets/panel/hz-resource-panel.controller.spec.js
index 52010575e..37f2a56c7 100644
--- a/horizon/static/framework/widgets/panel/hz-resource-panel.controller.spec.js
+++ b/horizon/static/framework/widgets/panel/hz-resource-panel.controller.spec.js
@@ -39,6 +39,7 @@
ctrl = $controller('horizon.framework.widgets.panel.HzResourcePanelController', {
'horizon.framework.conf.resource-type-registry.service': registry,
tableResourceType: 'OS::Test::Example'});
+ ctrl.$onInit();
}));
it('exists', function() {
diff --git a/horizon/test/webdriver.py b/horizon/test/webdriver.py
index 3edb71dcb..595e23d97 100644
--- a/horizon/test/webdriver.py
+++ b/horizon/test/webdriver.py
@@ -28,6 +28,9 @@ from selenium.webdriver.remote import webelement
if os.environ.get('SELENIUM_PHANTOMJS'):
from selenium.webdriver import PhantomJS as WebDriver
desired_capabilities = dc.DesiredCapabilities.PHANTOMJS
+elif os.environ.get('SELENIUM_CHROME'):
+ from selenium.webdriver import Chrome as WebDriver
+ desired_capabilities = dc.DesiredCapabilities.CHROME
else:
from horizon.test.firefox_binary import WebDriver
desired_capabilities = dc.DesiredCapabilities.FIREFOX
diff --git a/lower-constraints.txt b/lower-constraints.txt
deleted file mode 100644
index 656713424..000000000
--- a/lower-constraints.txt
+++ /dev/null
@@ -1,155 +0,0 @@
-alabaster==0.7.10
-amqp==2.1.1
-appdirs==1.4.0
-asn1crypto==0.23.0
-Babel==2.6.0
-cachetools==2.0.0
-cffi==1.14.0
-chardet==3.0.4
-cliff==2.8.0
-cmd2==0.8.0
-colorama==0.3.9
-contextlib2==0.4.0
-coverage==4.0
-cryptography==3.0
-debtcollector==1.2.0
-decorator==4.4.2
-deprecation==1.0
-Django==3.2
-django-appconf==1.0.5
-django-compressor==2.4.1
-django-debreach==1.4.2
-django-pyscss==2.0.2
-docutils==0.11
-dogpile.cache==0.6.2
-dulwich==0.15.0
-enmerkar==0.7.1
-eventlet==0.18.2
-extras==1.0.0
-fasteners==0.7.0
-fixtures==3.0.0
-freezegun==0.3.15
-futurist==1.2.0
-greenlet==0.4.10
-idna==2.6
-imagesize==0.7.1
-iso8601==0.1.11
-Jinja2==2.10
-jmespath==0.9.0
-jsonpatch==1.16
-jsonpointer==1.13
-jsonschema==2.6.0
-keystoneauth1==4.3.1
-kombu==4.0.0
-linecache2==1.0.0
-MarkupSafe==1.0
-mccabe==0.6.0
-monotonic==0.6
-msgpack-python==0.4.0
-munch==2.1.0
-netaddr==0.7.18
-netifaces==0.10.4
-nodeenv==0.9.4
-openstacksdk==0.11.2
-os-client-config==1.28.0
-os-service-types==1.2.0
-osc-lib==1.8.0
-oslo.concurrency==4.5.0
-oslo.config==8.8.0
-oslo.context==4.1.0
-oslo.i18n==5.1.0
-oslo.log==4.7.0
-oslo.messaging==5.29.0
-oslo.middleware==3.31.0
-oslo.policy==3.11.0
-oslo.serialization==4.3.0
-oslo.service==1.24.0
-oslo.upgradecheck==1.5.0
-oslo.utils==4.12.0
-osprofiler==3.4.2
-Paste==2.0.2
-PasteDeploy==1.5.0
-pbr==5.5.0
-pep8==1.5.7
-pika==0.10.0
-pika-pool==0.1.3
-positional==1.2.1
-prettytable==0.7.2
-pycodestyle==2.5.0
-pycparser==2.18
-Pygments==2.2.0
-pyinotify==0.9.6
-pymongo==3.0.2
-pyOpenSSL==19.1.0
-pyparsing==2.1.0
-pyperclip==1.5.27
-pyScss==1.4.0
-pytest==5.3.5
-pytest-django==3.8.0
-pytest-html==2.0.1
-python-cinderclient==8.0.0
-python-dateutil==2.8.1
-python-glanceclient==2.8.0
-python-keystoneclient==3.22.0
-python-memcached==1.59
-python-mimeparse==1.6.0
-python-neutronclient==6.7.0
-python-novaclient==9.1.0
-python-swiftclient==3.2.0
-pytz==2013.6
-PyYAML==6.0
-rcssmin==1.0.6
-reno==3.1.0
-repoze.lru==0.7
-requests==2.25.1
-requestsexceptions==1.2.0
-restructuredtext-lint==1.1.1
-rfc3986==1.5.0
-rjsmin==1.1.0
-Routes==2.3.1
-selenium==2.50.1
-semantic-version==2.3.1
-simplejson==3.5.1
-six==1.16.0
-snowballstemmer==1.2.1
-statsd==3.2.1
-stevedore==3.3.0
-tenacity==3.2.1
-termcolor==1.1.0
-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.11
-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.12.4.1
-XStatic-JQuery-Migrate==1.2.1.1
-XStatic-jquery-ui==1.12.1.1
-XStatic-JQuery.quicksearch==2.0.3.1
-XStatic-JQuery.TableSorter==2.14.5.1
-XStatic-JSEncrypt==2.3.1.1
-XStatic-mdi==1.6.50.2
-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
diff --git a/openstack_dashboard/api/cinder.py b/openstack_dashboard/api/cinder.py
index 03ac5aee3..89319cd4a 100644
--- a/openstack_dashboard/api/cinder.py
+++ b/openstack_dashboard/api/cinder.py
@@ -121,7 +121,7 @@ class VolumeBackup(BaseCinderAPIResourceWrapper):
_attrs = ['id', 'name', 'description', 'container', 'size', 'status',
'created_at', 'volume_id', 'availability_zone', 'snapshot_id',
- 'os-backup-project-attr:project_id']
+ 'os-backup-project-attr:project_id', 'fail_reason']
_volume = None
_snapshot = None
diff --git a/openstack_dashboard/api/neutron.py b/openstack_dashboard/api/neutron.py
index 6263a5e07..dcc9ac78b 100644
--- a/openstack_dashboard/api/neutron.py
+++ b/openstack_dashboard/api/neutron.py
@@ -532,10 +532,10 @@ class FloatingIpTarget(base.APIDictWrapper):
:param ip_address: IP address of the ``port``. It must be one of
IP address of a given port.
:param label: String displayed in the floating IP association form.
- IP address will be appended to a specified label.
+ IP address will be appended to a specified label. (Optional)
"""
- def __init__(self, port, ip_address, label):
+ def __init__(self, port, ip_address, label=None):
name = '%s: %s' % (label, ip_address) if label else ip_address
target = {'name': name,
'id': '%s_%s' % (port.id, ip_address),
@@ -670,8 +670,7 @@ class FloatingIpManager(object):
``port_id`` represents a VNIC of an instance.
``port_id`` argument is different from a normal neutron port ID.
A value passed as ``port_id`` must be one of target_id returned by
- ``list_targets``, ``get_target_by_instance`` or
- ``list_targets_by_instance`` method.
+ ``list_targets`` or ``list_targets_by_instance`` method.
"""
# NOTE: In Neutron Horizon floating IP support, port_id is
# "<port_id>_<ip_address>" format to identify multiple ports.
diff --git a/openstack_dashboard/api/rest/config.py b/openstack_dashboard/api/rest/config.py
index eeea25e89..175d83f14 100644
--- a/openstack_dashboard/api/rest/config.py
+++ b/openstack_dashboard/api/rest/config.py
@@ -17,6 +17,7 @@ from datetime import datetime
from django.conf import settings
from django.http import JsonResponse
+import django.template as django_template
from django.views import generic
import pytz
@@ -59,6 +60,7 @@ class Settings(generic.View):
in settings_allowed if k not in self.SPECIALS}
plain_settings.update(self.SPECIALS)
plain_settings.update(self.disk_formats(request))
+ plain_settings.update(self.default_user_data(request))
return plain_settings
def disk_formats(self, request):
@@ -70,6 +72,18 @@ class Settings(generic.View):
for (value, name) in api.glance.get_image_formats(request)
]}
+ def default_user_data(self, request):
+ template_code = settings.OPENSTACK_SERVER_DEFAULT_USER_DATA
+ if template_code:
+ engine = django_template.engine.Engine.get_default()
+ template = engine.from_string(template_code)
+ default_user_data = template.render(
+ django_template.Context(dict(request=request))
+ )
+ else:
+ default_user_data = ""
+ return {"OPENSTACK_SERVER_DEFAULT_USER_DATA": default_user_data}
+
@urls.register
class Timezones(generic.View):
diff --git a/openstack_dashboard/dashboards/admin/backups/tabs.py b/openstack_dashboard/dashboards/admin/backups/tabs.py
index d4631822c..dfb40ddaa 100644
--- a/openstack_dashboard/dashboards/admin/backups/tabs.py
+++ b/openstack_dashboard/dashboards/admin/backups/tabs.py
@@ -11,6 +11,8 @@
# under the License.
from openstack_dashboard.dashboards.project.backups \
+ import tables as backup_messages_tables
+from openstack_dashboard.dashboards.project.backups \
import tabs as project_tabs
@@ -19,5 +21,9 @@ class AdminBackupOverviewTab(project_tabs.BackupOverviewTab):
redirect_url = 'horizon:admin:backups:index'
+class BackupMessagesTab(project_tabs.BackupMessagesTab):
+ table_classes = (backup_messages_tables.BackupMessagesTable,)
+
+
class AdminBackupDetailTabs(project_tabs.BackupDetailTabs):
- tabs = (AdminBackupOverviewTab,)
+ tabs = (AdminBackupOverviewTab, BackupMessagesTab)
diff --git a/openstack_dashboard/dashboards/admin/backups/templates/backups/_detail_overview.html b/openstack_dashboard/dashboards/admin/backups/templates/backups/_detail_overview.html
index 948df205b..c878d33bf 100644
--- a/openstack_dashboard/dashboards/admin/backups/templates/backups/_detail_overview.html
+++ b/openstack_dashboard/dashboards/admin/backups/templates/backups/_detail_overview.html
@@ -14,6 +14,10 @@
<dd>{{ backup.project_id|default:_("-") }}</dd>
<dt>{% trans "Status" %}</dt>
<dd>{{ backup.status|capfirst }}</dd>
+ {% if backup.status == 'error' %}
+ <dt>{%trans "Fail reason"%}</dt>
+ <dd>{{ backup.fail_reason }} <dd>
+ {% endif %}
{% if volume %}
<dt>{% trans "Volume" %}</dt>
<dd>
diff --git a/openstack_dashboard/dashboards/admin/snapshots/tabs.py b/openstack_dashboard/dashboards/admin/snapshots/tabs.py
index 940fb074f..7ef2f5616 100644
--- a/openstack_dashboard/dashboards/admin/snapshots/tabs.py
+++ b/openstack_dashboard/dashboards/admin/snapshots/tabs.py
@@ -34,6 +34,6 @@ class SnapshotMessagesTab(project_tab.SnapshotMessagesTab):
table_classes = (snap_messages_tables.SnapshotMessagesTable,)
-class SnapshotDetailsTabs(tabs.TabGroup):
+class SnapshotDetailsTabs(tabs.DetailTabsGroup):
slug = "snapshot_details"
tabs = (OverviewTab, SnapshotMessagesTab)
diff --git a/openstack_dashboard/dashboards/project/backups/tables.py b/openstack_dashboard/dashboards/project/backups/tables.py
index 4cbf34ef8..6c0a1c46d 100644
--- a/openstack_dashboard/dashboards/project/backups/tables.py
+++ b/openstack_dashboard/dashboards/project/backups/tables.py
@@ -197,3 +197,21 @@ class BackupsTable(tables.DataTable):
row_class = UpdateRow
table_actions = (DeleteBackup,)
row_actions = (RestoreBackup, DeleteBackup)
+
+
+class BackupMessagesTable(tables.DataTable):
+ message_id = tables.Column("id", verbose_name=_("ID"))
+ message_level = tables.Column("message_level",
+ verbose_name=_("Message Level"))
+ event_id = tables.Column("event_id",
+ verbose_name=_("Event Id"))
+ user_message = tables.Column("user_message",
+ verbose_name=_("User Message"))
+ created_at = tables.Column("created_at",
+ verbose_name=_("Created At"))
+ guaranteed_until = tables.Column("guaranteed_until",
+ verbose_name=_("Guaranteed Until"))
+
+ class Meta(object):
+ name = "backup_messages"
+ verbose_name = _("Messages")
diff --git a/openstack_dashboard/dashboards/project/backups/tabs.py b/openstack_dashboard/dashboards/project/backups/tabs.py
index d867af485..74606fa45 100644
--- a/openstack_dashboard/dashboards/project/backups/tabs.py
+++ b/openstack_dashboard/dashboards/project/backups/tabs.py
@@ -18,6 +18,8 @@ from horizon import exceptions
from horizon import tabs
from openstack_dashboard.api import cinder
+from openstack_dashboard.dashboards.project.backups \
+ import tables as backup_messages_tables
class BackupOverviewTab(tabs.Tab):
@@ -53,6 +55,26 @@ class BackupOverviewTab(tabs.Tab):
redirect=redirect)
-class BackupDetailTabs(tabs.TabGroup):
+class BackupMessagesTab(tabs.TableTab):
+ table_classes = (backup_messages_tables.BackupMessagesTable,)
+ name = _("Messages")
+ slug = "messages_tab"
+ template_name = ("horizon/common/_detail_table.html")
+ preload = False
+
+ def get_backup_messages_data(self):
+ messages = []
+ backup = self.tab_group.kwargs['backup']
+ backup_id = backup.id
+ try:
+ messages = cinder.message_list(self.request, search_opts={
+ 'resource_type': 'volume_backup', 'resource_uuid': backup_id})
+ except Exception:
+ exceptions.handle(self.request, _("Unable to retrieve "
+ "backup messages."))
+ return messages
+
+
+class BackupDetailTabs(tabs.DetailTabsGroup):
slug = "backup_details"
- tabs = (BackupOverviewTab,)
+ tabs = (BackupOverviewTab, BackupMessagesTab)
diff --git a/openstack_dashboard/dashboards/project/backups/templates/backups/_detail_overview.html b/openstack_dashboard/dashboards/project/backups/templates/backups/_detail_overview.html
index 26e78b518..6567b88be 100644
--- a/openstack_dashboard/dashboards/project/backups/templates/backups/_detail_overview.html
+++ b/openstack_dashboard/dashboards/project/backups/templates/backups/_detail_overview.html
@@ -12,6 +12,10 @@
{% endif %}
<dt>{% trans "Status" %}</dt>
<dd>{{ backup.status|capfirst }}</dd>
+ {% if backup.status == 'error' %}
+ <dt>{%trans "Fail reason"%}</dt>
+ <dd>{{ backup.fail_reason }} <dd>
+ {% endif %}
{% if volume %}
<dt>{% trans "Volume" %}</dt>
<dd>
diff --git a/openstack_dashboard/dashboards/project/backups/tests.py b/openstack_dashboard/dashboards/project/backups/tests.py
index 4a93d782a..d769f10a8 100644
--- a/openstack_dashboard/dashboards/project/backups/tests.py
+++ b/openstack_dashboard/dashboards/project/backups/tests.py
@@ -9,7 +9,7 @@
# 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 urllib import parse
from django.conf import settings
@@ -20,6 +20,8 @@ from django.utils.http import urlencode
from openstack_dashboard import api
from openstack_dashboard.dashboards.project.backups \
import tables as backup_tables
+from openstack_dashboard.dashboards.project.backups \
+ import tabs
from openstack_dashboard.test import helpers as test
@@ -399,6 +401,38 @@ class VolumeBackupsViewTests(test.TestCase):
self.mock_volume_get.assert_called_once_with(
test.IsHttpRequest(), backup.volume_id)
+ @test.create_mocks({api.cinder: ('volume_backup_get',
+ 'volume_get',
+ 'message_list')})
+ def test_volume_backup_detail_view_with_messages_tab(self):
+
+ backup = self.cinder_volume_backups.first()
+ volume = self.cinder_volumes.first()
+
+ self.mock_volume_backup_get.return_value = backup
+ self.mock_volume_get.return_value = volume
+ messages = [msg for msg in self.cinder_messages.list()
+ if msg.resource_type == 'VOLUME_BACKUP']
+ self.mock_message_list.return_value = messages
+ url = reverse('horizon:project:backups:detail',
+ args=[backup.id])
+ detail_view = tabs.BackupDetailTabs(self.request)
+ messages_tab_link = "?%s=%s" % (
+ detail_view.param_name,
+ detail_view.get_tab("messages_tab").get_id())
+ url += messages_tab_link
+ res = self.client.get(url)
+ self.assertTemplateUsed(res, 'horizon/common/_detail.html')
+ self.assertContains(res, messages[0].user_message)
+ self.assertNoMessages()
+ self.mock_volume_backup_get.assert_has_calls([
+ mock.call(test.IsHttpRequest(), backup.id),
+ ])
+ search_opts = {'resource_type': 'volume_backup',
+ 'resource_uuid': backup.id}
+ self.mock_message_list.assert_called_once_with(
+ test.IsHttpRequest(), search_opts=search_opts)
+
@test.create_mocks({api.cinder: ('volume_list',
'volume_backup_restore')})
def test_restore_backup(self):
diff --git a/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/index.html b/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/index.html
index ac69cff24..7acd814d3 100644
--- a/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/index.html
+++ b/openstack_dashboard/dashboards/project/network_topology/templates/network_topology/index.html
@@ -47,4 +47,6 @@
});
}
</script>
+ </div>
+</div>
{% endblock %}
diff --git a/openstack_dashboard/dashboards/project/snapshots/tabs.py b/openstack_dashboard/dashboards/project/snapshots/tabs.py
index 5a3f63deb..34957b8a4 100644
--- a/openstack_dashboard/dashboards/project/snapshots/tabs.py
+++ b/openstack_dashboard/dashboards/project/snapshots/tabs.py
@@ -68,6 +68,6 @@ class SnapshotMessagesTab(tabs.TableTab):
return messages
-class SnapshotDetailTabs(tabs.TabGroup):
+class SnapshotDetailTabs(tabs.DetailTabsGroup):
slug = "snapshot_details"
tabs = (OverviewTab, SnapshotMessagesTab)
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers-model.service.js b/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers-model.service.js
index 2ace67ed3..d239c01a6 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers-model.service.js
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers-model.service.js
@@ -92,7 +92,7 @@
push.apply(model.containers, data.data.items);
}),
swiftAPI.getInfo().then(function onInfo(data) {
- model.swift_info = data.info;
+ model.swift_info = data.data.info;
})
]).then(function resolve() {
model.intialiseDeferred.resolve();
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers-model.service.spec.js b/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers-model.service.spec.js
index b67cb5be6..4b8ec824d 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers-model.service.spec.js
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers-model.service.spec.js
@@ -46,7 +46,7 @@
expect(swiftAPI.getInfo).toHaveBeenCalled();
expect(swiftAPI.getContainers).toHaveBeenCalled();
- infoDeferred.resolve({info: 'spam'});
+ infoDeferred.resolve({data: {info: 'spam'}});
containersDeferred.resolve({data: {items: ['two', 'items']}});
$rootScope.$apply();
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers.controller.js b/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers.controller.js
index 9c6a60615..eed4e3935 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers.controller.js
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/containers/containers.controller.js
@@ -97,11 +97,11 @@
return $q.when();
}
- var def = $q.defer();
// reverse the sense here - successful lookup == error so we reject the
// name if we find it in swift
- swiftAPI.getContainer(containerName, true).then(def.reject, def.resolve);
- return def.promise;
+ return swiftAPI.getContainer(containerName, true).then(function onSuccess(response) {
+ return $q.reject(response);
+ }, function onError() { return true; });
}
function selectContainer(container) {
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/configuration/configuration.html b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/configuration/configuration.html
index a9fb91582..1ef19adec 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/configuration/configuration.html
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/configuration/configuration.html
@@ -6,6 +6,7 @@
<load-edit title="{$ ctrl.title $}"
model="model.newInstanceSpec.user_data"
+ model-default-value="model.newInstanceSpec.default_user_data"
max-bytes="{$ ctrl.MAX_SCRIPT_SIZE $}"
key="user-data"
rows=8>
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/flavor/flavor.controller.js b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/flavor/flavor.controller.js
index 812172018..1590ad0dd 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/flavor/flavor.controller.js
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/flavor/flavor.controller.js
@@ -117,14 +117,14 @@
ng-show="item.errors.vcpus"
uib-popover="{$ item.errors.vcpus $}"
popover-placement="top" popover-append-to-body="true"
- popover-trigger="'mouseenter'"/>
+ popover-trigger="'mouseenter'"></span>
<span>{$ item.vcpus $}</span>`},
{id: 'ram', title: gettext('RAM'), priority: 1,
template: `<span class="invalid fa fa-exclamation-triangle"
ng-show="item.errors.ram"
uib-popover="{$ item.errors.ram $}"
popover-placement="top" popover-append-to-body="true"
- popover-trigger="'mouseenter'"/>
+ popover-trigger="'mouseenter'"></span>
<span>{$ item.ram | mb $}</span>`},
{id: 'totalDisk', title: gettext('Total Disk'), filters: ['gb'], priority: 1},
{id: 'rootDisk', title: gettext('Root Disk'), priority: 2,
@@ -132,7 +132,7 @@
ng-show="item.errors.disk"
uib-popover="{$ item.errors.disk $}"
popover-placement="top" popover-append-to-body="true"
- popover-trigger="'mouseenter'"/>
+ popover-trigger="'mouseenter'"></span>
<span>{$ item.rootDisk | gb $}</span>`},
{id: 'ephemeralDisk', title: gettext('Ephemeral Disk'), filters: ['gb'], priority: 2},
{id: 'isPublic', title: gettext('Public'), filters: ['yesno'], priority: 1}
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.js b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.js
index 810858829..26086bc14 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.js
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.js
@@ -182,6 +182,7 @@
description: null,
// REQUIRED Server Key. Null allowed.
user_data: '',
+ default_user_data: '',
disk_config: 'AUTO',
// REQUIRED
flavor: null,
@@ -249,6 +250,10 @@
function (response) {
model.defaultBootSource = response;
});
+ settings.getSetting("OPENSTACK_SERVER_DEFAULT_USER_DATA").then(
+ function (response) {
+ model.newInstanceSpec.default_user_data = response.OPENSTACK_SERVER_DEFAULT_USER_DATA;
+ });
promise = $q.all([
launchInstanceDefaults.then(setDefaultValues, noop),
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.spec.js b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.spec.js
index 4b6acfdb1..fa15af910 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.spec.js
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-model.service.spec.js
@@ -186,7 +186,8 @@
disable_volume_snapshot: false,
default_availability_zone: 'Any'
},
- DEFAULT_BOOT_SOURCE: 'image'
+ DEFAULT_BOOT_SOURCE: 'image',
+ OPENSTACK_SERVER_DEFAULT_USER_DATA: ''
};
IMAGE = {type: 'image', label: 'Image', selected: true};
VOLUME = {type: 'volume', label: 'Volume', selected: false};
@@ -883,7 +884,7 @@
// This is here to ensure that as people add/change items, they
// don't forget to implement tests for them.
it('has the right number of properties', function() {
- expect(Object.keys(model.newInstanceSpec).length).toBe(22);
+ expect(Object.keys(model.newInstanceSpec).length).toBe(23);
});
it('sets availability zone to null', function() {
@@ -910,6 +911,10 @@
expect(model.newInstanceSpec.user_data).toBe('');
});
+ it('sets default user data to an empty string', function() {
+ expect(model.newInstanceSpec.default_user_data).toBe('');
+ });
+
it('sets disk config to AUTO', function() {
expect(model.newInstanceSpec.disk_config).toBe('AUTO');
});
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-workflow.service.js b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-workflow.service.js
index 0d5f75783..f9e01d2b2 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-workflow.service.js
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/launch-instance-workflow.service.js
@@ -66,7 +66,8 @@
templateUrl: basePath + 'networkports/ports.html',
helpUrl: basePath + 'networkports/ports.help.html',
formName: 'launchInstanceNetworkPortForm',
- requiredServiceTypes: ['network']
+ requiredServiceTypes: ['network'],
+ setting: 'LAUNCH_INSTANCE_DEFAULTS.enable_net_ports'
},
{
id: 'secgroups',
@@ -112,7 +113,8 @@
title: gettext('Metadata'),
templateUrl: basePath + 'metadata/metadata.html',
helpUrl: basePath + 'metadata/metadata.help.html',
- formName: 'launchInstanceMetadataForm'
+ formName: 'launchInstanceMetadataForm',
+ setting: 'LAUNCH_INSTANCE_DEFAULTS.enable_metadata'
}
],
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network-details.html b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network-details.html
new file mode 100644
index 000000000..cee9222ed
--- /dev/null
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network-details.html
@@ -0,0 +1,23 @@
+<dl class="network-details dl-horizontal">
+ <dt translate>ID</dt>
+ <dd>{$ item.id $}</dd>
+ <dt translate>Project</dt>
+ <dd>{$ item.tenant_id $}</dd>
+ <dt translate>External Network</dt>
+ <dd>{$ item['router:external'] | yesno $}</dd>
+</dl>
+<span class="h5" translate>Provider Network</span>
+<div class="item" class="detail">
+ <dl class="col-sm-4">
+ <dt translate>Type</dt>
+ <dd>{$ item['provider:network_type'] $}</dd>
+ </dl>
+ <dl class="col-sm-4">
+ <dt translate>Segmentation ID</dt>
+ <dd>{$ item['provider:segmentation_id'] $}</dd>
+ </dl>
+ <dl class="col-sm-4">
+ <dt translate>Physical Network</dt>
+ <dd>{$ item['provider:physical_network'] $}</dd>
+ </dl>
+</div>
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.controller.js b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.controller.js
index 6126c9099..bd2f32465 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.controller.js
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.controller.js
@@ -28,11 +28,12 @@
LaunchInstanceNetworkController.$inject = [
'$scope',
+ 'horizon.dashboard.project.workflow.launch-instance.basePath',
'horizon.framework.widgets.action-list.button-tooltip.row-warning.service',
'launchInstanceModel'
];
- function LaunchInstanceNetworkController($scope, tooltipService, launchInstanceModel) {
+ function LaunchInstanceNetworkController($scope, basePath, tooltipService, launchInstanceModel) {
var ctrl = this;
ctrl.networkStatuses = {
@@ -45,21 +46,45 @@
'DOWN': gettext('Down')
};
+ function getStatus(status) {
+ return ctrl.networkStatuses[status];
+ }
+
+ function getAdminState(state) {
+ return ctrl.networkAdminStates[state];
+ }
+
ctrl.tableDataMulti = {
- available: $scope.model.networks,
- allocated: $scope.model.newInstanceSpec.networks,
- displayedAvailable: [],
- displayedAllocated: [],
+ available: launchInstanceModel.networks,
+ allocated: launchInstanceModel.newInstanceSpec.networks,
minItems: 1
};
+ ctrl.availableTableConfig = {
+ selectAll: false,
+ trackId: 'id',
+ detailsTemplateUrl: basePath + 'network/network-details.html',
+ columns: [
+ {id: 'name', title: gettext('Network'), priority: 1,
+ template: '<div>{$ item.name || item.id $}</div>'},
+ {id: 'subnets', title: gettext('Subnets Associated'), priority: 2,
+ template: '<div ng-repeat="subnet in item.subnets">{$ subnet.name || subnet.id $}</div>'},
+ {id: 'shared', title: gettext('Shared'), filters: ['yesno'], priority: 1},
+ {id: 'admin_state', title: gettext('Admin State'), filters: [getAdminState], priority: 1},
+ {id: 'status', title: gettext('Status'), filters: [getStatus], priority: 1}
+ ]
+ };
+
+ ctrl.allocatedTableConfig = angular.copy(ctrl.availableTableConfig);
+ ctrl.allocatedTableConfig.noItemsMessage = gettext(
+ 'Select one or more networks from the available networks below.');
+
ctrl.tableLimits = {
maxAllocation: -1
};
ctrl.tableHelpText = {
- allocHelpText: gettext('Select networks from those listed below.'),
- availHelpText: gettext('Select at least one network')
+ availHelpText: gettext('Select one or more')
};
ctrl.tooltipModel = tooltipService;
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.controller.spec.js b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.controller.spec.js
index d2e962fc5..22dad6442 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.controller.spec.js
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.controller.spec.js
@@ -82,7 +82,6 @@
it('contains help text for the table', function() {
expect(ctrl.tableHelpText).toBeDefined();
- expect(ctrl.tableHelpText.allocHelpText).toBeDefined();
expect(ctrl.tableHelpText.availHelpText).toBeDefined();
});
@@ -90,8 +89,6 @@
expect(ctrl.tableDataMulti).toBeDefined();
expect(ctrl.tableDataMulti.available).toEqual(['net-a', 'net-b']);
expect(ctrl.tableDataMulti.allocated).toEqual(['net-a']);
- expect(ctrl.tableDataMulti.displayedAllocated).toEqual([]);
- expect(ctrl.tableDataMulti.displayedAvailable).toEqual([]);
expect(ctrl.tableDataMulti.minItems).toEqual(1);
});
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.html b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.html
index eeda2f914..d52e00ff2 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.html
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/network/network.html
@@ -1,169 +1,16 @@
<div ng-controller="LaunchInstanceNetworkController as ctrl">
<p class="step-description" translate>
- Networks provide the communication channels for instances in the cloud.
+ Networks provide the communication channels for instances in the cloud. You can select ports instead of networks or a mix of both.
</p>
- <transfer-table tr-model="ctrl.tableDataMulti" help-text="ctrl.tableHelpText" limits="ctrl.tableLimits">
- <allocated validate-number-min="{$ ctrl.tableDataMulti.minItems $}" ng-model="ctrl.tableDataMulti.allocated.length">
- <table st-table="ctrl.tableDataMulti.displayedAllocated" st-safe-src="ctrl.tableDataMulti.allocated" hz-table
- class="table table-striped table-rsp table-detail">
- <thead>
- <tr>
- <th class="reorder"></th>
- <th class="expander"></th>
- <th class="rsp-p1" translate>Network</th>
- <th class="rsp-p2" translate>Subnets Associated</th>
- <th class="rsp-p1" translate>Shared</th>
- <th class="rsp-p1" translate>Admin State</th>
- <th class="rsp-p1" translate>Status</th>
- <th></th>
- </tr>
- </thead>
- <tbody>
- <tr ng-if="ctrl.tableDataMulti.allocated.length === 0">
- <td colspan="8">
- <div class="no-rows-help" translate>
- Select an item from Available items below
- </div>
- </td>
- </tr>
- <tr ng-repeat-start="row in ctrl.tableDataMulti.displayedAllocated track by row.id"
- lr-drag-data="ctrl.tableDataMulti.displayedAllocated" lr-drag-src="reorder"
- lr-drop-target="reorder" lr-drop-success="trCtrl.updateAllocated(e, item, collection)">
- <td class="reorder">
- <span class="fa fa-sort" title="{$ 'Re-order items using drag and drop'|translate $}"></span>
- {$ $index + 1 $}
- </td>
- <td class="expander">
- <span class="fa fa-chevron-right" hz-expand-detail
- title="{$ 'Click to see more details'|translate $}"></span>
- </td>
- <td class="rsp-p1 word-break">{$ row.name || row.id $}</td>
- <td class="rsp-p2">
- <div ng-repeat="subnet in row.subnets">{$ subnet.name || subnet.id $}</div>
- </td>
- <td class="rsp-p1">{$ row.shared | yesno $}</td>
- <td class="rsp-p1">{$ row.admin_state | decode:ctrl.networkAdminStates $}</td>
- <td class="rsp-p1">{$ row.status | decode:ctrl.networkStatuses $}</td>
- <td class="actions_column">
- <action-list>
- <action action-classes="'btn btn-default'"
- callback="trCtrl.deallocate" item="row">
- <span class="fa fa-arrow-down"></span>
- </action>
- </action-list>
- </td>
- </tr>
- <tr ng-repeat-end class="detail-row">
- <td colspan="9" class="detail">
- <dl class="dl-horizontal">
- <dt translate>ID</dt>
- <dd>{$ row.id $}</dd>
- <dt translate>Project</dt>
- <dd>{$ row.tenant_id $}</dd>
- <dt translate>External Network</dt>
- <dd>{$ row['router:external'] | yesno $}</dd>
- </dl>
- <span class="h5" translate>Provider Network</span>
- <div class="row" class="detail">
- <dl class="col-sm-4">
- <dt translate>Type</dt>
- <dd>{$ row['provider:network_type'] $}</dd>
- </dl>
- <dl class="col-sm-4">
- <dt translate>Segmentation ID</dt>
- <dd>{$ row['provider:segmentation_id'] $}</dd>
- </dl>
- <dl class="col-sm-4">
- <dt translate>Physical Network</dt>
- <dd>{$ row['provider:physical_network'] $}</dd>
- </dl>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- </allocated>
- <available>
- <hz-magic-search-context filter-facets="ctrl.networkFacets">
- <hz-magic-search-bar></hz-magic-search-bar>
- <table st-magic-search st-table="ctrl.tableDataMulti.displayedAvailable" st-safe-src="ctrl.tableDataMulti.available"
- hz-table class="table table-striped table-rsp table-detail">
- <thead>
- <tr>
- <th class="expander"></th>
- <th st-sort="name" st-sort-default class="rsp-p1" translate>Network</th>
- <th class="rsp-p2" translate>Subnets Associated</th>
- <th st-sort="shared" class="rsp-p1" translate>Shared</th>
- <th st-sort="admin_state" class="rsp-p1" translate>Admin State</th>
- <th st-sort="status" class="rsp-p1" translate>Status</th>
- <th></th>
- </tr>
- </thead>
- <tbody>
- <tr ng-if="trCtrl.numAvailable() === 0">
- <td colspan="7">
- <div class="no-rows-help" translate>
- No available items
- </div>
- </td>
- </tr>
- <tr ng-repeat-start="row in ctrl.tableDataMulti.displayedAvailable track by row.id" ng-if="!trCtrl.allocatedIds[row.id]">
- <td class="expander">
- <span class="fa fa-chevron-right" hz-expand-detail
- title="{$ 'Click to see more details'|translate $}"></span>
- </td>
- <td class="rsp-p1 word-break">{$ row.name || row.id $}</td>
- <td class="rsp-p2">
- <div ng-repeat="subnet in row.subnets">{$ subnet.name || subnet.id $}</div>
- </td>
- <td class="rsp-p1">{$ row.shared | yesno $}</td>
- <td class="rsp-p1">{$ row.admin_state | decode:ctrl.networkAdminStates $}</td>
- <td class="rsp-p1">{$ row.status | decode:ctrl.networkStatuses $}</td>
- <td class="actions_column">
- <action-list button-tooltip="row.warningMessage"
- bt-model="ctrl.tooltipModel" bt-disabled="!row.disabled"
- warning-classes="'invalid'">
- <notifications>
- <span class="fa fa-exclamation-circle invalid" ng-show="row.disabled"></span>
- </notifications>
- <action action-classes="'btn btn-default'"
- callback="trCtrl.allocate" item="row" disabled="row.disabled">
- <span class="fa fa-arrow-up"></span>
- </action>
- </action-list>
- </td>
- </tr>
- <tr ng-repeat-end class="detail-row" ng-if="!trCtrl.allocatedIds[row.id]">
- <td colspan="9" class="detail">
- <dl class="dl-horizontal">
- <dt translate>ID</dt>
- <dd>{$ row.id $}</dd>
- <dt translate>Project</dt>
- <dd>{$ row.tenant_id $}</dd>
- <dt translate>External Network</dt>
- <dd>{$ row['router:external'] | yesno $}</dd>
- </dl>
- <span class="h5" translate>Provider Network</span>
- <div class="row">
- <dl class="col-sm-4">
- <dt translate>Type</dt>
- <dd>{$ row['provider:network_type'] $}</dd>
- </dl>
- <dl class="col-sm-4">
- <dt translate>Segmentation ID</dt>
- <dd>{$ row['provider:segmentation_id'] $}</dd>
- </dl>
- <dl class="col-sm-4">
- <dt translate>Physical Network</dt>
- <dd>{$ row['provider:physical_network'] $}</dd>
- </dl>
- </div>
- </td>
- </tr>
- </tbody>
- </table>
- </hz-magic-search-context>
- </available>
- </transfer-table>
+ <transfer-table tr-model="ctrl.tableDataMulti" help-text="ctrl.tableHelpText" limits="ctrl.tableLimits" clone-content>
+ <hz-dynamic-table
+ config="$isAvailableTable ? ctrl.availableTableConfig : ctrl.allocatedTableConfig"
+ items="$isAvailableTable ? ($sourceItems | filterAvailable:trCtrl.allocatedIds) : $sourceItems"
+ validate-number-min="{$ ctrl.tableDataMulti.minItems $}" ng-model="ctrl.tableDataMulti.allocated.length"
+ item-actions="trCtrl.itemActions"
+ filter-facets="$isAvailableTable && ctrl.networkFacets"
+ table="ctrl">
+ </hz-dynamic-table>
+ </transfer-table> <!-- End Networks Transfer Table -->
</div>
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.controller.js b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.controller.js
index 462a8573e..e4483b755 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.controller.js
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.controller.js
@@ -100,10 +100,11 @@
};
ctrl.allocatedTableConfig = angular.copy(ctrl.availableTableConfig);
+ ctrl.allocatedTableConfig.noItemsMessage = gettext(
+ 'Select one or more ports from the available ports below.');
ctrl.tableHelpText = {
- allocHelpText: gettext('Select ports from those listed below.'),
- availHelpText: gettext('Select one or more ports')
+ availHelpText: gettext('Select one or more')
};
ctrl.filterFacets = [{
diff --git a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.spec.js b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.spec.js
index da5611aa1..459a1e5f0 100644
--- a/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.spec.js
+++ b/openstack_dashboard/dashboards/project/static/dashboard/project/workflow/launch-instance/networkports/ports.spec.js
@@ -59,7 +59,6 @@
it('contains help text for the table', function() {
expect(ctrl.tableHelpText).toBeDefined();
- expect(ctrl.tableHelpText.allocHelpText).toBeDefined();
});
it('nameOrID returns the name', function() {
diff --git a/openstack_dashboard/defaults.py b/openstack_dashboard/defaults.py
index 4ed8d1fc5..8d8e4ae8a 100644
--- a/openstack_dashboard/defaults.py
+++ b/openstack_dashboard/defaults.py
@@ -251,9 +251,14 @@ LAUNCH_INSTANCE_DEFAULTS = {
'disable_volume': False,
'disable_volume_snapshot': False,
'enable_scheduler_hints': True,
+ 'enable_metadata': True,
+ 'enable_net_ports': True,
'default_availability_zone': 'Any',
}
+# A Django template astring that will be used as default user_data for new VMs
+OPENSTACK_SERVER_DEFAULT_USER_DATA = ""
+
# The absolute path to the directory where message files are collected.
# The message file must have a .json file extension. When the user logins to
# horizon, the message files collected are processed and displayed to the user.
diff --git a/openstack_dashboard/locale/cs/LC_MESSAGES/django.po b/openstack_dashboard/locale/cs/LC_MESSAGES/django.po
index 944f13b36..2f825ad23 100644
--- a/openstack_dashboard/locale/cs/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/cs/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-06-21 10:46+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -6837,8 +6837,5 @@ msgstr "nedefinováno"
msgid "unknown IP address"
msgstr "neznámá IP adresa"
-msgid "vCPUs ="
-msgstr "vCPUs ="
-
msgid "yes"
msgstr "ano"
diff --git a/openstack_dashboard/locale/cs/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/cs/LC_MESSAGES/djangojs.po
index b668aa30a..2f96f4584 100644
--- a/openstack_dashboard/locale/cs/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/cs/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2020-01-08 17:19+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1204,9 +1204,6 @@ msgstr "Prvky sítě"
msgid "Networks"
msgstr "Sítě"
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr "Sítě poskytují komunikační kanály pro instance v cloudu."
-
msgid "Newer"
msgstr "Novější"
@@ -1473,9 +1470,6 @@ msgstr "ID ramdisku"
msgid "Raw"
msgstr "Raw"
-msgid "Re-order items using drag and drop"
-msgstr "Řazení položek změňte přetažením"
-
msgid "Remote"
msgstr "Vzdálené"
@@ -1554,12 +1548,6 @@ msgstr "Vyberte zdroj ze seznamu níže"
msgid "Select an item from Available items below"
msgstr "Vyberte položku ze seznamu níže"
-msgid "Select at least one network"
-msgstr "Vyberte alespoň jednu síť"
-
-msgid "Select networks from those listed below."
-msgstr "Vyberte sítě ze seznamu níže."
-
msgid "Select one"
msgstr "Vyberte jeden"
@@ -1570,9 +1558,6 @@ msgid "Select one or more security groups from the available groups below."
msgstr ""
"Vyberte jednu nebo více bezpečnostních skupin ze seznamu dostupných níže."
-msgid "Select ports from those listed below."
-msgstr "Vyberte porty ze seznamu níže."
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "Vyberte Ramdisk dostupnosti ze seznamu."
diff --git a/openstack_dashboard/locale/de/LC_MESSAGES/django.po b/openstack_dashboard/locale/de/LC_MESSAGES/django.po
index 42b6642b0..10d7f5473 100644
--- a/openstack_dashboard/locale/de/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/de/LC_MESSAGES/django.po
@@ -19,7 +19,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-06-21 10:46+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -8928,8 +8928,5 @@ msgstr "unbekannte IP-Adresse"
msgid "up"
msgstr "Aktiv"
-msgid "vCPUs ="
-msgstr "vCPUs ="
-
msgid "yes"
msgstr "ja"
diff --git a/openstack_dashboard/locale/de/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/de/LC_MESSAGES/djangojs.po
index 51c1ea909..2a8ed1d7e 100644
--- a/openstack_dashboard/locale/de/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/de/LC_MESSAGES/djangojs.po
@@ -16,7 +16,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-04-09 08:30+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1904,11 +1904,6 @@ msgstr ""
"Netzwerke von Subports können erst nach den Booten aktiv werden. Sie werden "
"verfügbar, wenn der Trunk den <em>AKTIV</em> Zustand erreicht."
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr ""
-"Netzwerke stellen die Kommunikationskanäle für die Instanzen in der Cloud "
-"zur Verfügung."
-
msgid "New File Contents"
msgstr "Inhalt neue Datei"
@@ -2303,9 +2298,6 @@ msgstr "Ramdisk-ID"
msgid "Raw"
msgstr "Raw"
-msgid "Re-order items using drag and drop"
-msgstr "Umsortieren der Positionen durch ziehen und ablegen"
-
msgid "Registered Resource Types"
msgstr "Registrierte Ressourcentypen"
@@ -2466,9 +2458,6 @@ msgstr ""
msgid "Select an item from Available items below"
msgstr "Wählen Sie einen Eintrag aus den verfügbaren Positionen aus"
-msgid "Select at least one network"
-msgstr "Wählen Sie mindestens ein Netzwerk aus"
-
msgid "Select from the list of available ports below."
msgstr "Wählen Sie aus den unten stehenden verfügbaren Ports aus."
@@ -2478,9 +2467,6 @@ msgstr "Wählen Sie Einträge aus den verfügbaren Positionen aus"
msgid "Select many"
msgstr "Mehrere auswählen"
-msgid "Select networks from those listed below."
-msgstr "Wählen Sie aus den unten stehenden Netzwerken aus."
-
msgid "Select one"
msgstr "Eines auswählen"
@@ -2492,9 +2478,6 @@ msgstr ""
"Wählen Sie eine oder mehrere Sicherheitsgruppen aus den verfügbaren unten "
"stehenden Gruppen aus."
-msgid "Select ports from those listed below."
-msgstr "Wählen Sie Ports aus den nachstehend aufgelisteten Ports aus."
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "Wählen Sie die Ramdisk aus dem Drop-Down Menü"
diff --git a/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po b/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po
index 78c68daaf..612dcdb84 100644
--- a/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/en_AU/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-06-21 10:46+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -7227,8 +7227,5 @@ msgstr "unknown IP address"
msgid "up"
msgstr "up"
-msgid "vCPUs ="
-msgstr "vCPUs ="
-
msgid "yes"
msgstr "yes"
diff --git a/openstack_dashboard/locale/en_AU/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/en_AU/LC_MESSAGES/djangojs.po
index f2aedf87a..d770a30c0 100644
--- a/openstack_dashboard/locale/en_AU/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/en_AU/LC_MESSAGES/djangojs.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2020-01-08 17:19+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1236,10 +1236,6 @@ msgstr "Network characteristics"
msgid "Networks"
msgstr "Networks"
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr ""
-"Networks provide the communication channels for instances in the cloud."
-
msgid "New File Contents"
msgstr "New File Contents"
@@ -1519,9 +1515,6 @@ msgstr "Ramdisk ID"
msgid "Raw"
msgstr "Raw"
-msgid "Re-order items using drag and drop"
-msgstr "Re-order items using drag and drop"
-
msgid "Registered Resource Types"
msgstr "Registered Resource Types"
@@ -1600,12 +1593,6 @@ msgstr "Select a source from those listed below."
msgid "Select an item from Available items below"
msgstr "Select an item from Available items below"
-msgid "Select at least one network"
-msgstr "Select at least one network"
-
-msgid "Select networks from those listed below."
-msgstr "Select networks from those listed below."
-
msgid "Select one"
msgstr "Select one"
@@ -1615,9 +1602,6 @@ msgstr "Select one or more"
msgid "Select one or more security groups from the available groups below."
msgstr "Select one or more security groups from the available groups below."
-msgid "Select ports from those listed below."
-msgstr "Select ports from those listed below."
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "Select the Ramdisk from the drop down menu."
diff --git a/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po b/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po
index daa8f9573..16c2477c2 100644
--- a/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/en_GB/LC_MESSAGES/django.po
@@ -13,11 +13,11 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-05-19 10:45+0000\n"
+"POT-Creation-Date: 2022-09-08 12:53+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2022-05-25 09:04+0000\n"
+"PO-Revision-Date: 2022-09-10 01:47+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>\n"
"Language-Team: English (United Kingdom)\n"
"Language: en_GB\n"
@@ -2781,6 +2781,9 @@ msgstr "Extra Specs"
msgid "FQDN"
msgstr "FQDN"
+msgid "Fail reason"
+msgstr "Fail reason"
+
msgctxt "Power state of an Instance"
msgid "Failed"
msgstr "Failed"
@@ -7360,6 +7363,9 @@ msgstr "Unable to retrieve availability zones."
msgid "Unable to retrieve backup details."
msgstr "Unable to retrieve backup details."
+msgid "Unable to retrieve backup messages."
+msgstr "Unable to retrieve backup messages."
+
msgid "Unable to retrieve community images."
msgstr "Unable to retrieve community images."
@@ -8809,8 +8815,5 @@ msgstr "unknown IP address"
msgid "up"
msgstr "up"
-msgid "vCPUs ="
-msgstr "vCPUs ="
-
msgid "yes"
msgstr "yes"
diff --git a/openstack_dashboard/locale/en_GB/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/en_GB/LC_MESSAGES/djangojs.po
index 8d835d980..62d3e73a7 100644
--- a/openstack_dashboard/locale/en_GB/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/en_GB/LC_MESSAGES/djangojs.po
@@ -12,11 +12,11 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-05-19 10:45+0000\n"
+"POT-Creation-Date: 2022-09-06 04:29+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2022-05-25 09:13+0000\n"
+"PO-Revision-Date: 2022-09-05 10:28+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>\n"
"Language-Team: English (United Kingdom)\n"
"Language: en_GB\n"
@@ -1947,9 +1947,12 @@ msgstr ""
" moment of bootup. But they will be available after the trunk reached\n"
" the <em>ACTIVE</em> status."
-msgid "Networks provide the communication channels for instances in the cloud."
+msgid ""
+"Networks provide the communication channels for instances in the cloud. You "
+"can select ports instead of networks or a mix of both."
msgstr ""
-"Networks provide the communication channels for instances in the cloud."
+"Networks provide communication channels for instances in the cloud. You can "
+"select ports instead of networks or a mix of both."
msgid "New File Contents"
msgstr "New File Contents"
@@ -2368,9 +2371,6 @@ msgstr "Ramdisk ID"
msgid "Raw"
msgstr "Raw"
-msgid "Re-order items using drag and drop"
-msgstr "Re-order items using drag and drop"
-
msgid "Registered Resource Types"
msgstr "Registered Resource Types"
@@ -2543,9 +2543,6 @@ msgstr ""
msgid "Select an item from Available items below"
msgstr "Select an item from Available items below"
-msgid "Select at least one network"
-msgstr "Select at least one network"
-
msgid "Select from the list of available ports below."
msgstr "Select from the list of available ports below."
@@ -2555,24 +2552,21 @@ msgstr "Select items from Available items below"
msgid "Select many"
msgstr "Select many"
-msgid "Select networks from those listed below."
-msgstr "Select networks from those listed below."
-
msgid "Select one"
msgstr "Select one"
msgid "Select one or more"
msgstr "Select one or more"
-msgid "Select one or more ports"
-msgstr "Select one or more ports"
+msgid "Select one or more networks from the available networks below."
+msgstr "Select one or more networks from the available networks below."
+
+msgid "Select one or more ports from the available ports below."
+msgstr "Select one or more ports from the available ports below."
msgid "Select one or more security groups from the available groups below."
msgstr "Select one or more security groups from the available groups below."
-msgid "Select ports from those listed below."
-msgstr "Select ports from those listed below."
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "Select the Ramdisk from the drop down menu."
diff --git a/openstack_dashboard/locale/eo/LC_MESSAGES/django.po b/openstack_dashboard/locale/eo/LC_MESSAGES/django.po
index b73c9b728..7c2cd4ee3 100644
--- a/openstack_dashboard/locale/eo/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/eo/LC_MESSAGES/django.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-06-21 10:46+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -8760,8 +8760,5 @@ msgstr "nekonata IP adreso"
msgid "up"
msgstr "supren"
-msgid "vCPUs ="
-msgstr "vCPUs ="
-
msgid "yes"
msgstr "jes"
diff --git a/openstack_dashboard/locale/eo/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/eo/LC_MESSAGES/djangojs.po
index 6cc1a7628..c3cb00777 100644
--- a/openstack_dashboard/locale/eo/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/eo/LC_MESSAGES/djangojs.po
@@ -7,11 +7,11 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-03-05 09:39+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2021-03-05 02:31+0000\n"
+"PO-Revision-Date: 2021-03-05 02:30+0000\n"
"Last-Translator: Georg Hennemann <georg.hennemann@t-systems.com>\n"
"Language-Team: Esperanto\n"
"Language: eo\n"
@@ -1871,9 +1871,6 @@ msgstr ""
" momento de praŝargo. Sed ili estos disponebla post la trunko atingis\n"
" la <em>AKTIVA</em> statuson."
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr "Retoj provizas la komunikadajn kanalojn por aperoj en la nubo."
-
msgid "New File Contents"
msgstr "Nova Dosiero Enhavo"
@@ -2265,9 +2262,6 @@ msgstr "Ram-disko ID"
msgid "Raw"
msgstr "Kruda"
-msgid "Re-order items using drag and drop"
-msgstr "Re-ordigu elementojn ŝovmetante"
-
msgid "Registered Resource Types"
msgstr "Registritaj Risurco Tipoj"
@@ -2426,9 +2420,6 @@ msgstr ""
msgid "Select an item from Available items below"
msgstr "Elektu unu elemento de la haveblaj elementoj malsupren"
-msgid "Select at least one network"
-msgstr "Elektu minimume unu reton"
-
msgid "Select from the list of available ports below."
msgstr "Elektu el al listo de haveblaj pordoj suben."
@@ -2438,24 +2429,15 @@ msgstr "Elektu elementojn de Haveblaj elementoj suben"
msgid "Select many"
msgstr "Elektu multajn"
-msgid "Select networks from those listed below."
-msgstr "Elektu retojn de tiuj listigita suben."
-
msgid "Select one"
msgstr "Elektu unu"
msgid "Select one or more"
msgstr "Elektu unu aŭ pli"
-msgid "Select one or more ports"
-msgstr "Elektu unu aŭ pli pordojn"
-
msgid "Select one or more security groups from the available groups below."
msgstr "Elektu unu aŭ pli da secureco grupojn de la haveblaj grupojn suben."
-msgid "Select ports from those listed below."
-msgstr "Elektu pordojn de tiuj listigita suben."
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "Elektu la Ram-disko el la kurtena menuo. "
diff --git a/openstack_dashboard/locale/es/LC_MESSAGES/django.po b/openstack_dashboard/locale/es/LC_MESSAGES/django.po
index 8af2b837a..2465a68c0 100644
--- a/openstack_dashboard/locale/es/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/es/LC_MESSAGES/django.po
@@ -15,7 +15,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-06-21 10:46+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -9007,8 +9007,5 @@ msgstr "Dirección IP desconocida"
msgid "up"
msgstr "arriba"
-msgid "vCPUs ="
-msgstr "vCPUs ="
-
msgid "yes"
msgstr "sí"
diff --git a/openstack_dashboard/locale/es/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/es/LC_MESSAGES/djangojs.po
index 01382c2ba..4295a74a2 100644
--- a/openstack_dashboard/locale/es/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/es/LC_MESSAGES/djangojs.po
@@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-06-06 15:02+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1859,10 +1859,6 @@ msgstr ""
" de arranque. Pero sí estarán disponibles una vez el enlace troncal\n"
" alcance el estado <em>ACTIVO</em>."
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr ""
-"Las Redes proveen los canales de comunicación para las instancias en la nube."
-
msgid "New File Contents"
msgstr "Contenido del nuevo fichero"
@@ -2255,9 +2251,6 @@ msgstr "Ramdisk ID"
msgid "Raw"
msgstr "Raw"
-msgid "Re-order items using drag and drop"
-msgstr "Reordene los ítems arrastrando y soltando."
-
msgid "Registered Resource Types"
msgstr "Tipos de recursos registrados"
@@ -2418,9 +2411,6 @@ msgstr ""
msgid "Select an item from Available items below"
msgstr "Seleccione un ítem de los disponibles abajo"
-msgid "Select at least one network"
-msgstr "Seleccionar al menos una red"
-
msgid "Select from the list of available ports below."
msgstr "Seleccione de la siguiente lista de puertos disponibles."
@@ -2430,26 +2420,17 @@ msgstr "Seleccione elementos de los disponibles a continuación"
msgid "Select many"
msgstr "Seleccionar varios"
-msgid "Select networks from those listed below."
-msgstr "Seleccionar redes de las listadas abajo."
-
msgid "Select one"
msgstr "Seleccionar uno"
msgid "Select one or more"
msgstr "Seleccionar uno o más"
-msgid "Select one or more ports"
-msgstr "Seleccionar uno o más puertos"
-
msgid "Select one or more security groups from the available groups below."
msgstr ""
"Seleccionar uno o más grupos de seguridad de los grupos disponibles a "
"continuación."
-msgid "Select ports from those listed below."
-msgstr "Seleccione puertos de entre los que se listan a continuación."
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "Seleccione el Disco RAM en el menú desplegable."
diff --git a/openstack_dashboard/locale/fr/LC_MESSAGES/django.po b/openstack_dashboard/locale/fr/LC_MESSAGES/django.po
index b16d5e45b..ebf5ca5fe 100644
--- a/openstack_dashboard/locale/fr/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/fr/LC_MESSAGES/django.po
@@ -26,7 +26,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-06-21 10:46+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -8576,8 +8576,5 @@ msgstr "Adresse IP inconnue"
msgid "up"
msgstr "actif"
-msgid "vCPUs ="
-msgstr "VCPU ="
-
msgid "yes"
msgstr "oui"
diff --git a/openstack_dashboard/locale/fr/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/fr/LC_MESSAGES/djangojs.po
index 294be6b31..55d74938f 100644
--- a/openstack_dashboard/locale/fr/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/fr/LC_MESSAGES/djangojs.po
@@ -30,7 +30,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2020-01-08 17:19+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1840,11 +1840,6 @@ msgstr "Caractéristiques de réseau"
msgid "Networks"
msgstr "Réseaux"
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr ""
-"Les réseaux fournissent les canaux de communication des instances dans le "
-"cloud."
-
msgid "New File Contents"
msgstr "Nouveau contenu du fichier"
@@ -2214,10 +2209,6 @@ msgstr "ID Ramdisk"
msgid "Raw"
msgstr "Raw"
-msgid "Re-order items using drag and drop"
-msgstr ""
-"Ordonnancer les éléments à nouveau en utilisant l'opération glisser-déplacer"
-
msgid "Registered Resource Types"
msgstr "Types de ressources enregistrés"
@@ -2364,15 +2355,9 @@ msgstr "Sélectionnez une source parmi celles qui sont listées ci-dessous."
msgid "Select an item from Available items below"
msgstr "Sélectionner un élément depuis les éléments disponibles ci-dessous"
-msgid "Select at least one network"
-msgstr "Sélectionner au moins un réseau"
-
msgid "Select items from Available items below"
msgstr "Sélectionner des éléments parmi les éléments Disponibles ci-dessous"
-msgid "Select networks from those listed below."
-msgstr "Sélectionner des réseaux à partir de la liste fournie ci-dessous."
-
msgid "Select one"
msgstr "Sélectionnez-en une"
@@ -2384,9 +2369,6 @@ msgstr ""
"Sélectionner un ou plusieurs groupes de sécurité dans les groupes "
"disponibles ci-dessous."
-msgid "Select ports from those listed below."
-msgstr "Sélectionnez des ports dans la liste ci-dessous."
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "Sélectionner le Ramdisk depuis le menu déroulant."
diff --git a/openstack_dashboard/locale/id/LC_MESSAGES/django.po b/openstack_dashboard/locale/id/LC_MESSAGES/django.po
index 91768882b..bbb4b4cd3 100644
--- a/openstack_dashboard/locale/id/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/id/LC_MESSAGES/django.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-06-21 10:46+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -8669,8 +8669,5 @@ msgstr "alamat IP yang tidak diketahui"
msgid "up"
msgstr "up (naik)"
-msgid "vCPUs ="
-msgstr "vCPUs ="
-
msgid "yes"
msgstr "yes (ya)"
diff --git a/openstack_dashboard/locale/id/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/id/LC_MESSAGES/djangojs.po
index cac1a6053..c23fc46fa 100644
--- a/openstack_dashboard/locale/id/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/id/LC_MESSAGES/djangojs.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-02-10 01:42+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1845,9 +1845,6 @@ msgstr ""
"   saat bootup. Tapi mereka akan tersedia setelah trunk tercapai\n"
"   status <em>ACTIVE</ em>."
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr "Jaringan menyediakan saluran komunikasi untuk instance di cloud."
-
msgid "New File Contents"
msgstr "Konten file baru"
@@ -2238,9 +2235,6 @@ msgstr "ID Ramdisk"
msgid "Raw"
msgstr "Raw"
-msgid "Re-order items using drag and drop"
-msgstr "Menyusun ulang item menggunakan drag dan drop"
-
msgid "Registered Resource Types"
msgstr "Registered Resource Types (tipe sumber daya teregistrasi)"
@@ -2397,9 +2391,6 @@ msgstr ""
msgid "Select an item from Available items below"
msgstr "Pilih item dari item tersedia bawah"
-msgid "Select at least one network"
-msgstr "Pilih setidaknya satu jaringan"
-
msgid "Select from the list of available ports below."
msgstr "Pilih dari daftar port yang tersedia di bawah ini."
@@ -2409,9 +2400,6 @@ msgstr "Pilih item dari item yang tersedia di bawah ini"
msgid "Select many"
msgstr "Pilih beberapa"
-msgid "Select networks from those listed below."
-msgstr "Pilih jaringan dari yang tercantum di bawah ini."
-
msgid "Select one"
msgstr "Pilih satu"
@@ -2423,9 +2411,6 @@ msgstr ""
"Pilih satu atau lebih kelompok keamanan dari kelompok yang tersedia di bawah "
"ini."
-msgid "Select ports from those listed below."
-msgstr "Pilih ports dari yang tercantum di bawah ini."
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "Pilih Ramdisk dari menu drop down."
diff --git a/openstack_dashboard/locale/it/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/it/LC_MESSAGES/djangojs.po
index bb1feeb58..046ce908a 100644
--- a/openstack_dashboard/locale/it/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/it/LC_MESSAGES/djangojs.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2020-01-08 17:19+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -895,9 +895,6 @@ msgstr "Caratteristiche di rete"
msgid "Networks"
msgstr "Reti"
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr "Le reti forniscono i canali di comunicazione per le istanze nel cloud."
-
msgid "Newer"
msgstr "Più nuovo"
@@ -1120,9 +1117,6 @@ msgstr "Pulsanti di opzione"
msgid "Ramdisk ID"
msgstr "ID ramdisk"
-msgid "Re-order items using drag and drop"
-msgstr "Riordina gli elementi utilizzando la funzione di trascinamento"
-
msgid "Remote"
msgstr "Remoto"
@@ -1176,12 +1170,6 @@ msgstr "Selezionare un'origine dall'elenco in basso."
msgid "Select an item from Available items below"
msgstr "Seleziona un elemento dagli elementi disponibili in basso"
-msgid "Select at least one network"
-msgstr "Seleziona almeno una rete"
-
-msgid "Select networks from those listed below."
-msgstr "Selezionare le reti dall'elenco in basso."
-
msgid "Select one"
msgstr "Seleziona uno"
@@ -1192,9 +1180,6 @@ msgid "Select one or more security groups from the available groups below."
msgstr ""
"Selezionare uno o più gruppi di sicurezza dai gruppi disponibili in basso."
-msgid "Select ports from those listed below."
-msgstr "Selezionare le porte dall'elenco in basso."
-
msgid "Select the security groups to launch the instance in."
msgstr "Selezionare i gruppi di sicurezza in cui avviare l'istanza."
diff --git a/openstack_dashboard/locale/ja/LC_MESSAGES/django.po b/openstack_dashboard/locale/ja/LC_MESSAGES/django.po
index 50d69c367..1c4c4b178 100644
--- a/openstack_dashboard/locale/ja/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ja/LC_MESSAGES/django.po
@@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-06-21 10:46+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -8759,8 +8759,5 @@ msgstr "不明な IP アドレス"
msgid "up"
msgstr "up"
-msgid "vCPUs ="
-msgstr "仮想 CPU 数 ="
-
msgid "yes"
msgstr "はい"
diff --git a/openstack_dashboard/locale/ja/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/ja/LC_MESSAGES/djangojs.po
index 8fa3aa868..3eb57cfbd 100644
--- a/openstack_dashboard/locale/ja/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/ja/LC_MESSAGES/djangojs.po
@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-10-06 20:57+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1833,9 +1833,6 @@ msgstr ""
"サブポートのネットワークは、起動後に利用可能になります。ただし、利用可能にな"
"るのは、トランクのステータスが<em>稼働中 (ACTIVE)</em> になった後です。"
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr "ネットワークはクラウド内のインスタンス用の通信経路を提供します。"
-
msgid "New File Contents"
msgstr "新しいファイルの内容"
@@ -2229,9 +2226,6 @@ msgstr "RAM ディスク ID"
msgid "Raw"
msgstr "Raw"
-msgid "Re-order items using drag and drop"
-msgstr "順番を並べ替えるには、アイテムをドラッグ&ドロップしてください。"
-
msgid "Registered Resource Types"
msgstr "登録リソース種別"
@@ -2387,9 +2381,6 @@ msgstr ""
msgid "Select an item from Available items below"
msgstr "以下の利用可能なアイテムから 1 つ選択してください。"
-msgid "Select at least one network"
-msgstr "ネットワークを少なくとも 1 つ選択してください"
-
msgid "Select from the list of available ports below."
msgstr "以下の利用可能なポートからポートを選択してください。"
@@ -2399,26 +2390,17 @@ msgstr "以下の利用可能なアイテムから選択してください。"
msgid "Select many"
msgstr "複数選択可"
-msgid "Select networks from those listed below."
-msgstr "以下のリストからネットワークを選択してください。"
-
msgid "Select one"
msgstr "1 つ選択してください。"
msgid "Select one or more"
msgstr "1 つ以上選択してください。"
-msgid "Select one or more ports"
-msgstr "ポートを 1 つ以上選択してください。"
-
msgid "Select one or more security groups from the available groups below."
msgstr ""
"以下の利用可能なグループから、1つ以上のセキュリティーグループを選択してくだ"
"さい。"
-msgid "Select ports from those listed below."
-msgstr "以下のリストからポートを選択してください。"
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "RAM ディスクをドロップダウンメニューから選択してください。"
diff --git a/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po b/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po
index bdae5a1c3..e3e04e99e 100644
--- a/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ko_KR/LC_MESSAGES/django.po
@@ -30,7 +30,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-06-21 10:46+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -8520,8 +8520,5 @@ msgstr "알 수 없는 IP 주소"
msgid "up"
msgstr "up"
-msgid "vCPUs ="
-msgstr "vCPUs ="
-
msgid "yes"
msgstr "네"
diff --git a/openstack_dashboard/locale/ko_KR/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/ko_KR/LC_MESSAGES/djangojs.po
index dac895987..a6da93e3d 100644
--- a/openstack_dashboard/locale/ko_KR/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/ko_KR/LC_MESSAGES/djangojs.po
@@ -3,7 +3,7 @@
# Andreas Jaeger <jaegerandi@gmail.com>, 2016. #zanata
# Eunseop Shin <kairos9603@khu.ac.kr>, 2016. #zanata
# Ian Y. Choi <ianyrchoi@gmail.com>, 2016. #zanata
-# SeongSoo Cho <ppiyakk2@printf.kr>, 2016. #zanata
+# Seongsoo Cho <ppiyakk2@printf.kr>, 2016. #zanata
# Sungjin Kang <gang.sungjin@gmail.com>, 2016. #zanata
# Ian Y. Choi <ianyrchoi@gmail.com>, 2017. #zanata
# Sungjin Kang <gang.sungjin@gmail.com>, 2017. #zanata
@@ -25,7 +25,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2020-05-06 10:26+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1836,9 +1836,6 @@ msgstr ""
" 그러나 트렁크가 <em>ACTIVE</em> 상태가 되어야만\n"
" 사용할 수 있습니다."
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr "네트워크는 클라우드 내 인스턴스에 대한 통신 채널을 제공합니다."
-
msgid "New File Contents"
msgstr "새로운 파일 내용"
@@ -2220,9 +2217,6 @@ msgstr "램디스크 ID"
msgid "Raw"
msgstr "Raw"
-msgid "Re-order items using drag and drop"
-msgstr "다시 주문할 아이템은 드래그 앤 드롭으로 가져옵니다."
-
msgid "Registered Resource Types"
msgstr "등록된 리소스 유형"
@@ -2377,9 +2371,6 @@ msgstr ""
msgid "Select an item from Available items below"
msgstr "아래에서 사용 가능한 항목에서 선택"
-msgid "Select at least one network"
-msgstr "적어도 하나 이상 네트워크를 선택합니다."
-
msgid "Select from the list of available ports below."
msgstr "아래 사용 가능한 포트에서 선택하세요."
@@ -2389,9 +2380,6 @@ msgstr "아래에서 사용 가능한 항목에서 선택"
msgid "Select many"
msgstr "여러 개 선택"
-msgid "Select networks from those listed below."
-msgstr "아래의 목록에서 네트워크를 선택합니다."
-
msgid "Select one"
msgstr "하나 선택"
@@ -2401,9 +2389,6 @@ msgstr "하나 이상 선택"
msgid "Select one or more security groups from the available groups below."
msgstr "아래 사용가능한 그룹에서 하나 이상의 보안 그룹을 선택합니다."
-msgid "Select ports from those listed below."
-msgstr "아래 목록에서 포트를 선택합니다."
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "드롭 다운 메뉴에서 램디스크를 선택합니다."
diff --git a/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po b/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po
index 705ed5d99..f7f0d0574 100644
--- a/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/pt_BR/LC_MESSAGES/django.po
@@ -17,7 +17,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-06-21 10:46+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -8275,8 +8275,5 @@ msgstr "endereço IP desconhecido"
msgid "up"
msgstr "Ativo"
-msgid "vCPUs ="
-msgstr "vCPUs ="
-
msgid "yes"
msgstr "sim"
diff --git a/openstack_dashboard/locale/pt_BR/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/pt_BR/LC_MESSAGES/djangojs.po
index 18a687b77..cf426e262 100644
--- a/openstack_dashboard/locale/pt_BR/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/pt_BR/LC_MESSAGES/djangojs.po
@@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2020-04-26 13:36+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1879,9 +1879,6 @@ msgstr ""
"alcançar\n"
" o estado <em>ATIVO</em>."
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr "As redes fornecem os canais de comunicação para instâncias na nuvem."
-
msgid "New File Contents"
msgstr "Novo Conteúdo do Arquivo"
@@ -2273,9 +2270,6 @@ msgstr "ID do Ramdisk"
msgid "Raw"
msgstr "Raw"
-msgid "Re-order items using drag and drop"
-msgstr "reordene os itens clicando em um deles e arrastando-o"
-
msgid "Registered Resource Types"
msgstr "Tipos de Recursos Registrados"
@@ -2426,9 +2420,6 @@ msgstr ""
msgid "Select an item from Available items below"
msgstr "Selecione um item dentre os disponíveis abaixo"
-msgid "Select at least one network"
-msgstr "Selecione ao menos uma rede"
-
msgid "Select from the list of available ports below."
msgstr "Selecione a partir da lista de portas disponíveis abaixo."
@@ -2438,9 +2429,6 @@ msgstr "Selecione itens a partir dos itens Disponíveis abaixo"
msgid "Select many"
msgstr "Selecionar vários"
-msgid "Select networks from those listed below."
-msgstr "Selecione redes dentre as disponíveis abaixo"
-
msgid "Select one"
msgstr "Selecione um"
@@ -2451,9 +2439,6 @@ msgid "Select one or more security groups from the available groups below."
msgstr ""
"Selecione um ou mais grupos de segurança dos grupos disponíveis abaixo."
-msgid "Select ports from those listed below."
-msgstr "Selecione portas dentre as listadas abaixo"
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "Selecione o Ramdisk a partir do menu suspenso."
diff --git a/openstack_dashboard/locale/ru/LC_MESSAGES/django.po b/openstack_dashboard/locale/ru/LC_MESSAGES/django.po
index 4468af7d1..5600fa557 100644
--- a/openstack_dashboard/locale/ru/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/ru/LC_MESSAGES/django.po
@@ -40,11 +40,11 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2022-02-21 12:43+0000\n"
+"PO-Revision-Date: 2022-09-01 04:42+0000\n"
"Last-Translator: Roman Gorshunov <roman.gorshunov@att.com>\n"
"Language: ru\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
@@ -5814,7 +5814,7 @@ msgid "Select a pool"
msgstr "Выберите пул"
msgid "Select a port"
-msgstr "Выберете порт"
+msgstr "Выберите порт"
msgid "Select a project"
msgstr "Выберите проект"
@@ -9007,8 +9007,5 @@ msgstr "неизвестный IP-адрес"
msgid "up"
msgstr "вверх"
-msgid "vCPUs ="
-msgstr "vCPU ="
-
msgid "yes"
msgstr "да"
diff --git a/openstack_dashboard/locale/ru/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/ru/LC_MESSAGES/djangojs.po
index 561d6f1c7..9252f2f34 100644
--- a/openstack_dashboard/locale/ru/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/ru/LC_MESSAGES/djangojs.po
@@ -21,15 +21,16 @@
# Roman Gorshunov <roman.gorshunov@att.com>, 2019. #zanata
# Dmitriy Rabotyagov <noonedeadpunk@ya.ru>, 2020. #zanata
# Roman Gorshunov <roman.gorshunov@att.com>, 2021. #zanata
+# Roman Gorshunov <roman.gorshunov@att.com>, 2022. #zanata
msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-09-09 10:31+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2021-09-06 04:35+0000\n"
+"PO-Revision-Date: 2022-09-01 05:27+0000\n"
"Last-Translator: Roman Gorshunov <roman.gorshunov@att.com>\n"
"Language-Team: Russian\n"
"Language: ru\n"
@@ -287,6 +288,9 @@ msgstr "Добавить интерфейс"
msgid "Add Ons, Required and Feedback"
msgstr "Дополнения, обязательные элементы и отзывы"
+msgid "Add Rule"
+msgstr "Добавить правило"
+
msgid "Admin Password"
msgstr "Пароль администратора"
@@ -455,6 +459,15 @@ msgstr "Доступные подсказки планировщика"
msgid "Badges"
msgstr "Бейджи"
+msgid "Bandwidth Limit"
+msgstr "Ограничение пропускной способности"
+
+msgid "Bandwidth Limit - , , , "
+msgstr "Лимит пропускной способности - , , ,"
+
+msgid "Bandwidth Rules"
+msgstr "Правила пропускной способности"
+
msgid "Bare Metal"
msgstr "Bare Metal"
@@ -818,6 +831,18 @@ msgstr[2] "Записи DNS"
msgid "DSCP Mark"
msgstr "DSCP метка"
+msgid "DSCP Mark - , "
+msgstr "DSCP метка - ,"
+
+msgid "DSCP Marking"
+msgstr "DSCP метка"
+
+msgid "DSCP Rules"
+msgstr "DSCP правила"
+
+msgid "DSCP mark"
+msgstr "DSCP метка"
+
msgid "Danger"
msgstr "Опасность"
@@ -956,6 +981,9 @@ msgstr "Удалить роли"
msgid "Delete Router"
msgstr "Удалить маршрутизатор"
+msgid "Delete Rule"
+msgstr "Удалить правило"
+
msgid "Delete Server Group"
msgid_plural "Delete Server Groups"
msgstr[0] "Удалить группу серверов"
@@ -1197,6 +1225,9 @@ msgstr "Редактировать образ"
msgid "Edit Role"
msgstr "Редактировать роль"
+msgid "Edit Rule"
+msgstr "Редактировать правило"
+
msgid "Edit Trunk"
msgstr "Редактировать транк"
@@ -1523,7 +1554,7 @@ msgid "Image Source"
msgstr "Источник образа"
msgid "Image from Other Project - Non-Public"
-msgstr "Образ из другого проекта - непубичный"
+msgstr "Образ из другого проекта - непубличный"
msgid "Impact on your quota"
msgstr "Влияние на квоту"
@@ -1802,12 +1833,18 @@ msgstr "Вручную"
msgid "Max Burst Kbits"
msgstr "Макс. пик. (кбит/с)"
+msgid "Max Burst Size (in kbps)"
+msgstr "Максимальная пиковая пропускная способность (в кбит/с)"
+
msgid "Max Kbps"
msgstr "Макс. (кбит/с)"
msgid "Max Port"
msgstr "По порт"
+msgid "Max bandwidth (in kbps)"
+msgstr "Максимальная пропускная способность (в кбит/с)"
+
msgid "Max. Size (bytes)"
msgstr "Макс. размер (байт)"
@@ -1856,6 +1893,9 @@ msgstr "Мин. размер диска (ГБ)"
msgid "Min Kbps"
msgstr "Мин. (кбит/с)"
+msgid "Min Kpps"
+msgstr "Мин. кпак./сек"
+
msgid "Min Port"
msgstr "От порта"
@@ -1874,18 +1914,42 @@ msgstr "Мин. размер (байт)"
msgid "Mini button"
msgstr "Микроскопическая кнопка"
+msgid "Minimum Bandwidth"
+msgstr "Минимальная пропускная способность"
+
+msgid "Minimum Bandwidth - , , "
+msgstr "Минимальная пропускная способность - , ,"
+
+msgid "Minimum Bandwidth Rules"
+msgstr "Правила минимальной пропускной способности"
+
msgid "Minimum Disk"
msgstr "Минимальный размер диска"
msgid "Minimum Disk (GB)"
msgstr "Минимальный размер диска (Гб)"
+msgid "Minimum Packet Rate"
+msgstr "Минимальная частота пакетов"
+
+msgid "Minimum Packet Rate - , , "
+msgstr "Минимальная частота пакетов - , ,"
+
+msgid "Minimum Packet Rules"
+msgstr "Правила минимальной частоты пакетов"
+
msgid "Minimum RAM"
msgstr "Минимальный размер памяти"
msgid "Minimum RAM (MB)"
msgstr "Минимальный размер памяти (Мб)"
+msgid "Minimum bandwidth (in kbps)"
+msgstr "Минимальная пропускная способность (в кбит/с)."
+
+msgid "Minimum packet rate (in kpps)"
+msgstr "Минимальная частота пакетов (в кпак./сек)."
+
msgid "Modals"
msgstr "Всплывающие диалоги"
@@ -1968,8 +2032,12 @@ msgstr ""
" загрузки. Они станут полностью доступны тогда, когда транк перейдёт\n"
" в статус <em>АКТИВЕН</em>."
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr "Сеть предоставляет канал связи между инстансами в облаке."
+msgid ""
+"Networks provide the communication channels for instances in the cloud. You "
+"can select ports instead of networks or a mix of both."
+msgstr ""
+"Сети обеспечивают каналы связи для инстансов в облаке. Можно выбирать порты "
+"и (или) сети в любом сочетании."
msgid "New File Contents"
msgstr "Содержимое Нового Файла"
@@ -2344,6 +2412,28 @@ msgstr[2] "Политики QoS"
msgid "QoS Policy %s was successfully created."
msgstr "QoS политика %s успешно создана."
+msgid "QoS Policy ID"
+msgstr "ИД стратегии QoS"
+
+msgid "QoS Policy Id"
+msgstr "ИД стратегии QoS"
+
+msgid "QoS Policy Name"
+msgstr "Имя стратегии QoS."
+
+msgid "QoSPolicyId"
+msgstr "ИД политики QoS"
+
+msgid "QoSPolicyName"
+msgstr "Имя политики QoS"
+
+msgid "Qos Policy Rule was successfully deleted."
+msgstr "Правило политики QoS было успешно удалено."
+
+#, python-format
+msgid "Qos Policy Rule %s was successfully updated."
+msgstr "Правило политики %s QoS было успешно обновлено."
+
msgid "Queued"
msgstr "Запланировано"
@@ -2371,9 +2461,6 @@ msgstr "ИД RAM-диска"
msgid "Raw"
msgstr "Raw"
-msgid "Re-order items using drag and drop"
-msgstr "Переопределите элементы перемещением"
-
msgid "Registered Resource Types"
msgstr "Зарегистрированные типы ресурсов"
@@ -2408,9 +2495,21 @@ msgstr "Роль успешно обновлена."
msgid "Root Disk"
msgstr "Основной диск"
+msgid "Rule"
+msgstr "Правило"
+
msgid "Rule ID"
msgstr "ID правила"
+msgid "Rule Type"
+msgstr "Тип правила"
+
+msgid "Rule to edit"
+msgstr "Правило для изменения"
+
+msgid "RuleId"
+msgstr "ИД правила"
+
msgid "Rules"
msgstr "Правила"
@@ -2515,6 +2614,9 @@ msgstr "Выберите заголовок"
msgid "Select a container to browse."
msgstr "Выберите контейнер для просмотра."
+msgid "Select a flavor from the available flavors below."
+msgstr "Выберите тип инстанса из списка доступных типов инстансов."
+
msgid "Select a key pair from the available key pairs below."
msgstr "Выберите одну из доступных пар ключей."
@@ -2536,9 +2638,6 @@ msgstr ""
msgid "Select an item from Available items below"
msgstr "Выберите элемент из доступных элементов ниже"
-msgid "Select at least one network"
-msgstr "Выберите как минимум одну сеть."
-
msgid "Select from the list of available ports below."
msgstr "Выберите из списка портов, перечисленных ниже."
@@ -2548,24 +2647,21 @@ msgstr "Выберите элемент из доступных ниже"
msgid "Select many"
msgstr "Выберите несколько"
-msgid "Select networks from those listed below."
-msgstr "Выберите сети из списка."
-
msgid "Select one"
msgstr "Выберите одно"
msgid "Select one or more"
msgstr "Выберите одну или несколько"
-msgid "Select one or more ports"
-msgstr "Выберите один или несколько портов"
+msgid "Select one or more networks from the available networks below."
+msgstr "Выберите одну или более сетей из доступных сетей, указанных ниже."
+
+msgid "Select one or more ports from the available ports below."
+msgstr "Выберите один или несколько портов из доступных ниже."
msgid "Select one or more security groups from the available groups below."
msgstr "Выберите одну или более групп безопасности из доступных."
-msgid "Select ports from those listed below."
-msgstr "Выберите порты из списка."
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "Выберите \"Диск в памяти\" в выпадающем меню."
@@ -2863,6 +2959,19 @@ msgstr ""
"связанным с ним интерфейсам."
msgid ""
+"The maximum KBPS (kilobits per second) value.\n"
+" If you specify this value, must be greater than 0 otherwise max_kbps "
+"will have no value.\n"
+" \n"
+" The maximum burst size (in kilobits). Default is 0."
+msgstr ""
+"Максимальное значение кбит/с (килобит в секунду).\n"
+" Если вы его указываете, то оно должно быть больше 0, иначе max_kbps "
+"будет не определено.\n"
+" \n"
+" Максимальное пиковое значение (в килобитах). По-умолчанию – 0."
+
+msgid ""
"The maximum number of key-value pairs that can be supplied per instance is "
"determined by the compute provider."
msgstr ""
@@ -2870,6 +2979,13 @@ msgstr ""
"модуля вычислительных ресурсов."
msgid ""
+"The minimum KBPS (kilobits per second) value which should be available for "
+"port."
+msgstr ""
+"Минимальное значение кбит/с (килобит в сек.), которое должно быть доступно "
+"для порта."
+
+msgid ""
"The minimum disk size required to boot the image. If unspecified, this value "
"defaults to 0 (no minimum)."
msgstr ""
@@ -2877,6 +2993,13 @@ msgstr ""
"установлено, используется значение по умолчанию - 0 (нет минимума)"
msgid ""
+"The minimum kpps (kilo(1000) packets per second) value which should be "
+"available for port."
+msgstr ""
+"Минимальное значение частоты пакетов в кпак./сек (тысяч пакетов в сек.), "
+"которое должно быть доступно для порта."
+
+msgid ""
"The minimum memory size required to boot the image. If unspecified, this "
"value defaults to 0 (no minimum)."
msgstr ""
@@ -2987,6 +3110,12 @@ msgstr ""
" Если вы считаете, что тут что-то не так, пожалуйста, свяжитесь с вашим "
"администратором."
+msgid "There are no rules to delete."
+msgstr "Нет правил для удаления."
+
+msgid "There are no rules to modify."
+msgstr "Нет правил для изменения."
+
msgid ""
"There are two ways to generate a key pair. From a Linux system,\n"
" generate the key pair with the <samp>ssh-keygen</samp> command:"
@@ -3147,6 +3276,18 @@ msgstr "Типография"
msgid "URL"
msgstr "URL"
+msgid "Unable to add the bandwidthrule ."
+msgstr "Не удалось добавить правило пропускной способности ."
+
+msgid "Unable to add the dscp_marking_rule ."
+msgstr "Не удалось добавить правило метки DSCP ."
+
+msgid "Unable to add the minimum_bandwidth_rule ."
+msgstr "Не удалось добавить правило минимальной пропускной способности ."
+
+msgid "Unable to add the minimum_packet_rate_rule."
+msgstr "Не удалось добавить правило минимальной частоты пакетов."
+
msgid "Unable to allocate new floating IP address."
msgstr "Не удаётся выделить новый плавающий IP-адрес."
@@ -3290,6 +3431,9 @@ msgstr[2] "Не удалось удалить политики: %s."
msgid "Unable to delete qos policy %(id)s"
msgstr "Не удалось удалить политику QoS %(id)s"
+msgid "Unable to delete the bandwidth_limit_rule."
+msgstr "Не удалось удалить правило пропускной способности."
+
msgid "Unable to delete the container."
msgstr "Не удаётся удалить контейнер."
@@ -3299,6 +3443,9 @@ msgstr "Не удалось удалить домен."
msgid "Unable to delete the domains."
msgstr "Не удалось удалить домены."
+msgid "Unable to delete the dscp_marking_rule."
+msgstr "Не удалось удалить правило метки DSCP."
+
#, python-format
msgid "Unable to delete the flavor with id: %(id)s"
msgstr "Не удаётся удалить разновидность с ИД: %(id)s"
@@ -3320,6 +3467,12 @@ msgstr "Не удаётся удалить образ с ИД: %(id)s"
msgid "Unable to delete the keypair with name: %(name)s"
msgstr "Не удалось удалить пару ключей с именем %(name)s"
+msgid "Unable to delete the minimum_bandwidth_rule ."
+msgstr "Не удалось удалить правило минимальной пропускной способности."
+
+msgid "Unable to delete the minimum_packet_rate_rule ."
+msgstr "Не удалось удалить правило минимальной частоты пакетов."
+
msgid "Unable to delete the object."
msgstr "Не удаётся удалить объект."
@@ -3663,12 +3816,24 @@ msgstr "Не удалось обновить метаданные."
msgid "Unable to update project quota data."
msgstr "Не удается обновить данные по квотам проекта."
+msgid "Unable to update the bandwidthrule."
+msgstr "Не удалось обновить правило пропускной способности."
+
+msgid "Unable to update the dscp marking rule."
+msgstr "Не удалось обновить правило метки DSCP."
+
msgid "Unable to update the flavor."
msgstr "Не удаётся обновить разновидность."
msgid "Unable to update the image."
msgstr "Не удалось обновить образ."
+msgid "Unable to update the minimum bandwidth rule."
+msgstr "Не удалось обновить правило минимальной пропускной способности."
+
+msgid "Unable to update the minimum packet rate rule."
+msgstr "Не удалось обновить правило минимальной частоты пакетов."
+
msgid "Unable to update the trunk."
msgstr "Не удалось обновить транк."
@@ -3824,6 +3989,18 @@ msgstr "VMDK - Диск виртуальной машины"
msgid "VNIC type"
msgstr "Тип VNIC"
+msgid ""
+"Valid DSCP mark values are even numbers between 0 and 56,\n"
+" except 2-6, 42, 44, and 50-54. The full list of valid DSCP marks is:\n"
+" 0, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, "
+"46, 48, 56."
+msgstr ""
+"Корректными значениями DSCP меток могут быть только четные числа между 0 и "
+"56,\n"
+" кроме 2-6, 42, 44, и 50-54. Полный список корректных DSCP меток:\n"
+" 0, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, "
+"46, 48, 56."
+
msgid "View As Modal"
msgstr "Просмотр в модальном виде"
@@ -4108,9 +4285,18 @@ msgstr[2] "Вы выбрали \"%s\". Удаление пользователе
msgid "Your Form as JavaScript"
msgstr "Ваша форма в JavaScript"
+msgid "any"
+msgstr "Любой"
+
+msgid "egress"
+msgstr "Исходящий трафик"
+
msgid "image"
msgstr "образ"
+msgid "ingress"
+msgstr "Входящий трафик"
+
msgid "inherit"
msgstr "унаследовать"
diff --git a/openstack_dashboard/locale/tr_TR/LC_MESSAGES/django.po b/openstack_dashboard/locale/tr_TR/LC_MESSAGES/django.po
index 0dec62fd1..8fbf8bd80 100644
--- a/openstack_dashboard/locale/tr_TR/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/tr_TR/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-06-21 10:46+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -7282,8 +7282,5 @@ msgstr "bilinmeyen IP adresi"
msgid "up"
msgstr "up"
-msgid "vCPUs ="
-msgstr "vCPU'lar ="
-
msgid "yes"
msgstr "evet"
diff --git a/openstack_dashboard/locale/tr_TR/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/tr_TR/LC_MESSAGES/djangojs.po
index 45a2d947a..fad305b1b 100644
--- a/openstack_dashboard/locale/tr_TR/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/tr_TR/LC_MESSAGES/djangojs.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2020-01-08 17:19+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1465,9 +1465,6 @@ msgstr "Ağ Özellikleri"
msgid "Networks"
msgstr "Ağlar"
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr "Ağlar buluttaki sunucular için iletişim kanalları sağlarlar."
-
msgid "New File Contents"
msgstr "Yeni Dosya İçerikleri"
@@ -1815,9 +1812,6 @@ msgstr "Ramdisk ID"
msgid "Raw"
msgstr "Raw"
-msgid "Re-order items using drag and drop"
-msgstr "Sürükle ve bırak kullanarak ögeleri yeniden sırala"
-
msgid "Registered Resource Types"
msgstr "Kaydedilmiş Kaynak Tipleri:"
@@ -1946,12 +1940,6 @@ msgstr "Listeden bir kaynak seçin."
msgid "Select an item from Available items below"
msgstr "Aşağıdaki kullanılabilir öğelerden birini seçin."
-msgid "Select at least one network"
-msgstr "En az bir ağ seçmelisiniz"
-
-msgid "Select networks from those listed below."
-msgstr "Aşağıda listelenen ağlar içinden seçim yapın."
-
msgid "Select one"
msgstr "Birini seçin"
@@ -1961,9 +1949,6 @@ msgstr "Bir veya daha fazla seçin"
msgid "Select one or more security groups from the available groups below."
msgstr "Aşağıdaki güvenlik gruplarından bir veya daha fazlasını seçin."
-msgid "Select ports from those listed below."
-msgstr "Aşağıda listelenenlerden bağlantı noktaları seçin."
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "Aşağı açılır menüden Ramdisk'i seçin."
diff --git a/openstack_dashboard/locale/zh_Hans/LC_MESSAGES/django.po b/openstack_dashboard/locale/zh_Hans/LC_MESSAGES/django.po
index b654d93b6..ce4484d82 100644
--- a/openstack_dashboard/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/zh_Hans/LC_MESSAGES/django.po
@@ -33,7 +33,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-06-21 10:46+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -8217,8 +8217,5 @@ msgstr "未知的IP地址"
msgid "up"
msgstr "启动"
-msgid "vCPUs ="
-msgstr "vCPUs ="
-
msgid "yes"
msgstr "是"
diff --git a/openstack_dashboard/locale/zh_Hans/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/zh_Hans/LC_MESSAGES/djangojs.po
index e5af6ce9d..dfaf4f229 100644
--- a/openstack_dashboard/locale/zh_Hans/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/zh_Hans/LC_MESSAGES/djangojs.po
@@ -24,7 +24,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-03-05 09:39+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1798,9 +1798,6 @@ msgstr ""
"有效。但它们会在中继成为\n"
" <em>ACTIVE</em> 状态时有效。"
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr "在云中,网络为实例提供通信通道。"
-
msgid "New File Contents"
msgstr "新文件内容"
@@ -2184,9 +2181,6 @@ msgstr "内存盘 ID"
msgid "Raw"
msgstr "原始"
-msgid "Re-order items using drag and drop"
-msgstr "使用拖放重新排序"
-
msgid "Registered Resource Types"
msgstr "注册的资源类型"
@@ -2338,9 +2332,6 @@ msgstr ""
msgid "Select an item from Available items below"
msgstr "从以下可选项中选择一项"
-msgid "Select at least one network"
-msgstr "至少选择一个网络"
-
msgid "Select from the list of available ports below."
msgstr "从以下有效的端口列表中选择。"
@@ -2350,9 +2341,6 @@ msgstr "从以下可用项中选择一项"
msgid "Select many"
msgstr "选择多个"
-msgid "Select networks from those listed below."
-msgstr "从下拉列表选择网络"
-
msgid "Select one"
msgstr "选择一个"
@@ -2362,9 +2350,6 @@ msgstr "选择一个或多个"
msgid "Select one or more security groups from the available groups below."
msgstr "从以下可用的组中选择一个或多个安全组。"
-msgid "Select ports from those listed below."
-msgstr "选择下面列出的端口。"
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "从下拉菜单中选择 Ramdisk。"
diff --git a/openstack_dashboard/locale/zh_Hant/LC_MESSAGES/django.po b/openstack_dashboard/locale/zh_Hant/LC_MESSAGES/django.po
index 764b2ca16..944f6053d 100644
--- a/openstack_dashboard/locale/zh_Hant/LC_MESSAGES/django.po
+++ b/openstack_dashboard/locale/zh_Hant/LC_MESSAGES/django.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-02-21 20:31+0000\n"
+"POT-Creation-Date: 2022-06-21 10:46+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -7827,8 +7827,5 @@ msgstr "未知的 IP 位址"
msgid "up"
msgstr "上線"
-msgid "vCPUs ="
-msgstr "虛擬處理器數 ="
-
msgid "yes"
msgstr "是"
diff --git a/openstack_dashboard/locale/zh_Hant/LC_MESSAGES/djangojs.po b/openstack_dashboard/locale/zh_Hant/LC_MESSAGES/djangojs.po
index 26dec662e..681d1f39d 100644
--- a/openstack_dashboard/locale/zh_Hant/LC_MESSAGES/djangojs.po
+++ b/openstack_dashboard/locale/zh_Hant/LC_MESSAGES/djangojs.po
@@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-03-05 09:39+0000\n"
+"POT-Creation-Date: 2022-09-03 19:04+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1730,9 +1730,6 @@ msgstr "網路特徵"
msgid "Networks"
msgstr "網路"
-msgid "Networks provide the communication channels for instances in the cloud."
-msgstr "網路為雲實例提供雲中的通訊頻道。"
-
msgid "New File Contents"
msgstr "新增資料內容"
@@ -2097,9 +2094,6 @@ msgstr "Ramdisk ID"
msgid "Raw"
msgstr "Raw"
-msgid "Re-order items using drag and drop"
-msgstr "使用拖拉來重新排列"
-
msgid "Registered Resource Types"
msgstr "註冊過的資源類型"
@@ -2240,9 +2234,6 @@ msgstr "從下列列表中選擇來源。"
msgid "Select an item from Available items below"
msgstr "從下列可用項目中選擇項目"
-msgid "Select at least one network"
-msgstr "選擇至少一個網路"
-
msgid "Select from the list of available ports below."
msgstr "從下列列表中選擇一個可用的端口。"
@@ -2252,9 +2243,6 @@ msgstr "從下列可用的項目中選擇"
msgid "Select many"
msgstr "選擇多個"
-msgid "Select networks from those listed below."
-msgstr "從下列列表中選擇網路。"
-
msgid "Select one"
msgstr "擇一"
@@ -2264,9 +2252,6 @@ msgstr "選擇一個或多個"
msgid "Select one or more security groups from the available groups below."
msgstr "從下列可用群組中選擇一個或多個安全性群組。"
-msgid "Select ports from those listed below."
-msgstr "從下面列出的埠中選取埠。"
-
msgid "Select the Ramdisk from the drop down menu."
msgstr "從下拉選單中選擇 Ramdisk。"
diff --git a/openstack_dashboard/settings.py b/openstack_dashboard/settings.py
index b192efadf..23d52a50b 100644
--- a/openstack_dashboard/settings.py
+++ b/openstack_dashboard/settings.py
@@ -135,9 +135,14 @@ COMPRESS_PRECOMPILERS = (
('text/scss', 'horizon.utils.scss_filter.HorizonScssFilter'),
)
-COMPRESS_CSS_FILTERS = (
- 'compressor.filters.css_default.CssAbsoluteFilter',
-)
+COMPRESS_FILTERS = {
+ 'css': (
+ 'compressor.filters.css_default.CssAbsoluteFilter',
+ ),
+ 'js': (
+ 'compressor.filters.jsmin.rJSMinFilter',
+ )
+}
COMPRESS_ENABLED = True
COMPRESS_OUTPUT_DIR = 'dashboard'
diff --git a/openstack_dashboard/static/app/core/openstack-service-api/swift.service.js b/openstack_dashboard/static/app/core/openstack-service-api/swift.service.js
index 6480f3382..b2b170efe 100644
--- a/openstack_dashboard/static/app/core/openstack-service-api/swift.service.js
+++ b/openstack_dashboard/static/app/core/openstack-service-api/swift.service.js
@@ -137,7 +137,7 @@
function getContainer(container, ignoreError) {
var promise = apiService.get(service.getContainerURL(container) + '/metadata/');
if (ignoreError) {
- return promise.catch(angular.noop);
+ return promise;
}
return promise.catch(function onError() {
toastService.add('error', gettext('Unable to get the container details.'));
diff --git a/openstack_dashboard/static/app/core/openstack-service-api/swift.service.spec.js b/openstack_dashboard/static/app/core/openstack-service-api/swift.service.spec.js
index c1d317c54..40ec0002d 100644
--- a/openstack_dashboard/static/app/core/openstack-service-api/swift.service.spec.js
+++ b/openstack_dashboard/static/app/core/openstack-service-api/swift.service.spec.js
@@ -247,7 +247,6 @@
spyOn(promise, 'catch');
spyOn(toastService, 'add');
service.getContainer('spam', true);
- expect(promise.catch).toHaveBeenCalledWith(angular.noop);
expect(toastService.add).not.toHaveBeenCalled();
});
diff --git a/openstack_dashboard/test/integration_tests/tests/test_instances.py b/openstack_dashboard/test/integration_tests/tests/test_instances.py
index 852b17055..da510b268 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_instances.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_instances.py
@@ -22,10 +22,6 @@ class TestInstances(helpers.TestCase):
def instances_page(self):
return self.home_pg.go_to_project_compute_instancespage()
- @property
- def instance_table_name_column(self):
- return 'Instance Name'
-
def test_create_delete_instance(self):
"""tests the instance creation and deletion functionality:
@@ -49,6 +45,61 @@ class TestInstances(helpers.TestCase):
instances_page.find_message_and_dismiss(messages.ERROR))
self.assertTrue(instances_page.is_instance_deleted(self.INSTANCE_NAME))
+
+class TestInstancesPagination(helpers.TestCase):
+ INSTANCE_NAME = helpers.gen_random_resource_name('instance',
+ timestamp=False)
+ ITEMS_PER_PAGE = 1
+ INSTANCE_COUNT = 2
+
+ @property
+ def instances_page(self):
+ return self.home_pg.go_to_project_compute_instancespage()
+
+ def setUp(self):
+ super().setUp()
+ self.instance_list = ["{0}-{1}".format(self.INSTANCE_NAME, item)
+ for item in range(1, self.INSTANCE_COUNT + 1)]
+
+ instances_page = self.instances_page
+
+ # delete any old instances
+ garbage = instances_page.instances_table.get_column_data(
+ name_column='Instance Name')
+ if garbage:
+ instances_page.delete_instances(garbage)
+ self.assertTrue(
+ instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertTrue(
+ instances_page.are_instances_deleted(garbage))
+
+ instances_page.create_instance(self.INSTANCE_NAME,
+ instance_count=self.INSTANCE_COUNT)
+ self.assertTrue(
+ instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertTrue(
+ instances_page.is_instance_active(self.instance_list[1]))
+
+ settings_page = self.home_pg.go_to_settings_usersettingspage()
+ settings_page.change_pagesize(self.ITEMS_PER_PAGE)
+ self.assertTrue(
+ settings_page.find_message_and_dismiss(messages.SUCCESS))
+
+ def cleanup():
+ settings_page = self.home_pg.go_to_settings_usersettingspage()
+ settings_page.change_pagesize()
+ self.assertTrue(
+ settings_page.find_message_and_dismiss(messages.SUCCESS))
+
+ instances_page = self.instances_page
+ instances_page.delete_instances(self.instance_list)
+ self.assertTrue(
+ instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertTrue(
+ instances_page.are_instances_deleted(self.instance_list))
+
+ self.addCleanup(cleanup)
+
def test_instances_pagination(self):
"""This test checks instance pagination
@@ -66,27 +117,14 @@ class TestInstances(helpers.TestCase):
9) Go to user settings page and restore 'Items Per Page'
10) Delete created instances via proper page (depends on user)
"""
- items_per_page = 1
- instance_count = 2
- instance_list = ["{0}-{1}".format(self.INSTANCE_NAME, item)
- for item in range(1, instance_count + 1)]
first_page_definition = {'Next': True, 'Prev': False,
- 'Count': items_per_page,
- 'Names': [instance_list[1]]}
+ 'Count': self.ITEMS_PER_PAGE,
+ 'Names': [self.instance_list[1]]}
second_page_definition = {'Next': False, 'Prev': True,
- 'Count': items_per_page,
- 'Names': [instance_list[0]]}
- settings_page = self.home_pg.go_to_settings_usersettingspage()
- settings_page.change_pagesize(items_per_page)
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
+ 'Count': self.ITEMS_PER_PAGE,
+ 'Names': [self.instance_list[0]]}
- instances_page = self.home_pg.go_to_project_compute_instancespage()
- instances_page.create_instance(self.INSTANCE_NAME,
- instance_count=instance_count)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
- self.assertTrue(instances_page.is_instance_active(instance_list[1]))
+ instances_page = self.instances_page
instances_page = self.instances_page
instances_page.instances_table.assert_definition(
@@ -100,17 +138,6 @@ class TestInstances(helpers.TestCase):
instances_page.instances_table.assert_definition(
first_page_definition, sorting=True, name_column="Instance Name")
- settings_page = self.home_pg.go_to_settings_usersettingspage()
- settings_page.change_pagesize()
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
-
- instances_page = self.instances_page
- instances_page.delete_instances(instance_list)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
- self.assertTrue(instances_page.are_instances_deleted(instance_list))
-
def test_instances_pagination_and_filtration(self):
"""This test checks instance pagination and filtration
@@ -131,40 +158,24 @@ class TestInstances(helpers.TestCase):
10) Delete created instances via proper page (depends on user)
"""
- items_per_page = 1
- instance_count = 2
- instance_list = ["{0}-{1}".format(self.INSTANCE_NAME, item)
- for item in range(1, instance_count + 1)]
first_page_definition = {'Next': True, 'Prev': False,
- 'Count': items_per_page,
- 'Names': [instance_list[1]]}
+ 'Count': self.ITEMS_PER_PAGE,
+ 'Names': [self.instance_list[1]]}
second_page_definition = {'Next': False, 'Prev': False,
- 'Count': items_per_page,
- 'Names': [instance_list[0]]}
+ 'Count': self.ITEMS_PER_PAGE,
+ 'Names': [self.instance_list[0]]}
filter_first_page_definition = {'Next': False, 'Prev': False,
- 'Count': items_per_page,
- 'Names': [instance_list[1]]}
-
- settings_page = self.home_pg.go_to_settings_usersettingspage()
- settings_page.change_pagesize(items_per_page)
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
-
- instances_page = self.home_pg.go_to_project_compute_instancespage()
- instances_page.create_instance(self.INSTANCE_NAME,
- instance_count=instance_count)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
- self.assertTrue(instances_page.is_instance_active(instance_list[1]))
+ 'Count': self.ITEMS_PER_PAGE,
+ 'Names': [self.instance_list[1]]}
instances_page = self.instances_page
instances_page.instances_table.set_filter_value('name')
- instances_page.instances_table.filter(instance_list[1])
+ instances_page.instances_table.filter(self.instance_list[1])
instances_page.instances_table.assert_definition(
filter_first_page_definition, sorting=True,
name_column="Instance Name")
- instances_page.instances_table.filter(instance_list[0])
+ instances_page.instances_table.filter(self.instance_list[0])
instances_page.instances_table.assert_definition(
second_page_definition, sorting=True,
name_column="Instance Name")
@@ -175,16 +186,48 @@ class TestInstances(helpers.TestCase):
name_column="Instance Name")
instances_page.instances_table.filter('')
- settings_page = self.home_pg.go_to_settings_usersettingspage()
- settings_page.change_pagesize()
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
+class TestInstancesFilter(helpers.TestCase):
+ INSTANCE_NAME = helpers.gen_random_resource_name('instance',
+ timestamp=False)
+ INSTANCE_COUNT = 2
+
+ @property
+ def instances_page(self):
+ return self.home_pg.go_to_project_compute_instancespage()
+
+ def setUp(self):
+ super().setUp()
+ self.instance_list = ["{0}-{1}".format(self.INSTANCE_NAME, item)
+ for item in range(1, self.INSTANCE_COUNT + 1)]
instances_page = self.instances_page
- instances_page.delete_instances(instance_list)
+
+ # delete any old instances
+ garbage = instances_page.instances_table.get_column_data(
+ name_column='Instance Name')
+ if garbage:
+ instances_page.delete_instances(garbage)
+ self.assertTrue(
+ instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertTrue(
+ instances_page.are_instances_deleted(garbage))
+
+ instances_page.create_instance(self.INSTANCE_NAME,
+ instance_count=self.INSTANCE_COUNT)
self.assertTrue(
instances_page.find_message_and_dismiss(messages.INFO))
- self.assertTrue(instances_page.are_instances_deleted(instance_list))
+ self.assertTrue(
+ instances_page.is_instance_active(self.instance_list[1]))
+
+ def cleanup():
+ instances_page = self.instances_page
+ instances_page.delete_instances(self.instance_list)
+ self.assertTrue(
+ instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertTrue(
+ instances_page.are_instances_deleted(self.instance_list))
+
+ self.addCleanup(cleanup)
def test_filter_instances(self):
"""This test checks filtering of instances by Instance Name
@@ -202,27 +245,18 @@ class TestInstances(helpers.TestCase):
8) Set nonexistent instance name. Check that 0 rows are displayed
9) Clear filter and delete instances via proper page (depends on user)
"""
- instance_count = 2
- instance_list = ["{0}-{1}".format(self.INSTANCE_NAME, item)
- for item in range(1, instance_count + 1)]
-
- instances_page = self.home_pg.go_to_project_compute_instancespage()
- instances_page.create_instance(self.INSTANCE_NAME,
- instance_count=instance_count)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
- self.assertTrue(instances_page.is_instance_active(instance_list[0]))
instances_page = self.instances_page
instances_page.instances_table.set_filter_value('name')
- instances_page.instances_table.filter(instance_list[0])
- self.assertTrue(instances_page.is_instance_present(instance_list[0]))
- for instance in instance_list[1:]:
+ instances_page.instances_table.filter(self.instance_list[0])
+ self.assertTrue(
+ instances_page.is_instance_present(self.instance_list[0]))
+ for instance in self.instance_list[1:]:
self.assertFalse(instances_page.is_instance_present(instance))
instances_page.instances_table.filter(self.INSTANCE_NAME)
- for instance in instance_list:
+ for instance in self.instance_list:
self.assertTrue(instances_page.is_instance_present(instance))
nonexistent_instance_name = "{0}_test".format(self.INSTANCE_NAME)
@@ -230,24 +264,62 @@ class TestInstances(helpers.TestCase):
self.assertEqual(instances_page.instances_table.rows, [])
instances_page.instances_table.filter('')
- instances_page.delete_instances(instance_list)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
- self.assertTrue(instances_page.are_instances_deleted(instance_list))
-
-class TestAdminInstances(helpers.AdminTestCase, TestInstances):
+class TestAdminInstancesPagination(helpers.AdminTestCase, TestInstances):
INSTANCE_NAME = helpers.gen_random_resource_name('instance',
timestamp=False)
+ ITEMS_PER_PAGE = 1
+ INSTANCE_COUNT = 2
@property
def instances_page(self):
self.home_pg.go_to_admin_overviewpage()
return self.home_pg.go_to_admin_compute_instancespage()
- @property
- def instance_table_name_column(self):
- return 'Name'
+ def setUp(self):
+ super().setUp()
+ self.instance_list = ["{0}-{1}".format(self.INSTANCE_NAME, item)
+ for item in range(1, self.INSTANCE_COUNT + 1)]
+
+ # we have to use the project page, since admin has no create button
+ instances_page = self.home_pg.go_to_project_compute_instancespage()
+
+ # delete any old instances
+ garbage = instances_page.instances_table.get_column_data(
+ name_column='Instance Name')
+ if garbage:
+ instances_page.delete_instances(garbage)
+ self.assertTrue(
+ instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertTrue(
+ instances_page.are_instances_deleted(garbage))
+
+ instances_page.create_instance(self.INSTANCE_NAME,
+ instance_count=self.INSTANCE_COUNT)
+ self.assertTrue(
+ instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertTrue(
+ instances_page.is_instance_active(self.instance_list[1]))
+
+ settings_page = self.home_pg.go_to_settings_usersettingspage()
+ settings_page.change_pagesize(self.ITEMS_PER_PAGE)
+ self.assertTrue(
+ settings_page.find_message_and_dismiss(messages.SUCCESS))
+
+ def cleanup():
+ settings_page = self.home_pg.go_to_settings_usersettingspage()
+ settings_page.change_pagesize()
+ self.assertTrue(
+ settings_page.find_message_and_dismiss(messages.SUCCESS))
+
+ instances_page = self.instances_page
+ instances_page.delete_instances(self.instance_list)
+ self.assertTrue(
+ instances_page.find_message_and_dismiss(messages.INFO))
+ self.assertTrue(
+ instances_page.are_instances_deleted(self.instance_list))
+
+ self.addCleanup(cleanup)
def test_instances_pagination(self):
"""This test checks instance pagination
@@ -266,27 +338,12 @@ class TestAdminInstances(helpers.AdminTestCase, TestInstances):
9) Go to user settings page and restore 'Items Per Page'
10) Delete created instances via proper page
"""
- items_per_page = 1
- instance_count = 2
- instance_list = ["{0}-{1}".format(self.INSTANCE_NAME, item)
- for item in range(1, instance_count + 1)]
first_page_definition = {'Next': True, 'Prev': False,
- 'Count': items_per_page,
- 'Names': [instance_list[1]]}
+ 'Count': self.ITEMS_PER_PAGE,
+ 'Names': [self.instance_list[1]]}
second_page_definition = {'Next': False, 'Prev': True,
- 'Count': items_per_page,
- 'Names': [instance_list[0]]}
- settings_page = self.home_pg.go_to_settings_usersettingspage()
- settings_page.change_pagesize(items_per_page)
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
-
- instances_page = self.home_pg.go_to_project_compute_instancespage()
- instances_page.create_instance(self.INSTANCE_NAME,
- instance_count=instance_count)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
- self.assertTrue(instances_page.is_instance_active(instance_list[1]))
+ 'Count': self.ITEMS_PER_PAGE,
+ 'Names': [self.instance_list[0]]}
instances_page = self.instances_page
instances_page.instances_table.assert_definition(
@@ -300,17 +357,6 @@ class TestAdminInstances(helpers.AdminTestCase, TestInstances):
instances_page.instances_table.assert_definition(
first_page_definition, sorting=True)
- settings_page = self.home_pg.go_to_settings_usersettingspage()
- settings_page.change_pagesize()
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
-
- instances_page = self.instances_page
- instances_page.delete_instances(instance_list)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
- self.assertTrue(instances_page.are_instances_deleted(instance_list))
-
def test_instances_pagination_and_filtration(self):
"""This test checks instance pagination and filtration
@@ -331,39 +377,23 @@ class TestAdminInstances(helpers.AdminTestCase, TestInstances):
10) Delete created instances via proper page
"""
- items_per_page = 1
- instance_count = 2
- instance_list = ["{0}-{1}".format(self.INSTANCE_NAME, item)
- for item in range(1, instance_count + 1)]
first_page_definition = {'Next': True, 'Prev': False,
- 'Count': items_per_page,
- 'Names': [instance_list[1]]}
+ 'Count': self.ITEMS_PER_PAGE,
+ 'Names': [self.instance_list[1]]}
second_page_definition = {'Next': False, 'Prev': False,
- 'Count': items_per_page,
- 'Names': [instance_list[0]]}
+ 'Count': self.ITEMS_PER_PAGE,
+ 'Names': [self.instance_list[0]]}
filter_first_page_definition = {'Next': False, 'Prev': False,
- 'Count': items_per_page,
- 'Names': [instance_list[1]]}
-
- settings_page = self.home_pg.go_to_settings_usersettingspage()
- settings_page.change_pagesize(items_per_page)
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
-
- instances_page = self.home_pg.go_to_project_compute_instancespage()
- instances_page.create_instance(self.INSTANCE_NAME,
- instance_count=instance_count)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
- self.assertTrue(instances_page.is_instance_active(instance_list[1]))
+ 'Count': self.ITEMS_PER_PAGE,
+ 'Names': [self.instance_list[1]]}
instances_page = self.instances_page
instances_page.instances_table.set_filter_value('name')
- instances_page.instances_table.filter(instance_list[1])
+ instances_page.instances_table.filter(self.instance_list[1])
instances_page.instances_table.assert_definition(
filter_first_page_definition, sorting=True)
- instances_page.instances_table.filter(instance_list[0])
+ instances_page.instances_table.filter(self.instance_list[0])
instances_page.instances_table.assert_definition(
second_page_definition, sorting=True)
@@ -371,14 +401,3 @@ class TestAdminInstances(helpers.AdminTestCase, TestInstances):
instances_page.instances_table.assert_definition(
first_page_definition, sorting=True)
instances_page.instances_table.filter('')
-
- settings_page = self.home_pg.go_to_settings_usersettingspage()
- settings_page.change_pagesize()
- self.assertTrue(
- settings_page.find_message_and_dismiss(messages.SUCCESS))
-
- instances_page = self.instances_page
- instances_page.delete_instances(instance_list)
- self.assertTrue(
- instances_page.find_message_and_dismiss(messages.INFO))
- self.assertTrue(instances_page.are_instances_deleted(instance_list))
diff --git a/openstack_dashboard/test/integration_tests/tests/test_volumes.py b/openstack_dashboard/test/integration_tests/tests/test_volumes.py
index 92c88b66b..002f502a5 100644
--- a/openstack_dashboard/test/integration_tests/tests/test_volumes.py
+++ b/openstack_dashboard/test/integration_tests/tests/test_volumes.py
@@ -101,6 +101,15 @@ class TestVolumesBasic(helpers.TestCase):
12) Delete created volumes
"""
volumes_page = self.home_pg.go_to_project_volumes_volumespage()
+
+ # delete any old instances
+ garbage = volumes_page.volumes_table.get_column_data(
+ name_column='Name')
+ if garbage:
+ volumes_page.delete_volumes(garbage)
+ self.assertTrue(
+ volumes_page.find_message_and_dismiss(messages.INFO))
+
count = 3
items_per_page = 1
volumes_names = ["{0}_{1}".format(self.VOLUME_NAME, i) for i in
diff --git a/openstack_dashboard/test/test_data/cinder_data.py b/openstack_dashboard/test/test_data/cinder_data.py
index cc2f72681..8aa0b5e6c 100644
--- a/openstack_dashboard/test/test_data/cinder_data.py
+++ b/openstack_dashboard/test/test_data/cinder_data.py
@@ -579,6 +579,20 @@ def data(TEST):
'user_message': ('schedule allocate volume:'
'Could not find any available weighted backend.'),
})
+ messages_4 = messages.Message(
+ messages.MessageManager(None),
+ {'created_at': '2020-09-24T11:03:31.000000',
+ 'event_id': 'VOLUME_VOLUME_BACKUP_001_004',
+ 'guaranteed_until': '2020-10-24T11:03:31.000000',
+ 'id': '029c84a0-5810-47ed-94b6-c2aa61c5aaaf',
+ 'resource_type': 'VOLUME_BACKUP',
+ 'resource_uuid': '3c2106cb-ebef-490e-803d-b92f061e7308',
+ 'message_level': 'ERROR',
+ 'user_message': ('create backup:'
+ 'Backup driver failed to create backup.'),
+ })
+
TEST.cinder_messages.add(api.cinder.Message(messages_1))
TEST.cinder_messages.add(api.cinder.Message(messages_2))
TEST.cinder_messages.add(api.cinder.Message(messages_3))
+ TEST.cinder_messages.add(api.cinder.Message(messages_4))
diff --git a/releasenotes/notes/add_default_user_data-76d9c17e474fc34e.yaml b/releasenotes/notes/add_default_user_data-76d9c17e474fc34e.yaml
new file mode 100644
index 000000000..0a533cfd3
--- /dev/null
+++ b/releasenotes/notes/add_default_user_data-76d9c17e474fc34e.yaml
@@ -0,0 +1,7 @@
+---
+features:
+ - |
+ The new setting ``OPENSTACK_SERVER_DEFAULT_USER_DATA`` allows an
+ administrator to specify a default user data (e.g. comments or
+ instructions for cloudinit) for new VMs. It can be a raw string or string
+ template that accepts the request.
diff --git a/releasenotes/notes/add_enable_metadata_and_enable_net_ports_options-8213bb18558031a8.yaml b/releasenotes/notes/add_enable_metadata_and_enable_net_ports_options-8213bb18558031a8.yaml
new file mode 100644
index 000000000..564e4e568
--- /dev/null
+++ b/releasenotes/notes/add_enable_metadata_and_enable_net_ports_options-8213bb18558031a8.yaml
@@ -0,0 +1,6 @@
+---
+features:
+ - |
+ The new settings ``LAUNCH_INSTANCE_DEFAULTS.enable_metadata`` and
+ ``LAUNCH_INSTANCE_DEFAULTS.enable_net_ports`` allow to hide Metadata and
+ Network Ports tabs from launch instance workflow.
diff --git a/releasenotes/notes/cinder-backup-cinder-messages-2127d04da3c82033.yaml b/releasenotes/notes/cinder-backup-cinder-messages-2127d04da3c82033.yaml
new file mode 100644
index 000000000..aa52ddfce
--- /dev/null
+++ b/releasenotes/notes/cinder-backup-cinder-messages-2127d04da3c82033.yaml
@@ -0,0 +1,4 @@
+---
+features:
+ - |
+ Cinder user messages are now available for volume backups in a messages tab.
diff --git a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
index 6da696a10..0e67a37d7 100644
--- a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
+++ b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
@@ -9,11 +9,11 @@ msgid ""
msgstr ""
"Project-Id-Version: horizon\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-19 10:41+0000\n"
+"POT-Creation-Date: 2022-09-08 12:49+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2022-05-25 09:17+0000\n"
+"PO-Revision-Date: 2022-09-10 01:48+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>\n"
"Language-Team: English (United Kingdom)\n"
"Language: en_GB\n"
@@ -168,8 +168,8 @@ msgstr "18.3.0"
msgid "18.3.3"
msgstr "18.3.3"
-msgid "18.3.5-3"
-msgstr "18.3.5-3"
+msgid "18.3.5-4"
+msgstr "18.3.5-4"
msgid "18.5.0"
msgstr "18.5.0"
@@ -192,8 +192,8 @@ msgstr "19.1.0"
msgid "19.2.0"
msgstr "19.2.0"
-msgid "19.2.0-14"
-msgstr "19.2.0-14"
+msgid "19.3.0"
+msgstr "19.3.0"
msgid "20.0.0"
msgstr "20.0.0"
@@ -210,12 +210,15 @@ msgstr "21.0.0"
msgid "22.0.0"
msgstr "22.0.0"
-msgid "22.0.0-13"
-msgstr "22.0.0-13"
-
msgid "22.1.0"
msgstr "22.1.0"
+msgid "22.2.0"
+msgstr "22.2.0"
+
+msgid "22.2.0-22"
+msgstr "22.2.0-22"
+
msgid "8.0.1"
msgstr "8.0.1"
@@ -1342,6 +1345,11 @@ msgstr ""
"Cinder defines storage size in gibibytes (GiB), which is inconsistent with "
"Horizon panels that show/request storage size in gigabytes (GB)."
+msgid ""
+"Cinder user messages are now available for volume backups in a messages tab."
+msgstr ""
+"Cinder user messages are now available for volume backups in a messages tab."
+
msgid "Cinder v2 by default"
msgstr "Cinder v2 by default"
@@ -3953,6 +3961,25 @@ msgstr ""
"special additional dashboard when enabled and supported in Neutron."
msgid ""
+"The Django version of the Images, Keypairs, and Roles panels is deprecated "
+"now. Switch to the AngularJS version by setting ``images_panel``, "
+"``key_pairs_panel`` and ``roles_panel`` keys in ``ANGULAR_FEATURES`` setting "
+"to ``True`` (or dropping these keys from ``ANGULAR_FEATURES`` setting). The "
+"horizon team believes that feature gaps between Django and AngularJS "
+"implementations have been closed for all these panels and we can drop the "
+"Django version. If you see any feature gap, please file a bug to horizon or "
+"contact the horizon team."
+msgstr ""
+"The Django version of the Images, Keypairs, and Roles panels is deprecated "
+"now. Switch to the AngularJS version by setting ``images_panel``, "
+"``key_pairs_panel`` and ``roles_panel`` keys in ``ANGULAR_FEATURES`` setting "
+"to ``True`` (or dropping these keys from ``ANGULAR_FEATURES`` setting). The "
+"horizon team believes that feature gaps between Django and AngularJS "
+"implementations have been closed for all these panels and we can drop the "
+"Django version. If you see any feature gap, please file a bug to Horizon or "
+"contact the Horizon team."
+
+msgid ""
"The Django version of the launch instance form is deprecated now. Switch to "
"the AngularJS version of the form by setting ``LAUNCH_INSTANCE_NG_ENABLED`` "
"to ``True`` and ``LAUNCH_INSTANCE_LEGACY_ENABLED`` to ``False``. The horizon "
@@ -4692,6 +4719,26 @@ msgstr ""
"or actions taken by other users on those instances."
msgid ""
+"The new setting ``OPENSTACK_SERVER_DEFAULT_USER_DATA`` allows an "
+"administrator to specify a default user data (e.g. comments or instructions "
+"for cloudinit) for new VMs. It can be a raw string or string template that "
+"accepts the request."
+msgstr ""
+"The new setting ``OPENSTACK_SERVER_DEFAULT_USER_DATA`` allows an "
+"administrator to specify default user data (e.g. comments or instructions "
+"for cloud-init) for new VMs. It can be a raw string or string template that "
+"accepts the request."
+
+msgid ""
+"The new settings ``LAUNCH_INSTANCE_DEFAULTS.enable_metadata`` and "
+"``LAUNCH_INSTANCE_DEFAULTS.enable_net_ports`` allow to hide Metadata and "
+"Network Ports tabs from launch instance workflow."
+msgstr ""
+"The new settings ``LAUNCH_INSTANCE_DEFAULTS.enable_metadata`` and "
+"``LAUNCH_INSTANCE_DEFAULTS.enable_net_ports`` allow to hide Metadata and "
+"Network Ports tabs from launch instance workflow."
+
+msgid ""
"The number of OpenStack Compute (Nova) features that are supported in "
"Horizon continues to grow. New features in the Havana release include:"
msgstr ""
diff --git a/requirements.txt b/requirements.txt
index 9eabe2f25..70b5f94e0 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,7 @@
+# Note: Requirements lower bounds listed here are our best effort to keep them up to
+# date but we do not test them so there is no guarantee of having them all correct.
+# if you find any incorrect lower bounds, let us know or propose a fix.
+
# 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.
diff --git a/setup.cfg b/setup.cfg
index 0c7a5578a..76ead952f 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -6,6 +6,7 @@ description_file =
author = OpenStack
author_email = openstack-discuss@lists.openstack.org
home_page = https://docs.openstack.org/horizon/latest/
+python_requires = >=3.8
classifier =
Development Status :: 5 - Production/Stable
Environment :: OpenStack
@@ -19,8 +20,6 @@ classifier =
Programming Language :: Python
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
Topic :: Internet :: WWW/HTTP
diff --git a/setup.py b/setup.py
index 566d84432..0fa6510d8 100644
--- a/setup.py
+++ b/setup.py
@@ -13,16 +13,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-# THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT
import setuptools
-# In python < 2.7.4, a lazy loading of package `pbr` will break
-# setuptools if some other modules registered functions in `atexit`.
-# solution from: http://bugs.python.org/issue15881#msg170215
-try:
- import multiprocessing # noqa
-except ImportError:
- pass
setuptools.setup(
setup_requires=['pbr>=2.0.0'],
diff --git a/tox.ini b/tox.ini
index 9765f3449..8a4ebfab8 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,6 +1,6 @@
[tox]
minversion = 3.18.0
-envlist = pep8,py36,py39,releasenotes,npm,py3-dj32
+envlist = pep8,py39,releasenotes,npm,py3-dj32
skipsdist = True
# Automatic envs (pyXX) will only use the python version appropriate to that
# env and ignore basepython inherited from [testenv] if we set
@@ -13,8 +13,9 @@ usedevelop = True
setenv =
VIRTUAL_ENV = {envdir}
PYTHONDONTWRITEBYTECODE = 1
+ # TODO(amotoki): There are three variants of PYTHONWARNINGS. They should be merged.
PYTHONWARNINGS = once,ignore::PendingDeprecationWarning
- py{3,36,37}:PYTHONWARNINGS = once,ignore::PendingDeprecationWarning,ignore::ImportWarning:backports
+ py{3,39}:PYTHONWARNINGS = once,ignore::PendingDeprecationWarning,ignore::ImportWarning:backports
# DeprecationWarning is disabled in dj32 tox env as Django 3.2
# deprecated Django 2.2 features. This workaround is just to reduce
# the number of warnings due to this change.
@@ -35,14 +36,6 @@ commands =
find . -type f -name "*.pyc" -delete
bash {toxinidir}/tools/unit_tests.sh {toxinidir} {posargs}
-[testenv:lower-constraints]
-deps =
- -c{toxinidir}/lower-constraints.txt
- -r{toxinidir}/test-requirements.txt
- -r{toxinidir}/requirements.txt
- # Unit test for a local hacking rule requires hacking.
- hacking>=3.0.1,<3.1.0 # Apache-2.0
-
[testenv:venv]
envdir = {toxworkdir}/venv
commands = {posargs}