Cloudflare dns errors trying to delete records

I’m seeing errors related to Cloudflare DNS in a few places, and they all look related. I’m guessing this is a quirk or bug in some Cloudflare API call. Any time ApisCP tries to delete a DNS record, I get an error. I verified that the Cloudflare auth token has edit access. Cloudflare API access seems to be working properly otherwise.

For example:

Using the transfersite.php script fails when it gets to updating dns records:

updating dns stage data
NOTICE: dns_modify_record failed... retrying...
NOTICE: dns_modify_record failed... retrying...
NOTICE: dns_modify_record failed... retrying...
NOTICE: dns_modify_record failed... retrying...
NOTICE: dns_modify_record failed... retrying...
FAILURE: dns_modify_record
failed to find record ID in CF zone `mydomain.com' - does `@' (rr: `A', parameter: `10.10.101.1') exist? 
Line 86 
#0 /usr/local/apnscp/lib/Util/API.php(86): SoapClient->__call('dns_modify_reco...', Array)
#1 /usr/local/apnscp/lib/CLI/Transfer.php(238): Util_API->__call('dns_modify_reco...', Array)
#2 /usr/local/apnscp/lib/CLI/Transfer.php(1871): CLI_Transfer->_sync('remote', 'dns_modify_reco...', 'mydomai....', '', 'A', '10.10.101.1', Array)
#3 /usr/local/apnscp/lib/CLI/Transfer.php(1806): CLI_Transfer->alter_ip('mydomai....', '10.10.101.1', '10.10.101.1', 120)
#4 /usr/local/apnscp/lib/CLI/Transfer.php(195): CLI_Transfer->_sync_update_stage()
#5 /usr/local/apnscp/bin/scripts/transfersite.php(233): CLI_Transfer->process()
#6 {main}
ERROR  : unknown(): migration failed - unhandled exception
         0. Error_Reporter::add_error("migration failed - unhandled exception", )
            [/usr/local/apnscp/lib/log_wrapper.php:72]
         1. error("migration failed - unhandled exception")
            [/usr/local/apnscp/bin/scripts/transfersite.php:247]
unknown(): migration failed - unhandled exception

From the DNS Manager in the admin panel, running “Reset DNS to default” fails with the following errors:

 Action failed
Purged 7 old records
Added 10 records
 17 more messages
failed to purge record `mydomain.com.` A 14400 10.10.101.1
failed to purge record `mydomain.com.` MX 1 10 mail.mydomain.com
failed to purge record `mydomain.com.` TXT 14400 v=spf1 a private stuff ~all
failed to purge record `mydomain.com.` TXT 1 v=spf1 a private stuff ~all
failed to purge record `mydomain.com.` TXT 14400 v=spf1 a mx ~all
failed to purge record `mydomain.com.` TXT 1 google-site-verification=redacted
failed to purge record `_dmarc.mydomain.com.` TXT 1 v=DMARC1;  p=none;
Record `@.mydomain.com' (rr: `A', param: `10.10.101.1')  does not exist
Record `@.mydomain.com' (rr: `MX', param: `10 mail.mydomain.com')  does not exist
Record `@.mydomain.com' (rr: `TXT', param: `v=spf1 a private stuff ~all')  does not exist
Record `@.mydomain.com' (rr: `TXT', param: `v=spf1 a private stuff ~all')  does not exist
Record `@.mydomain.com' (rr: `TXT', param: `v=spf1 a mx ~all')  does not exist
Record `@.mydomain.com' (rr: `TXT', param: `google-site-verification=redacted')  does not exist
Record `_dmarc.mydomain.com' (rr: `TXT', param: `v=DMARC1;  p=none')  does not exist
Failed to create record `@.mydomain.com' type A: An identical record already exists.
Failed to create record `@.mydomain.com' type MX: An identical record already exists.
Failed to create record `@.mydomain.com' type TXT: An identical record already exists.

And selecting an individual record to delete fails as well:

Record `@.mydomain.com' (rr: `TXT', param: `v=spf1 a private stuff ~all') does not exist

Check “Client IP Address Filtering” for the API token. Looks like these tokens shared on the new server lack read or write privileges. Test suite against Cloudflare completes, so their API has remained the same.

./phpunit.php dns/ResourceRecordTest.php
PHPUnit 9.6.22 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 00:38.526, Memory: 22.00 MB

OK (1 test, 73 assertions)

The token seems to be working, at least some of the time. cpcmd -o json admin:collect '[]' | jq -r 'values[].domain' | while read DOMAIN ; do EditDomain -c dns,key='DEFAULT' -D $DOMAIN; done helped clear up some problems with some domains.

I did some testing to try to narrow down a reproducible error case, and I found one. Deleting the default MX record consistently fails. To make sure it wasn’t caused by some odd manual change I made, I deleted the record from my Cloudflare dashboard, then from the ApisCP dashboard I ran “Restore default MX” which threw errors on other records but did in fact re-create the MX record. After that, the “Delete” button still errors with:

