kubesphere/kubesphere · error

failed to create or update extension version

Error message

failed to create or update extension version

What it means

syncExtensionsFromURL wraps any error from createOrUpdateExtensionVersion with 'failed to create or update extension version' using errors.Wrapf. It means an ExtensionVersion object for an extension from the repository index could not be created or updated in the cluster, typically a Kubernetes API failure.

Source

Thrown at pkg/controller/core/repository_controller.go:263

			extensionVersions = append(extensionVersions, extensionVersion)
		}

		filteredVersions := filterExtensionVersions(extensionVersions, repo.Spec.Depth)
		if len(filteredVersions) == 0 {
			continue
		}
		// update extension of latest extensionVersion
		extension, err := r.createOrUpdateExtension(ctx, repo, extensionName, ptr.To(filteredVersions[0]))
		if err != nil {
			if errors.Is(err, extensionRepoConflict) {
				continue
			}
			return errors.Wrapf(err, "failed to create or update extension")
		}
		// create extensionVersions of filteredVersions
		for _, extensionVersion := range filteredVersions {
			if err := r.createOrUpdateExtensionVersion(ctx, extension, &extensionVersion); err != nil {
				return errors.Wrapf(err, "failed to create or update extension version")
			}
		}
		// remove extensionVersions of existVersions
		if err := r.removeSuspendedExtensionVersion(ctx, repo.Name, extension.Name, extensionVersions); err != nil {
			return errors.Wrapf(err, "failed to remove suspended extension version")
		}
	}

	extensions := &corev1alpha1.ExtensionList{}
	if err := r.List(ctx, extensions, client.MatchingLabels{corev1alpha1.RepositoryReferenceLabel: repo.Name}); err != nil {
		return errors.Wrapf(err, "failed to list extensions")
	}

	for _, extension := range extensions.Items {
		if _, ok := index.Entries[extension.Name]; !ok {
			// remove all the extensionVersions if the extension is not in the index
			if err := r.removeSuspendedExtensionVersion(ctx, repo.Name, extension.Name, []corev1alpha1.ExtensionVersion{}); err != nil {
				return errors.Wrapf(err, "failed to remove suspended extension version")

View on GitHub (pinned to 04a29b5c60)

Solutions

  1. Inspect the wrapped inner error to find the underlying API failure (not found, conflict, invalid)
  2. Verify the ExtensionVersion CRD is installed and matches the version the controller expects
  3. Check controller RBAC permissions to create/update extensionversions
  4. Validate the extension package metadata in the repo index for fields the API rejects
Defensive patterns

Strategy: try-catch

Validate before calling

// verify CRDs exist before sync
for _, gvk := range []string{"extensionversions.kubesphere.io"} {
    if _, err := discoveryClient.ServerResourcesForGroupVersion(gvk); err != nil { return err }
}

Try / catch

if err := r.createOrUpdateExtensionVersion(ctx, ext, &ev); err != nil {
    if apierrors.IsConflict(err) || apierrors.IsAlreadyExists(err) { return retryOnConflict(...) }
    return fmt.Errorf("extension version sync failed: %w", err)
}

Prevention

When it happens

Trigger: During repository reconcile, after filteredVersions are computed, r.createOrUpdateExtensionVersion fails — e.g. create/update API call rejected, validation webhook denial, RBAC denial, or invalid ExtensionVersion spec content from the index.

Common situations: Extension CRD not installed or CRD schema mismatch, admission webhook rejecting the spec, API server throttling/outage, corrupted version metadata (invalid labels/annotations) in the uploaded index.

Related errors


AI-assisted analysis of kubesphere/kubesphere@04a29b5c60 (2026-09-03). Data as JSON: /api/errors/a586cbe2ed11ae6d. Report an issue: GitHub.