diff options
22 files changed, 140 insertions, 128 deletions
diff --git a/designate/backend/impl_dynect.py b/designate/backend/impl_dynect.py index 19f586f5..7e30443c 100755 --- a/designate/backend/impl_dynect.py +++ b/designate/backend/impl_dynect.py @@ -202,11 +202,11 @@ class DynClient(object): self._http_log_req(method, url, kwargs) if self.timings: - start_time = time.time() + start_time = time.monotonic() resp = self.http.request(method, url, **kwargs) if self.timings: self.times.append(("%s %s" % (method, url), - start_time, time.time())) + start_time, time.monotonic())) self._http_log_resp(resp) if resp.status_code >= 400: diff --git a/designate/central/service.py b/designate/central/service.py index 77334dd0..e9831e80 100644 --- a/designate/central/service.py +++ b/designate/central/service.py @@ -1211,6 +1211,8 @@ class Service(service.RPCService): policy.check('share_zone', context, target) + self._is_valid_project_id(context.project_id) + if zone.tenant_id == shared_zone.target_project_id: raise exceptions.BadRequest( 'Cannot share the zone with the zone owner.') diff --git a/designate/dnsutils.py b/designate/dnsutils.py index 81df8409..43c45dff 100644 --- a/designate/dnsutils.py +++ b/designate/dnsutils.py @@ -203,12 +203,12 @@ class ZoneLock(object): with self.lock: # If no one holds the lock for the zone, grant it if zone not in self.data: - self.data[zone] = time.time() + self.data[zone] = time.monotonic() return True # Otherwise, get the time that it was locked locktime = self.data[zone] - now = time.time() + now = time.monotonic() period = now - locktime diff --git a/designate/tests/__init__.py b/designate/tests/__init__.py index d65ef2bf..ac371ab7 100644 --- a/designate/tests/__init__.py +++ b/designate/tests/__init__.py @@ -820,7 +820,7 @@ class TestCase(base.BaseTestCase): Zone imports spawn a thread to parse the zone file and insert the data. This waits for this process before continuing """ - start_time = time.time() + start_time = time.monotonic() while True: # Retrieve it, and ensure it's the same zone_import = self.central_service.get_zone_import( @@ -835,7 +835,7 @@ class TestCase(base.BaseTestCase): if error_is_ok and zone_import.status != 'PENDING': break - if (time.time() - start_time) > max_wait: + if (time.monotonic() - start_time) > max_wait: break time.sleep(0.5) @@ -870,8 +870,8 @@ class TestCase(base.BaseTestCase): Poll every `interval` seconds. `condition` can be a callable. (Caution: some mocks behave both as values and callables.) """ - t_max = time.time() + timeout - while time.time() < t_max: + t_max = time.monotonic() + timeout + while time.monotonic() < t_max: if callable(condition): result = condition() else: diff --git a/designate/tests/test_api/__init__.py b/designate/tests/test_api/__init__.py index bf9cc4d7..e69de29b 100644 --- a/designate/tests/test_api/__init__.py +++ b/designate/tests/test_api/__init__.py @@ -1,20 +0,0 @@ -# Copyright 2012 Managed I.T. -# -# Author: Kiall Mac Innes <kiall@managedit.ie> -# -# 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 designate.tests import TestCase - - -class ApiTestCase(TestCase): - pass diff --git a/designate/tests/test_api/test_admin/__init__.py b/designate/tests/test_api/test_admin/__init__.py index 82bbec29..4ff894e4 100644 --- a/designate/tests/test_api/test_admin/__init__.py +++ b/designate/tests/test_api/test_admin/__init__.py @@ -20,7 +20,7 @@ from webtest import TestApp from designate.api import admin as admin_api from designate.api import middleware -from designate.tests.test_api import ApiTestCase +import designate.tests LOG = logging.getLogger(__name__) @@ -33,7 +33,7 @@ INVALID_ID = [ ] -class AdminApiTestCase(ApiTestCase): +class AdminApiTestCase(designate.tests.TestCase): def setUp(self): super(AdminApiTestCase, self).setUp() diff --git a/designate/tests/test_api/test_middleware.py b/designate/tests/test_api/test_middleware.py index ea162496..6e6dd3f4 100644 --- a/designate/tests/test_api/test_middleware.py +++ b/designate/tests/test_api/test_middleware.py @@ -23,7 +23,7 @@ from designate.api import middleware from designate import context from designate import exceptions from designate import rpc -from designate.tests.test_api import ApiTestCase +import designate.tests class FakeRequest(object): @@ -43,7 +43,7 @@ class FakeRequest(object): return "FakeResponse" -class KeystoneContextMiddlewareTest(ApiTestCase): +class KeystoneContextMiddlewareTest(designate.tests.TestCase): def test_process_request(self): app = middleware.KeystoneContextMiddleware({}) @@ -106,7 +106,7 @@ class KeystoneContextMiddlewareTest(ApiTestCase): self.assertEqual(response, 'FakeResponse') -class NoAuthContextMiddlewareTest(ApiTestCase): +class NoAuthContextMiddlewareTest(designate.tests.TestCase): def test_process_request(self): app = middleware.NoAuthContextMiddleware({}) @@ -125,7 +125,7 @@ class NoAuthContextMiddlewareTest(ApiTestCase): self.assertEqual(['admin'], ctxt.roles) -class MaintenanceMiddlewareTest(ApiTestCase): +class MaintenanceMiddlewareTest(designate.tests.TestCase): def test_process_request_disabled(self): self.config(maintenance_mode=False, group='service:api') @@ -197,7 +197,7 @@ class MaintenanceMiddlewareTest(ApiTestCase): self.assertEqual('FakeResponse', response) -class NormalizeURIMiddlewareTest(ApiTestCase): +class NormalizeURIMiddlewareTest(designate.tests.TestCase): def test_strip_trailing_slases(self): request = FakeRequest() request.environ['PATH_INFO'] = 'resource/' @@ -223,7 +223,7 @@ class NormalizeURIMiddlewareTest(ApiTestCase): self.assertEqual('resource', request.environ['PATH_INFO']) -class FaultMiddlewareTest(ApiTestCase): +class FaultMiddlewareTest(designate.tests.TestCase): @mock.patch.object(notifier.Notifier, "error") def test_notify_of_fault(self, mock_notifier): self.config(notify_api_faults=True) diff --git a/designate/tests/test_api/test_service.py b/designate/tests/test_api/test_service.py index 702e4af0..c0b699dc 100644 --- a/designate/tests/test_api/test_service.py +++ b/designate/tests/test_api/test_service.py @@ -20,10 +20,10 @@ from paste import urlmap from designate.api import service from designate import exceptions -from designate.tests.test_api import ApiTestCase +import designate.tests -class ApiServiceTest(ApiTestCase): +class ApiServiceTest(designate.tests.TestCase): def setUp(self): super(ApiServiceTest, self).setUp() diff --git a/designate/tests/test_api/test_v2/__init__.py b/designate/tests/test_api/test_v2/__init__.py index 938b803a..962a81c9 100644 --- a/designate/tests/test_api/test_v2/__init__.py +++ b/designate/tests/test_api/test_v2/__init__.py @@ -20,7 +20,7 @@ from webtest import TestApp from designate.api import middleware from designate.api import v2 as api_v2 -from designate.tests.test_api import ApiTestCase +import designate.tests LOG = logging.getLogger(__name__) @@ -33,7 +33,7 @@ INVALID_ID = [ ] -class ApiV2TestCase(ApiTestCase): +class ApiV2TestCase(designate.tests.TestCase): def setUp(self): super(ApiV2TestCase, self).setUp() diff --git a/designate/tests/test_central/__init__.py b/designate/tests/test_central/__init__.py index 088df403..e69de29b 100644 --- a/designate/tests/test_central/__init__.py +++ b/designate/tests/test_central/__init__.py @@ -1,20 +0,0 @@ -# Copyright 2012 Managed I.T. -# -# Author: Kiall Mac Innes <kiall@managedit.ie> -# -# 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 designate.tests import TestCase - - -class CentralTestCase(TestCase): - pass diff --git a/designate/tests/test_central/test_service.py b/designate/tests/test_central/test_service.py index ae2f3416..21b29aec 100644 --- a/designate/tests/test_central/test_service.py +++ b/designate/tests/test_central/test_service.py @@ -39,15 +39,15 @@ from designate import exceptions from designate import objects from designate.storage.impl_sqlalchemy import tables from designate.storage import sql +import designate.tests from designate.tests import fixtures -from designate.tests.test_central import CentralTestCase from designate import utils from designate.worker import rpcapi as worker_api LOG = logging.getLogger(__name__) -class CentralServiceTest(CentralTestCase): +class CentralServiceTest(designate.tests.TestCase): def setUp(self): super(CentralServiceTest, self).setUp() self.stdlog = fixtures.StandardLogging() diff --git a/designate/tests/test_manage/__init__.py b/designate/tests/test_manage/__init__.py index dd671f43..e69de29b 100644 --- a/designate/tests/test_manage/__init__.py +++ b/designate/tests/test_manage/__init__.py @@ -1,5 +0,0 @@ -from designate.tests import TestCase - - -class DesignateManageTestCase(TestCase): - pass diff --git a/designate/tests/test_manage/test_database.py b/designate/tests/test_manage/test_database.py index c318ea42..22d3150c 100644 --- a/designate/tests/test_manage/test_database.py +++ b/designate/tests/test_manage/test_database.py @@ -15,14 +15,14 @@ from io import StringIO from unittest import mock from designate.manage import database -from designate import tests as designate_tests +import designate.tests -class TestManageDatabase(designate_tests.TestCase): +class TestManageDatabase(designate.tests.TestCase): def setUp(self): super(TestManageDatabase, self).setUp() - self.stdlog = designate_tests.fixtures.StandardLogging() + self.stdlog = designate.tests.fixtures.StandardLogging() self.useFixture(self.stdlog) self.db_cmds = database.DatabaseCommands() diff --git a/designate/tests/test_manage/test_pool.py b/designate/tests/test_manage/test_pool.py index 1abf8f6a..51927172 100644 --- a/designate/tests/test_manage/test_pool.py +++ b/designate/tests/test_manage/test_pool.py @@ -20,9 +20,9 @@ import oslo_messaging from designate.central import service from designate.manage import base from designate.manage import pool +import designate.tests from designate.tests import fixtures from designate.tests import resources -from designate.tests.test_manage import DesignateManageTestCase LOG = logging.getLogger(__name__) @@ -36,9 +36,9 @@ def get_pools(name='pools.yaml'): return yaml.safe_load(pool_obj) -class ManagePoolTestCase(DesignateManageTestCase): +class ManagePoolTestCase(designate.tests.TestCase): def setUp(self): - super(DesignateManageTestCase, self).setUp() + super(ManagePoolTestCase, self).setUp() self.stdlog = fixtures.StandardLogging() self.useFixture(self.stdlog) diff --git a/designate/tests/test_manage/test_update_pool.py b/designate/tests/test_manage/test_update_pool.py index c7cf1457..8254bda8 100644 --- a/designate/tests/test_manage/test_update_pool.py +++ b/designate/tests/test_manage/test_update_pool.py @@ -17,8 +17,8 @@ from oslo_log import log as logging from designate.manage import base from designate.manage import pool from designate import objects +import designate.tests from designate.tests import fixtures -from designate.tests.test_manage import DesignateManageTestCase LOG = logging.getLogger(__name__) @@ -34,9 +34,9 @@ def hydrate_pool_targets(target_masters): return pool_targets -class UpdatePoolTestCase(DesignateManageTestCase): +class UpdatePoolTestCase(designate.tests.TestCase): def setUp(self): - super(DesignateManageTestCase, self).setUp() + super(UpdatePoolTestCase, self).setUp() self.stdlog = fixtures.StandardLogging() self.useFixture(self.stdlog) diff --git a/designate/tests/test_mdns/__init__.py b/designate/tests/test_mdns/__init__.py index 203ff334..e69de29b 100644 --- a/designate/tests/test_mdns/__init__.py +++ b/designate/tests/test_mdns/__init__.py @@ -1,20 +0,0 @@ -# Copyright 2014 Hewlett-Packard Development Company, L.P. -# -# Author: Kiall Mac Innes <kiall@hpe.com> -# -# 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 designate.tests import TestCase - - -class MdnsTestCase(TestCase): - pass diff --git a/designate/tests/test_mdns/test_handler.py b/designate/tests/test_mdns/test_handler.py index d8eeaac1..9efdfdcd 100644 --- a/designate/tests/test_mdns/test_handler.py +++ b/designate/tests/test_mdns/test_handler.py @@ -28,7 +28,7 @@ import testtools from designate import context from designate.mdns import handler from designate import objects -from designate.tests.test_mdns import MdnsTestCase +import designate.tests CONF = cfg.CONF default_pool_id = CONF['service:central'].default_pool_id @@ -49,7 +49,7 @@ ANSWER = [ ] -class MdnsRequestHandlerTest(MdnsTestCase): +class MdnsRequestHandlerTest(designate.tests.TestCase): def setUp(self): super(MdnsRequestHandlerTest, self).setUp() self.mock_tg = mock.Mock() diff --git a/designate/tests/test_mdns/test_service.py b/designate/tests/test_mdns/test_service.py index d25f2ab9..4a20c0f9 100644 --- a/designate/tests/test_mdns/test_service.py +++ b/designate/tests/test_mdns/test_service.py @@ -24,7 +24,7 @@ import dns import dns.message from oslo_log import log as logging -from designate.tests.test_mdns import MdnsTestCase +import designate.tests LOG = logging.getLogger(__name__) @@ -33,7 +33,7 @@ def hex_wire(response): return binascii.b2a_hex(response.to_wire()) -class MdnsServiceTest(MdnsTestCase): +class MdnsServiceTest(designate.tests.TestCase): # DNS packet with IQUERY opcode query_payload = binascii.a2b_hex( "271209000001000000000000076578616d706c6503636f6d0000010001" diff --git a/designate/tests/test_quota/test_quota.py b/designate/tests/test_quota/test_quota.py index 0596ec65..0c685e4e 100644 --- a/designate/tests/test_quota/test_quota.py +++ b/designate/tests/test_quota/test_quota.py @@ -17,16 +17,17 @@ from unittest import mock from oslo_config import cfg from oslo_log import log as logging -from testscenarios import load_tests_apply_scenarios as load_tests # noqa +import testscenarios from designate import exceptions from designate import quota -from designate import tests +import designate.tests LOG = logging.getLogger(__name__) +load_tests = testscenarios.load_tests_apply_scenarios -class QuotaTestCase(tests.TestCase): +class QuotaTestCase(designate.tests.TestCase): scenarios = [ ('noop', dict(quota_driver='noop')), ('storage', dict(quota_driver='storage')) diff --git a/designate/worker/processing.py b/designate/worker/processing.py index 59f8fcbe..cf280033 100644 --- a/designate/worker/processing.py +++ b/designate/worker/processing.py @@ -70,9 +70,9 @@ class Executor(object): if callable(tasks): tasks = [tasks] - start_time = time.time() + start_time = time.monotonic() results = [r for r in self._executor.map(self.do, tasks)] - elapsed_time = time.time() - start_time + elapsed_time = time.monotonic() - start_time LOG.debug( 'Finished Task(s): %(tasks)s in %(time)fs', diff --git a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po index 7e453f6a..f2ed1769 100644 --- a/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po +++ b/releasenotes/source/locale/en_GB/LC_MESSAGES/releasenotes.po @@ -9,11 +9,11 @@ msgid "" msgstr "" "Project-Id-Version: Designate Release Notes\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-06 16:30+0000\n" +"POT-Creation-Date: 2023-05-02 19:37+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2023-02-10 12:08+0000\n" +"PO-Revision-Date: 2023-05-08 10:13+0000\n" "Last-Translator: Andi Chandler <andi@gowling.com>\n" "Language-Team: English (United Kingdom)\n" "Language: en_GB\n" @@ -29,11 +29,8 @@ msgstr "1.0.2" msgid "10.0.0" msgstr "10.0.0" -msgid "10.0.0.0rc1" -msgstr "10.0.0.0rc1" - -msgid "10.0.2-4" -msgstr "10.0.2-4" +msgid "10.0.2-6" +msgstr "10.0.2-6" msgid "11.0.0" msgstr "11.0.0" @@ -41,8 +38,8 @@ msgstr "11.0.0" msgid "11.0.2" msgstr "11.0.2" -msgid "11.0.2-4" -msgstr "11.0.2-4" +msgid "11.0.2-6" +msgstr "11.0.2-6" msgid "12.0.0" msgstr "12.0.0" @@ -50,8 +47,8 @@ msgstr "12.0.0" msgid "12.1.0" msgstr "12.1.0" -msgid "12.1.0-6" -msgstr "12.1.0-6" +msgid "12.1.0-10" +msgstr "12.1.0-10" msgid "13.0.0" msgstr "13.0.0" @@ -62,17 +59,35 @@ msgstr "13.0.1" msgid "13.0.2" msgstr "13.0.2" +msgid "13.0.2-6" +msgstr "13.0.2-6" + msgid "14.0.0" msgstr "14.0.0" msgid "14.0.1" msgstr "14.0.1" +msgid "14.0.2" +msgstr "14.0.2" + +msgid "14.0.2-3" +msgstr "14.0.2-3" + msgid "15.0.0" msgstr "15.0.0" -msgid "15.0.0.0rc1" -msgstr "15.0.0.0rc1" +msgid "15.0.0-6" +msgstr "15.0.0-6" + +msgid "16.0.0" +msgstr "16.0.0" + +msgid "16.0.0-15" +msgstr "16.0.0-15" + +msgid "16.0.0-8" +msgstr "16.0.0-8" msgid "2.0.0" msgstr "2.0.0" @@ -80,6 +95,9 @@ msgstr "2.0.0" msgid "2.1.0" msgstr "2.1.0" +msgid "2023.1 Series Release Notes" +msgstr "2023.1 Series Release Notes" + msgid "3.0.0" msgstr "3.0.0" @@ -432,6 +450,22 @@ msgstr "" "alembic package has been added." msgid "" +"Designate will now use the openstacksdk to access neutron instead of the " +"deprecated neutronclient." +msgstr "" +"Designate will now use the openstacksdk to access neutron instead of the " +"deprecated neutronclient." + +msgid "" +"Designate will now use the openstacksdk to access neutron instead of the " +"deprecated neutronclient. The python-neutronclient module requirement has " +"been replaced by the openstacksdk module." +msgstr "" +"Designate will now use the openstacksdk to access Neutron instead of the " +"deprecated neutronclient. The python-neutronclient module requirement has " +"been replaced by the openstacksdk module." + +msgid "" "Designate-Sink service now supports notification listener pooling for those " "oslo.messaging drivers that support this feature (currently those are " "``rabbit``/``kombu`` and ``kafka``). `Listener pools <https://docs.openstack." @@ -454,6 +488,13 @@ msgstr "" "flooded with duplicate service entries." msgid "" +"Fixed `bug 2015762`_ which could cause managed records to occasionally fail " +"to delete due to a race condition." +msgstr "" +"Fixed `bug 2015762`_ which could cause managed records to occasionally fail " +"to delete due to a race condition." + +msgid "" "Fixed a bug preventing `service_statuses` from properly updating when " "Designate services were configured with multiple workers." msgstr "" @@ -461,6 +502,11 @@ msgstr "" "Designate services were configured with multiple workers." msgid "" +"Fixed a bug that allowed users to create a zone share for the zone owner." +msgstr "" +"Fixed a bug that allowed users to create a zone share for the zone owner." + +msgid "" "Fixed a bug where deleting a zone transfer request may fail when using a " "system scoped token." msgstr "" @@ -518,6 +564,9 @@ msgstr "" "service statuses. In addition, a compatibility workaround was added for the " "incorrect /v2/service_status path." +msgid "Fixed compatibility issues with SQLAlchemy 2.x." +msgstr "Fixed compatibility issues with SQLAlchemy 2.x." + msgid "Fixed designate compatibility with jsonschema >= 4.16.0." msgstr "Fixed designate compatibility with jsonschema >= 4.16.0." @@ -592,6 +641,15 @@ msgstr "Liberty Series Release Notes" msgid "Mitaka Series Release Notes" msgstr "Mitaka Series Release Notes" +msgid "" +"Moved zone serial updates to a `designate-producer` task called " +"`increment_serial` to fix race conditions and to reduce the number of " +"updates to the upstream DNS servers when performing multiple DNS updates." +msgstr "" +"Moved zone serial updates to a `designate-producer` task called " +"`increment_serial` to fix race conditions and to reduce the number of " +"updates to the upstream DNS servers when performing multiple DNS updates." + msgid "New Features" msgstr "New Features" @@ -618,6 +676,13 @@ msgid "Newton Series Release Notes" msgstr "Newton Series Release Notes" msgid "" +"Now that zones can be shared with multiple projects, recordsets and records " +"can have project identifiers that are different than the parent zone." +msgstr "" +"Now that zones can be shared with multiple projects, recordsets and records " +"can have project identifiers that are different than the parent zone." + +msgid "" "OSprofiler support requires passing of trace information between various " "OpenStack services. This information is securely signed by one of HMAC keys, " "defined in designate.conf configuration file. To allow cross-project tracing " @@ -928,6 +993,17 @@ msgstr "" "config file." msgid "" +"The backend agent framework and agent based drivers are deprecated for " +"removal in the \"C\" release. The following backend agent drivers are now " +"deprecated: Bind9 (Agent), Denominator, Microsoft DNS (Agent), Djbdns " +"(Agent), Gdnsd (Agent), Knot2 (Agent)." +msgstr "" +"The backend agent framework and agent based drivers are deprecated for " +"removal in the \"C\" release. The following backend agent drivers are now " +"deprecated: Bind9 (Agent), Denominator, Microsoft DNS (Agent), Djbdns " +"(Agent), Gdnsd (Agent), Knot2 (Agent)." + +msgid "" "The central service was not using a global lock which can lead to a race " "condition in a high availability setup leading to missing recordsets in the " "DNS backend. This release includes a partial backport of a distributed " @@ -1166,6 +1242,13 @@ msgstr "Yoga Series Release Notes" msgid "Zed Series Release Notes" msgstr "Zed Series Release Notes" +msgid "" +"Zones can now be shared with other projects, allowing them to create and " +"manage recordsets and records in the zone." +msgstr "" +"Zones can now be shared with other projects, allowing them to create and " +"manage recordsets and records in the zone." + msgid "`LP#1971856 <https://bugs.launchpad.net/designate/+bug/1971856>`__" msgstr "`LP#1971856 <https://bugs.launchpad.net/designate/+bug/1971856>`__" diff --git a/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po b/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po index 236641bc..cffcae7a 100644 --- a/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po +++ b/releasenotes/source/locale/fr/LC_MESSAGES/releasenotes.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: Designate Release Notes\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-06 16:30+0000\n" +"POT-Creation-Date: 2023-05-02 19:37+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -26,15 +26,6 @@ msgstr "2.0.0" msgid "3.0.0" msgstr "3.0.0" -msgid "3.0.0.0b1" -msgstr "3.0.0.0b1" - -msgid "3.0.0.0b2" -msgstr "3.0.0.0b2" - -msgid "3.0.0.0rc1" -msgstr "3.0.0.0rc1" - msgid "ASync Export" msgstr "Export Async" |