Record `@.domain.com' (rr: `MX', param: `10 mail.domain.com') does not exist

For what it’s worth, below is the output when I try to run the test suite. I’m not sure I understand how it’s supposed to work, though. It’s erroring because the domain debug.test is not a domain that my Cloudflare account has access to use. So it’s not clear to me that the failure shows any unanticipated problem.

# ./phpunit.php -v dns/ResourceRecordTest.php 
PHPUnit 9.6.22 by Sebastian Bergmann and contributors.

Runtime:       PHP 8.1.21
Configuration: /usr/local/apnscp/tests/phpunit.xml

INFO   : no billing identifier specified for site, generated `apnscp-JYGKMQRN'
         0. Error_Reporter::add_info("no billing identifier specified for site, generated `%s'", ["apnscp-JYGKMQRN"])
            [/usr/local/apnscp/lib/log_wrapper.php:108]
         1. info("no billing identifier specified for site, generated `%s'", "apnscp-JYGKMQRN")
            [/usr/local/apnscp/lib/Opcenter/Service/Validators/Billing/Invoice.php:35]
         2. Opcenter\Service\Validators\Billing\Invoice->valid("apnscp-JYGKMQRN")
            [/usr/local/apnscp/lib/Opcenter/Service/ConfigurationContext.php:568]
         3. Opcenter\Service\ConfigurationContext->check("invoice", "apnscp-JYGKMQRN")
            [/usr/local/apnscp/lib/Opcenter/Service/ConfigurationContext.php:165]
         4. Opcenter\Service\ConfigurationContext->preflight()
            [/usr/local/apnscp/lib/Opcenter/SiteConfiguration.php:736]
         5. Opcenter\SiteConfiguration->verify("billing", Opcenter\Service\ConfigurationContext)
            [/usr/local/apnscp/lib/Opcenter/SiteConfiguration.php:655]
         6. Opcenter\SiteConfiguration->verifyAll()
            [/usr/local/apnscp/lib/Opcenter/Account/Create.php:183]
         7. Opcenter\Account\Create->installServices("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Cardinal.php:143]
         8. Event\Contracts\Subscriber@anonymous/usr/local/apnscp/lib/Event/Cardinal.php:132$d1->update("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Manager.php:187]
         9. Event\Manager->fire("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Cardinal.php:172]
        10. Event\Cardinal::fire(["FILESYSTEM", "created"], Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Opcenter/Filesystem.php:79]
        11. Opcenter\Filesystem->populate()
            [/usr/local/apnscp/lib/Opcenter/Filesystem.php:47]
        12. Opcenter\Filesystem::create("site17", null)
            [/usr/local/apnscp/lib/Opcenter/Account/Create.php:154]
        13. Opcenter\Account\Create->exec()
            [/usr/local/apnscp/lib/Opcenter/Account/Ephemeral.php:113]
        14. Opcenter\Account\Ephemeral->exec()
            [/usr/local/apnscp/lib/Opcenter/Account/Ephemeral.php:104]
        15. Opcenter\Account\Ephemeral::create([[domain:"debug.test"]])
            [/usr/local/apnscp/tests/TestHelpers.php:45]
        16. TestHelpers::create("debug.test")
            [/usr/local/apnscp/tests/dns/ResourceRecordTest.php:18]
        17. ResourceRecordTest->testProviders()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:1617]
        18. PHPUnit\Framework\TestCase->runTest()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:1223]
        19. PHPUnit\Framework\TestCase->runBare()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestResult.php:729]
        20. PHPUnit\Framework\TestResult->run(ResourceRecordTest)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:973]
        21. PHPUnit\Framework\TestCase->run(PHPUnit\Framework\TestResult)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestSuite.php:685]
        22. PHPUnit\Framework\TestSuite->run(PHPUnit\Framework\TestResult)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:651]
        23. PHPUnit\TextUI\TestRunner->run(PHPUnit\Framework\TestSuite, [listGroups:false, listSuites:false, listTests:false, listTestsXml:false, loader:null, useDefaultConfiguration:true, [[[verbose:true, ]]]])
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/Command.php:146]
        24. PHPUnit\TextUI\Command->run(["./phpunit.php", "-v", "dns/ResourceRecordTest.php"], true)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/Command.php:99]
        25. PHPUnit\TextUI\Command::main()
            [/usr/local/apnscp/tests/phpunit.php:70]
