diff options
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 @@ -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 @@ -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 = |