summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.zuul.yaml4
-rw-r--r--devstack/lib/heat16
-rwxr-xr-xdevstack/upgrade/resources.sh2
-rwxr-xr-xdevstack/upgrade/shutdown.sh4
-rw-r--r--doc/source/template_guide/composition.rst2
-rw-r--r--heat/common/config.py12
-rw-r--r--heat/common/policy.py4
-rw-r--r--heat/common/wsgi.py63
-rw-r--r--heat/db/sqlalchemy/api.py15
-rw-r--r--heat/db/sqlalchemy/types.py2
-rw-r--r--heat/engine/clients/os/magnum.py10
-rw-r--r--heat/engine/clients/os/openstacksdk.py6
-rw-r--r--heat/engine/hot/functions.py4
-rw-r--r--heat/engine/resources/openstack/heat/cloud_watch.py41
-rw-r--r--heat/engine/resources/openstack/heat/swiftsignal.py2
-rw-r--r--heat/engine/resources/openstack/magnum/bay.py137
-rw-r--r--heat/engine/resources/openstack/neutron/floatingip.py156
-rw-r--r--heat/engine/resources/openstack/nova/keypair.py17
-rw-r--r--heat/engine/resources/volume_base.py13
-rw-r--r--heat/engine/stack.py6
-rw-r--r--heat/engine/stk_defn.py7
-rw-r--r--heat/locale/de/LC_MESSAGES/heat.po70
-rw-r--r--heat/locale/es/LC_MESSAGES/heat.po63
-rw-r--r--heat/locale/fr/LC_MESSAGES/heat.po64
-rw-r--r--heat/locale/it/LC_MESSAGES/heat.po66
-rw-r--r--heat/locale/ja/LC_MESSAGES/heat.po60
-rw-r--r--heat/locale/ko_KR/LC_MESSAGES/heat.po60
-rw-r--r--heat/locale/pt_BR/LC_MESSAGES/heat.po63
-rw-r--r--heat/locale/ru/LC_MESSAGES/heat.po58
-rw-r--r--heat/locale/zh_CN/LC_MESSAGES/heat.po57
-rw-r--r--heat/locale/zh_TW/LC_MESSAGES/heat.po57
-rw-r--r--heat/tests/clients/test_magnum_client.py19
-rw-r--r--heat/tests/openstack/cinder/test_volume.py23
-rw-r--r--heat/tests/openstack/heat/test_swiftsignal.py111
-rw-r--r--heat/tests/openstack/magnum/test_bay.py157
-rw-r--r--heat/tests/openstack/neutron/test_neutron_floating_ip.py262
-rw-r--r--heat/tests/openstack/nova/test_keypair.py23
-rw-r--r--heat_integrationtests/functional/test_template_resource.py21
-rw-r--r--releasenotes/notes/add-port-forwarding-resource-e32b5515f1b47a28.yaml6
-rw-r--r--releasenotes/notes/cloud-watch-cleanup-62151466d15ac504.yaml4
-rw-r--r--releasenotes/source/index.rst1
-rw-r--r--releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po26
-rw-r--r--releasenotes/source/zed.rst6
-rw-r--r--setup.cfg1
-rw-r--r--tox.ini6
45 files changed, 652 insertions, 1155 deletions
diff --git a/.zuul.yaml b/.zuul.yaml
index 233dc0d95..1ae750731 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -184,8 +184,8 @@
queue: heat
templates:
- openstack-cover-jobs
- - openstack-python3-zed-jobs
- - openstack-python3-zed-jobs-arm64
+ - openstack-python3-jobs
+ - openstack-python3-jobs-arm64
- periodic-stable-jobs
- publish-openstack-docs-pti
- check-requirements
diff --git a/devstack/lib/heat b/devstack/lib/heat
index dcd59b6f4..8e953ca26 100644
--- a/devstack/lib/heat
+++ b/devstack/lib/heat
@@ -333,14 +333,6 @@ function stop_heat {
fi
}
-# TODO(ramishra): Remove after Queens
-function stop_cw_service {
- if $SYSTEMCTL is-enabled devstack@h-api-cw.service; then
- $SYSTEMCTL stop devstack@h-api-cw.service
- $SYSTEMCTL disable devstack@h-api-cw.service
- fi
-}
-
# _cleanup_heat_apache_wsgi() - Remove wsgi files, disable and remove apache vhost file
function _cleanup_heat_apache_wsgi {
if [[ "$WSGI_MODE" == "uwsgi" ]]; then
@@ -446,8 +438,12 @@ function configure_tempest_for_heat {
# Skip CfnInitIntegrationTest as latest fedora images don't have heat-cfntools
iniset $TEMPEST_CONFIG heat_plugin skip_scenario_test_list 'AutoscalingLoadBalancerTest, AutoscalingLoadBalancerv2Test, \
SoftwareConfigIntegrationTest, AodhAlarmTest, CfnInitIntegrationTest'
- # Skip LoadBalancerv2Test as deprecated neutron-lbaas service is not enabled
- iniset $TEMPEST_CONFIG heat_plugin skip_functional_test_list 'LoadBalancerv2Test, NotificationTest'
+ # Skip LoadBalancerv2Test as deprecated neutron-lbaas service is not enabled.
+ # Also Skip a few tests failing because of a known libvirt issue in Jammy
+ # https://bugs.launchpad.net/nova/+bug/1998274
+ iniset $TEMPEST_CONFIG heat_plugin skip_functional_test_list 'LoadBalancerv2Test, NotificationTest, \
+ UpdateStackTest.test_stack_update_with_replacing_userdata, \
+ CancelUpdateTest.test_cancel_update_server_with_port'
openstack flavor show m1.heat_int || openstack flavor create m1.heat_int --ram 512 --disk 10
openstack flavor show m1.heat_micro || openstack flavor create m1.heat_micro --ram 128 --disk 1
diff --git a/devstack/upgrade/resources.sh b/devstack/upgrade/resources.sh
index 3f00dce9d..20ae4589d 100755
--- a/devstack/upgrade/resources.sh
+++ b/devstack/upgrade/resources.sh
@@ -71,7 +71,7 @@ function _run_heat_integrationtests {
tox -evenv-tempest -- pip install -c$UPPER_CONSTRAINTS_FILE $HEAT_TEMPEST_PLUGIN
tox -evenv-tempest -- stestr --test-path=$DEST/heat/heat_integrationtests --top-dir=$DEST/heat \
--group_regex='heat_tempest_plugin\.tests\.api\.test_heat_api[._]([^_]+)' \
- run --whitelist-file $UPGRADE_TESTS
+ run --include-list $UPGRADE_TESTS
_heat_set_user
popd
}
diff --git a/devstack/upgrade/shutdown.sh b/devstack/upgrade/shutdown.sh
index dfe566cee..f512e8d4d 100755
--- a/devstack/upgrade/shutdown.sh
+++ b/devstack/upgrade/shutdown.sh
@@ -30,10 +30,6 @@ set -o xtrace
stop_heat
-# stop cloudwatch service if running
-# TODO(ramishra): Remove it after Queens
-stop_cw_service
-
SERVICES_DOWN="heat-api heat-engine heat-api-cfn"
# sanity check that services are actually down
diff --git a/doc/source/template_guide/composition.rst b/doc/source/template_guide/composition.rst
index 1176cf8ca..5cfc531f5 100644
--- a/doc/source/template_guide/composition.rst
+++ b/doc/source/template_guide/composition.rst
@@ -146,7 +146,7 @@ accessible as follows
outputs:
test_out:
- value: {get_attr: my_server, resource.server, first_address}
+ value: {get_attr: [my_server, resource.server, first_address]}
Making your template resource more "transparent"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/heat/common/config.py b/heat/common/config.py
index 72d1aaf09..b96da54aa 100644
--- a/heat/common/config.py
+++ b/heat/common/config.py
@@ -47,12 +47,6 @@ service_opts = [
'keystone catalog')),
cfg.StrOpt('heat_waitcondition_server_url',
help=_('URL of the Heat waitcondition server.')),
- cfg.StrOpt('heat_watch_server_url',
- default="",
- deprecated_for_removal=True,
- deprecated_reason='Heat CloudWatch Service has been removed.',
- deprecated_since='10.0.0',
- help=_('URL of the Heat CloudWatch server.')),
cfg.StrOpt('instance_connection_is_secure',
default="0",
help=_('Instance connection to CFN/CW API via https.')),
@@ -218,12 +212,6 @@ engine_opts = [
default=2,
help=_('RPC timeout for the engine liveness check that is used'
' for stack locking.')),
- cfg.BoolOpt('enable_cloud_watch_lite',
- default=False,
- deprecated_for_removal=True,
- deprecated_reason='Heat CloudWatch Service has been removed.',
- deprecated_since='10.0.0',
- help=_('Enable the legacy OS::Heat::CWLiteAlarm resource.')),
cfg.BoolOpt('enable_stack_abandon',
default=False,
help=_('Enable the preview Stack Abandon feature.')),
diff --git a/heat/common/policy.py b/heat/common/policy.py
index 7f53b38f7..bfcadbaf4 100644
--- a/heat/common/policy.py
+++ b/heat/common/policy.py
@@ -188,6 +188,6 @@ class ResourceEnforcer(Enforcer):
def enforce_stack(self, stack, scope=None, target=None,
is_registered_policy=False):
- for res in stack.resources.values():
- self.enforce(stack.context, res.type(), scope=scope, target=target,
+ for res_type in stack.defn.all_resource_types():
+ self.enforce(stack.context, res_type, scope=scope, target=target,
is_registered_policy=is_registered_policy)
diff --git a/heat/common/wsgi.py b/heat/common/wsgi.py
index 7e63ee883..42126b7b4 100644
--- a/heat/common/wsgi.py
+++ b/heat/common/wsgi.py
@@ -130,68 +130,6 @@ cfg.CONF.register_group(api_cfn_group)
cfg.CONF.register_opts(api_cfn_opts,
group=api_cfn_group)
-api_cw_opts = [
- cfg.IPOpt('bind_host', default='0.0.0.0',
- help=_('Address to bind the server. Useful when '
- 'selecting a particular network interface.'),
- deprecated_group='DEFAULT',
- deprecated_for_removal=True,
- deprecated_reason='Heat CloudWatch API has been removed.',
- deprecated_since='10.0.0'),
- cfg.PortOpt('bind_port', default=8003,
- help=_('The port on which the server will listen.'),
- deprecated_group='DEFAULT',
- deprecated_for_removal=True,
- deprecated_reason='Heat CloudWatch API has been removed.',
- deprecated_since='10.0.0'),
- cfg.IntOpt('backlog', default=4096,
- help=_("Number of backlog requests "
- "to configure the socket with."),
- deprecated_group='DEFAULT',
- deprecated_for_removal=True,
- deprecated_reason='Heat CloudWatch API has been removed.',
- deprecated_since='10.0.0'),
- cfg.StrOpt('cert_file',
- help=_("Location of the SSL certificate file "
- "to use for SSL mode."),
- deprecated_group='DEFAULT',
- deprecated_for_removal=True,
- deprecated_reason='Heat CloudWatch API has been Removed.',
- deprecated_since='10.0.0'),
- cfg.StrOpt('key_file',
- help=_("Location of the SSL key file to use "
- "for enabling SSL mode."),
- deprecated_group='DEFAULT',
- deprecated_for_removal=True,
- deprecated_reason='Heat CloudWatch API has been Removed.',
- deprecated_since='10.0.0'),
- cfg.IntOpt('workers', min=0, default=1,
- help=_("Number of workers for Heat service."),
- deprecated_group='DEFAULT',
- deprecated_for_removal=True,
- deprecated_reason='Heat CloudWatch API has been Removed.',
- deprecated_since='10.0.0'),
- cfg.IntOpt('max_header_line', default=16384,
- help=_('Maximum line size of message headers to be accepted. '
- 'max_header_line may need to be increased when using '
- 'large tokens (typically those generated by the '
- 'Keystone v3 API with big service catalogs.)'),
- deprecated_for_removal=True,
- deprecated_reason='Heat CloudWatch API has been Removed.',
- deprecated_since='10.0.0'),
- cfg.IntOpt('tcp_keepidle', default=600,
- help=_('The value for the socket option TCP_KEEPIDLE. This is '
- 'the time in seconds that the connection must be idle '
- 'before TCP starts sending keepalive probes.'),
- deprecated_for_removal=True,
- deprecated_reason='Heat CloudWatch API has been Removed.',
- deprecated_since='10.0.0')
-]
-api_cw_group = cfg.OptGroup('heat_api_cloudwatch')
-cfg.CONF.register_group(api_cw_group)
-cfg.CONF.register_opts(api_cw_opts,
- group=api_cw_group)
-
wsgi_elt_opts = [
cfg.BoolOpt('wsgi_keep_alive',
default=True,
@@ -218,7 +156,6 @@ def list_opts():
yield None, [json_size_opt]
yield 'heat_api', api_opts
yield 'heat_api_cfn', api_cfn_opts
- yield 'heat_api_cloudwatch', api_cw_opts
yield 'eventlet_opts', wsgi_elt_opts
diff --git a/heat/db/sqlalchemy/api.py b/heat/db/sqlalchemy/api.py
index 4b719d8de..df627d43c 100644
--- a/heat/db/sqlalchemy/api.py
+++ b/heat/db/sqlalchemy/api.py
@@ -65,7 +65,9 @@ LOG = logging.getLogger(__name__)
# TODO(sbaker): fix tests so that sqlite_fk=True can be passed to configure
-db_context.configure()
+# FIXME(stephenfin): we need to remove reliance on autocommit semantics ASAP
+# since it's not compatible with SQLAlchemy 2.0
+db_context.configure(__autocommit=True)
def get_facade():
@@ -385,9 +387,14 @@ def resource_data_get_all(context, resource_id, data=None):
for res in data:
if res.redact:
- ret[res.key] = crypt.decrypt(res.decrypt_method, res.value)
- else:
- ret[res.key] = res.value
+ try:
+ ret[res.key] = crypt.decrypt(res.decrypt_method, res.value)
+ continue
+ except exception.InvalidEncryptionKey:
+ LOG.exception('Failed to decrypt resource data %(rkey)s '
+ 'for %(rid)s, ignoring.',
+ {'rkey': res.key, 'rid': resource_id})
+ ret[res.key] = res.value
return ret
diff --git a/heat/db/sqlalchemy/types.py b/heat/db/sqlalchemy/types.py
index 4d4a213e5..d454024c6 100644
--- a/heat/db/sqlalchemy/types.py
+++ b/heat/db/sqlalchemy/types.py
@@ -34,6 +34,8 @@ class LongText(types.TypeDecorator):
class Json(LongText):
+ cache_ok = True
+
def process_bind_param(self, value, dialect):
return dumps(value)
diff --git a/heat/engine/clients/os/magnum.py b/heat/engine/clients/os/magnum.py
index 310b81c8d..acc470b08 100644
--- a/heat/engine/clients/os/magnum.py
+++ b/heat/engine/clients/os/magnum.py
@@ -57,10 +57,6 @@ class MagnumClientPlugin(client_plugin.ClientPlugin):
raise exception.EntityNotFound(entity=entity_msg,
name=value)
- def get_baymodel(self, value):
- return self._get_rsrc_name_or_id(value, entity='baymodels',
- entity_msg='BayModel')
-
def get_cluster_template(self, value):
return self._get_rsrc_name_or_id(value, entity='cluster_templates',
entity_msg='ClusterTemplate')
@@ -70,9 +66,3 @@ class ClusterTemplateConstraint(constraints.BaseCustomConstraint):
resource_client_name = CLIENT_NAME
resource_getter_name = 'get_cluster_template'
-
-
-class BaymodelConstraint(constraints.BaseCustomConstraint):
-
- resource_client_name = CLIENT_NAME
- resource_getter_name = 'get_baymodel'
diff --git a/heat/engine/clients/os/openstacksdk.py b/heat/engine/clients/os/openstacksdk.py
index 56c17b45b..15a08bf30 100644
--- a/heat/engine/clients/os/openstacksdk.py
+++ b/heat/engine/clients/os/openstacksdk.py
@@ -72,6 +72,12 @@ class OpenStackSDKPlugin(client_plugin.ClientPlugin):
def find_network_segment(self, value):
return self.client().network.find_segment(value).id
+ def find_network_port(self, value):
+ return self.client().network.find_port(value).id
+
+ def find_network_ip(self, value):
+ return self.client().network.find_ip(value).id
+
class SegmentConstraint(constraints.BaseCustomConstraint):
diff --git a/heat/engine/hot/functions.py b/heat/engine/hot/functions.py
index a309392b3..ec4bb9d6d 100644
--- a/heat/engine/hot/functions.py
+++ b/heat/engine/hot/functions.py
@@ -738,7 +738,9 @@ class MapMerge(function.Function):
elif isinstance(m, collections.abc.Mapping):
return m
else:
- msg = _('Incorrect arguments: Items to merge must be maps.')
+ msg = _('Incorrect arguments: Items to merge must be maps. '
+ '{} is type {} instead of a dict'.format(
+ repr(m)[:200], type(m)))
raise TypeError(msg)
ret_map = {}
diff --git a/heat/engine/resources/openstack/heat/cloud_watch.py b/heat/engine/resources/openstack/heat/cloud_watch.py
deleted file mode 100644
index 26ed62f13..000000000
--- a/heat/engine/resources/openstack/heat/cloud_watch.py
+++ /dev/null
@@ -1,41 +0,0 @@
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-from oslo_config import cfg
-
-from heat.common.i18n import _
-from heat.engine.resources.openstack.heat import none_resource
-from heat.engine import support
-
-
-class CloudWatchAlarm(none_resource.NoneResource):
- support_status = support.SupportStatus(
- status=support.HIDDEN,
- message=_('OS::Heat::CWLiteAlarm resource has been removed '
- 'since version 10.0.0. Existing stacks can still '
- 'use it, where it would do nothing for update/delete.'),
- version='5.0.0',
- previous_status=support.SupportStatus(
- status=support.DEPRECATED,
- version='2014.2')
- )
-
-
-def resource_mapping():
- cfg.CONF.import_opt('enable_cloud_watch_lite', 'heat.common.config')
- if cfg.CONF.enable_cloud_watch_lite:
- return {
- 'OS::Heat::CWLiteAlarm': CloudWatchAlarm,
- }
- else:
- return {}
diff --git a/heat/engine/resources/openstack/heat/swiftsignal.py b/heat/engine/resources/openstack/heat/swiftsignal.py
index dc78b9310..295f6ae4f 100644
--- a/heat/engine/resources/openstack/heat/swiftsignal.py
+++ b/heat/engine/resources/openstack/heat/swiftsignal.py
@@ -267,6 +267,8 @@ class SwiftSignal(resource.Resource):
continue
body = signal[1]
+ if isinstance(body, bytes):
+ body = body.decode()
if body == swift.IN_PROGRESS: # Ignore the initial object
continue
if body == "":
diff --git a/heat/engine/resources/openstack/magnum/bay.py b/heat/engine/resources/openstack/magnum/bay.py
index 1837dd552..f3a1693e6 100644
--- a/heat/engine/resources/openstack/magnum/bay.py
+++ b/heat/engine/resources/openstack/magnum/bay.py
@@ -11,15 +11,12 @@
# License for the specific language governing permissions and limitations
# under the License.
-from heat.common import exception
from heat.common.i18n import _
-from heat.engine import constraints
-from heat.engine import properties
-from heat.engine import resource
+from heat.engine.resources.openstack.heat import none_resource
from heat.engine import support
-class Bay(resource.Resource):
+class Bay(none_resource.NoneResource):
"""A resource that creates a Magnum Bay.
This resource has been deprecated in favor of OS::Magnum::Cluster.
@@ -40,136 +37,6 @@ class Bay(resource.Resource):
)
)
- PROPERTIES = (
- NAME, BAYMODEL, NODE_COUNT, MASTER_COUNT, DISCOVERY_URL,
- BAY_CREATE_TIMEOUT
- ) = (
- 'name', 'baymodel', 'node_count', 'master_count',
- 'discovery_url', 'bay_create_timeout'
- )
-
- properties_schema = {
- NAME: properties.Schema(
- properties.Schema.STRING,
- _('The bay name.')
- ),
- BAYMODEL: properties.Schema(
- properties.Schema.STRING,
- _('The name or ID of the bay model.'),
- constraints=[
- constraints.CustomConstraint('magnum.baymodel')
- ],
- required=True
- ),
- NODE_COUNT: properties.Schema(
- properties.Schema.INTEGER,
- _('The node count for this bay.'),
- constraints=[constraints.Range(min=1)],
- update_allowed=True,
- default=1
- ),
- MASTER_COUNT: properties.Schema(
- properties.Schema.INTEGER,
- _('The number of master nodes for this bay.'),
- constraints=[constraints.Range(min=1)],
- update_allowed=True,
- default=1
- ),
- DISCOVERY_URL: properties.Schema(
- properties.Schema.STRING,
- _('Specifies a custom discovery url for node discovery.')
- ),
- BAY_CREATE_TIMEOUT: properties.Schema(
- properties.Schema.INTEGER,
- _('Timeout for creating the bay in minutes. '
- 'Set to 0 for no timeout.'),
- constraints=[constraints.Range(min=0)],
- default=0
- )
- }
-
- default_client_name = 'magnum'
-
- entity = 'bays'
-
- def handle_create(self):
- args = {
- 'name': self.properties[self.NAME],
- 'baymodel_id': self.properties[self.BAYMODEL],
- 'node_count': self.properties[self.NODE_COUNT],
- 'master_count': self.properties[self.NODE_COUNT],
- 'discovery_url': self.properties[self.DISCOVERY_URL],
- 'bay_create_timeout': self.properties[self.BAY_CREATE_TIMEOUT]
- }
- bay = self.client().bays.create(**args)
- self.resource_id_set(bay.uuid)
- return bay.uuid
-
- def check_create_complete(self, id):
- bay = self.client().bays.get(id)
- if bay.status == 'CREATE_IN_PROGRESS':
- return False
- elif bay.status is None:
- return False
- elif bay.status == 'CREATE_COMPLETE':
- return True
- elif bay.status == 'CREATE_FAILED':
- msg = (_("Failed to create Bay '%(name)s' - %(reason)s")
- % {'name': self.name, 'reason': bay.status_reason})
- raise exception.ResourceInError(status_reason=msg,
- resource_status=bay.status)
- else:
- msg = (_("Unknown status creating Bay '%(name)s' - %(reason)s")
- % {'name': self.name, 'reason': bay.status_reason})
- raise exception.ResourceUnknownStatus(status_reason=msg,
- resource_status=bay.status)
-
- def handle_update(self, json_snippet, tmpl_diff, prop_diff):
- if prop_diff:
- patch = [{'op': 'replace', 'path': '/' + k, 'value': v}
- for k, v in prop_diff.items()]
- self.client().bays.update(self.resource_id, patch)
- return self.resource_id
-
- def parse_live_resource_data(self, resource_properties, resource_data):
- record_reality = {}
-
- for key in [self.NODE_COUNT, self.MASTER_COUNT]:
- record_reality.update({key: resource_data.get(key)})
-
- return record_reality
-
- def check_update_complete(self, id):
- bay = self.client().bays.get(id)
- # Check update complete request might get status before the status
- # got changed to update in progress, so we allow `CREATE_COMPLETE`
- # for it.
- if bay.status in ['UPDATE_IN_PROGRESS', 'CREATE_COMPLETE']:
- return False
- elif bay.status == 'UPDATE_COMPLETE':
- return True
- elif bay.status == 'UPDATE_FAILED':
- msg = (_("Failed to update Bay '%(name)s' - %(reason)s")
- % {'name': self.name, 'reason': bay.status_reason})
- raise exception.ResourceInError(status_reason=msg,
- resource_status=bay.status)
-
- else:
- msg = (_("Unknown status updating Bay '%(name)s' - %(reason)s")
- % {'name': self.name, 'reason': bay.status_reason})
- raise exception.ResourceUnknownStatus(status_reason=msg,
- resource_status=bay.status)
-
- def check_delete_complete(self, id):
- if not id:
- return True
- try:
- self.client().bays.get(id)
- except Exception as exc:
- self.client_plugin().ignore_not_found(exc)
- return True
- return False
-
def resource_mapping():
return {
diff --git a/heat/engine/resources/openstack/neutron/floatingip.py b/heat/engine/resources/openstack/neutron/floatingip.py
index a56a0163d..1b1aa1d77 100644
--- a/heat/engine/resources/openstack/neutron/floatingip.py
+++ b/heat/engine/resources/openstack/neutron/floatingip.py
@@ -455,8 +455,164 @@ class FloatingIPAssociation(neutron.NeutronResource):
self.resource_id_set(self.id)
+class FloatingIPPortForward(neutron.NeutronResource):
+ """A resource for creating port forwarding for floating IPs.
+
+ This resource creates port forwarding for floating IPs.
+ These are sub-resource of exsisting Floating ips, which requires the
+ service_plugin and extension port_forwarding enabled and that the floating
+ ip is not associated with a neutron port.
+ """
+
+ default_client_name = 'openstack'
+
+ required_service_extension = 'floating-ip-port-forwarding'
+
+ support_status = support.SupportStatus(
+ status=support.SUPPORTED,
+ version='19.0.0',
+ )
+
+ PROPERTIES = (
+ INTERNAL_IP_ADDRESS, INTERNAL_PORT_NUMBER, EXTERNAL_PORT,
+ INTERNAL_PORT, PROTOCOL, FLOATINGIP
+ ) = (
+ 'internal_ip_address', 'internal_port_number',
+ 'external_port', 'internal_port', 'protocol', 'floating_ip'
+ )
+
+ properties_schema = {
+ INTERNAL_IP_ADDRESS: properties.Schema(
+ properties.Schema.STRING,
+ _('Internal IP address to port forwarded to.'),
+ required=True,
+ update_allowed=True,
+ constraints=[
+ constraints.CustomConstraint('ip_addr')
+ ]
+ ),
+ INTERNAL_PORT_NUMBER: properties.Schema(
+ properties.Schema.INTEGER,
+ _('Internal port number to port forward to.'),
+ update_allowed=True,
+ constraints=[
+ constraints.Range(min=1, max=65535)
+ ]
+ ),
+ EXTERNAL_PORT: properties.Schema(
+ properties.Schema.INTEGER,
+ _('External port address to port forward from.'),
+ required=True,
+ update_allowed=True,
+ constraints=[
+ constraints.Range(min=1, max=65535)
+ ]
+ ),
+ INTERNAL_PORT: properties.Schema(
+ properties.Schema.STRING,
+ _('Name or ID of the internal_ip_address port.'),
+ required=True,
+ update_allowed=True,
+ constraints=[
+ constraints.CustomConstraint('neutron.port')
+ ]
+ ),
+ PROTOCOL: properties.Schema(
+ properties.Schema.STRING,
+ _('Port protocol to forward.'),
+ required=True,
+ update_allowed=True,
+ constraints=[
+ constraints.AllowedValues([
+ 'tcp', 'udp', 'icmp', 'icmp6', 'sctp', 'dccp'])
+ ]
+ ),
+ FLOATINGIP: properties.Schema(
+ properties.Schema.STRING,
+ _('Name or ID of the floating IP create port forwarding on.'),
+ required=True,
+ ),
+ }
+
+ def translation_rules(self, props):
+ client_plugin = self.client_plugin()
+ return [
+ translation.TranslationRule(
+ props,
+ translation.TranslationRule.RESOLVE,
+ [self.FLOATINGIP],
+ client_plugin=client_plugin,
+ finder='find_network_ip'
+ ),
+ translation.TranslationRule(
+ props,
+ translation.TranslationRule.RESOLVE,
+ [self.INTERNAL_PORT],
+ client_plugin=client_plugin,
+ finder='find_network_port'
+ )
+ ]
+
+ def add_dependencies(self, deps):
+ super(FloatingIPPortForward, self).add_dependencies(deps)
+
+ for resource in self.stack.values():
+ if resource.has_interface('OS::Neutron::RouterInterface'):
+
+ def port_on_subnet(resource, subnet):
+ if not resource.has_interface('OS::Neutron::Port'):
+ return False
+ fixed_ips = resource.properties.get(
+ port.Port.FIXED_IPS) or []
+ for fixed_ip in fixed_ips:
+ port_subnet = (
+ fixed_ip.get(port.Port.FIXED_IP_SUBNET)
+ or fixed_ip.get(port.Port.FIXED_IP_SUBNET_ID))
+ return subnet == port_subnet
+ return False
+
+ interface_subnet = (
+ resource.properties.get(router.RouterInterface.SUBNET) or
+ resource.properties.get(router.RouterInterface.SUBNET_ID))
+ for d in deps.graph()[self]:
+ if port_on_subnet(d, interface_subnet):
+ deps += (self, resource)
+ break
+
+ def handle_create(self):
+ props = self.prepare_properties(self.properties, self.name)
+ fp = self.client().network.create_floating_ip_port_forwarding(
+ props.pop(self.FLOATINGIP),
+ **props)
+ self.resource_id_set(fp.id)
+
+ def handle_delete(self):
+ if not self.resource_id:
+ return
+
+ self.client().network.delete_floating_ip_port_forwarding(
+ self.properties[self.FLOATINGIP],
+ self.resource_id,
+ ignore_missing=True
+ )
+
+ def handle_check(self):
+ self.client().network.get_port_forwarding(
+ self.resource_id,
+ self.properties[self.FLOATINGIP]
+ )
+
+ def handle_update(self, prop_diff):
+ if prop_diff:
+ self.client().network.update_floating_ip_port_forwarding(
+ self.properties[self.FLOATINGIP],
+ self.resource_id,
+ **prop_diff)
+
+
def resource_mapping():
return {
'OS::Neutron::FloatingIP': FloatingIP,
'OS::Neutron::FloatingIPAssociation': FloatingIPAssociation,
+ 'OS::Neutron::FloatingIPPortForward': FloatingIPPortForward,
}
diff --git a/heat/engine/resources/openstack/nova/keypair.py b/heat/engine/resources/openstack/nova/keypair.py
index b7994cc1d..25df73aca 100644
--- a/heat/engine/resources/openstack/nova/keypair.py
+++ b/heat/engine/resources/openstack/nova/keypair.py
@@ -22,7 +22,8 @@ from heat.engine import translation
NOVA_MICROVERSIONS = (MICROVERSION_KEY_TYPE,
- MICROVERSION_USER) = ('2.2', '2.10')
+ MICROVERSION_USER,
+ MICROVERSION_PUBLIC_KEY) = ('2.2', '2.10', '2.92')
class KeyPair(resource.Resource):
@@ -71,9 +72,10 @@ class KeyPair(resource.Resource):
),
PUBLIC_KEY: properties.Schema(
properties.Schema.STRING,
- _('The optional public key. This allows users to supply the '
- 'public key from a pre-existing key pair. If not supplied, a '
- 'new key pair will be generated.')
+ _('The public key. This allows users to supply the public key '
+ 'from a pre-existing key pair. In Nova api version < 2.92, '
+ 'if not supplied, a new key pair will be generated. '
+ 'This property is required since Nova api version 2.92.')
),
KEY_TYPE: properties.Schema(
properties.Schema.STRING,
@@ -148,6 +150,7 @@ class KeyPair(resource.Resource):
# Check if key_type is allowed to use
key_type = self.properties[self.KEY_TYPE]
user = self.properties[self.USER]
+ public_key = self.properties[self.PUBLIC_KEY]
validate_props = []
c_plugin = self.client_plugin()
@@ -161,6 +164,12 @@ class KeyPair(resource.Resource):
'support required api microversion.') % validate_props)
raise exception.StackValidationFailed(message=msg)
+ if not public_key and c_plugin.is_version_supported(
+ MICROVERSION_PUBLIC_KEY):
+ msg = _('The public_key property is required by the nova API '
+ 'version currently used.')
+ raise exception.StackValidationFailed(message=msg)
+
def handle_create(self):
pub_key = self.properties[self.PUBLIC_KEY] or None
user_id = self.properties[self.USER]
diff --git a/heat/engine/resources/volume_base.py b/heat/engine/resources/volume_base.py
index f959ce6b7..e870afecc 100644
--- a/heat/engine/resources/volume_base.py
+++ b/heat/engine/resources/volume_base.py
@@ -197,11 +197,10 @@ class BaseVolumeAttachment(resource.Resource):
if self.resource_id:
server_id = self.properties[self.INSTANCE_ID]
vol_id = self.properties[self.VOLUME_ID]
- self.client_plugin('nova').detach_volume(server_id,
- self.resource_id)
- prg = progress.VolumeDetachProgress(
- server_id, vol_id, self.resource_id)
- prg.called = True
+ prg = progress.VolumeDetachProgress(server_id, vol_id,
+ self.resource_id)
+ prg.called = self.client_plugin('nova').detach_volume(
+ server_id, self.resource_id)
return prg
@@ -209,6 +208,10 @@ class BaseVolumeAttachment(resource.Resource):
if prg is None:
return True
+ if not prg.called:
+ prg.called = self.client_plugin('nova').detach_volume(
+ prg.srv_id, self.resource_id)
+ return False
if not prg.cinder_complete:
prg.cinder_complete = self.client_plugin(
).check_detach_volume_complete(prg.vol_id, prg.srv_id)
diff --git a/heat/engine/stack.py b/heat/engine/stack.py
index ec46e8ff4..c7ebec129 100644
--- a/heat/engine/stack.py
+++ b/heat/engine/stack.py
@@ -1889,11 +1889,13 @@ class Stack(collections.abc.Mapping):
def _try_get_user_creds(self):
# There are cases where the user_creds cannot be returned
# due to credentials truncated when being saved to DB.
- # Ignore this error instead of blocking stack deletion.
+ # Also, there are cases where auth_encryption_key has
+ # changed for some reason.
+ # Ignore these errors instead of blocking stack deletion.
try:
return ucreds_object.UserCreds.get_by_id(self.context,
self.user_creds_id)
- except exception.Error:
+ except (exception.Error, exception.InvalidEncryptionKey):
LOG.exception("Failed to retrieve user_creds")
return None
diff --git a/heat/engine/stk_defn.py b/heat/engine/stk_defn.py
index eb8e1334c..585a05797 100644
--- a/heat/engine/stk_defn.py
+++ b/heat/engine/stk_defn.py
@@ -102,6 +102,13 @@ class StackDefinition(object):
else:
return self.enabled_rsrc_names()
+ def all_resource_types(self):
+ """Return the set of types of all resources in the template."""
+ if self._resource_defns is None:
+ self._load_rsrc_defns()
+ return set(self._resource_defns[res].resource_type
+ for res in self._resource_defns)
+
def get_availability_zones(self):
"""Return the list of Nova availability zones."""
if self._zones is None:
diff --git a/heat/locale/de/LC_MESSAGES/heat.po b/heat/locale/de/LC_MESSAGES/heat.po
index 95148ce69..3faad4066 100644
--- a/heat/locale/de/LC_MESSAGES/heat.po
+++ b/heat/locale/de/LC_MESSAGES/heat.po
@@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: heat VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2022-06-28 08:24+0000\n"
+"POT-Creation-Date: 2022-11-11 06:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -2405,9 +2405,6 @@ msgstr "E-Mail-Adresse des Keystone-Benutzers"
msgid "Enable the docker registry in the cluster."
msgstr "Aktivieren Sie die Docker-Registrierung im Cluster."
-msgid "Enable the legacy OS::Heat::CWLiteAlarm resource."
-msgstr "Aktivieren Sie die ältere OS::Heat::CWLiteAlarm-Ressource."
-
msgid "Enable the preview Stack Abandon feature."
msgstr "Aktivieren Sie die Vorschau-Funktion Stapel-Abandon."
@@ -2634,10 +2631,6 @@ msgstr ""
"Fehler beim Verbinden von Datenträger %(vol)s mit Server %(srv)s - %(err)s"
#, python-format
-msgid "Failed to create Bay '%(name)s' - %(reason)s"
-msgstr "Fehler beim Erstellen der Bay '%(name)s' - %(reason)s"
-
-#, python-format
msgid "Failed to create Cluster '%(name)s' - %(reason)s"
msgstr "Fehler beim Erstellen des Clusters '%(name)s' - %(reason)s"
@@ -2706,10 +2699,6 @@ msgstr ""
"(%(engine_id)s)"
#, python-format
-msgid "Failed to update Bay '%(name)s' - %(reason)s"
-msgstr "Fehler beim Aktualisieren der Bay '%(name)s' - %(reason)s"
-
-#, python-format
msgid "Failed to update Cluster '%(name)s' - %(reason)s"
msgstr "Fehler beim Aktualisieren von Cluster '%(name)s' - %(reason)s"
@@ -3415,9 +3404,6 @@ msgstr ""
msgid "Incorrect arguments to \"%(fn_name)s\" should be: %(example)s"
msgstr "Falsche Argumente zu \"%(fn_name)s\" sollten sein: %(example)s"
-msgid "Incorrect arguments: Items to merge must be maps."
-msgstr "Falsche Argumente: Zu vereinende Elemente müssen Maps sein."
-
#, python-format
msgid ""
"Incorrect arguments: to \"%(fn_name)s\", arguments must be a list of maps. "
@@ -4342,16 +4328,6 @@ msgstr ""
"verwendet werden (normalerweise solche, die von der Keystone v3-API mit "
"großen Servicekatalogen generiert werden)."
-msgid ""
-"Maximum line size of message headers to be accepted. max_header_line may "
-"need to be increased when using large tokens (typically those generated by "
-"the Keystone v3 API with big service catalogs.)"
-msgstr ""
-"Maximale Zeilengröße von Nachrichtenheadern, die akzeptiert werden sollen. "
-"Möglicherweise muss max_header_line erhöht werden, wenn große Token "
-"verwendet werden (in der Regel solche, die von der Keystone v3-API mit "
-"großen Servicekatalogen generiert werden.)"
-
msgid "Maximum number of instances in the group."
msgstr "Maximale Anzahl von Instanzen in der Gruppe."
@@ -5220,15 +5196,6 @@ msgstr ""
"OS::Aodh::CombinationAlarm ist veraltet und wurde von Aodh entfernt. "
"Verwenden Sie stattdessen OS::Aodh::CompositeAlarm."
-msgid ""
-"OS::Heat::CWLiteAlarm resource has been removed since version 10.0.0. "
-"Existing stacks can still use it, where it would do nothing for update/"
-"delete."
-msgstr ""
-"Die OS::Heat::CWLiteAlarm-Ressource wurde seit der Version 10.0.0 entfernt. "
-"Bestehende Stapel können es immer noch verwenden, wo es nichts zum "
-"Aktualisieren/Löschen tun würde."
-
#, python-format
msgid "Object action %(action)s failed because: %(reason)s"
msgstr "Objektaktion %(action)s ist fehlgeschlagen, weil: %(reason)s"
@@ -7481,9 +7448,6 @@ msgstr "Die Verfügbarkeitszone, in der das Volume erstellt wird."
msgid "The availability zone of shared filesystem."
msgstr "Die Verfügbarkeitszone des freigegebenen Dateisystems."
-msgid "The bay name."
-msgstr "Der Name der Bay."
-
msgid "The bit-length of the secret."
msgstr "Die Bitlänge des Geheimnisses."
@@ -8139,9 +8103,6 @@ msgstr ""
msgid "The name or ID of target cluster."
msgstr "Der Name oder die ID des Zielclusters."
-msgid "The name or ID of the bay model."
-msgstr "Der Name oder die ID des Bay-Modells."
-
msgid "The name or ID of the cluster template."
msgstr "Der Name oder die ID der Clustervorlage."
@@ -8172,9 +8133,6 @@ msgstr "Der Verhandlungsmodus der IKE-Richtlinie."
msgid "The next hop for the destination."
msgstr "Der nächste Hop für das Ziel."
-msgid "The node count for this bay."
-msgstr "Die Anzahl der Knoten für diese Bay."
-
msgid "The node count for this cluster."
msgstr "Die Knotenzahl für diesen Cluster."
@@ -8226,9 +8184,6 @@ msgstr ""
"Die Anzahl aufeinanderfolgender Health Probe-Erfolge, die erforderlich sind, "
"bevor die Instanz in den Status \"Healthy\" versetzt wird."
-msgid "The number of master nodes for this bay."
-msgstr "Die Anzahl der Master-Knoten für diese Bay."
-
msgid "The number of master nodes for this cluster."
msgstr "Die Anzahl der Master-Knoten für diesen Cluster."
@@ -8278,14 +8233,6 @@ msgid "The operator indicates how to combine the rules."
msgstr "Der Operator gibt an, wie die Regeln zu kombinieren sind."
msgid ""
-"The optional public key. This allows users to supply the public key from a "
-"pre-existing key pair. If not supplied, a new key pair will be generated."
-msgstr ""
-"Der optionale öffentliche Schlüssel. Dadurch können Benutzer den "
-"öffentlichen Schlüssel aus einem bereits vorhandenen Schlüsselpaar "
-"bereitstellen. Wenn nicht angegeben, wird ein neues Schlüsselpaar generiert."
-
-msgid ""
"The os-collect-config configuration for the server's local agent to be "
"configured to connect to Heat to retrieve deployment data."
msgstr ""
@@ -8986,10 +8933,6 @@ msgstr ""
"Verbindung für diese Anzahl von Sekunden inaktiv ist, wird sie geschlossen. "
"Ein Wert von '0' bedeutet ewig warten."
-msgid "Timeout for creating the bay in minutes. Set to 0 for no timeout."
-msgstr ""
-"Timeout zum Erstellen der Bay in Minuten. Für kein Timeout auf 0 setzen."
-
msgid "Timeout for creating the cluster in minutes. Set to 0 for no timeout."
msgstr ""
"Timeout zum Erstellen des Clusters in Minuten. Für kein Timeout auf 0 setzen."
@@ -9160,9 +9103,6 @@ msgstr ""
msgid "URL of keystone service endpoint."
msgstr "URL des Schlüsseldienst-Endpunkts"
-msgid "URL of the Heat CloudWatch server."
-msgstr "URL des Heat CloudWatch Servers"
-
msgid ""
"URL of the Heat metadata server. NOTE: Setting this is only needed if you "
"require instances to use a different endpoint than in the keystone catalog"
@@ -9343,10 +9283,6 @@ msgid "Unknown status Container '%(name)s' - %(reason)s"
msgstr "Unbekannter Status Container '%(name)s' - %(reason)s"
#, python-format
-msgid "Unknown status creating Bay '%(name)s' - %(reason)s"
-msgstr "Unbekannter Status beim Erstellen der Bay '%(name)s' - %(reason)s "
-
-#, python-format
msgid "Unknown status creating Cluster '%(name)s' - %(reason)s"
msgstr "Unbekannter Status beim Erstellen des Clusters '%(name)s' - %(reason)s"
@@ -9354,10 +9290,6 @@ msgid "Unknown status during deleting share \"{0}\""
msgstr "Unbekannter Status beim Löschen der Freigabe \"{0}\""
#, python-format
-msgid "Unknown status updating Bay '%(name)s' - %(reason)s"
-msgstr "Unbekannter Bay-Status wird aktualisiert. '%(name)s' - %(reason)s"
-
-#, python-format
msgid "Unknown status updating Cluster '%(name)s' - %(reason)s"
msgstr "Unbekannter Status aktualisiert Cluster '%(name)s' - %(reason)s"
diff --git a/heat/locale/es/LC_MESSAGES/heat.po b/heat/locale/es/LC_MESSAGES/heat.po
index b3d422fa3..1f89d4529 100644
--- a/heat/locale/es/LC_MESSAGES/heat.po
+++ b/heat/locale/es/LC_MESSAGES/heat.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: heat VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-11-01 17:57+0000\n"
+"POT-Creation-Date: 2022-11-11 06:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1677,9 +1677,6 @@ msgstr ""
msgid "Email address of keystone user."
msgstr "Dirección de correo electrónico del usuario de keystone."
-msgid "Enable the legacy OS::Heat::CWLiteAlarm resource."
-msgstr "Habilitar el recurso heredado OS::Heat::CWLiteAlarm."
-
msgid "Enable the preview Stack Abandon feature."
msgstr ""
"Habilitar la característica Stack Abandon (abandono de pila) de vista previa."
@@ -1838,10 +1835,6 @@ msgstr ""
"No se ha podido conectar el volumen %(vol)s al servidor %(srv)s - %(err)s"
#, python-format
-msgid "Failed to create Bay '%(name)s' - %(reason)s"
-msgstr "No se ha podido crear la bahía '%(name)s' - %(reason)s"
-
-#, python-format
msgid "Failed to detach interface (%(port)s) from server (%(server)s)"
msgstr ""
"No se ha podido desconectar la interfaz (%(port)s) del servidor (%(server)s)"
@@ -1901,10 +1894,6 @@ msgstr ""
"No se ha podido detener la pila (%(stack_name)s) en otro motor "
"(%(engine_id)s)"
-#, python-format
-msgid "Failed to update Bay '%(name)s' - %(reason)s"
-msgstr "No se ha podido actualizar la bahía '%(name)s' - %(reason)s"
-
msgid "Failed to update, can not found port info."
msgstr "Ha fallado la actualización, no se encuentra información de puerto."
@@ -2452,10 +2441,6 @@ msgstr "Argumentos incorrectos en \"%(fn_name)s\" debe ser uno de: %(allowed)s"
msgid "Incorrect arguments to \"%(fn_name)s\" should be: %(example)s"
msgstr "Argumentos incorrectos en \"%(fn_name)s\" deben ser: %(example)s"
-msgid "Incorrect arguments: Items to merge must be maps."
-msgstr ""
-"Argumentos no correctos: los elementos a mezclar deben ser correlaciones."
-
#, python-format
msgid ""
"Incorrect index to \"%(fn_name)s\" should be between 0 and %(max_index)s"
@@ -3118,16 +3103,6 @@ msgstr ""
"grandes (normalmente las generadas por la API de Keystone v3 con catálogos "
"de servicio grandes)."
-msgid ""
-"Maximum line size of message headers to be accepted. max_header_line may "
-"need to be increased when using large tokens (typically those generated by "
-"the Keystone v3 API with big service catalogs.)"
-msgstr ""
-"Tamaño de línea máximo de cabeceras de mensaje que se deben aceptar. Es "
-"posible que max_header_line se necesite incrementar al utilizar señales "
-"grandes (normalmente las generadas por la API de Keystone v3 con catálogos "
-"de servicio grandes.)"
-
msgid "Maximum number of instances in the group."
msgstr "Número máximo de instancias en el grupo."
@@ -5482,9 +5457,6 @@ msgstr "La zona de disponibilidad en la que se creará el volumen."
msgid "The availability zone of shared filesystem."
msgstr "La zona de disponibilidad del sistema de archivos compartido."
-msgid "The bay name."
-msgstr "El nombre de la bahía."
-
msgid "The bit-length of the secret."
msgstr "La longitud en bits del secreto."
@@ -5970,9 +5942,6 @@ msgstr "El nombre o el ID de este proyecto de keystone en la jerarquía."
msgid "The name or ID of target cluster."
msgstr "El nombre o el ID del clúster de destino."
-msgid "The name or ID of the bay model."
-msgstr "El nombre o el ID del modelo de bahía."
-
msgid "The name or ID of the subnet on which to allocate the VIP address."
msgstr "El nombre o el ID de la subred donde asignar la dirección VIP."
@@ -5988,9 +5957,6 @@ msgstr "La modalidad de negociación de la política ike."
msgid "The next hop for the destination."
msgstr "El siguiente salto del destino."
-msgid "The node count for this bay."
-msgstr "El recuento de nodos para esta bahía."
-
msgid "The notification methods to use when an alarm state is ALARM."
msgstr ""
"Los métodos de notificación a utilizar cuando el estado de una alarma es "
@@ -6026,9 +5992,6 @@ msgstr ""
"El número de éxitos de análisis de estado consecutivos necesarios antes de "
"mover la instancia al estado saludable."
-msgid "The number of master nodes for this bay."
-msgstr "El número de nodos mestros para esta bahía."
-
msgid "The number of objects stored in the container."
msgstr "El número de objetos almacenados en el contenedor."
@@ -6060,14 +6023,6 @@ msgstr ""
"de creación de pila continúe."
msgid ""
-"The optional public key. This allows users to supply the public key from a "
-"pre-existing key pair. If not supplied, a new key pair will be generated."
-msgstr ""
-"Clave pública opcional. Permite a los usuarios proporcionar la clave pública "
-"desde un par de claves existente previamente. Si no se proporciona, se "
-"generará un nuevo par de claves."
-
-msgid ""
"The owner tenant ID of the address scope. Only administrative users can "
"specify a tenant ID other than their own."
msgstr ""
@@ -6592,11 +6547,6 @@ msgstr ""
"una conexión entrante está inactiva para este número de segundos se cerrará. "
"Un valor de '0' significa esperar permanentemente."
-msgid "Timeout for creating the bay in minutes. Set to 0 for no timeout."
-msgstr ""
-"Tiempo de espera para crear la bahía en minutos. Establézcalo en 0 si no "
-"desea que haya tiempo de espera."
-
msgid "Timeout in seconds for stack action (ie. create or update)."
msgstr ""
"Tiempo de espera en segúndos para una acción de pila (por ejemplo, creár o "
@@ -6716,9 +6666,6 @@ msgstr ""
msgid "URL of keystone service endpoint."
msgstr "URL del punto final del servicio de keystone."
-msgid "URL of the Heat CloudWatch server."
-msgstr "URL del servidor CloudWatch de Heat."
-
msgid ""
"URL of the Heat metadata server. NOTE: Setting this is only needed if you "
"require instances to use a different endpoint than in the keystone catalog"
@@ -6867,20 +6814,12 @@ msgstr ""
"Estado del recurso compartido (share_status) desconocido durante la creación "
"del recurso compartido \"{0}\""
-#, python-format
-msgid "Unknown status creating Bay '%(name)s' - %(reason)s"
-msgstr "Estado desconocido al crear la bahía '%(name)s' - %(reason)s"
-
msgid "Unknown status during deleting share \"{0}\""
msgstr ""
"Estado del recurso compartido (share_status) desconocido al suprimir el "
"recurso compartido \"{0}\""
#, python-format
-msgid "Unknown status updating Bay '%(name)s' - %(reason)s"
-msgstr "Estado desconocido al actualizar la bahía '%(name)s' - %(reason)s"
-
-#, python-format
msgid "Unknown status: %s"
msgstr "Estado desconocido: %s"
diff --git a/heat/locale/fr/LC_MESSAGES/heat.po b/heat/locale/fr/LC_MESSAGES/heat.po
index a87f82a60..9e437169a 100644
--- a/heat/locale/fr/LC_MESSAGES/heat.po
+++ b/heat/locale/fr/LC_MESSAGES/heat.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: heat VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-11-01 17:57+0000\n"
+"POT-Creation-Date: 2022-11-11 06:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1674,9 +1674,6 @@ msgstr ""
msgid "Email address of keystone user."
msgstr "Adresse e-mail de l'utilisateur Keystone."
-msgid "Enable the legacy OS::Heat::CWLiteAlarm resource."
-msgstr "Activer la ressource OS::Heat::CWLiteAlarm existante."
-
msgid "Enable the preview Stack Abandon feature."
msgstr "Activer la fonction préliminaire d'abandon de pile (Stack Abandon)."
@@ -1831,10 +1828,6 @@ msgid "Failed to attach volume %(vol)s to server %(srv)s - %(err)s"
msgstr "Echec de connexion du volume %(vol)s au serveur %(srv)s - %(err)s"
#, python-format
-msgid "Failed to create Bay '%(name)s' - %(reason)s"
-msgstr "Echec de la création de la baie '%(name)s' - %(reason)s"
-
-#, python-format
msgid "Failed to detach interface (%(port)s) from server (%(server)s)"
msgstr "Echec de déconnexion de l'interface (%(port)s) du serveur (%(server)s)"
@@ -1893,10 +1886,6 @@ msgstr ""
"Echec de l'arrêt de la pile (%(stack_name)s) sur l'autre moteur "
"(%(engine_id)s)"
-#, python-format
-msgid "Failed to update Bay '%(name)s' - %(reason)s"
-msgstr "Echec de mise à jour de la baie '%(name)s' - %(reason)s"
-
msgid "Failed to update, can not found port info."
msgstr "Echec de la mise à jour, les informations de port sont introuvables."
@@ -2438,10 +2427,6 @@ msgid "Incorrect arguments to \"%(fn_name)s\" should be: %(example)s"
msgstr ""
"Arguments incorrects pour \"%(fn_name)s\", devraient être : %(example)s"
-msgid "Incorrect arguments: Items to merge must be maps."
-msgstr ""
-"Arguments incorrects : les éléments à fusionner doivent être des mappes."
-
#, python-format
msgid ""
"Incorrect index to \"%(fn_name)s\" should be between 0 and %(max_index)s"
@@ -3102,16 +3087,6 @@ msgstr ""
"(généralement ceux qui sont générés par l'API Keystone v3 avec des "
"catalogues de service volumineux)."
-msgid ""
-"Maximum line size of message headers to be accepted. max_header_line may "
-"need to be increased when using large tokens (typically those generated by "
-"the Keystone v3 API with big service catalogs.)"
-msgstr ""
-"Taille maximale de ligne des en-têtes de message à accepter. max_header_line "
-"peut avoir besoin d'être augmenté lors de l'utilisation de grands jetons "
-"(généralement ceux qui sont générés par l'API Keystone v3 avec des "
-"catalogues de service volumineux)."
-
msgid "Maximum number of instances in the group."
msgstr "Nombre maximal d'instances dans le groupe."
@@ -5448,9 +5423,6 @@ msgstr "Zone de disponibilité dans laquelle le volume sera créé."
msgid "The availability zone of shared filesystem."
msgstr "Zone de disponibilité du système de fichiers partagé."
-msgid "The bay name."
-msgstr "Nom de baie."
-
msgid "The bit-length of the secret."
msgstr "Longeur en bits du secret."
@@ -5931,9 +5903,6 @@ msgstr "Nom ou ID du parent de ce projet Keystone dans la hiérarchie."
msgid "The name or ID of target cluster."
msgstr "Nom ou ID du cluster cible."
-msgid "The name or ID of the bay model."
-msgstr "Nom ou ID du modèle de baie."
-
msgid "The name or ID of the subnet on which to allocate the VIP address."
msgstr "Nom ou ID du sous-réseau sur lequel allouer l'adresse VIP."
@@ -5949,9 +5918,6 @@ msgstr "Mode de négociation de la stratégie IKE."
msgid "The next hop for the destination."
msgstr "Prochain saut pour la destination."
-msgid "The node count for this bay."
-msgstr "Nombre de noeuds pour cette baie."
-
msgid "The notification methods to use when an alarm state is ALARM."
msgstr ""
"Méthodes de notification à utiliser quand l'état d'une alarme est ALARM."
@@ -5984,9 +5950,6 @@ msgstr ""
"Le nombre d'analyses d'intégrité consécutives réussies requises avant de "
"faire passer l'instance à l'état sain."
-msgid "The number of master nodes for this bay."
-msgstr "Nombre de noeuds maître pour cette baie."
-
msgid "The number of objects stored in the container."
msgstr "Nombre d'objets stockés dans le conteneur."
@@ -6018,14 +5981,6 @@ msgstr ""
"création de la pile se poursuive."
msgid ""
-"The optional public key. This allows users to supply the public key from a "
-"pre-existing key pair. If not supplied, a new key pair will be generated."
-msgstr ""
-"Clé publique facultative. Cela permet aux utilisateurs de fournir la clé "
-"publique à partir d'une paire de clés préexistante. Si elle n'est pas "
-"fournie, une nouvelle paire de clés sera générée."
-
-msgid ""
"The owner tenant ID of the address scope. Only administrative users can "
"specify a tenant ID other than their own."
msgstr ""
@@ -6536,11 +6491,6 @@ msgstr ""
"client. La connexion entrante est fermée si elle reste en veille pendant ce "
"délai en nombre de secondes. La valeur '0' signifie une attente illimitée."
-msgid "Timeout for creating the bay in minutes. Set to 0 for no timeout."
-msgstr ""
-"Délai d'attente, en minutes, pour la création de la baie. Défini sur 0 quand "
-"il n'y a pas de délai d'attente."
-
msgid "Timeout in seconds for stack action (ie. create or update)."
msgstr ""
"Délai d'attente en secondes pour l'action de pile (par ex. création ou mise "
@@ -6659,9 +6609,6 @@ msgstr ""
msgid "URL of keystone service endpoint."
msgstr "URL du noeud final de service Keystone."
-msgid "URL of the Heat CloudWatch server."
-msgstr "URL du serveur Heat CloudWatch."
-
msgid ""
"URL of the Heat metadata server. NOTE: Setting this is only needed if you "
"require instances to use a different endpoint than in the keystone catalog"
@@ -6809,19 +6756,10 @@ msgstr "Clé(s) inconnue(s) %s"
msgid "Unknown share_status during creation of share \"{0}\""
msgstr "share_status inconnu lors de la création du partage \"{0}\""
-#, python-format
-msgid "Unknown status creating Bay '%(name)s' - %(reason)s"
-msgstr "Statut inconnu lors de la création de la baie '%(name)s' - %(reason)s"
-
msgid "Unknown status during deleting share \"{0}\""
msgstr "Statut inconnu lors de la suppression du partage \"{0}\""
#, python-format
-msgid "Unknown status updating Bay '%(name)s' - %(reason)s"
-msgstr ""
-"Statut inconnu lors de la mise à jour de la baie '%(name)s' - %(reason)s"
-
-#, python-format
msgid "Unknown status: %s"
msgstr "Status inconnu: %s"
diff --git a/heat/locale/it/LC_MESSAGES/heat.po b/heat/locale/it/LC_MESSAGES/heat.po
index 73f636656..82127c0e4 100644
--- a/heat/locale/it/LC_MESSAGES/heat.po
+++ b/heat/locale/it/LC_MESSAGES/heat.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: heat VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-11-01 17:57+0000\n"
+"POT-Creation-Date: 2022-11-11 06:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1670,9 +1670,6 @@ msgstr ""
msgid "Email address of keystone user."
msgstr "Indirizzo email dell'utente keystone."
-msgid "Enable the legacy OS::Heat::CWLiteAlarm resource."
-msgstr "Abilita la risorsa OS::Heat::CWLiteAlarm legacy."
-
msgid "Enable the preview Stack Abandon feature."
msgstr "Abilitare la funzione Stack Abandon."
@@ -1828,10 +1825,6 @@ msgstr ""
"Collegamento del volume %(vol)s al server %(srv)snon riuscito - %(err)s"
#, python-format
-msgid "Failed to create Bay '%(name)s' - %(reason)s"
-msgstr "Impossibile creare l'alloggiamento '%(name)s' - %(reason)s"
-
-#, python-format
msgid "Failed to detach interface (%(port)s) from server (%(server)s)"
msgstr ""
"Impossibile scollegare l'interfaccia (%(port)s) dal server (%(server)s)"
@@ -1890,10 +1883,6 @@ msgstr ""
"Impossibile arrestare lo stack (%(stack_name)s) su un altro motore "
"(%(engine_id)s)"
-#, python-format
-msgid "Failed to update Bay '%(name)s' - %(reason)s"
-msgstr "Impossibile aggiornare l'alloggiamento '%(name)s' - %(reason)s"
-
msgid "Failed to update, can not found port info."
msgstr ""
"Impossibile aggiornare, non è possibile reperire le informazioni sulla porta."
@@ -2428,9 +2417,6 @@ msgstr ""
msgid "Incorrect arguments to \"%(fn_name)s\" should be: %(example)s"
msgstr "Argomenti non corretti per \"%(fn_name)s\"; devono essere: %(example)s"
-msgid "Incorrect arguments: Items to merge must be maps."
-msgstr "Argomenti non corretti: gli elementi da unire devono essere mappe."
-
#, python-format
msgid ""
"Incorrect index to \"%(fn_name)s\" should be between 0 and %(max_index)s"
@@ -3084,16 +3070,6 @@ msgstr ""
"token grandi (in genere quelli generati dall'API Keystone v3 con cataloghi "
"del servizio di grandi dimensioni)."
-msgid ""
-"Maximum line size of message headers to be accepted. max_header_line may "
-"need to be increased when using large tokens (typically those generated by "
-"the Keystone v3 API with big service catalogs.)"
-msgstr ""
-"Dimensione massima della riga di intestazioni del messaggio che deve essere "
-"accettata. max_header_line dovrebbe essere incrementato quando si utilizzano "
-"token grandi (in genere quelli generati dall'API Keystone v3 con cataloghi "
-"del servizio di grandi dimensioni)."
-
msgid "Maximum number of instances in the group."
msgstr "Numero massimo di istanze nel gruppo."
@@ -5413,9 +5389,6 @@ msgstr "La zona di disponibilità in cui il volume verrà creato."
msgid "The availability zone of shared filesystem."
msgstr "La zona di disponibilità per il filesystem condiviso."
-msgid "The bay name."
-msgstr "Il nome dell'alloggiamento."
-
msgid "The bit-length of the secret."
msgstr "La lunghezza in bit del segreto."
@@ -5909,9 +5882,6 @@ msgstr ""
msgid "The name or ID of target cluster."
msgstr "Il nome o l'ID del cluster di destinazione."
-msgid "The name or ID of the bay model."
-msgstr "Il nome o l'ID del modello di alloggiamento."
-
msgid "The name or ID of the subnet on which to allocate the VIP address."
msgstr "Il nome o l'ID della sottorete su cui allocare l'indirizzo VIP."
@@ -5927,9 +5897,6 @@ msgstr "La modalità di negoziazione della politica ike."
msgid "The next hop for the destination."
msgstr "L'hop successivo per la destinazione."
-msgid "The node count for this bay."
-msgstr "Il numero di nodi per questo alloggiamento."
-
msgid "The notification methods to use when an alarm state is ALARM."
msgstr ""
"I metodi di notifica da utilizzare quando uno stato di allarme è ALARM."
@@ -5963,9 +5930,6 @@ msgstr ""
"Il numero di probe di stato consecutivi con esito positivo richiesti prima "
"di spostare l'istanza allo stato funzionante."
-msgid "The number of master nodes for this bay."
-msgstr "Il numero di nodi principali per questo alloggiamento."
-
msgid "The number of objects stored in the container."
msgstr "Il numero di oggetti memorizzati nel contenitore."
@@ -5997,14 +5961,6 @@ msgstr ""
"processo di creazione dello stack continui."
msgid ""
-"The optional public key. This allows users to supply the public key from a "
-"pre-existing key pair. If not supplied, a new key pair will be generated."
-msgstr ""
-"La chiave pubblica facoltativa. Ciò consente agli utenti di fornire la "
-"chiave pubblica da una coppia di chiavi preesistente. Se non fornita, verrà "
-"generata una nuova coppia di chiavi."
-
-msgid ""
"The owner tenant ID of the address scope. Only administrative users can "
"specify a tenant ID other than their own."
msgstr ""
@@ -6519,11 +6475,6 @@ msgstr ""
"connessione in entrata è inattiva per questo numero di secondi, verrà "
"chiusa. Il valore 0 indica un'attesa illimitata."
-msgid "Timeout for creating the bay in minutes. Set to 0 for no timeout."
-msgstr ""
-"Timeout per la creazione dell'alloggiamento in minuti. Impostare su 0 per "
-"nessun timeout."
-
msgid "Timeout in seconds for stack action (ie. create or update)."
msgstr ""
"Timeout in secondi per l'azione stack (ad esempio creare o aggiornare)."
@@ -6643,9 +6594,6 @@ msgstr ""
msgid "URL of keystone service endpoint."
msgstr "URL dell'endpoint del servizio keystone."
-msgid "URL of the Heat CloudWatch server."
-msgstr "URL del server Heat CloudWatch."
-
msgid ""
"URL of the Heat metadata server. NOTE: Setting this is only needed if you "
"require instances to use a different endpoint than in the keystone catalog"
@@ -6791,22 +6739,10 @@ msgid "Unknown share_status during creation of share \"{0}\""
msgstr ""
"share_status sconosciuto durante la creazione della condivisione \"{0}\""
-#, python-format
-msgid "Unknown status creating Bay '%(name)s' - %(reason)s"
-msgstr ""
-"Stato sconosciuto durante la creazione dell'alloggiamento '%(name)s' - "
-"%(reason)s"
-
msgid "Unknown status during deleting share \"{0}\""
msgstr "Stato sconosciuto durante l'eliminazione della condivisione \"{0}\""
#, python-format
-msgid "Unknown status updating Bay '%(name)s' - %(reason)s"
-msgstr ""
-"Stato sconosciuto durante l'aggiornamento dell'alloggiamento '%(name)s' - "
-"%(reason)s"
-
-#, python-format
msgid "Unknown status: %s"
msgstr "Stato sconosciuto: %s"
diff --git a/heat/locale/ja/LC_MESSAGES/heat.po b/heat/locale/ja/LC_MESSAGES/heat.po
index fb71e0127..74915afcd 100644
--- a/heat/locale/ja/LC_MESSAGES/heat.po
+++ b/heat/locale/ja/LC_MESSAGES/heat.po
@@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: heat VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-11-01 17:57+0000\n"
+"POT-Creation-Date: 2022-11-11 06:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1620,9 +1620,6 @@ msgstr ""
msgid "Email address of keystone user."
msgstr "keystone ユーザー㮠E メールアドレス。"
-msgid "Enable the legacy OS::Heat::CWLiteAlarm resource."
-msgstr "既存㮠OS::Heat::CWLiteAlarm リソースを有効ã«ã—ã¾ã™ã€‚"
-
msgid "Enable the preview Stack Abandon feature."
msgstr "スタック破棄ã®ãƒ—レビュー機能を有効ã«ã—ã¾ã™ã€‚"
@@ -1782,10 +1779,6 @@ msgid "Failed to attach volume %(vol)s to server %(srv)s - %(err)s"
msgstr "サーãƒãƒ¼ %(srv)s ã¸ã®ãƒœãƒªãƒ¥ãƒ¼ãƒ  %(vol)s ã®è¿½åŠ ã«å¤±æ•—ã—ã¾ã—ãŸ: %(err)s"
#, python-format
-msgid "Failed to create Bay '%(name)s' - %(reason)s"
-msgstr "ベイ '%(name)s' ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ: %(reason)s"
-
-#, python-format
msgid "Failed to detach interface (%(port)s) from server (%(server)s)"
msgstr ""
"サーãƒãƒ¼ (%(server)s) ã‹ã‚‰ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ (%(port)s) を接続解除ã§ãã¾ã›ã‚“ã§"
@@ -1850,10 +1843,6 @@ msgstr ""
"ä»–ã®ã‚¨ãƒ³ã‚¸ãƒ³ (%(engine_id)s) 上ã®ã‚¹ã‚¿ãƒƒã‚¯ (%(stack_name)s) ã‚’åœæ­¢ã§ãã¾ã›ã‚“ã§"
"ã—ãŸã€‚"
-#, python-format
-msgid "Failed to update Bay '%(name)s' - %(reason)s"
-msgstr "ベイ '%(name)s' ã®æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸ: %(reason)s"
-
msgid "Failed to update, can not found port info."
msgstr "æ›´æ–°ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãƒãƒ¼ãƒˆæƒ…å ±ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。"
@@ -2375,9 +2364,6 @@ msgid "Incorrect arguments to \"%(fn_name)s\" should be: %(example)s"
msgstr ""
"\"%(fn_name)s\" ã«å¯¾ã™ã‚‹å¼•æ•°ãŒæ­£ã—ãã‚ã‚Šã¾ã›ã‚“。正ã—ã„引数: %(example)s"
-msgid "Incorrect arguments: Items to merge must be maps."
-msgstr "ä¸æ­£ç¢ºãªå¼•æ•°: マージã™ã‚‹é …ç›®ã¯ãƒžãƒƒãƒ—ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
-
#, python-format
msgid ""
"Incorrect index to \"%(fn_name)s\" should be between 0 and %(max_index)s"
@@ -3028,15 +3014,6 @@ msgstr ""
"Keystone v3 API ã§å¤§ããªã‚µãƒ¼ãƒ“スカタログを使用ã—ã¦ç”Ÿæˆã•ã‚Œã‚‹ãƒˆãƒ¼ã‚¯ãƒ³) を使用"
"ã™ã‚‹ã¨ã㯠max_header_line を増やã•ãªã‘ã‚Œã°ãªã‚‰ãªã„å ´åˆãŒã‚ã‚Šã¾ã™ã€‚"
-msgid ""
-"Maximum line size of message headers to be accepted. max_header_line may "
-"need to be increased when using large tokens (typically those generated by "
-"the Keystone v3 API with big service catalogs.)"
-msgstr ""
-"å—ã‘入れられるメッセージヘッダーã®æœ€å¤§è¡Œã‚µã‚¤ã‚ºã€‚大ããªãƒˆãƒ¼ã‚¯ãƒ³ (通常ã¯ã€"
-"Keystone v3 API ã§å¤§ããªã‚µãƒ¼ãƒ“スカタログを使用ã—ã¦ç”Ÿæˆã•ã‚Œã‚‹ãƒˆãƒ¼ã‚¯ãƒ³) を使用"
-"ã™ã‚‹ã¨ã㯠max_header_line を増やã•ãªã‘ã‚Œã°ãªã‚‰ãªã„å ´åˆãŒã‚ã‚Šã¾ã™ã€‚"
-
msgid "Maximum number of instances in the group."
msgstr "グループ内ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã®æœ€å¤§æ•°ã€‚"
@@ -5312,9 +5289,6 @@ msgstr "ボリュームãŒä½œæˆã•ã‚Œã‚‹ã‚¢ãƒ™ã‚¤ãƒ©ãƒ“リティーゾーン。
msgid "The availability zone of shared filesystem."
msgstr "共有ファイルシステムã®ã‚¢ãƒ™ã‚¤ãƒ©ãƒ“リティーゾーン。"
-msgid "The bay name."
-msgstr "ベイã®åå‰ã€‚"
-
msgid "The bit-length of the secret."
msgstr "秘密ã®ãƒ“ット長。"
@@ -5775,9 +5749,6 @@ msgstr "階層内ã®ã“ã® keystone プロジェクトã®è¦ªã®åå‰ã¾ãŸã¯ I
msgid "The name or ID of target cluster."
msgstr "ターゲットクラスターã®åå‰ã¾ãŸã¯ ID。"
-msgid "The name or ID of the bay model."
-msgstr "ベイモデルã®åå‰ã¾ãŸã¯ ID。"
-
msgid "The name or ID of the subnet on which to allocate the VIP address."
msgstr "VIP アドレスを割り当ã¦ã‚‹å¿…è¦ã®ã‚るサブãƒãƒƒãƒˆã®åå‰ã¾ãŸã¯ ID。"
@@ -5793,9 +5764,6 @@ msgstr "IKE ãƒãƒªã‚·ãƒ¼ã®ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ãƒ¢ãƒ¼ãƒ‰ã€‚"
msgid "The next hop for the destination."
msgstr "宛先ã®ãƒã‚¯ã‚¹ãƒˆãƒ›ãƒƒãƒ—。"
-msgid "The node count for this bay."
-msgstr "ã“ã®ãƒ™ã‚¤ã®ãƒŽãƒ¼ãƒ‰æ•°ã€‚"
-
msgid "The notification methods to use when an alarm state is ALARM."
msgstr "アラームã®çŠ¶æ…‹ãŒ ALARM ã®å ´åˆã«ä½¿ç”¨ã™ã‚‹é€šçŸ¥æ–¹æ³•ã€‚"
@@ -5825,9 +5793,6 @@ msgstr ""
"インスタンスを正常ãªçŠ¶æ…‹ã«ç§»è¡Œã™ã‚‹å‰ã«ã€é€£ç¶šã™ã‚‹ãƒ˜ãƒ«ã‚¹ãƒ—ローブã®æˆåŠŸæ•°ãŒå¿…è¦"
"ã§ã™ã€‚"
-msgid "The number of master nodes for this bay."
-msgstr "ã“ã®ãƒ™ã‚¤ã®ãƒžã‚¹ã‚¿ãƒ¼ãƒŽãƒ¼ãƒ‰ã®æ•°ã€‚"
-
msgid "The number of objects stored in the container."
msgstr "コンテナーã«ä¿ç®¡ã•ã‚ŒãŸã‚ªãƒ–ジェクトã®æ•°ã€‚"
@@ -5856,13 +5821,6 @@ msgid ""
msgstr "スタック作æˆãƒ—ロセスを続行ã™ã‚‹ãŸã‚ã«å—ä¿¡ã™ã‚‹å¿…è¦ã®ã‚ã‚‹æˆåŠŸã‚·ã‚°ãƒŠãƒ«æ•°ã€‚"
msgid ""
-"The optional public key. This allows users to supply the public key from a "
-"pre-existing key pair. If not supplied, a new key pair will be generated."
-msgstr ""
-"オプションã®å…¬é–‹éµã€‚ã“れを使用ã—ã¦ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯æ—¢å­˜ã®ã‚­ãƒ¼ãƒšã‚¢ã‹ã‚‰ã®å…¬é–‹éµã‚’指"
-"定ã§ãã¾ã™ã€‚指定ã—ãªã„å ´åˆã¯ã€æ–°ã—ã„キーペアãŒç”Ÿæˆã•ã‚Œã¾ã™ã€‚"
-
-msgid ""
"The owner tenant ID of the address scope. Only administrative users can "
"specify a tenant ID other than their own."
msgstr "アドレススコープã®æ‰€æœ‰è€…"
@@ -6355,11 +6313,6 @@ msgstr ""
"間アイドル状態ã«ã‚ã‚‹å ´åˆã€æŽ¥ç¶šã¯çµ‚了ã—ã¾ã™ã€‚値㌠'0' ã®å ´åˆã€å¾…機時間ã«åˆ¶é™ãŒ"
"ãªã„ã“ã¨ã‚’指ã—ã¾ã™ã€‚"
-msgid "Timeout for creating the bay in minutes. Set to 0 for no timeout."
-msgstr ""
-"ベイを作æˆã™ã‚‹éš›ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆæ™‚é–“ (分)。タイムアウト時間を設定ã—ãªã„å ´åˆã¯ "
-"0 を設定ã—ã¾ã™ã€‚"
-
msgid "Timeout in seconds for stack action (ie. create or update)."
msgstr "スタックアクション (作æˆã¾ãŸã¯æ›´æ–°) ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆ (秒)。"
@@ -6475,9 +6428,6 @@ msgstr ""
msgid "URL of keystone service endpoint."
msgstr "keystone サービスã®ã‚¨ãƒ³ãƒ‰ãƒã‚¤ãƒ³ãƒˆã®URL。"
-msgid "URL of the Heat CloudWatch server."
-msgstr "heat CloudWatch サーãƒãƒ¼ã® URL。"
-
msgid ""
"URL of the Heat metadata server. NOTE: Setting this is only needed if you "
"require instances to use a different endpoint than in the keystone catalog"
@@ -6610,18 +6560,10 @@ msgstr "キー %s ã¯ä¸æ˜Žã§ã™"
msgid "Unknown share_status during creation of share \"{0}\""
msgstr "シェア \"{0}\" ã®ä½œæˆä¸­ã® share_status ãŒä¸æ˜Žã§ã™ã€‚"
-#, python-format
-msgid "Unknown status creating Bay '%(name)s' - %(reason)s"
-msgstr "ベイ '%(name)s' ã®ä½œæˆçŠ¶æ³ãŒä¸æ˜Žã§ã™: %(reason)s"
-
msgid "Unknown status during deleting share \"{0}\""
msgstr "シェア \"{0}\" ã®å‰Šé™¤ä¸­ã®çŠ¶æ…‹ãŒä¸æ˜Žã§ã™ã€‚"
#, python-format
-msgid "Unknown status updating Bay '%(name)s' - %(reason)s"
-msgstr "ベイ '%(name)s' ã®æ›´æ–°çŠ¶æ³ãŒä¸æ˜Žã§ã™: %(reason)s"
-
-#, python-format
msgid "Unknown status: %s"
msgstr "ä¸æ˜ŽçŠ¶æ³: %s"
diff --git a/heat/locale/ko_KR/LC_MESSAGES/heat.po b/heat/locale/ko_KR/LC_MESSAGES/heat.po
index 9220f7b04..a694e8139 100644
--- a/heat/locale/ko_KR/LC_MESSAGES/heat.po
+++ b/heat/locale/ko_KR/LC_MESSAGES/heat.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: heat VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-11-01 17:57+0000\n"
+"POT-Creation-Date: 2022-11-11 06:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1562,9 +1562,6 @@ msgstr "디바ì´ìŠ¤ 맵핑 %sì— ëŒ€í•´ volume_id ë˜ëŠ” snapshot_idê°€ 지정ë
msgid "Email address of keystone user."
msgstr "keystone 사용ìžì˜ ì´ë©”ì¼ ì£¼ì†Œìž…ë‹ˆë‹¤."
-msgid "Enable the legacy OS::Heat::CWLiteAlarm resource."
-msgstr "레거시 OS::Heat::CWLiteAlarm ìžì›ì„ 사용합니다."
-
msgid "Enable the preview Stack Abandon feature."
msgstr "ìŠ¤íƒ ì¤‘ë‹¨ 미리보기 ê¸°ëŠ¥ì„ ì‚¬ìš©í•©ë‹ˆë‹¤."
@@ -1713,10 +1710,6 @@ msgid "Failed to attach volume %(vol)s to server %(srv)s - %(err)s"
msgstr "볼륨 %(vol)sì„(를) 서버 %(srv)sì— ì—°ê²°í•˜ëŠ” ë° ì‹¤íŒ¨ - %(err)s"
#, python-format
-msgid "Failed to create Bay '%(name)s' - %(reason)s"
-msgstr "Bay '%(name)s' - %(reason)s 작성 실패"
-
-#, python-format
msgid "Failed to detach interface (%(port)s) from server (%(server)s)"
msgstr "서버((%(server)s)ì—ì„œ ì¸í„°íŽ˜ì´ìŠ¤(%(port)s)ì˜ ì—°ê²°ì„ í•´ì œí•˜ëŠ” ë° ì‹¤íŒ¨"
@@ -1770,10 +1763,6 @@ msgstr ""
msgid "Failed to stop stack (%(stack_name)s) on other engine (%(engine_id)s)"
msgstr "다른 엔진(%(engine_id)s)ì—ì„œ 스íƒ(%(stack_name)s) 중지 실패"
-#, python-format
-msgid "Failed to update Bay '%(name)s' - %(reason)s"
-msgstr "Bay '%(name)s' - %(reason)s ì—…ë°ì´íŠ¸ 실패"
-
msgid "Failed to update, can not found port info."
msgstr "ì—…ë°ì´íŠ¸ì— 실패했고 í¬íŠ¸ 정보를 ì°¾ì„ ìˆ˜ 없습니다."
@@ -2277,9 +2266,6 @@ msgstr ""
msgid "Incorrect arguments to \"%(fn_name)s\" should be: %(example)s"
msgstr "\"%(fn_name)s\"ì— ëŒ€í•œ 올바르지 ì•Šì€ ì¸ìˆ˜ëŠ” %(example)sì´ì–´ì•¼ 함 "
-msgid "Incorrect arguments: Items to merge must be maps."
-msgstr "ìž˜ëª»ëœ ì¸ìˆ˜: 병합할 í•­ëª©ì€ ë§µì´ì–´ì•¼ 합니다."
-
#, python-format
msgid ""
"Incorrect index to \"%(fn_name)s\" should be between 0 and %(max_index)s"
@@ -2885,15 +2871,6 @@ msgstr ""
"ì„ ëŠ˜ë ¤ì•¼ í•  수 있습니다(ì¼ë°˜ì ìœ¼ë¡œ í° ì„œë¹„ìŠ¤ 카탈로그가 있는 키스톤 v3 API"
"ì— ì˜í•´ ìƒì„±ë¨)."
-msgid ""
-"Maximum line size of message headers to be accepted. max_header_line may "
-"need to be increased when using large tokens (typically those generated by "
-"the Keystone v3 API with big service catalogs.)"
-msgstr ""
-"허용할 메시지 í—¤ë”ì˜ ìµœëŒ€ í–‰ í¬ê¸°ìž…니다. ë” í° í† í° ì‚¬ìš© ì‹œ max_header_line"
-"ì„ ëŠ˜ë ¤ì•¼ í•  수 있습니다(ì¼ë°˜ì ìœ¼ë¡œ í° ì„œë¹„ìŠ¤ 카탈로그가 있는 키스톤 v3 API"
-"ì— ì˜í•´ ìƒì„±ë¨)."
-
msgid "Maximum number of instances in the group."
msgstr "ê·¸ë£¹ì˜ ìµœëŒ€ ì¸ìŠ¤í„´ìŠ¤ 수입니다."
@@ -5089,9 +5066,6 @@ msgstr "ë³¼ë¥¨ì´ ìž‘ì„±ë˜ëŠ” 가용성 구역입니다."
msgid "The availability zone of shared filesystem."
msgstr "공유 íŒŒì¼ ì‹œìŠ¤í…œì˜ ê°€ìš© 구역입니다."
-msgid "The bay name."
-msgstr "Bay ì´ë¦„입니다."
-
msgid "The bit-length of the secret."
msgstr "ì‹œí¬ë¦¿ì˜ 비트 길ì´ìž…니다."
@@ -5541,9 +5515,6 @@ msgstr "계층 êµ¬ì¡°ì— ìžˆëŠ” ì´ keystone 프로ì íŠ¸ì˜ ìƒìœ„ ì´ë¦„ ë˜ëŠ
msgid "The name or ID of target cluster."
msgstr "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ì˜ ì´ë¦„ ë˜ëŠ” ID입니다."
-msgid "The name or ID of the bay model."
-msgstr "Bay 모ë¸ì˜ ì´ë¦„ ë˜ëŠ” ID입니다."
-
msgid "The name or ID of the subnet on which to allocate the VIP address."
msgstr "VIP 주소를 할당할 ì„œë¸Œë„·ì˜ ì´ë¦„ ë˜ëŠ” ID입니다."
@@ -5559,9 +5530,6 @@ msgstr "ike ì •ì±…ì˜ í˜‘ìƒ ëª¨ë“œìž…ë‹ˆë‹¤."
msgid "The next hop for the destination."
msgstr "대ìƒì˜ ë‹¤ìŒ hop입니다."
-msgid "The node count for this bay."
-msgstr "ì´ Bayì˜ ë…¸ë“œ 수입니다."
-
msgid "The notification methods to use when an alarm state is ALARM."
msgstr "알람 ìƒíƒœê°€ ALARMì´ë©´ 사용할 알림 방법입니다."
@@ -5589,9 +5557,6 @@ msgid ""
msgstr ""
"ì¸ìŠ¤í„´ìŠ¤ë¥¼ 양호 ìƒíƒœë¡œ ì´ë™í•˜ê¸° ì „ì— í•„ìš”í•œ ì—°ì† ìƒíƒœ 프로브 성공 수입니다."
-msgid "The number of master nodes for this bay."
-msgstr "Bayì˜ ë§ˆìŠ¤í„° 노드 수입니다."
-
msgid "The number of objects stored in the container."
msgstr "컨테ì´ë„ˆì— ì €ìž¥ëœ ì˜¤ë¸Œì íŠ¸ 수입니다."
@@ -5620,13 +5585,6 @@ msgid ""
msgstr "ìŠ¤íƒ ìž‘ì„± 프로세스가 계ì†ë˜ê¸° ì „ì— ìˆ˜ì‹ ë˜ì–´ì•¼ 하는 성공 신호 수입니다."
msgid ""
-"The optional public key. This allows users to supply the public key from a "
-"pre-existing key pair. If not supplied, a new key pair will be generated."
-msgstr ""
-"ì„ íƒì  공개 키입니다. ì´ë¡œ ì¸í•´ 사용ìžê°€ ì´ì „ì˜ ê¸°ì¡´ 키 ìŒì—ì„œ 공개 키를 제공"
-"í•  수 있습니다. 제공ë˜ì§€ 않는 경우 새 키 ìŒì´ ìƒì„±ë©ë‹ˆë‹¤."
-
-msgid ""
"The owner tenant ID of the address scope. Only administrative users can "
"specify a tenant ID other than their own."
msgstr ""
@@ -6106,11 +6064,6 @@ msgstr ""
"í´ë¼ì´ì–¸íŠ¸ ì—°ê²°ì˜ ì†Œì¼“ ì¡°ìž‘ì— ëŒ€í•œ 제한시간입니다. 수신 ì—°ê²°ì´ ì´ ê¸°ê°„(ì´ˆ) ë™"
"안 유휴 ìƒíƒœì´ë©´ ì—°ê²°ì´ ë‹«íž™ë‹ˆë‹¤. ê°’ì´ '0'ì´ë©´ 무기한 대기합니다."
-msgid "Timeout for creating the bay in minutes. Set to 0 for no timeout."
-msgstr ""
-"Bay를 작성하기 위한 제한시간(분)입니다. ì œí•œì‹œê°„ì´ ì—†ê²Œ 하려면 0으로 설정하십"
-"시오."
-
msgid "Timeout in seconds for stack action (ie. create or update)."
msgstr "ìŠ¤íƒ ì¡°ì¹˜(즉, 작성 ë˜ëŠ” ì—…ë°ì´íŠ¸)ì— ëŒ€í•œ 제한시간(ì´ˆ)입니다."
@@ -6224,9 +6177,6 @@ msgstr ""
msgid "URL of keystone service endpoint."
msgstr "keystone 서비스 엔드í¬ì¸íŠ¸ì˜ URL입니다."
-msgid "URL of the Heat CloudWatch server."
-msgstr "히트 CloudWatch ì„œë²„ì˜ URL입니다."
-
msgid ""
"URL of the Heat metadata server. NOTE: Setting this is only needed if you "
"require instances to use a different endpoint than in the keystone catalog"
@@ -6359,18 +6309,10 @@ msgstr "알 수 없는 키 %s"
msgid "Unknown share_status during creation of share \"{0}\""
msgstr "공유 \"{0}\" 작성 ì¤‘ì— ì•Œ 수 없는 share_status"
-#, python-format
-msgid "Unknown status creating Bay '%(name)s' - %(reason)s"
-msgstr "ì•Œ 수 없는 Bay '%(name)s' - %(reason)s 작성 ìƒíƒœ"
-
msgid "Unknown status during deleting share \"{0}\""
msgstr "공유 \"{0}\" ì‚­ì œ ì¤‘ì— ì•Œ 수 없는 ìƒíƒœ"
#, python-format
-msgid "Unknown status updating Bay '%(name)s' - %(reason)s"
-msgstr "ì•Œ 수 없는 Bay '%(name)s' - %(reason)s ì—…ë°ì´íŠ¸ ìƒíƒœ"
-
-#, python-format
msgid "Unknown status: %s"
msgstr "ì•Œ 수 없는 ìƒíƒœ: %s"
diff --git a/heat/locale/pt_BR/LC_MESSAGES/heat.po b/heat/locale/pt_BR/LC_MESSAGES/heat.po
index 993846ba8..bd63e248d 100644
--- a/heat/locale/pt_BR/LC_MESSAGES/heat.po
+++ b/heat/locale/pt_BR/LC_MESSAGES/heat.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: heat VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-11-01 17:57+0000\n"
+"POT-Creation-Date: 2022-11-11 06:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1650,9 +1650,6 @@ msgstr ""
msgid "Email address of keystone user."
msgstr "Endereço de e-mail do usuário do keystone."
-msgid "Enable the legacy OS::Heat::CWLiteAlarm resource."
-msgstr "Ative o recurso OS::Heat::CWLiteAlarm de legado."
-
msgid "Enable the preview Stack Abandon feature."
msgstr "Ative o recurso Stack Abandon de visualização."
@@ -1807,10 +1804,6 @@ msgid "Failed to attach volume %(vol)s to server %(srv)s - %(err)s"
msgstr "Falha ao conectar volume %(vol)s ao servidor %(srv)s - %(err)s"
#, python-format
-msgid "Failed to create Bay '%(name)s' - %(reason)s"
-msgstr "Falha ao criar o Compartimento '%(name)s' - %(reason)s"
-
-#, python-format
msgid "Failed to detach interface (%(port)s) from server (%(server)s)"
msgstr "Falha ao desconectar a interface (%(port)s) do servidor (%(server)s)"
@@ -1867,10 +1860,6 @@ msgid "Failed to stop stack (%(stack_name)s) on other engine (%(engine_id)s)"
msgstr ""
"Falha ao parar pilha (%(stack_name)s) em outro mecanismo (%(engine_id)s)"
-#, python-format
-msgid "Failed to update Bay '%(name)s' - %(reason)s"
-msgstr "Falha ao atualizar o Compartimento '%(name)s' - %(reason)s"
-
msgid "Failed to update, can not found port info."
msgstr ""
"Falha na atualização, não é possível localizar as informações da porta."
@@ -2399,9 +2388,6 @@ msgstr "Argumentos incorretos para \"%(fn_name)s\" deve ser um de: %(allowed)s"
msgid "Incorrect arguments to \"%(fn_name)s\" should be: %(example)s"
msgstr "Argumentos incorretos para \"%(fn_name)s\" deve ser: %(example)s"
-msgid "Incorrect arguments: Items to merge must be maps."
-msgstr "Argumentos incorretos: Itens para mesclar devem ser mapas."
-
#, python-format
msgid ""
"Incorrect index to \"%(fn_name)s\" should be between 0 and %(max_index)s"
@@ -3046,16 +3032,6 @@ msgstr ""
"(geralmente aqueles gerados pela API Keystone v3 com catálogos de serviço "
"grandes)."
-msgid ""
-"Maximum line size of message headers to be accepted. max_header_line may "
-"need to be increased when using large tokens (typically those generated by "
-"the Keystone v3 API with big service catalogs.)"
-msgstr ""
-"Tamanho máximo da linha de cabeçalhos da mensagem a ser aceito. "
-"max_header_line pode precisar ser aumentada ao utilizar tokens grandes "
-"(geralmente aqueles gerados pela API Keystone v3 com catálogos de serviço "
-"grandes)."
-
msgid "Maximum number of instances in the group."
msgstr "Número máximo de instâncias no grupo."
@@ -5354,9 +5330,6 @@ msgstr "A zona de disponibilidade na qual o volume será criado."
msgid "The availability zone of shared filesystem."
msgstr "A zona de disponibilidade do sistema de arquivos compartilhado."
-msgid "The bay name."
-msgstr "O nome do compartimento."
-
msgid "The bit-length of the secret."
msgstr "O comprimento de bit do segredo."
@@ -5830,9 +5803,6 @@ msgstr "O nome ou ID do pai desse projeto do keystone na hierarquia."
msgid "The name or ID of target cluster."
msgstr "O nome ou ID do cluster de destino."
-msgid "The name or ID of the bay model."
-msgstr "O nome ou ID do modelo do compartimento."
-
msgid "The name or ID of the subnet on which to allocate the VIP address."
msgstr "O nome ou ID da sub-rede no qual alocar o endereço VIP."
@@ -5848,9 +5818,6 @@ msgstr "O modo de negociação da política ike."
msgid "The next hop for the destination."
msgstr "O próximo hop para o destino."
-msgid "The node count for this bay."
-msgstr "A contagens de nós para esse compartimento."
-
msgid "The notification methods to use when an alarm state is ALARM."
msgstr ""
"Os métodos de notificação a serem usados quando um estado de alarme for "
@@ -5885,9 +5852,6 @@ msgstr ""
"O número de sucessos de análise consecutivas de funcionamento necessária "
"antes de mover a instância para o estado saudável."
-msgid "The number of master nodes for this bay."
-msgstr "O número de nós principais para esse compartimento."
-
msgid "The number of objects stored in the container."
msgstr "O número de objetos armazenados no contêiner."
@@ -5919,14 +5883,6 @@ msgstr ""
"criação da pilha continue."
msgid ""
-"The optional public key. This allows users to supply the public key from a "
-"pre-existing key pair. If not supplied, a new key pair will be generated."
-msgstr ""
-"A chave pública opcional. Isso permite que os usuários forneçam a chave "
-"pública a partir de um par de chaves preexistente. Se não fornecido, um novo "
-"par de chaves será gerado."
-
-msgid ""
"The owner tenant ID of the address scope. Only administrative users can "
"specify a tenant ID other than their own."
msgstr ""
@@ -6435,11 +6391,6 @@ msgstr ""
"conexão recebida estiver inativa por esse número de segundos, ela será "
"encerrada. Um valor de '0' significa aguardar para sempre."
-msgid "Timeout for creating the bay in minutes. Set to 0 for no timeout."
-msgstr ""
-"Tempo limite para criar o compartimento em minutos. Configure para 0 para "
-"nenhum tempo limite. "
-
msgid "Timeout in seconds for stack action (ie. create or update)."
msgstr ""
"Tempo limite em segundos para a ação da pilha (por exemplo, a criação ou "
@@ -6558,9 +6509,6 @@ msgstr ""
msgid "URL of keystone service endpoint."
msgstr "URL do terminal de serviço do keystone."
-msgid "URL of the Heat CloudWatch server."
-msgstr "URL do servidor CloudWatch."
-
msgid ""
"URL of the Heat metadata server. NOTE: Setting this is only needed if you "
"require instances to use a different endpoint than in the keystone catalog"
@@ -6702,19 +6650,10 @@ msgid "Unknown share_status during creation of share \"{0}\""
msgstr ""
"share_status desconhecido durante a criação do compartilhamento \"{0}\""
-#, python-format
-msgid "Unknown status creating Bay '%(name)s' - %(reason)s"
-msgstr "Status desconhecido ao criar o Compartimento '%(name)s' - %(reason)s"
-
msgid "Unknown status during deleting share \"{0}\""
msgstr "Status desconhecido durante a exclusão do compartilhamento \"{0}\""
#, python-format
-msgid "Unknown status updating Bay '%(name)s' - %(reason)s"
-msgstr ""
-"Status desconhecido ao atualizar o Compartimento '%(name)s' - %(reason)s"
-
-#, python-format
msgid "Unknown status: %s"
msgstr "Status desconhecido: %s"
diff --git a/heat/locale/ru/LC_MESSAGES/heat.po b/heat/locale/ru/LC_MESSAGES/heat.po
index a17264dae..76444a4fc 100644
--- a/heat/locale/ru/LC_MESSAGES/heat.po
+++ b/heat/locale/ru/LC_MESSAGES/heat.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: heat VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-11-01 17:57+0000\n"
+"POT-Creation-Date: 2022-11-11 06:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1627,9 +1627,6 @@ msgstr ""
msgid "Email address of keystone user."
msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ keystone."
-msgid "Enable the legacy OS::Heat::CWLiteAlarm resource."
-msgstr "Включить уÑтаревший реÑÑƒÑ€Ñ OS::Heat::CWLiteAlarm."
-
msgid "Enable the preview Stack Abandon feature."
msgstr "Включить предварительный проÑмотр функции Отклонить Ñтек."
@@ -1784,10 +1781,6 @@ msgid "Failed to attach volume %(vol)s to server %(srv)s - %(err)s"
msgstr "Ðе удаетÑÑ Ð¿Ñ€Ð¸Ñоединить том %(vol)s к Ñерверу %(srv)s - %(err)s"
#, python-format
-msgid "Failed to create Bay '%(name)s' - %(reason)s"
-msgstr "Ðе удаетÑÑ Ñоздать отÑек '%(name)s' - %(reason)s"
-
-#, python-format
msgid "Failed to detach interface (%(port)s) from server (%(server)s)"
msgstr "Ðе удаетÑÑ Ð¾Ñ‚Ñоединить Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ (%(port)s) от Ñервера (%(server)s)"
@@ -1844,10 +1837,6 @@ msgid "Failed to stop stack (%(stack_name)s) on other engine (%(engine_id)s)"
msgstr ""
"Ðе удалоÑÑŒ оÑтановить Ñтек (%(stack_name)s) в другом модуле (%(engine_id)s)"
-#, python-format
-msgid "Failed to update Bay '%(name)s' - %(reason)s"
-msgstr "Ðе удаетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ‚ÑŒ отÑек '%(name)s' - %(reason)s"
-
msgid "Failed to update, can not found port info."
msgstr "Ðе удалоÑÑŒ обновить: не найдена Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ портах."
@@ -2379,9 +2368,6 @@ msgstr "Ðеверные аргументы \"%(fn_name)s\", должны быт
msgid "Incorrect arguments to \"%(fn_name)s\" should be: %(example)s"
msgstr "Ðеверные аргументы \"%(fn_name)s\", должны быть: %(example)s"
-msgid "Incorrect arguments: Items to merge must be maps."
-msgstr "ÐедопуÑтимые аргументы. ОбъединÑемые Ñлементы должны быть картами."
-
#, python-format
msgid ""
"Incorrect index to \"%(fn_name)s\" should be between 0 and %(max_index)s"
@@ -3020,15 +3006,6 @@ msgstr ""
"потребуетÑÑ ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ñ‚ÑŒ при иÑпользовании больших маркеров (как правило, "
"Ñозданных API Keystone верÑии 3 API Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼Ð¸ каталогами)."
-msgid ""
-"Maximum line size of message headers to be accepted. max_header_line may "
-"need to be increased when using large tokens (typically those generated by "
-"the Keystone v3 API with big service catalogs.)"
-msgstr ""
-"МакÑимальный размер Ñтроки заголовка Ñообщений. Возможно, max_header_line "
-"потребуетÑÑ ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ñ‚ÑŒ при иÑпользовании больших маркеров (как правило, "
-"Ñозданных API Keystone верÑии 3 API Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼Ð¸ каталогами)."
-
msgid "Maximum number of instances in the group."
msgstr "МакÑимальное чиÑло ÑкземплÑров в группе."
@@ -5282,9 +5259,6 @@ msgstr "ОблаÑÑ‚ÑŒ доÑтупноÑти, в которой будет Ñо
msgid "The availability zone of shared filesystem."
msgstr "Зона доÑтупноÑти Ð´Ð»Ñ Ð¾Ð±Ñ‰Ð¸Ñ… файловых ÑиÑтем."
-msgid "The bay name."
-msgstr "Ð˜Ð¼Ñ Ð¾Ñ‚Ñека."
-
msgid "The bit-length of the secret."
msgstr "ЧиÑло разрÑдов Ñекретного ключа."
@@ -5756,9 +5730,6 @@ msgstr "Ð˜Ð¼Ñ Ð¸Ð»Ð¸ ИД родительÑкого объекта проекÑ
msgid "The name or ID of target cluster."
msgstr "Ð˜Ð¼Ñ Ð¸Ð»Ð¸ ИД целевого клаÑтера."
-msgid "The name or ID of the bay model."
-msgstr "Ð˜Ð¼Ñ Ð¸Ð»Ð¸ ИД модели отÑека."
-
msgid "The name or ID of the subnet on which to allocate the VIP address."
msgstr "Ð˜Ð¼Ñ Ð¸Ð»Ð¸ ИД подÑети, в которой выделÑетÑÑ Ð°Ð´Ñ€ÐµÑ VIP."
@@ -5774,9 +5745,6 @@ msgstr "Режим ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ñтратегии ike."
msgid "The next hop for the destination."
msgstr "Следующий промежуточный узел в маршруте."
-msgid "The node count for this bay."
-msgstr "КоличеÑтво узлов Ð´Ð»Ñ Ð¾Ñ‚Ñека."
-
msgid "The notification methods to use when an alarm state is ALARM."
msgstr ""
"Методы ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ ÑоÑтоÑнием ALARM предупреждениÑ."
@@ -5809,9 +5777,6 @@ msgstr ""
"ЧиÑло поÑледовательных уÑпешных выполнений теÑтов работоÑпоÑобноÑти, поÑле "
"которых ÑкземплÑÑ€ будет переведен в работоÑпоÑобное ÑоÑтоÑние."
-msgid "The number of master nodes for this bay."
-msgstr "КоличеÑтво главных узлов Ð´Ð»Ñ Ð¾Ñ‚Ñека."
-
msgid "The number of objects stored in the container."
msgstr "ЧиÑло объектов, хранимых в контейнере."
@@ -5842,13 +5807,6 @@ msgstr ""
"продолжать процеÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñтека."
msgid ""
-"The optional public key. This allows users to supply the public key from a "
-"pre-existing key pair. If not supplied, a new key pair will be generated."
-msgstr ""
-"ÐеобÑзательный общий ключ. ПозволÑет пользователÑм указывать общий ключ из "
-"готовой пары ключей. ЕÑли не указан, будет Ñоздана Ð½Ð¾Ð²Ð°Ñ Ð¿Ð°Ñ€Ð° ключей. "
-
-msgid ""
"The owner tenant ID of the address scope. Only administrative users can "
"specify a tenant ID other than their own."
msgstr ""
@@ -6356,9 +6314,6 @@ msgstr ""
"проÑтаивает в течение Ñтого времени, оно будет закрыто. Значение '0' "
"означает неограниченное ожидание."
-msgid "Timeout for creating the bay in minutes. Set to 0 for no timeout."
-msgstr "Тайм-аут в минутах Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ñека. Значение 0 отменÑет тайм-аут."
-
msgid "Timeout in seconds for stack action (ie. create or update)."
msgstr ""
"Тайм-аут в Ñекундах Ð´Ð»Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð½Ð°Ð´ Ñтеком (например, Ñоздать или обновить)."
@@ -6477,9 +6432,6 @@ msgstr ""
msgid "URL of keystone service endpoint."
msgstr "URL конечной точки Ñлужбы keystone."
-msgid "URL of the Heat CloudWatch server."
-msgstr "URL Ñервера Heat CloudWatch."
-
msgid ""
"URL of the Heat metadata server. NOTE: Setting this is only needed if you "
"require instances to use a different endpoint than in the keystone catalog"
@@ -6622,18 +6574,10 @@ msgstr "ÐеизвеÑтный ключ(и) %s"
msgid "Unknown share_status during creation of share \"{0}\""
msgstr "ÐеизвеÑтный share_status при Ñоздании общего реÑурÑа \"{0}\""
-#, python-format
-msgid "Unknown status creating Bay '%(name)s' - %(reason)s"
-msgstr "ÐеизвеÑтное ÑоÑтоÑние при Ñоздании отÑека '%(name)s' - %(reason)s"
-
msgid "Unknown status during deleting share \"{0}\""
msgstr "ÐеизвеÑтный код ÑоÑтоÑÐ½Ð¸Ñ Ð¿Ñ€Ð¸ удалении общего реÑурÑа \"{0}\""
#, python-format
-msgid "Unknown status updating Bay '%(name)s' - %(reason)s"
-msgstr "ÐеизвеÑтное ÑоÑтоÑние при обновлении отÑека '%(name)s' - %(reason)s"
-
-#, python-format
msgid "Unknown status: %s"
msgstr "ÐеизвеÑтное ÑоÑтоÑние: %s"
diff --git a/heat/locale/zh_CN/LC_MESSAGES/heat.po b/heat/locale/zh_CN/LC_MESSAGES/heat.po
index 0008a7e7e..eaac832d7 100644
--- a/heat/locale/zh_CN/LC_MESSAGES/heat.po
+++ b/heat/locale/zh_CN/LC_MESSAGES/heat.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: heat VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-11-01 17:57+0000\n"
+"POT-Creation-Date: 2022-11-11 06:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1495,9 +1495,6 @@ msgstr "必须为设备映射 %s 指定 volume_id 或 snapshot_id"
msgid "Email address of keystone user."
msgstr "keystone 用户的电å­é‚®ä»¶åœ°å€ã€‚"
-msgid "Enable the legacy OS::Heat::CWLiteAlarm resource."
-msgstr "请å¯ç”¨æ—§çš„ OS::Heat::CWLiteAlarm 资æºã€‚"
-
msgid "Enable the preview Stack Abandon feature."
msgstr "请å¯ç”¨é¢„览“堆栈放弃â€åŠŸèƒ½ã€‚"
@@ -1639,10 +1636,6 @@ msgid "Failed to attach volume %(vol)s to server %(srv)s - %(err)s"
msgstr "æ— æ³•å°†å· %(vol)s 附加至æœåŠ¡å™¨ %(srv)s - %(err)s"
#, python-format
-msgid "Failed to create Bay '%(name)s' - %(reason)s"
-msgstr "无法创建支架“%(name)s†- %(reason)s"
-
-#, python-format
msgid "Failed to detach interface (%(port)s) from server (%(server)s)"
msgstr "无法从æœåŠ¡å™¨ (%(server)s) æ‹†ç¦»æŽ¥å£ (%(port)s)"
@@ -1695,10 +1688,6 @@ msgstr "未能对其他引擎 (%(engine_id)s) 将消æ¯å‘é€è‡³å †æ ˆ (%(stack_
msgid "Failed to stop stack (%(stack_name)s) on other engine (%(engine_id)s)"
msgstr "未能对其他引擎 (%(engine_id)s) åœæ­¢å †æ ˆ (%(stack_name)s)"
-#, python-format
-msgid "Failed to update Bay '%(name)s' - %(reason)s"
-msgstr "无法更新支架“%(name)s†- %(reason)s"
-
msgid "Failed to update, can not found port info."
msgstr "未能更新,找ä¸åˆ°ç«¯å£ä¿¡æ¯ã€‚"
@@ -2185,9 +2174,6 @@ msgstr "针对“%(fn_name)sâ€çš„ä¸æ­£ç¡®è‡ªå˜é‡åº”该是下列其中一项ï
msgid "Incorrect arguments to \"%(fn_name)s\" should be: %(example)s"
msgstr "针对“%(fn_name)sâ€çš„ä¸æ­£ç¡®è‡ªå˜é‡åº”该如下:%(example)s"
-msgid "Incorrect arguments: Items to merge must be maps."
-msgstr "自å˜é‡ä¸æ­£ç¡®ï¼šè¦åˆå¹¶çš„项必须为映射。"
-
#, python-format
msgid ""
"Incorrect index to \"%(fn_name)s\" should be between 0 and %(max_index)s"
@@ -2769,14 +2755,6 @@ msgstr ""
"è¦æŽ¥å—的消æ¯å¤´çš„最大行大å°ã€‚将大型令牌(通常是由 Keystone V3 API 生æˆçš„那些令"
"牌)与大型æœåŠ¡ç›®å½•é…åˆä½¿ç”¨æ—¶ï¼Œå¯èƒ½éœ€è¦å¢žå¤§ max_header_line。"
-msgid ""
-"Maximum line size of message headers to be accepted. max_header_line may "
-"need to be increased when using large tokens (typically those generated by "
-"the Keystone v3 API with big service catalogs.)"
-msgstr ""
-"è¦æŽ¥å—的消æ¯å¤´çš„最大行大å°ã€‚将大型令牌(通常是由 Keystone V3 API 生æˆçš„那些令"
-"牌)与大型æœåŠ¡ç›®å½•é…åˆä½¿ç”¨æ—¶ï¼Œå¯èƒ½éœ€è¦å¢žå¤§ max_header_line。"
-
msgid "Maximum number of instances in the group."
msgstr "组中的最大实例数。"
@@ -4882,9 +4860,6 @@ msgstr "将在其中创建å·çš„å¯ç”¨æ€§åŒºåŸŸã€‚"
msgid "The availability zone of shared filesystem."
msgstr "共享文件系统的å¯ç”¨åŒºåŸŸã€‚"
-msgid "The bay name."
-msgstr "支架å称。"
-
msgid "The bit-length of the secret."
msgstr "密钥的ä½é•¿åº¦ã€‚"
@@ -5314,9 +5289,6 @@ msgstr "æ­¤ keystone 项目在层次结构中的父代的å称或标识。"
msgid "The name or ID of target cluster."
msgstr "目标集群的å称或标识。"
-msgid "The name or ID of the bay model."
-msgstr "支架模型的å称或标识。"
-
msgid "The name or ID of the subnet on which to allocate the VIP address."
msgstr "è¦åœ¨å…¶ä¸Šåˆ†é… VIP 地å€çš„å­ç½‘çš„å称或标识。"
@@ -5332,9 +5304,6 @@ msgstr "ike 策略的å商方å¼ã€‚"
msgid "The next hop for the destination."
msgstr "目标的下一中断段。"
-msgid "The node count for this bay."
-msgstr "此支架的节点计数。"
-
msgid "The notification methods to use when an alarm state is ALARM."
msgstr "è¦åœ¨è­¦æŠ¥çŠ¶æ€ä¸º ALARM 时使用的通知方法。"
@@ -5360,9 +5329,6 @@ msgid ""
"instance to the healthy state."
msgstr "将实例移至正常状æ€ä¹‹å‰éœ€è¦çš„è¿žç»­è¿è¡ŒçŠ¶å†µæŽ¢æµ‹å™¨æˆåŠŸæ¬¡æ•°ã€‚"
-msgid "The number of master nodes for this bay."
-msgstr "此支架的主节点数。"
-
msgid "The number of objects stored in the container."
msgstr "容器中存储的对象数。"
@@ -5391,13 +5357,6 @@ msgid ""
msgstr "在堆栈创建过程继续之å‰ï¼Œå¿…须接收到的æˆåŠŸä¿¡å·æ•°ã€‚"
msgid ""
-"The optional public key. This allows users to supply the public key from a "
-"pre-existing key pair. If not supplied, a new key pair will be generated."
-msgstr ""
-"å¯é€‰å…¬ç”¨å¯†é’¥ã€‚è¿™å…许用户æä¾›æ¥è‡ªé¢„先存在的密钥对的公用密钥。如果未æ供,那么"
-"将生æˆæ–°å¯†é’¥å¯¹ã€‚"
-
-msgid ""
"The owner tenant ID of the address scope. Only administrative users can "
"specify a tenant ID other than their own."
msgstr "地å€èŒƒå›´çš„所有者租户标识。åªæœ‰ç®¡ç†ç”¨æˆ·æ‰èƒ½æŒ‡å®šä»–们自身以外的租户标识。"
@@ -5856,9 +5815,6 @@ msgstr ""
"客户机连接的套接字æ“作的超时。如果入局连接的空闲时间达到此秒数,那么该连接将"
"被关闭。值“0â€æ„味ç€æ°¸è¿œç­‰å¾…。"
-msgid "Timeout for creating the bay in minutes. Set to 0 for no timeout."
-msgstr "针对创建支架的超时(以分钟计)。设置为 0 表示无超时。"
-
msgid "Timeout in seconds for stack action (ie. create or update)."
msgstr "堆栈æ“作(å³ï¼Œåˆ›å»ºæˆ–更新)的超时,以秒计。"
@@ -5966,9 +5922,6 @@ msgstr "资æºå°†åœ¨å…¶ä¸­å‘出信å·æŒ‡ç¤ºå®ŒæˆåŠï¼ˆå¯é€‰ï¼‰ä¸Šè½½æ•°æ®çš„
msgid "URL of keystone service endpoint."
msgstr "keystone æœåŠ¡ç«¯ç‚¹çš„ URL。"
-msgid "URL of the Heat CloudWatch server."
-msgstr "Heat CloudWatch æœåŠ¡å™¨çš„ URL。"
-
msgid ""
"URL of the Heat metadata server. NOTE: Setting this is only needed if you "
"require instances to use a different endpoint than in the keystone catalog"
@@ -6094,18 +6047,10 @@ msgstr "键 %s 未知"
msgid "Unknown share_status during creation of share \"{0}\""
msgstr "创建共享“{0}â€æœŸé—´å‡ºçŽ°æœªçŸ¥ share_status"
-#, python-format
-msgid "Unknown status creating Bay '%(name)s' - %(reason)s"
-msgstr "创建支架“%(name)sâ€ æ—¶å‡ºçŽ°æœªçŸ¥çŠ¶æ€ - %(reason)s"
-
msgid "Unknown status during deleting share \"{0}\""
msgstr "删除共享“{0}â€æœŸé—´å‡ºçŽ°æœªçŸ¥çŠ¶æ€"
#, python-format
-msgid "Unknown status updating Bay '%(name)s' - %(reason)s"
-msgstr "更新支架“%(name)sâ€ æ—¶å‡ºçŽ°æœªçŸ¥çŠ¶æ€ - %(reason)s"
-
-#, python-format
msgid "Unknown status: %s"
msgstr "未知状æ€ï¼š%s"
diff --git a/heat/locale/zh_TW/LC_MESSAGES/heat.po b/heat/locale/zh_TW/LC_MESSAGES/heat.po
index f51016a3f..552305a3e 100644
--- a/heat/locale/zh_TW/LC_MESSAGES/heat.po
+++ b/heat/locale/zh_TW/LC_MESSAGES/heat.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: heat VERSION\n"
"Report-Msgid-Bugs-To: https://bugs.launchpad.net/openstack-i18n/\n"
-"POT-Creation-Date: 2021-11-01 17:57+0000\n"
+"POT-Creation-Date: 2022-11-11 06:43+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -1496,9 +1496,6 @@ msgstr "必須給è£ç½®å°æ˜  %s 指定 volume_id 或 snapshot_id"
msgid "Email address of keystone user."
msgstr "Keystone 使用者的電å­éƒµä»¶ä½å€ã€‚"
-msgid "Enable the legacy OS::Heat::CWLiteAlarm resource."
-msgstr "å•Ÿç”¨èˆŠå¼ OS::Heat::CWLiteAlarm 資æºã€‚"
-
msgid "Enable the preview Stack Abandon feature."
msgstr "啟用é è¦½ã€Œå †ç–Šæ”¾æ£„ã€åŠŸèƒ½ã€‚"
@@ -1642,10 +1639,6 @@ msgid "Failed to attach volume %(vol)s to server %(srv)s - %(err)s"
msgstr "無法將ç£å€ %(vol)s 連接至伺æœå™¨ %(srv)s - %(err)s"
#, python-format
-msgid "Failed to create Bay '%(name)s' - %(reason)s"
-msgstr "無法建立機架 '%(name)s' - %(reason)s"
-
-#, python-format
msgid "Failed to detach interface (%(port)s) from server (%(server)s)"
msgstr "ç„¡æ³•å°‡ä»‹é¢ (%(port)s) 從伺æœå™¨ (%(server)s) 分離"
@@ -1698,10 +1691,6 @@ msgstr "無法將訊æ¯å‚³é€è‡³å…¶ä»–引擎 (%(engine_id)s) 上的堆疊 (%(sta
msgid "Failed to stop stack (%(stack_name)s) on other engine (%(engine_id)s)"
msgstr "無法在其他引擎 (%(engine_id)s) 上åœæ­¢å †ç–Š (%(stack_name)s)"
-#, python-format
-msgid "Failed to update Bay '%(name)s' - %(reason)s"
-msgstr "無法更新機架 '%(name)s' - %(reason)s"
-
msgid "Failed to update, can not found port info."
msgstr "無法更新,找ä¸åˆ°åŸ è³‡è¨Šã€‚"
@@ -2190,9 +2179,6 @@ msgstr "\"%(fn_name)s\" 的引數ä¸æ­£ç¢ºï¼Œæ‡‰è©²æ˜¯ä¸‹åˆ—其中一項:%(all
msgid "Incorrect arguments to \"%(fn_name)s\" should be: %(example)s"
msgstr "\"%(fn_name)s\" 的引數ä¸æ­£ç¢ºï¼Œæ‡‰è©²æ˜¯ï¼š%(example)s"
-msgid "Incorrect arguments: Items to merge must be maps."
-msgstr "引數ä¸æ­£ç¢ºï¼šè¦åˆä½µçš„項目必須是å°æ˜ ã€‚"
-
#, python-format
msgid ""
"Incorrect index to \"%(fn_name)s\" should be between 0 and %(max_index)s"
@@ -2778,14 +2764,6 @@ msgstr ""
"è¦æŽ¥å—的訊æ¯æ¨™é ­è¡Œå¤§å°ä¸Šé™ã€‚如果使用大記號(通常是那些由 Keystone 第 3 版 "
"API é€éŽå¤§åž‹æœå‹™åž‹éŒ„所產生的記號),則å¯èƒ½éœ€è¦å¢žåŠ  max_header_line 值。"
-msgid ""
-"Maximum line size of message headers to be accepted. max_header_line may "
-"need to be increased when using large tokens (typically those generated by "
-"the Keystone v3 API with big service catalogs.)"
-msgstr ""
-"è¦æŽ¥å—的訊æ¯æ¨™é ­è¡Œå¤§å°ä¸Šé™ã€‚如果使用大記號(通常是那些由 Keystone 第 3 版 "
-"API é€éŽå¤§åž‹æœå‹™åž‹éŒ„所產生的記號),則å¯èƒ½éœ€è¦å¢žåŠ  max_header_line 值。"
-
msgid "Maximum number of instances in the group."
msgstr "群組中的實例數目上é™ã€‚"
@@ -4892,9 +4870,6 @@ msgstr "將在其中建立ç£å€çš„å¯ç”¨æ€§å€åŸŸã€‚"
msgid "The availability zone of shared filesystem."
msgstr "共用檔案系統的å¯ç”¨æ€§å€åŸŸã€‚"
-msgid "The bay name."
-msgstr "機架å稱。"
-
msgid "The bit-length of the secret."
msgstr "密碼的ä½å…ƒé•·åº¦ã€‚"
@@ -5326,9 +5301,6 @@ msgstr "在階層中,此 Keystone 專案之æ¯é …çš„å稱或 ID。"
msgid "The name or ID of target cluster."
msgstr "目標å¢é›†çš„å稱或 ID。"
-msgid "The name or ID of the bay model."
-msgstr "機架型號的å稱或 ID。"
-
msgid "The name or ID of the subnet on which to allocate the VIP address."
msgstr "在其中é…ç½® VIP ä½å€ä¹‹å­ç¶²è·¯çš„å稱或 ID。"
@@ -5344,9 +5316,6 @@ msgstr "IKE 原則的å”議模å¼ã€‚"
msgid "The next hop for the destination."
msgstr "目標的下一個中繼站。"
-msgid "The node count for this bay."
-msgstr "此機架的節點計數。"
-
msgid "The notification methods to use when an alarm state is ALARM."
msgstr "在警示狀態為「警示ã€æ™‚,è¦ä½¿ç”¨çš„通知方法。"
@@ -5372,9 +5341,6 @@ msgid ""
"instance to the healthy state."
msgstr "將實例移至狀æ³è‰¯å¥½ç‹€æ…‹ä¹‹å‰æ‰€éœ€çš„連續性能探測æˆåŠŸæ¬¡æ•¸ã€‚"
-msgid "The number of master nodes for this bay."
-msgstr "此機架的主è¦ç¯€é»žæ•¸ç›®ã€‚"
-
msgid "The number of objects stored in the container."
msgstr "儲存器中所儲存的物件數。"
@@ -5403,13 +5369,6 @@ msgid ""
msgstr "繼續執行堆疊建立程åºä¹‹å‰ï¼Œå¿…須收到的æˆåŠŸä¿¡è™Ÿæ•¸ç›®ã€‚"
msgid ""
-"The optional public key. This allows users to supply the public key from a "
-"pre-existing key pair. If not supplied, a new key pair will be generated."
-msgstr ""
-"é¸ç”¨çš„公開金鑰。這容許使用者從é å…ˆå­˜åœ¨çš„金鑰組æ供公開金鑰。如果沒有æ供,則"
-"將產生新金鑰組。"
-
-msgid ""
"The owner tenant ID of the address scope. Only administrative users can "
"specify a tenant ID other than their own."
msgstr "ä½å€ç¯„åœçš„æ“有者租戶 ID。僅管ç†ä½¿ç”¨è€…å¯ä»¥æŒ‡å®šå…¶ä»–使用者的租戶 ID。"
@@ -5868,9 +5827,6 @@ msgstr ""
"用戶端連線的 Socket 作業逾時。如果é€å…¥çš„連線處於閒置狀態的時間é”到此秒數,則"
"會將其關閉。值 '0' 表示永久等待。"
-msgid "Timeout for creating the bay in minutes. Set to 0 for no timeout."
-msgstr "用於建立機架的逾時(以分é˜ç‚ºå–®ä½ï¼‰ã€‚設定為 0 表示沒有逾時。"
-
msgid "Timeout in seconds for stack action (ie. create or update)."
msgstr "堆疊動作(例如,建立或更新)的逾時值(以秒為單ä½ï¼‰ã€‚"
@@ -5977,9 +5933,6 @@ msgstr "TempURL çš„ URL,資æºå°‡åœ¨è©² URL 處傳é€å®Œæˆä¿¡è™Ÿï¼Œä¸¦é¸æ“‡æ
msgid "URL of keystone service endpoint."
msgstr "Keystone æœå‹™ç«¯é»žçš„ URL。"
-msgid "URL of the Heat CloudWatch server."
-msgstr "Heat CloudWatch 伺æœå™¨çš„ URL。"
-
msgid ""
"URL of the Heat metadata server. NOTE: Setting this is only needed if you "
"require instances to use a different endpoint than in the keystone catalog"
@@ -6105,18 +6058,10 @@ msgstr "ä¸æ˜Žçš„ç´¢å¼•éµ %s"
msgid "Unknown share_status during creation of share \"{0}\""
msgstr "建立共用項目 \"{0}\" 時的ä¸æ˜Ž share_status"
-#, python-format
-msgid "Unknown status creating Bay '%(name)s' - %(reason)s"
-msgstr "建立機架 '%(name)s' 時的ä¸æ˜Žç‹€æ…‹ - %(reason)s"
-
msgid "Unknown status during deleting share \"{0}\""
msgstr "刪除共用項目 \"{0}\" 時的ä¸æ˜Žç‹€æ…‹"
#, python-format
-msgid "Unknown status updating Bay '%(name)s' - %(reason)s"
-msgstr "更新機架 '%(name)s' 時的ä¸æ˜Žç‹€æ…‹ - %(reason)s"
-
-#, python-format
msgid "Unknown status: %s"
msgstr "ä¸æ˜Žç‹€æ…‹ï¼š%s"
diff --git a/heat/tests/clients/test_magnum_client.py b/heat/tests/clients/test_magnum_client.py
index e0468308c..a12310e81 100644
--- a/heat/tests/clients/test_magnum_client.py
+++ b/heat/tests/clients/test_magnum_client.py
@@ -56,22 +56,3 @@ class ClusterTemplateConstraintTest(common.HeatTestCase):
self.mock_cluster_template_get.side_effect = mc_exc.NotFound()
self.assertFalse(self.constraint.validate(
"bad_cluster_template", self.ctx))
-
-
-class BaymodelConstraintTest(common.HeatTestCase):
- def setUp(self):
- super(BaymodelConstraintTest, self).setUp()
- self.ctx = utils.dummy_context()
- self.mock_baymodel_get = mock.Mock()
- self.ctx.clients.client_plugin(
- 'magnum').client().baymodels.get = self.mock_baymodel_get
- self.constraint = mc.BaymodelConstraint()
-
- def test_validate(self):
- self.mock_baymodel_get.return_value = fake_cluster_template(
- id='badbaymodel')
- self.assertTrue(self.constraint.validate("mybaymodel", self.ctx))
-
- def test_validate_fail(self):
- self.mock_baymodel_get.side_effect = mc_exc.NotFound()
- self.assertFalse(self.constraint.validate("badbaymodel", self.ctx))
diff --git a/heat/tests/openstack/cinder/test_volume.py b/heat/tests/openstack/cinder/test_volume.py
index 56c28b98b..a137b226a 100644
--- a/heat/tests/openstack/cinder/test_volume.py
+++ b/heat/tests/openstack/cinder/test_volume.py
@@ -1404,3 +1404,26 @@ class CinderVolumeTest(vt_base.VolumeTestCase):
self.assertEqual(True, rsrc._ready_to_extend_volume())
self.assertEqual(False, rsrc._ready_to_extend_volume())
self.assertEqual(True, rsrc._ready_to_extend_volume())
+
+ def test_try_detach_volume_if_server_was_temporarily_in_error(self):
+ self.stack_name = 'test_cvolume_detach_server_in_error_stack'
+ fva = vt_base.FakeVolume('in-use')
+ m_v = self._mock_create_server_volume_script(
+ vt_base.FakeVolume('attaching'))
+ self._mock_create_volume(vt_base.FakeVolume('creating'),
+ self.stack_name,
+ extra_get_mocks=[
+ m_v, fva,
+ vt_base.FakeVolume('available')])
+ self.stub_VolumeConstraint_validate()
+ # delete script
+ self.fc.volumes.get_server_volume.side_effect = [
+ fva, fva, fakes_nova.fake_exception()]
+ nova_responses = [nova_exp.Conflict('409'), None]
+ self.fc.volumes.delete_server_volume.side_effect = nova_responses
+ stack = utils.parse_stack(self.t, stack_name=self.stack_name)
+ self.create_volume(self.t, stack, 'volume')
+ rsrc = self.create_attachment(self.t, stack, 'attachment')
+ scheduler.TaskRunner(rsrc.delete)()
+ self.assertEqual(self.fc.volumes.delete_server_volume.call_count,
+ len(nova_responses))
diff --git a/heat/tests/openstack/heat/test_swiftsignal.py b/heat/tests/openstack/heat/test_swiftsignal.py
index 64a15df1b..8fc592e9d 100644
--- a/heat/tests/openstack/heat/test_swiftsignal.py
+++ b/heat/tests/openstack/heat/test_swiftsignal.py
@@ -129,7 +129,8 @@ class SwiftSignalHandleTest(common.HeatTestCase):
obj_name = "%s-%s-abcdefghijkl" % (st.name, handle.name)
mock_name.return_value = obj_name
mock_swift_object.get_container.return_value = cont_index(obj_name, 2)
- mock_swift_object.get_object.return_value = (obj_header, '{"id": "1"}')
+ mock_swift_object.get_object.return_value = (obj_header,
+ b'{"id": "1"}')
st.create()
handle = st.resources['test_wait_condition_handle']
@@ -311,7 +312,7 @@ class SwiftSignalTest(common.HeatTestCase):
obj_name = "%s-%s-abcdefghijkl" % (st.name, handle.name)
mock_name.return_value = obj_name
mock_swift_object.get_container.return_value = cont_index(obj_name, 2)
- mock_swift_object.get_object.return_value = (obj_header, '')
+ mock_swift_object.get_object.return_value = (obj_header, b'')
st.create()
self.assertEqual(('CREATE', 'COMPLETE'), st.state)
@@ -358,13 +359,13 @@ class SwiftSignalTest(common.HeatTestCase):
mock_name.return_value = obj_name
mock_swift_object.get_container.return_value = cont_index(obj_name, 2)
mock_swift_object.get_object.side_effect = (
- (obj_header, json.dumps({'id': 1})),
- (obj_header, json.dumps({'id': 1})),
- (obj_header, json.dumps({'id': 1})),
+ (obj_header, json.dumps({'id': 1}).encode()),
+ (obj_header, json.dumps({'id': 1}).encode()),
+ (obj_header, json.dumps({'id': 1}).encode()),
- (obj_header, json.dumps({'id': 1})),
- (obj_header, json.dumps({'id': 2})),
- (obj_header, json.dumps({'id': 3})),
+ (obj_header, json.dumps({'id': 1}).encode()),
+ (obj_header, json.dumps({'id': 2}).encode()),
+ (obj_header, json.dumps({'id': 3}).encode()),
)
st.create()
@@ -385,8 +386,8 @@ class SwiftSignalTest(common.HeatTestCase):
obj_name = "%s-%s-abcdefghijkl" % (st.name, handle.name)
mock_name.return_value = obj_name
mock_swift_object.get_container.return_value = cont_index(obj_name, 2)
- mock_swift_object.get_object.return_value = (obj_header,
- json.dumps({'id': 1}))
+ body = json.dumps({'id': 1}).encode()
+ mock_swift_object.get_object.return_value = (obj_header, body)
time_now = timeutils.utcnow()
time_series = [datetime.timedelta(0, t) + time_now
@@ -419,9 +420,9 @@ class SwiftSignalTest(common.HeatTestCase):
mock_name.return_value = obj_name
mock_swift_object.get_container.return_value = cont_index(obj_name, 2)
mock_swift_object.get_object.side_effect = (
- (obj_header, json.dumps({'id': 1, 'status': "SUCCESS"})),
- (obj_header, json.dumps({'id': 1, 'status': "SUCCESS"})),
- (obj_header, json.dumps({'id': 2, 'status': "SUCCESS"})),
+ (obj_header, json.dumps({'id': 1, 'status': "SUCCESS"}).encode()),
+ (obj_header, json.dumps({'id': 1, 'status': "SUCCESS"}).encode()),
+ (obj_header, json.dumps({'id': 2, 'status': "SUCCESS"}).encode()),
)
st.create()
@@ -445,15 +446,15 @@ class SwiftSignalTest(common.HeatTestCase):
mock_swift_object.get_object.side_effect = (
# Create
(obj_header, json.dumps({'id': 1, 'status': "FAILURE",
- 'reason': "foo"})),
+ 'reason': "foo"}).encode()),
(obj_header, json.dumps({'id': 2, 'status': "FAILURE",
- 'reason': "bar"})),
+ 'reason': "bar"}).encode()),
# SwiftSignalFailure
(obj_header, json.dumps({'id': 1, 'status': "FAILURE",
- 'reason': "foo"})),
+ 'reason': "foo"}).encode()),
(obj_header, json.dumps({'id': 2, 'status': "FAILURE",
- 'reason': "bar"})),
+ 'reason': "bar"}).encode()),
)
st.create()
@@ -480,14 +481,14 @@ class SwiftSignalTest(common.HeatTestCase):
mock_swift_object.get_object.side_effect = (
# st create
- (obj_header, json.dumps({'id': 1, 'data': "foo"})),
- (obj_header, json.dumps({'id': 2, 'data': "bar"})),
- (obj_header, json.dumps({'id': 3, 'data': "baz"})),
+ (obj_header, json.dumps({'id': 1, 'data': "foo"}).encode()),
+ (obj_header, json.dumps({'id': 2, 'data': "bar"}).encode()),
+ (obj_header, json.dumps({'id': 3, 'data': "baz"}).encode()),
# FnGetAtt call
- (obj_header, json.dumps({'id': 1, 'data': "foo"})),
- (obj_header, json.dumps({'id': 2, 'data': "bar"})),
- (obj_header, json.dumps({'id': 3, 'data': "baz"})),
+ (obj_header, json.dumps({'id': 1, 'data': "foo"}).encode()),
+ (obj_header, json.dumps({'id': 2, 'data': "bar"}).encode()),
+ (obj_header, json.dumps({'id': 3, 'data': "baz"}).encode()),
)
st.create()
@@ -515,15 +516,15 @@ class SwiftSignalTest(common.HeatTestCase):
mock_swift_object.get_object.side_effect = (
# st create
(obj_header, json.dumps({'data': "foo", 'reason': "bar",
- 'status': "SUCCESS"})),
+ 'status': "SUCCESS"}).encode()),
(obj_header, json.dumps({'data': "dog", 'reason': "cat",
- 'status': "SUCCESS"})),
+ 'status': "SUCCESS"}).encode()),
# FnGetAtt call
(obj_header, json.dumps({'data': "foo", 'reason': "bar",
- 'status': "SUCCESS"})),
+ 'status': "SUCCESS"}).encode()),
(obj_header, json.dumps({'data': "dog", 'reason': "cat",
- 'status': "SUCCESS"})),
+ 'status': "SUCCESS"}).encode()),
)
st.create()
@@ -549,12 +550,12 @@ class SwiftSignalTest(common.HeatTestCase):
mock_swift_object.get_object.side_effect = (
# st create
- (obj_header, ''),
- (obj_header, ''),
+ (obj_header, b''),
+ (obj_header, b''),
# FnGetAtt call
- (obj_header, ''),
- (obj_header, ''),
+ (obj_header, b''),
+ (obj_header, b''),
)
st.create()
@@ -579,7 +580,7 @@ class SwiftSignalTest(common.HeatTestCase):
mock_name.return_value = obj_name
mock_swift_object.get_container.return_value = cont_index(obj_name, 1)
mock_swift_object.get_object.return_value = (
- obj_header, json.dumps({'status': 'SUCCESS'}))
+ obj_header, json.dumps({'status': 'SUCCESS'}).encode())
st.create()
self.assertEqual(['SUCCESS', 'SUCCESS'], wc.get_status())
@@ -605,7 +606,7 @@ class SwiftSignalTest(common.HeatTestCase):
obj_name = "%s-%s-abcdefghijkl" % (st.name, handle.name)
mock_name.return_value = obj_name
mock_swift_object.get_container.return_value = cont_index(obj_name, 1)
- mock_swift_object.get_object.return_value = (obj_header, '')
+ mock_swift_object.get_object.return_value = (obj_header, b'')
st.create()
self.assertEqual(['SUCCESS', 'SUCCESS'], wc.get_status())
@@ -632,7 +633,7 @@ class SwiftSignalTest(common.HeatTestCase):
mock_name.return_value = obj_name
mock_swift_object.get_container.return_value = cont_index(obj_name, 1)
mock_swift_object.get_object.return_value = (
- obj_header, json.dumps({'id': 1, 'status': "SUCCESS"}))
+ obj_header, json.dumps({'id': 1, 'status': "SUCCESS"}).encode())
st.create()
self.assertEqual(['SUCCESS'], wc.get_status())
@@ -657,7 +658,7 @@ class SwiftSignalTest(common.HeatTestCase):
mock_name.return_value = obj_name
mock_swift_object.get_container.return_value = cont_index(obj_name, 1)
mock_swift_object.get_object.return_value = (
- obj_header, json.dumps({'id': 1, 'status': "FAILURE"}))
+ obj_header, json.dumps({'id': 1, 'status': "FAILURE"}).encode())
st.create()
self.assertEqual(('CREATE', 'FAILED'), st.state)
@@ -684,8 +685,8 @@ class SwiftSignalTest(common.HeatTestCase):
mock_swift_object.get_object.side_effect = (
# st create
- (obj_header, ''),
- (obj_header, ''),
+ (obj_header, b''),
+ (obj_header, b''),
)
st.create()
@@ -710,8 +711,8 @@ class SwiftSignalTest(common.HeatTestCase):
mock_swift_object.get_object.side_effect = (
# st create
- (obj_header, ''),
- (obj_header, ''),
+ (obj_header, b''),
+ (obj_header, b''),
)
st.create()
@@ -741,8 +742,8 @@ class SwiftSignalTest(common.HeatTestCase):
mock_swift_object.get_object.side_effect = (
# st create
- (obj_header, ''),
- (obj_header, ''),
+ (obj_header, b''),
+ (obj_header, b''),
)
st.create()
@@ -772,8 +773,8 @@ class SwiftSignalTest(common.HeatTestCase):
mock_swift_object.get_object.side_effect = (
# st create
- (obj_header, '{"status": "SUCCESS"'),
- (obj_header, '{"status": "FAI'),
+ (obj_header, b'{"status": "SUCCESS"'),
+ (obj_header, b'{"status": "FAI'),
)
st.create()
@@ -800,7 +801,7 @@ class SwiftSignalTest(common.HeatTestCase):
mock_swift_object.get_container.return_value = cont_index(obj_name, 1)
mock_swift_object.get_object.return_value = (
- obj_header, '{"status": "BOO"}')
+ obj_header, b'{"status": "BOO"}')
st.create()
self.assertEqual(('CREATE', 'FAILED'), st.state)
@@ -827,9 +828,10 @@ class SwiftSignalTest(common.HeatTestCase):
(container_header, []), # The user deleted the objects
)
mock_swift_object.get_object.side_effect = (
- (obj_header, json.dumps({'id': 1})), # Objects there during create
- (obj_header, json.dumps({'id': 2})),
- (obj_header, json.dumps({'id': 3})),
+ # Objects there during create
+ (obj_header, json.dumps({'id': 1}).encode()),
+ (obj_header, json.dumps({'id': 2}).encode()),
+ (obj_header, json.dumps({'id': 3}).encode()),
)
st.create()
@@ -860,8 +862,8 @@ class SwiftSignalTest(common.HeatTestCase):
cont_index(obj_name, 1),
)
mock_swift_object.get_object.side_effect = (
- (obj_header, json.dumps({'id': 1})),
- (obj_header, json.dumps({'id': 2})),
+ (obj_header, json.dumps({'id': 1}).encode()),
+ (obj_header, json.dumps({'id': 2}).encode()),
)
st.create()
@@ -887,9 +889,10 @@ class SwiftSignalTest(common.HeatTestCase):
http_status=404) # User deleted
]
mock_swift_object.get_object.side_effect = (
- (obj_header, json.dumps({'id': 1})), # Objects there during create
- (obj_header, json.dumps({'id': 2})),
- (obj_header, json.dumps({'id': 3})),
+ # Objects there during create
+ (obj_header, json.dumps({'id': 1}).encode()),
+ (obj_header, json.dumps({'id': 2}).encode()),
+ (obj_header, json.dumps({'id': 3}).encode()),
)
st.create()
@@ -915,8 +918,8 @@ class SwiftSignalTest(common.HeatTestCase):
mock_swift_object.get_object.side_effect = (
swiftclient_client.ClientException(
"Object %s not found" % obj_name, http_status=404),
- (obj_header, '{"id": 1}'),
- (obj_header, '{"id": 2}'),
+ (obj_header, b'{"id": 1}'),
+ (obj_header, b'{"id": 2}'),
)
st.create()
diff --git a/heat/tests/openstack/magnum/test_bay.py b/heat/tests/openstack/magnum/test_bay.py
deleted file mode 100644
index 66803e80e..000000000
--- a/heat/tests/openstack/magnum/test_bay.py
+++ /dev/null
@@ -1,157 +0,0 @@
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-
-import copy
-from unittest import mock
-
-from oslo_config import cfg
-
-from heat.common import exception
-from heat.common import template_format
-from heat.engine.clients.os import magnum as mc
-from heat.engine import resource
-from heat.engine.resources.openstack.magnum import bay
-from heat.engine import scheduler
-from heat.engine import template
-from heat.tests import common
-from heat.tests import utils
-
-
-magnum_template = '''
- heat_template_version: 2015-04-30
- resources:
- test_bay:
- type: OS::Magnum::Bay
- properties:
- name: test_bay
- baymodel: 123456
- node_count: 5
- master_count: 1
- discovery_url: https://discovery.etcd.io
- bay_create_timeout: 15
-'''
-
-RESOURCE_TYPE = 'OS::Magnum::Bay'
-
-
-class TestMagnumBay(common.HeatTestCase):
- def setUp(self):
- super(TestMagnumBay, self).setUp()
- resource._register_class(RESOURCE_TYPE, bay.Bay)
- t = template_format.parse(magnum_template)
- self.stack = utils.parse_stack(t)
- resource_defns = self.stack.t.resource_definitions(self.stack)
- self.rsrc_defn = resource_defns['test_bay']
- self.client = mock.Mock()
- self.patchobject(bay.Bay, 'client', return_value=self.client)
- self.patchobject(mc.MagnumClientPlugin, 'get_baymodel')
-
- def _create_resource(self, name, snippet, stack, stat='CREATE_COMPLETE'):
- self.resource_id = '12345'
- value = mock.MagicMock(uuid=self.resource_id)
- self.client.bays.create.return_value = value
- get_rv = mock.MagicMock(status=stat)
- self.client.bays.get.return_value = get_rv
- b = bay.Bay(name, snippet, stack)
- return b
-
- def test_bay_create(self):
- b = self._create_resource('bay', self.rsrc_defn, self.stack)
- scheduler.TaskRunner(b.create)()
- self.assertEqual(self.resource_id, b.resource_id)
- self.assertEqual((b.CREATE, b.COMPLETE), b.state)
-
- def test_bay_create_failed(self):
- cfg.CONF.set_override('action_retry_limit', 0)
- b = self._create_resource('bay', self.rsrc_defn, self.stack,
- stat='CREATE_FAILED')
- exc = self.assertRaises(
- exception.ResourceFailure,
- scheduler.TaskRunner(b.create))
- self.assertIn("Failed to create Bay", str(exc))
-
- def test_bay_create_unknown_status(self):
- b = self._create_resource('bay', self.rsrc_defn, self.stack,
- stat='CREATE_FOO')
- exc = self.assertRaises(
- exception.ResourceFailure,
- scheduler.TaskRunner(b.create))
- self.assertIn("Unknown status creating Bay", str(exc))
-
- def test_bay_update(self):
- b = self._create_resource('bay', self.rsrc_defn, self.stack)
- scheduler.TaskRunner(b.create)()
- status = mock.MagicMock(status='UPDATE_COMPLETE')
- self.client.bays.get.return_value = status
- t = template_format.parse(magnum_template)
- new_t = copy.deepcopy(t)
- new_t['resources']['test_bay']['properties']['node_count'] = 10
- rsrc_defns = template.Template(new_t).resource_definitions(self.stack)
- new_bm = rsrc_defns['test_bay']
- scheduler.TaskRunner(b.update, new_bm)()
- self.assertEqual((b.UPDATE, b.COMPLETE), b.state)
-
- def test_bay_update_failed(self):
- b = self._create_resource('bay', self.rsrc_defn, self.stack)
- scheduler.TaskRunner(b.create)()
- status = mock.MagicMock(status='UPDATE_FAILED')
- self.client.bays.get.return_value = status
- t = template_format.parse(magnum_template)
- new_t = copy.deepcopy(t)
- new_t['resources']['test_bay']['properties']['node_count'] = 10
- rsrc_defns = template.Template(new_t).resource_definitions(self.stack)
- new_bm = rsrc_defns['test_bay']
- exc = self.assertRaises(
- exception.ResourceFailure,
- scheduler.TaskRunner(b.update, new_bm))
- self.assertIn("Failed to update Bay", str(exc))
-
- def test_bay_update_unknown_status(self):
- b = self._create_resource('bay', self.rsrc_defn, self.stack)
- scheduler.TaskRunner(b.create)()
- status = mock.MagicMock(status='UPDATE_BAR')
- self.client.bays.get.return_value = status
- t = template_format.parse(magnum_template)
- new_t = copy.deepcopy(t)
- new_t['resources']['test_bay']['properties']['node_count'] = 10
- rsrc_defns = template.Template(new_t).resource_definitions(self.stack)
- new_bm = rsrc_defns['test_bay']
- exc = self.assertRaises(
- exception.ResourceFailure,
- scheduler.TaskRunner(b.update, new_bm))
- self.assertIn("Unknown status updating Bay", str(exc))
-
- def test_bay_delete(self):
- b = self._create_resource('bay', self.rsrc_defn, self.stack)
- scheduler.TaskRunner(b.create)()
- b.client_plugin = mock.MagicMock()
- self.client.bays.get.side_effect = Exception('Not Found')
- self.client.get.reset_mock()
- scheduler.TaskRunner(b.delete)()
- self.assertEqual((b.DELETE, b.COMPLETE), b.state)
- self.assertEqual(2, self.client.bays.get.call_count)
-
- def test_bay_get_live_state(self):
- b = self._create_resource('bay', self.rsrc_defn, self.stack)
- scheduler.TaskRunner(b.create)()
- value = mock.MagicMock()
- value.to_dict.return_value = {
- 'name': 'test_bay',
- 'baymodel': 123456,
- 'node_count': 5,
- 'master_count': 1,
- 'discovery_url': 'https://discovery.etcd.io',
- 'bay_create_timeout': 15}
- self.client.bays.get.return_value = value
- reality = b.get_live_state(b.properties)
- self.assertEqual({'node_count': 5, 'master_count': 1}, reality)
diff --git a/heat/tests/openstack/neutron/test_neutron_floating_ip.py b/heat/tests/openstack/neutron/test_neutron_floating_ip.py
index 59f54147b..6915c1077 100644
--- a/heat/tests/openstack/neutron/test_neutron_floating_ip.py
+++ b/heat/tests/openstack/neutron/test_neutron_floating_ip.py
@@ -17,6 +17,8 @@ from unittest import mock
from neutronclient.common import exceptions as qe
from neutronclient.neutron import v2_0 as neutronV20
from neutronclient.v2_0 import client as neutronclient
+from openstack import exceptions
+from oslo_utils import excutils
from heat.common import exception
from heat.common import template_format
@@ -56,6 +58,16 @@ resources:
floatingip_id: { get_resource: floating_ip }
port_id: { get_resource: port_floating }
+ port_forwarding:
+ type: OS::Neutron::FloatingIPPortForward
+ properties:
+ internal_ip_address: 10.0.0.10
+ internal_port_number: 8080
+ external_port: 80
+ protocol: tcp
+ internal_port: { get_resource: port_floating }
+ floating_ip: { get_resource: floating_ip }
+
router:
type: OS::Neutron::Router
@@ -136,6 +148,29 @@ class NeutronFloatingIPTest(common.HeatTestCase):
self.patchobject(neutron.NeutronClientPlugin, 'has_extension',
return_value=True)
+ class FakeOpenStackPlugin(object):
+
+ @excutils.exception_filter
+ def ignore_not_found(self, ex):
+ if not isinstance(ex, exceptions.ResourceNotFound):
+ raise ex
+
+ def find_network_port(self, value):
+ return('9c1eb3fe-7bba-479d-bd43-fdb0bc7cd151')
+
+ def find_network_ip(self, value):
+ return('477e8273-60a7-4c41-b683-1d497e53c384')
+
+ self.ctx = utils.dummy_context()
+ tpl = template_format.parse(neutron_floating_template)
+ self.stack = utils.parse_stack(tpl)
+ self.sdkclient = mock.Mock()
+ self.port_forward = self.stack['port_forwarding']
+ self.port_forward.client = mock.Mock(return_value=self.sdkclient)
+ self.port_forward.client_plugin = mock.Mock(
+ return_value=FakeOpenStackPlugin()
+ )
+
def test_floating_ip_validate(self):
t = template_format.parse(neutron_floating_no_assoc_template)
stack = utils.parse_stack(t)
@@ -743,3 +778,230 @@ class NeutronFloatingIPTest(common.HeatTestCase):
deps.graph.return_value = {fipa: [port]}
fipa.add_dependencies(deps)
self.assertEqual([], dep_list)
+
+ def test_fip_port_forward_create(self):
+ pfid = mock.Mock(id='180941c5-9e82-41c7-b64d-6a57302ec211')
+
+ props = {'internal_ip_address': '10.0.0.10',
+ 'internal_port_number': 8080,
+ 'external_port': 80,
+ 'internal_port': '9c1eb3fe-7bba-479d-bd43-fdb0bc7cd151',
+ 'protocol': 'tcp'}
+
+ mock_create = self.patchobject(self.sdkclient.network,
+ 'create_floating_ip_port_forwarding',
+ return_value=pfid)
+
+ self.mockclient.create_port.return_value = {
+ 'port': {
+ "status": "BUILD",
+ "id": "9c1eb3fe-7bba-479d-bd43-fdb0bc7cd151"
+ }
+ }
+ self.mockclient.show_port.return_value = {
+ 'port': {
+ "status": "ACTIVE",
+ "id": "9c1eb3fe-7bba-479d-bd43-fdb0bc7cd151"
+ }
+ }
+ self.mockclient.create_floatingip.return_value = {
+ 'floatingip': {
+ "status": "ACTIVE",
+ "id": "477e8273-60a7-4c41-b683-1d497e53c384"
+ }
+ }
+
+ p = self.stack['port_floating']
+ scheduler.TaskRunner(p.create)()
+ self.assertEqual((p.CREATE, p.COMPLETE), p.state)
+ stk_defn.update_resource_data(self.stack.defn,
+ p.name,
+ p.node_data())
+
+ fip = self.stack['floating_ip']
+ scheduler.TaskRunner(fip.create)()
+ self.assertEqual((fip.CREATE, fip.COMPLETE), fip.state)
+ stk_defn.update_resource_data(self.stack.defn,
+ fip.name,
+ fip.node_data())
+
+ port_forward = self.stack['port_forwarding']
+ scheduler.TaskRunner(port_forward.create)()
+ self.assertEqual((port_forward.CREATE, port_forward.COMPLETE),
+ port_forward.state)
+ mock_create.assert_called_once_with(
+ '477e8273-60a7-4c41-b683-1d497e53c384',
+ **props)
+
+ def test_fip_port_forward_update(self):
+ pfid = mock.Mock(id='180941c5-9e82-41c7-b64d-6a57302ec211')
+ fip_id = '477e8273-60a7-4c41-b683-1d497e53c384'
+
+ prop_diff = {'external_port': 8080}
+
+ mock_update = self.patchobject(self.sdkclient.network,
+ 'update_floating_ip_port_forwarding',
+ return_value=pfid)
+ self.patchobject(self.sdkclient.network,
+ 'create_floating_ip_port_forwarding',
+ return_value=pfid)
+ self.mockclient.create_port.return_value = {
+ 'port': {
+ "status": "BUILD",
+ "id": "9c1eb3fe-7bba-479d-bd43-fdb0bc7cd151"
+ }
+ }
+ self.mockclient.show_port.return_value = {
+ 'port': {
+ "status": "ACTIVE",
+ "id": "9c1eb3fe-7bba-479d-bd43-fdb0bc7cd151"
+ }
+ }
+ self.mockclient.create_floatingip.return_value = {
+ 'floatingip': {
+ "status": "ACTIVE",
+ "id": "477e8273-60a7-4c41-b683-1d497e53c384"
+ }
+ }
+
+ p = self.stack['port_floating']
+ scheduler.TaskRunner(p.create)()
+ self.assertEqual((p.CREATE, p.COMPLETE), p.state)
+ stk_defn.update_resource_data(self.stack.defn,
+ p.name,
+ p.node_data())
+
+ fip = self.stack['floating_ip']
+ scheduler.TaskRunner(fip.create)()
+ self.assertEqual((fip.CREATE, fip.COMPLETE), fip.state)
+ stk_defn.update_resource_data(self.stack.defn,
+ fip.name,
+ fip.node_data())
+
+ port_forward = self.stack['port_forwarding']
+ scheduler.TaskRunner(port_forward.create)()
+ self.port_forward.handle_update(prop_diff)
+
+ mock_update.assert_called_once_with(
+ fip_id,
+ '180941c5-9e82-41c7-b64d-6a57302ec211',
+ **prop_diff)
+
+ def test_fip_port_forward_delete(self):
+ pfid = mock.Mock(id='180941c5-9e82-41c7-b64d-6a57302ec211')
+ fip_id = '477e8273-60a7-4c41-b683-1d497e53c384'
+
+ self.patchobject(self.sdkclient.network,
+ 'create_floating_ip_port_forwarding',
+ return_value=pfid)
+
+ mock_delete = self.patchobject(self.sdkclient.network,
+ 'delete_floating_ip_port_forwarding',
+ return_value=None)
+
+ self.mockclient.create_port.return_value = {
+ 'port': {
+ "status": "BUILD",
+ "id": "9c1eb3fe-7bba-479d-bd43-fdb0bc7cd151"
+ }
+ }
+ self.mockclient.show_port.return_value = {
+ 'port': {
+ "status": "ACTIVE",
+ "id": "9c1eb3fe-7bba-479d-bd43-fdb0bc7cd151"
+ }
+ }
+ self.mockclient.create_floatingip.return_value = {
+ 'floatingip': {
+ "status": "ACTIVE",
+ "id": "477e8273-60a7-4c41-b683-1d497e53c384"
+ }
+ }
+
+ p = self.stack['port_floating']
+ scheduler.TaskRunner(p.create)()
+ self.assertEqual((p.CREATE, p.COMPLETE), p.state)
+ stk_defn.update_resource_data(self.stack.defn,
+ p.name,
+ p.node_data())
+
+ fip = self.stack['floating_ip']
+ scheduler.TaskRunner(fip.create)()
+ self.assertEqual((fip.CREATE, fip.COMPLETE), fip.state)
+ stk_defn.update_resource_data(self.stack.defn,
+ fip.name,
+ fip.node_data())
+
+ port_forward = self.stack['port_forwarding']
+ scheduler.TaskRunner(port_forward.create)()
+ self.port_forward.handle_delete()
+ mock_delete.assert_called_once_with(
+ fip_id,
+ '180941c5-9e82-41c7-b64d-6a57302ec211',
+ ignore_missing=True
+ )
+
+ def test_fip_port_forward_check(self):
+ pfid = mock.Mock(id='180941c5-9e82-41c7-b64d-6a57302ec211')
+ fip_id = '477e8273-60a7-4c41-b683-1d497e53c384'
+
+ self.patchobject(self.sdkclient.network,
+ 'create_floating_ip_port_forwarding',
+ return_value=pfid)
+
+ self.mockclient.create_port.return_value = {
+ 'port': {
+ "status": "BUILD",
+ "id": "9c1eb3fe-7bba-479d-bd43-fdb0bc7cd151"
+ }
+ }
+ self.mockclient.show_port.return_value = {
+ 'port': {
+ "status": "ACTIVE",
+ "id": "9c1eb3fe-7bba-479d-bd43-fdb0bc7cd151"
+ }
+ }
+ self.mockclient.create_floatingip.return_value = {
+ 'floatingip': {
+ "status": "ACTIVE",
+ "id": "477e8273-60a7-4c41-b683-1d497e53c384"
+ }
+ }
+
+ p = self.stack['port_floating']
+ scheduler.TaskRunner(p.create)()
+ self.assertEqual((p.CREATE, p.COMPLETE), p.state)
+ stk_defn.update_resource_data(self.stack.defn,
+ p.name,
+ p.node_data())
+
+ fip = self.stack['floating_ip']
+ scheduler.TaskRunner(fip.create)()
+ self.assertEqual((fip.CREATE, fip.COMPLETE), fip.state)
+ stk_defn.update_resource_data(self.stack.defn,
+ fip.name,
+ fip.node_data())
+
+ port_forward = self.stack['port_forwarding']
+ scheduler.TaskRunner(port_forward.create)()
+ self.port_forward.handle_check()
+ mock_check = self.sdkclient.network.get_port_forwarding
+
+ mock_check.assert_called_once_with(
+ '180941c5-9e82-41c7-b64d-6a57302ec211',
+ fip_id
+ )
+
+ def test_pf_add_dependencies(self):
+ port = self.stack['port_floating']
+ r_int = self.stack['router_interface']
+ pf_port = self.stack['port_forwarding']
+ deps = mock.MagicMock()
+ dep_list = []
+
+ def iadd(obj):
+ dep_list.append(obj[1])
+ deps.__iadd__.side_effect = iadd
+ deps.graph.return_value = {pf_port: [port]}
+ pf_port.add_dependencies(deps)
+ self.assertEqual([r_int], dep_list)
diff --git a/heat/tests/openstack/nova/test_keypair.py b/heat/tests/openstack/nova/test_keypair.py
index 29c92c0f0..83dd116d3 100644
--- a/heat/tests/openstack/nova/test_keypair.py
+++ b/heat/tests/openstack/nova/test_keypair.py
@@ -201,6 +201,29 @@ class NovaKeyPairTest(common.HeatTestCase):
return_value='2.1')
self._test_validate(user='user_A')
+ def test_validate_public_key(self):
+ self.patchobject(nova.NovaClientPlugin, 'get_max_microversion',
+ return_value='2.92')
+ template = copy.deepcopy(self.kp_template)
+ template['resources']['kp']['properties']['public_key'] = 'dummy'
+ stack = utils.parse_stack(template)
+ definition = stack.t.resource_definitions(stack)['kp']
+ kp_res = keypair.KeyPair('kp', definition, stack)
+ kp_res.validate()
+
+ def test_validate_public_key_fail(self):
+ self.patchobject(nova.NovaClientPlugin, 'get_max_microversion',
+ return_value='2.92')
+ template = copy.deepcopy(self.kp_template)
+ stack = utils.parse_stack(template)
+ definition = stack.t.resource_definitions(stack)['kp']
+ kp_res = keypair.KeyPair('kp', definition, stack)
+ error = self.assertRaises(exception.StackValidationFailed,
+ kp_res.validate)
+ msg = ('The public_key property is required by the nova API version '
+ 'currently used.')
+ self.assertIn(msg, str(error))
+
def test_check_key(self):
res = self._get_test_resource(self.kp_template)
res.state_set(res.CREATE, res.COMPLETE, 'for test')
diff --git a/heat_integrationtests/functional/test_template_resource.py b/heat_integrationtests/functional/test_template_resource.py
index f2a513b3a..34ecab119 100644
--- a/heat_integrationtests/functional/test_template_resource.py
+++ b/heat_integrationtests/functional/test_template_resource.py
@@ -15,7 +15,6 @@ import json
from heatclient import exc as heat_exceptions
import yaml
-from heat_integrationtests.common import test
from heat_integrationtests.functional import functional_base
@@ -517,14 +516,13 @@ class TemplateResourceUpdateFailedTest(functional_base.FunctionalTestsBase):
main_template = '''
HeatTemplateFormatVersion: '2012-12-12'
Resources:
- keypair:
- Type: OS::Nova::KeyPair
+ test:
+ Type: OS::Heat::TestResource
Properties:
- name: replace-this
- save_private_key: false
+ fail: replace-this
server:
Type: server_fail.yaml
- DependsOn: keypair
+ DependsOn: test
'''
nested_templ = '''
HeatTemplateFormatVersion: '2012-12-12'
@@ -535,21 +533,18 @@ Resources:
def setUp(self):
super(TemplateResourceUpdateFailedTest, self).setUp()
- self.assign_keypair()
def test_update_on_failed_create(self):
- # create a stack with "server" dependent on "keypair", but
- # keypair fails, so "server" is not created properly.
+ # create a stack with "server" dependent on "test", but
+ # "test" fails, so "server" is not created properly.
# We then fix the template and it should succeed.
- broken_templ = self.main_template.replace('replace-this',
- self.keypair_name)
+ broken_templ = self.main_template.replace('replace-this', 'true')
stack_identifier = self.stack_create(
template=broken_templ,
files={'server_fail.yaml': self.nested_templ},
expected_status='CREATE_FAILED')
- fixed_templ = self.main_template.replace('replace-this',
- test.rand_name())
+ fixed_templ = self.main_template.replace('replace-this', 'false')
self.update_stack(stack_identifier,
fixed_templ,
files={'server_fail.yaml': self.nested_templ})
diff --git a/releasenotes/notes/add-port-forwarding-resource-e32b5515f1b47a28.yaml b/releasenotes/notes/add-port-forwarding-resource-e32b5515f1b47a28.yaml
new file mode 100644
index 000000000..35e1fe2d4
--- /dev/null
+++ b/releasenotes/notes/add-port-forwarding-resource-e32b5515f1b47a28.yaml
@@ -0,0 +1,6 @@
+---
+features:
+ - |
+ OS::Neutron::FloatingIPPortForward added. This feature allows
+ an operator to create port-forwarding rules in Neutron for
+ their floating ips.
diff --git a/releasenotes/notes/cloud-watch-cleanup-62151466d15ac504.yaml b/releasenotes/notes/cloud-watch-cleanup-62151466d15ac504.yaml
new file mode 100644
index 000000000..39d78b625
--- /dev/null
+++ b/releasenotes/notes/cloud-watch-cleanup-62151466d15ac504.yaml
@@ -0,0 +1,4 @@
+---
+upgrade:
+ - |
+ The remaining deprecated parameters for Cloud Watch API have been removed.
diff --git a/releasenotes/source/index.rst b/releasenotes/source/index.rst
index f604b9ae2..3ed36482c 100644
--- a/releasenotes/source/index.rst
+++ b/releasenotes/source/index.rst
@@ -6,6 +6,7 @@
:maxdepth: 1
unreleased
+ zed
yoga
xena
wallaby
diff --git a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
index e313682df..e31e2f8a6 100644
--- a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
+++ b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po
@@ -8,11 +8,11 @@ msgid ""
msgstr ""
"Project-Id-Version: openstack-heat\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-06-28 08:22+0000\n"
+"POT-Creation-Date: 2022-11-11 06:41+0000\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"PO-Revision-Date: 2022-06-25 03:50+0000\n"
+"PO-Revision-Date: 2022-11-04 10:36+0000\n"
"Last-Translator: Andi Chandler <andi@gowling.com>\n"
"Language-Team: English (United Kingdom)\n"
"Language: en_GB\n"
@@ -59,8 +59,8 @@ msgstr "13.0.0"
msgid "13.0.1"
msgstr "13.0.1"
-msgid "13.1.0-22"
-msgstr "13.1.0-22"
+msgid "13.1.0-25"
+msgstr "13.1.0-25"
msgid "14.0.0"
msgstr "14.0.0"
@@ -83,6 +83,9 @@ msgstr "17.0.0"
msgid "18.0.0"
msgstr "18.0.0"
+msgid "19.0.0"
+msgstr "19.0.0"
+
msgid "5.0.1"
msgstr "5.0.1"
@@ -1520,6 +1523,13 @@ msgstr ""
"project."
msgid ""
+"OS::Neutron::FloatingIPPortForward added. This feature allows an operator to "
+"create port-forwarding rules in Neutron for their floating ips."
+msgstr ""
+"OS::Neutron::FloatingIPPortForward added. This feature allows an operator to "
+"create port-forwarding rules in Neutron for their floating IPs."
+
+msgid ""
"OS::Neutron::QoSBandwidthLimitRule resource plugin is added to support "
"neutron QoS bandwidth limit rule, which is provided by neutron ``qos`` API "
"extension."
@@ -2306,6 +2316,11 @@ msgstr ""
"1894920 <https://bugs.launchpad.net/tripleo/+bug/1894920>`_."
msgid ""
+"The remaining deprecated parameters for Cloud Watch API have been removed."
+msgstr ""
+"The remaining deprecated parameters for Cloud Watch API have been removed."
+
+msgid ""
"The template validate API call now returns the Environment calculated by "
"heat - this enables preview of the merged environment when using "
"parameter_merge_strategy prior to creating the stack"
@@ -2459,6 +2474,9 @@ msgstr "Xena Series Release Notes"
msgid "Yoga Series Release Notes"
msgstr "Yoga Series Release Notes"
+msgid "Zed Series Release Notes"
+msgstr "Zed Series Release Notes"
+
msgid ""
"``OS::Neutron::Port`` resources will now be replaced when the "
"``mac_address`` property is modified. Neutron is unable to update the MAC "
diff --git a/releasenotes/source/zed.rst b/releasenotes/source/zed.rst
new file mode 100644
index 000000000..9608c05e4
--- /dev/null
+++ b/releasenotes/source/zed.rst
@@ -0,0 +1,6 @@
+========================
+Zed Series Release Notes
+========================
+
+.. release-notes::
+ :branch: stable/zed
diff --git a/setup.cfg b/setup.cfg
index 28b93c875..d83b4690d 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -125,7 +125,6 @@ heat.constraints =
keystone.role = heat.engine.clients.os.keystone.keystone_constraints:KeystoneRoleConstraint
keystone.service = heat.engine.clients.os.keystone.keystone_constraints:KeystoneServiceConstraint
keystone.user = heat.engine.clients.os.keystone.keystone_constraints:KeystoneUserConstraint
- magnum.baymodel = heat.engine.clients.os.magnum:BaymodelConstraint
magnum.cluster_template = heat.engine.clients.os.magnum:ClusterTemplateConstraint
manila.share_network = heat.engine.clients.os.manila:ManilaShareNetworkConstraint
manila.share_snapshot = heat.engine.clients.os.manila:ManilaShareSnapshotConstraint
diff --git a/tox.ini b/tox.ini
index 662ebcac7..801e49dd5 100644
--- a/tox.ini
+++ b/tox.ini
@@ -2,7 +2,6 @@
envlist = py38,py39,pep8
ignore_basepython_conflict = True
minversion = 3.18.0
-skipsdist = True
[testenv]
basepython = python3
@@ -17,7 +16,10 @@ commands =
stestr run {posargs}
stestr slowest
-passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY
+passenv =
+ http_proxy
+ https_proxy
+ no_proxy
[testenv:pep8]
commands =