INFO   : no mysql database prefix specified - suggesting `debu_'
         0. Error_Reporter::add_info("no %(type)s database prefix specified - suggesting `%(prefix)s'", [[type:"mysql", prefix:"debu_"]])
            [/usr/local/apnscp/lib/log_wrapper.php:108]
         1. info("no %(type)s database prefix specified - suggesting `%(prefix)s'", [type:"mysql", prefix:"debu_"])
            [/usr/local/apnscp/lib/Opcenter/Service/Validators/Mysql/Dbaseprefix.php:61]
         2. Opcenter\Service\Validators\Mysql\Dbaseprefix->valid("debu_")
            [/usr/local/apnscp/lib/Opcenter/Service/ConfigurationContext.php:568]
         3. Opcenter\Service\ConfigurationContext->check("dbaseprefix", "debu_")
            [/usr/local/apnscp/lib/Opcenter/Service/ConfigurationContext.php:165]
         4. Opcenter\Service\ConfigurationContext->preflight()
            [/usr/local/apnscp/lib/Opcenter/SiteConfiguration.php:736]
         5. Opcenter\SiteConfiguration->verify("mysql", Opcenter\Service\ConfigurationContext)
            [/usr/local/apnscp/lib/Opcenter/SiteConfiguration.php:655]
         6. Opcenter\SiteConfiguration->verifyAll()
            [/usr/local/apnscp/lib/Opcenter/Account/Create.php:183]
         7. Opcenter\Account\Create->installServices("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Cardinal.php:143]
         8. Event\Contracts\Subscriber@anonymous/usr/local/apnscp/lib/Event/Cardinal.php:132$d1->update("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Manager.php:187]
         9. Event\Manager->fire("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Cardinal.php:172]
        10. Event\Cardinal::fire(["FILESYSTEM", "created"], Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Opcenter/Filesystem.php:79]
        11. Opcenter\Filesystem->populate()
            [/usr/local/apnscp/lib/Opcenter/Filesystem.php:47]
        12. Opcenter\Filesystem::create("site17", null)
            [/usr/local/apnscp/lib/Opcenter/Account/Create.php:154]
        13. Opcenter\Account\Create->exec()
            [/usr/local/apnscp/lib/Opcenter/Account/Ephemeral.php:113]
        14. Opcenter\Account\Ephemeral->exec()
            [/usr/local/apnscp/lib/Opcenter/Account/Ephemeral.php:104]
        15. Opcenter\Account\Ephemeral::create([[domain:"debug.test"]])
            [/usr/local/apnscp/tests/TestHelpers.php:45]
        16. TestHelpers::create("debug.test")
            [/usr/local/apnscp/tests/dns/ResourceRecordTest.php:18]
        17. ResourceRecordTest->testProviders()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:1617]
        18. PHPUnit\Framework\TestCase->runTest()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:1223]
        19. PHPUnit\Framework\TestCase->runBare()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestResult.php:729]
        20. PHPUnit\Framework\TestResult->run(ResourceRecordTest)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:973]
        21. PHPUnit\Framework\TestCase->run(PHPUnit\Framework\TestResult)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestSuite.php:685]
        22. PHPUnit\Framework\TestSuite->run(PHPUnit\Framework\TestResult)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:651]
        23. PHPUnit\TextUI\TestRunner->run(PHPUnit\Framework\TestSuite, [listGroups:false, listSuites:false, listTests:false, listTestsXml:false, loader:null, useDefaultConfiguration:true, [[[verbose:true, ]]]])
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/Command.php:146]
        24. PHPUnit\TextUI\Command->run(["./phpunit.php", "-v", "dns/ResourceRecordTest.php"], true)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/Command.php:99]
        25. PHPUnit\TextUI\Command::main()
            [/usr/local/apnscp/tests/phpunit.php:70]
