{"record":{"id":"8d1ffea9318abde1","repo":"microsoft/aspire","slug":"clusterissuer-issuer-name-has-no-solvers-configured-add-at","errorCode":null,"errorMessage":"ClusterIssuer '{issuer.Name}' has no solvers configured. Add at least one solver via WithHttp01Solver().","messagePattern":"ClusterIssuer '(.+?)' has no solvers configured\\. Add at least one solver via WithHttp01Solver\\(\\)\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Aspire.Hosting.Kubernetes/CertManagerExtensions.cs","lineNumber":433,"sourceCode":"\n        return Task.FromResult<IEnumerable<PipelineStep>>(steps);\n    }\n\n    private static async Task ApplyClusterIssuerAsync(\n        PipelineStepContext context,\n        CertManagerResource certManager,\n        CertManagerIssuerResource issuer)\n    {\n        if (issuer.Spec is null)\n        {\n            throw new InvalidOperationException(\n                $\"ClusterIssuer '{issuer.Name}' has no spec. Configure it with WithLetsEncryptProduction(), \" +\n                \"WithLetsEncryptStaging(), or WithAcmeServer().\");\n        }\n\n        if (issuer.Solvers.Count == 0)\n        {\n            throw new InvalidOperationException(\n                $\"ClusterIssuer '{issuer.Name}' has no solvers configured. Add at least one \" +\n                \"solver via WithHttp01Solver().\");\n        }\n\n        var environment = certManager.Parent;\n\n        var manifest = await BuildClusterIssuerManifestAsync(context.Model, certManager, issuer, context.Logger, context.CancellationToken)\n            .ConfigureAwait(false);\n\n        context.Logger.LogInformation(\n            \"Applying cert-manager ClusterIssuer '{IssuerName}'.\", issuer.Name);\n\n        // Write to a temp file and apply. kubectl apply -f - via stdin would avoid the\n        // temp file but ProcessUtil.Run doesn't expose a stdin pipe; Directory.CreateTempSubdirectory\n        // is the standard temp pattern in this codebase (see EnsureBootstrapTlsSecretAsync).\n        var tempDir = Directory.CreateTempSubdirectory(\".aspire-cm-issuer\");\n        try\n        {","sourceCodeStart":415,"sourceCodeEnd":451,"githubUrl":"https://github.com/microsoft/aspire/blob/25830f84bd145686607ad00c057b3f84e2e51d43/src/Aspire.Hosting.Kubernetes/CertManagerExtensions.cs#L415-L451","documentation":"After verifying the issuer has a spec, ApplyClusterIssuerAsync also requires at least one challenge solver (e.g. HTTP-01) because cert-manager cannot complete ACME challenges without one. If issuer.Solvers is empty the publisher throws InvalidOperationException.","triggerScenarios":"Publishing/running a model where an issuer was configured with an ACME spec (e.g. WithLetsEncryptProduction) but no solver was added via WithHttp01Solver() (or other solver extension).","commonSituations":"Developers configure the ACME account/email but forget the challenge solver step, or remove solver configuration during refactoring.","solutions":["Add .WithHttp01Solver() to the ClusterIssuer builder chain.","If using DNS challenges via a custom solver type, ensure the corresponding solver extension is applied.","Verify no code path clears the Solvers collection after configuration."],"exampleFix":"// before\ncertManager.AddClusterIssuer(\"letsencrypt\").WithLetsEncryptProduction(email);\n\n// after\ncertManager.AddClusterIssuer(\"letsencrypt\")\n    .WithLetsEncryptProduction(email)\n    .WithHttp01Solver();","handlingStrategy":"validation","validationCode":"if (issuer.Solvers.Count == 0) issuerBuilder.WithHttp01Solver(); // ensure a solver exists","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat AddClusterIssuer + config + WithHttp01Solver as an atomic chain.","Add a helper method that builds fully-configured issuers to avoid partial setup."],"tags":["kubernetes","cert-manager","acme","solver"],"backgroundTag":"missing-required-config","analyzedSha":"25830f84bd145686607ad00c057b3f84e2e51d43","analyzedAt":"2026-09-16T11:10:06.193Z","contentChangedAt":"2026-09-16T11:10:06.193Z","schemaVersion":2},"datasetVersion":"2026-09-21T09:17:21.228Z"}