WARNING: cgroup usage is strongly encouraged when using PHP-FPM - enable with cgroup,enabled=1
         0. Error_Reporter::add_warning("cgroup usage is strongly encouraged when using PHP-FPM - enable with cgroup,enabled=1", )
            [/usr/local/apnscp/lib/log_wrapper.php:95]
         1. warn("cgroup usage is strongly encouraged when using PHP-FPM - enable with cgroup,enabled=1")
            [/usr/local/apnscp/lib/Opcenter/Service/Validators/Apache/Jail.php:59]
         2. Opcenter\Service\Validators\Apache\Jail->valid(1)
            [/usr/local/apnscp/lib/Opcenter/Service/ConfigurationContext.php:568]
         3. Opcenter\Service\ConfigurationContext->check("jail", 1)
            [/usr/local/apnscp/lib/Opcenter/Service/ConfigurationContext.php:165]
         4. Opcenter\Service\ConfigurationContext->preflight()
            [/usr/local/apnscp/lib/Opcenter/SiteConfiguration.php:736]
         5. Opcenter\SiteConfiguration->verify("apache", Opcenter\Service\ConfigurationContext)
            [/usr/local/apnscp/lib/Opcenter/SiteConfiguration.php:655]
         6. Opcenter\SiteConfiguration->verifyAll()
            [/usr/local/apnscp/lib/Opcenter/Account/Create.php:183]
         7. Opcenter\Account\Create->installServices("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Cardinal.php:143]
         8. Event\Contracts\Subscriber@anonymous/usr/local/apnscp/lib/Event/Cardinal.php:132$d1->update("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Manager.php:187]
         9. Event\Manager->fire("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Cardinal.php:172]
        10. Event\Cardinal::fire(["FILESYSTEM", "created"], Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Opcenter/Filesystem.php:79]
        11. Opcenter\Filesystem->populate()
            [/usr/local/apnscp/lib/Opcenter/Filesystem.php:47]
        12. Opcenter\Filesystem::create("site17", null)
            [/usr/local/apnscp/lib/Opcenter/Account/Create.php:154]
        13. Opcenter\Account\Create->exec()
            [/usr/local/apnscp/lib/Opcenter/Account/Ephemeral.php:113]
        14. Opcenter\Account\Ephemeral->exec()
            [/usr/local/apnscp/lib/Opcenter/Account/Ephemeral.php:104]
        15. Opcenter\Account\Ephemeral::create([[domain:"debug.test"]])
            [/usr/local/apnscp/tests/TestHelpers.php:45]
        16. TestHelpers::create("debug.test")
            [/usr/local/apnscp/tests/dns/ResourceRecordTest.php:18]
        17. ResourceRecordTest->testProviders()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:1617]
        18. PHPUnit\Framework\TestCase->runTest()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:1223]
        19. PHPUnit\Framework\TestCase->runBare()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestResult.php:729]
        20. PHPUnit\Framework\TestResult->run(ResourceRecordTest)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:973]
        21. PHPUnit\Framework\TestCase->run(PHPUnit\Framework\TestResult)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestSuite.php:685]
        22. PHPUnit\Framework\TestSuite->run(PHPUnit\Framework\TestResult)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:651]
        23. PHPUnit\TextUI\TestRunner->run(PHPUnit\Framework\TestSuite, [listGroups:false, listSuites:false, listTests:false, listTestsXml:false, loader:null, useDefaultConfiguration:true, [[[verbose:true, ]]]])
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/Command.php:146]
        24. PHPUnit\TextUI\Command->run(["./phpunit.php", "-v", "dns/ResourceRecordTest.php"], true)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/Command.php:99]
        25. PHPUnit\TextUI\Command::main()
            [/usr/local/apnscp/tests/phpunit.php:70]
INFO   : no bandwidth rollover date specified, using day of month, `16'
         0. Error_Reporter::add_info("no bandwidth rollover date specified, using day of month, `%s'", [16])
            [/usr/local/apnscp/lib/log_wrapper.php:108]
         1. info("no bandwidth rollover date specified, using day of month, `%s'", 16)
            [/usr/local/apnscp/lib/Opcenter/Service/Validators/Bandwidth/Rollover.php:27]
         2. Opcenter\Service\Validators\Bandwidth\Rollover->valid(16)
            [/usr/local/apnscp/lib/Opcenter/Service/ConfigurationContext.php:568]
         3. Opcenter\Service\ConfigurationContext->check("rollover", 16)
            [/usr/local/apnscp/lib/Opcenter/Service/ConfigurationContext.php:165]
         4. Opcenter\Service\ConfigurationContext->preflight()
            [/usr/local/apnscp/lib/Opcenter/SiteConfiguration.php:736]
         5. Opcenter\SiteConfiguration->verify("bandwidth", Opcenter\Service\ConfigurationContext)
            [/usr/local/apnscp/lib/Opcenter/SiteConfiguration.php:655]
         6. Opcenter\SiteConfiguration->verifyAll()
            [/usr/local/apnscp/lib/Opcenter/Account/Create.php:183]
         7. Opcenter\Account\Create->installServices("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Cardinal.php:143]
         8. Event\Contracts\Subscriber@anonymous/usr/local/apnscp/lib/Event/Cardinal.php:132$d1->update("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Manager.php:187]
         9. Event\Manager->fire("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Cardinal.php:172]
        10. Event\Cardinal::fire(["FILESYSTEM", "created"], Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Opcenter/Filesystem.php:79]
        11. Opcenter\Filesystem->populate()
            [/usr/local/apnscp/lib/Opcenter/Filesystem.php:47]
        12. Opcenter\Filesystem::create("site17", null)
            [/usr/local/apnscp/lib/Opcenter/Account/Create.php:154]
        13. Opcenter\Account\Create->exec()
            [/usr/local/apnscp/lib/Opcenter/Account/Ephemeral.php:113]
        14. Opcenter\Account\Ephemeral->exec()
            [/usr/local/apnscp/lib/Opcenter/Account/Ephemeral.php:104]
        15. Opcenter\Account\Ephemeral::create([[domain:"debug.test"]])
            [/usr/local/apnscp/tests/TestHelpers.php:45]
        16. TestHelpers::create("debug.test")
            [/usr/local/apnscp/tests/dns/ResourceRecordTest.php:18]
        17. ResourceRecordTest->testProviders()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:1617]
        18. PHPUnit\Framework\TestCase->runTest()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:1223]
        19. PHPUnit\Framework\TestCase->runBare()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestResult.php:729]
        20. PHPUnit\Framework\TestResult->run(ResourceRecordTest)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:973]
        21. PHPUnit\Framework\TestCase->run(PHPUnit\Framework\TestResult)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestSuite.php:685]
        22. PHPUnit\Framework\TestSuite->run(PHPUnit\Framework\TestResult)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:651]
        23. PHPUnit\TextUI\TestRunner->run(PHPUnit\Framework\TestSuite, [listGroups:false, listSuites:false, listTests:false, listTestsXml:false, loader:null, useDefaultConfiguration:true, [[[verbose:true, ]]]])
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/Command.php:146]
        24. PHPUnit\TextUI\Command->run(["./phpunit.php", "-v", "dns/ResourceRecordTest.php"], true)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/Command.php:99]
        25. PHPUnit\TextUI\Command::main()
            [/usr/local/apnscp/tests/phpunit.php:70]
INFO   : No password specified - generating random password: `Bn2b0xYf7HA7Gkal4DNavwYWmLiKNsmL'
         0. Error_Reporter::add_info("No password specified - generating random password: `%s'", ["Bn2b0xYf7HA7Gkal4DNavwYWmLiKNsmL"])
            [/usr/local/apnscp/lib/log_wrapper.php:108]
         1. info("No password specified - generating random password: `%s'", "Bn2b0xYf7HA7Gkal4DNavwYWmLiKNsmL")
            [/usr/local/apnscp/lib/Opcenter/Service/Validators/Auth/Tpasswd.php:33]
         2. Opcenter\Service\Validators\Auth\Tpasswd->valid("Bn2b0xYf7HA7Gkal4DNavwYWmLiKNsmL")
            [/usr/local/apnscp/lib/Opcenter/Service/ConfigurationContext.php:568]
         3. Opcenter\Service\ConfigurationContext->check("tpasswd", "Bn2b0xYf7HA7Gkal4DNavwYWmLiKNsmL")
            [/usr/local/apnscp/lib/Opcenter/Service/ConfigurationContext.php:165]
         4. Opcenter\Service\ConfigurationContext->preflight()
            [/usr/local/apnscp/lib/Opcenter/SiteConfiguration.php:736]
         5. Opcenter\SiteConfiguration->verify("auth", Opcenter\Service\ConfigurationContext)
            [/usr/local/apnscp/lib/Opcenter/SiteConfiguration.php:655]
         6. Opcenter\SiteConfiguration->verifyAll()
            [/usr/local/apnscp/lib/Opcenter/Account/Create.php:183]
         7. Opcenter\Account\Create->installServices("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Cardinal.php:143]
         8. Event\Contracts\Subscriber@anonymous/usr/local/apnscp/lib/Event/Cardinal.php:132$d1->update("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Manager.php:187]
         9. Event\Manager->fire("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Cardinal.php:172]
        10. Event\Cardinal::fire(["FILESYSTEM", "created"], Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Opcenter/Filesystem.php:79]
        11. Opcenter\Filesystem->populate()
            [/usr/local/apnscp/lib/Opcenter/Filesystem.php:47]
        12. Opcenter\Filesystem::create("site17", null)
            [/usr/local/apnscp/lib/Opcenter/Account/Create.php:154]
        13. Opcenter\Account\Create->exec()
            [/usr/local/apnscp/lib/Opcenter/Account/Ephemeral.php:113]
        14. Opcenter\Account\Ephemeral->exec()
            [/usr/local/apnscp/lib/Opcenter/Account/Ephemeral.php:104]
        15. Opcenter\Account\Ephemeral::create([[domain:"debug.test"]])
            [/usr/local/apnscp/tests/TestHelpers.php:45]
        16. TestHelpers::create("debug.test")
            [/usr/local/apnscp/tests/dns/ResourceRecordTest.php:18]
        17. ResourceRecordTest->testProviders()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:1617]
        18. PHPUnit\Framework\TestCase->runTest()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:1223]
        19. PHPUnit\Framework\TestCase->runBare()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestResult.php:729]
        20. PHPUnit\Framework\TestResult->run(ResourceRecordTest)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:973]
        21. PHPUnit\Framework\TestCase->run(PHPUnit\Framework\TestResult)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestSuite.php:685]
        22. PHPUnit\Framework\TestSuite->run(PHPUnit\Framework\TestResult)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:651]
        23. PHPUnit\TextUI\TestRunner->run(PHPUnit\Framework\TestSuite, [listGroups:false, listSuites:false, listTests:false, listTestsXml:false, loader:null, useDefaultConfiguration:true, [[[verbose:true, ]]]])
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/Command.php:146]
        24. PHPUnit\TextUI\Command->run(["./phpunit.php", "-v", "dns/ResourceRecordTest.php"], true)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/Command.php:99]
        25. PHPUnit\TextUI\Command::main()
            [/usr/local/apnscp/tests/phpunit.php:70]
INFO   : allocated port range [40110,40119] for account
         0. Error_Reporter::add_info("allocated port range [4%03u0,4%03u9] for account", [11, 11])
            [/usr/local/apnscp/lib/log_wrapper.php:108]
         1. info("allocated port range [4%03u0,4%03u9] for account", 11, 11)
            [/usr/local/apnscp/lib/Opcenter/Service/Validators/Ssh/PortIndex.php:45]
         2. Opcenter\Service\Validators\Ssh\PortIndex->valid(11)
            [/usr/local/apnscp/lib/Opcenter/Service/ConfigurationContext.php:568]
         3. Opcenter\Service\ConfigurationContext->check("port_index", 11)
            [/usr/local/apnscp/lib/Opcenter/Service/ConfigurationContext.php:165]
         4. Opcenter\Service\ConfigurationContext->preflight()
            [/usr/local/apnscp/lib/Opcenter/SiteConfiguration.php:736]
         5. Opcenter\SiteConfiguration->verify("ssh", Opcenter\Service\ConfigurationContext)
            [/usr/local/apnscp/lib/Opcenter/SiteConfiguration.php:655]
         6. Opcenter\SiteConfiguration->verifyAll()
            [/usr/local/apnscp/lib/Opcenter/Account/Create.php:183]
         7. Opcenter\Account\Create->installServices("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Cardinal.php:143]
         8. Event\Contracts\Subscriber@anonymous/usr/local/apnscp/lib/Event/Cardinal.php:132$d1->update("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Manager.php:187]
         9. Event\Manager->fire("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Cardinal.php:172]
        10. Event\Cardinal::fire(["FILESYSTEM", "created"], Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Opcenter/Filesystem.php:79]
        11. Opcenter\Filesystem->populate()
            [/usr/local/apnscp/lib/Opcenter/Filesystem.php:47]
        12. Opcenter\Filesystem::create("site17", null)
            [/usr/local/apnscp/lib/Opcenter/Account/Create.php:154]
        13. Opcenter\Account\Create->exec()
            [/usr/local/apnscp/lib/Opcenter/Account/Ephemeral.php:113]
        14. Opcenter\Account\Ephemeral->exec()
            [/usr/local/apnscp/lib/Opcenter/Account/Ephemeral.php:104]
        15. Opcenter\Account\Ephemeral::create([[domain:"debug.test"]])
            [/usr/local/apnscp/tests/TestHelpers.php:45]
        16. TestHelpers::create("debug.test")
            [/usr/local/apnscp/tests/dns/ResourceRecordTest.php:18]
        17. ResourceRecordTest->testProviders()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:1617]
        18. PHPUnit\Framework\TestCase->runTest()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:1223]
        19. PHPUnit\Framework\TestCase->runBare()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestResult.php:729]
        20. PHPUnit\Framework\TestResult->run(ResourceRecordTest)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:973]
        21. PHPUnit\Framework\TestCase->run(PHPUnit\Framework\TestResult)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestSuite.php:685]
        22. PHPUnit\Framework\TestSuite->run(PHPUnit\Framework\TestResult)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:651]
        23. PHPUnit\TextUI\TestRunner->run(PHPUnit\Framework\TestSuite, [listGroups:false, listSuites:false, listTests:false, listTestsXml:false, loader:null, useDefaultConfiguration:true, [[[verbose:true, ]]]])
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/Command.php:146]
        24. PHPUnit\TextUI\Command->run(["./phpunit.php", "-v", "dns/ResourceRecordTest.php"], true)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/Command.php:99]
        25. PHPUnit\TextUI\Command::main()
            [/usr/local/apnscp/tests/phpunit.php:70]
INFO   : DNS not configured for `debug.test', bypassing DNS hooks
         0. Error_Reporter::add_info("DNS not configured for `%s', bypassing DNS hooks", ["debug.test"])
            [/usr/local/apnscp/lib/log_wrapper.php:108]
         1. info("DNS not configured for `%s', bypassing DNS hooks", "debug.test")
            [/usr/local/apnscp/lib/Opcenter/Service/Validators/Dns/Enabled.php:51]
         2. Opcenter\Service\Validators\Dns\Enabled->populate(Opcenter\SiteConfiguration)
            [/usr/local/apnscp/lib/Opcenter/Service/Validators/Common/Enabled.php:126]
         3. Opcenter\Service\Validators\Common\Enabled->fire(["service"], Opcenter\SiteConfiguration)
            [/usr/local/apnscp/lib/Opcenter/Service/Validators/Common/Enabled.php:94]
         4. Opcenter\Service\Validators\Common\Enabled->update("service.success", Opcenter\SiteConfiguration)
            [/usr/local/apnscp/lib/Event/Cardinal.php:143]
         5. Event\Contracts\Subscriber@anonymous/usr/local/apnscp/lib/Event/Cardinal.php:132$d1->update("service.success", Opcenter\SiteConfiguration)
            [/usr/local/apnscp/lib/Event/Manager.php:187]
         6. Event\Manager->fire("service.success", Opcenter\SiteConfiguration)
            [/usr/local/apnscp/lib/Event/Cardinal.php:172]
         7. Event\Cardinal::fire(["service", "success"], Opcenter\SiteConfiguration)
            [/usr/local/apnscp/lib/Opcenter/Account/Create.php:209]
         8. Opcenter\Account\Create->installServices("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Cardinal.php:143]
         9. Event\Contracts\Subscriber@anonymous/usr/local/apnscp/lib/Event/Cardinal.php:132$d1->update("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Manager.php:187]
        10. Event\Manager->fire("FILESYSTEM.created", Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Event/Cardinal.php:172]
        11. Event\Cardinal::fire(["FILESYSTEM", "created"], Opcenter\Filesystem)
            [/usr/local/apnscp/lib/Opcenter/Filesystem.php:79]
        12. Opcenter\Filesystem->populate()
            [/usr/local/apnscp/lib/Opcenter/Filesystem.php:47]
        13. Opcenter\Filesystem::create("site17", null)
            [/usr/local/apnscp/lib/Opcenter/Account/Create.php:154]
        14. Opcenter\Account\Create->exec()
            [/usr/local/apnscp/lib/Opcenter/Account/Ephemeral.php:113]
        15. Opcenter\Account\Ephemeral->exec()
            [/usr/local/apnscp/lib/Opcenter/Account/Ephemeral.php:104]
        16. Opcenter\Account\Ephemeral::create([[domain:"debug.test"]])
            [/usr/local/apnscp/tests/TestHelpers.php:45]
        17. TestHelpers::create("debug.test")
            [/usr/local/apnscp/tests/dns/ResourceRecordTest.php:18]
        18. ResourceRecordTest->testProviders()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:1617]
        19. PHPUnit\Framework\TestCase->runTest()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:1223]
        20. PHPUnit\Framework\TestCase->runBare()
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestResult.php:729]
        21. PHPUnit\Framework\TestResult->run(ResourceRecordTest)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestCase.php:973]
        22. PHPUnit\Framework\TestCase->run(PHPUnit\Framework\TestResult)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/Framework/TestSuite.php:685]
        23. PHPUnit\Framework\TestSuite->run(PHPUnit\Framework\TestResult)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/TestRunner.php:651]
        24. PHPUnit\TextUI\TestRunner->run(PHPUnit\Framework\TestSuite, [listGroups:false, listSuites:false, listTests:false, listTestsXml:false, loader:null, useDefaultConfiguration:true, [[[verbose:true, ]]]])
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/Command.php:146]
        25. PHPUnit\TextUI\Command->run(["./phpunit.php", "-v", "dns/ResourceRecordTest.php"], true)
            [/usr/local/apnscp/vendor/phpunit/phpunit/src/TextUI/Command.php:99]
        26. PHPUnit\TextUI\Command::main()
            [/usr/local/apnscp/tests/phpunit.php:70]
F                                                                   1 / 1 (100%){  }

Time: 00:01.920, Memory: 43.00 MB

There was 1 failure:

1) ResourceRecordTest::testProviders
Failed asserting that actual size 0 matches expected size 2.

/usr/local/apnscp/tests/dns/helpers/RecordFramework.php:284
/usr/local/apnscp/tests/dns/ResourceRecordTest.php:35

FAILURES!
Tests: 1, Assertions: 65, Failures: 1.

Looks good to me. Here’s how to reproduce the test case:

  • Create a file named definitions.yml in /usr/local/apnscp/tests with the following content:
    dns:
      provider_list:
        - cloudflare
    
      cloudflare:
        domain: debug.dev
        key:
          key: x-y_z
          proxy: false
    
  • Run ./phpunit.php dns/ResourceRecordTest.php

All 73 assertions passed against debug.dev. Note that Cloudflare will reject any .test TLD as this is not a valid TLD per IANA. Under Profile > API Tokens, the token used (specified as “key” in test suite configuration) has Edit permissions set for Zone.Zone + Zone.DNS. Zone.Resources is set to “Include” all zones.

OK, thanks. The test script is running successfully now for me as well:

# ./phpunit.php dns/ResourceRecordTest.php 
PHPUnit 9.6.22 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 00:29.970, Memory: 32.50 MB

OK (1 test, 73 assertions)

I can also confirm that I am still seeing the error with deleting/adding certain records. Specifically, any record that does not have a specified subdomain isn’t working properly. These records can be added, but they do not show as existing via record_exists and they cannot be removed. In addition to the previous example with the MX record, the error can be seen with a simple text record. Behavior is the same whether I specify subdomain '@' or '':

# cpcmd -d domain.com dns:record_exists domain.com '@' txt 'testing 123'

# cpcmd -d domain.com dns:add_record domain.com '@' txt 'testing 123'
1
# cpcmd -d domain.com dns:record_exists domain.com '@' txt 'testing 123'

# cpcmd -d domain.com dns:remove_record domain.com '@' txt 'testing 123'
ERROR  : Opcenter\Dns\Providers\Cloudflare\Module::remove_record(): Record `@.domain.com' (rr: `TXT', param: `testing 123')  does not exist
         0. Error_Reporter::add_error("Record `%s' (rr: `%s', param: `%s')  does not exist", ["@.domain.com", "TXT", "testing 123"])
            [/usr/local/apnscp/lib/log_wrapper.php:72]
         1. error("Record `%s' (rr: `%s', param: `%s')  does not exist", "@.domain.com", "TXT", "testing 123")
            [/usr/local/apnscp/lib/Opcenter/Dns/Providers/Cloudflare/Module.php:284]
         2. Opcenter\Dns\Providers\Cloudflare\Module->remove_record("domain.com", "@", "TXT", "testing 123")
            [/usr/local/apnscp/lib/Module/Skeleton/Standard.php:146]
         3. Module\Skeleton\Standard->_invoke("remove_record", ["domain.com", "@", "txt", "testing 123"])
            [/usr/local/apnscp/lib/apnscpfunction.php:991]
         4. apnscpFunctionInterceptor->call("dns_remove_record", ["domain.com", "@", "txt", "testing 123"])
            [/usr/local/apnscp/lib/CLI/cmd.php:55]
         5. CLI\__call("dns_remove_record", ["domain.com", "@", "txt", "testing 123"])
            [/usr/local/apnscp/lib/CLI/cmd.php:574]
         6. CLI\main()
            [/usr/local/apnscp/bin/cmd:7]
----------------------------------------
MESSAGE SUMMARY
Reporter level: ERROR
ERROR: Opcenter\Dns\Providers\Cloudflare\Module::remove_record(): Record `@.domain.com' (rr: `TXT', param: `testing 123')  does not exist
----------------------------------------

ERROR: Opcenter\Dns\Providers\Cloudflare\Module::remove_record(): Record `@.domain.com' (rr: `TXT', param: `testing 123')  does not exist
# cpcmd -d domain.com dns:add_record domain.com '@' txt 'testing 123'
ERROR  : Opcenter\Dns\Providers\Cloudflare\Module::add_record(): Failed to create record `@.domain.com' type TXT: An identical record already exists.
         0. Error_Reporter::add_error("Failed to create record `%s' type %s: %s", ["@.domain.com", "TXT", "An identical record already exists."])
            [/usr/local/apnscp/lib/log_wrapper.php:72]
         1. error("Failed to create record `%s' type %s: %s", "@.domain.com", "TXT", "An identical record already exists.")
            [/usr/local/apnscp/lib/Opcenter/Dns/Providers/Cloudflare/Module.php:195]
         2. Opcenter\Dns\Providers\Cloudflare\Module->add_record("domain.com", "@", "TXT", "testing 123")
            [/usr/local/apnscp/lib/Module/Skeleton/Standard.php:146]
         3. Module\Skeleton\Standard->_invoke("add_record", ["domain.com", "@", "txt", "testing 123"])
            [/usr/local/apnscp/lib/apnscpfunction.php:991]
         4. apnscpFunctionInterceptor->call("dns_add_record", ["domain.com", "@", "txt", "testing 123"])
            [/usr/local/apnscp/lib/CLI/cmd.php:55]
         5. CLI\__call("dns_add_record", ["domain.com", "@", "txt", "testing 123"])
            [/usr/local/apnscp/lib/CLI/cmd.php:574]
         6. CLI\main()
            [/usr/local/apnscp/bin/cmd:7]
----------------------------------------
MESSAGE SUMMARY
Reporter level: ERROR
ERROR: Opcenter\Dns\Providers\Cloudflare\Module::add_record(): Failed to create record `@.domain.com' type TXT: An identical record already exists.
----------------------------------------

ERROR: Opcenter\Dns\Providers\Cloudflare\Module::add_record(): Failed to create record `@.domain.com' type TXT: An identical record already exists.

Thanks for the bug report. Should be fixed on Edge now.

To hop on Edge until the next release:

cpcmd scope:set cp.update-policy edge-major
upcp