kubernetes/kops · error

error creating kops config template: %w

Error message

error creating kops config template: %w

What it means

MachineDeploymentBuilder.BuildObjects wraps any failure from createKopsConfigTemplate with this message. createKopsConfigTemplate constructs the cluster-api KopsConfigTemplate unstructured object (bootstrap.cluster.x-k8s.io/v1beta1) from the builder's fields. In practice this means an earlier stage of generating the kops-config template failed, and the wrapper preserves the underlying cause via %w.

Source

Thrown at clusterapi/pkg/builders/machinedeploymentbuilder.go:217

			"name":      b.Name,
			"namespace": b.Namespace,
		},
		"spec": map[string]any{
			"template": map[string]any{
				"spec": templateSpec,
			},
		},
	}

	u := &unstructured.Unstructured{Object: obj}

	b.capiInfra = u
	return nil
}

func (b *MachineDeploymentBuilder) BuildObjects(ctx context.Context) ([]*unstructured.Unstructured, error) {
	if err := b.createKopsConfigTemplate(ctx); err != nil {
		return nil, fmt.Errorf("error creating kops config template: %w", err)
	}

	if err := b.createGCPMachineTemplate(ctx); err != nil {
		return nil, fmt.Errorf("error creating gcp machine template: %w", err)
	}

	if err := b.buildMachineDeployments(); err != nil {
		return nil, fmt.Errorf("error building machine deployments: %w", err)
	}

	var objects []*unstructured.Unstructured
	objects = append(objects, b.capiConfigTemplate)
	objects = append(objects, b.capiInfra)

	var machineDeployments []*unstructured.Unstructured
	for _, md := range b.capiMachineDeployments {
		machineDeployments = append(machineDeployments, md)
	}

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Inspect the wrapped cause (%w) printed after this message — it identifies the real failure inside createKopsConfigTemplate.
  2. Ensure the ctx passed to BuildObjects is alive (not cancelled/timed out) for the duration of object generation.
  3. Verify Name and Namespace on MachineDeploymentBuilder are set to valid DNS-1123 values before calling BuildObjects.
  4. Rebuild from a matching kops version; this builder code (clusterapi/pkg/builders) evolves with the cluster-api bootstrap provider.

Example fix

// before
objs, err := builder.BuildObjects(ctx) // ctx from a short-lived request timeout
// after
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
objs, err := builder.BuildObjects(ctx)
Defensive patterns

Strategy: try-catch

Validate before calling

if err := ctx.Err(); err != nil {
    return fmt.Errorf("context already done before BuildObjects: %w", err)
}
if builder.Name == "" || builder.Namespace == "" {
    return fmt.Errorf("builder Name and Namespace must be set")
}

Try / catch

objs, err := builder.BuildObjects(ctx)
if err != nil {
    if strings.Contains(err.Error(), "error creating kops config template") {
        // log wrapped cause: fmt.Sprintf("%+v", errors.Unwrap(err))
        return fmt.Errorf("kops config template stage failed: %w", err)
    }
    return err
}

Prevention

When it happens

Trigger: Calling BuildObjects (via RunGenerateMachineDeployment) when createKopsConfigTemplate returns a non-nil error — typically when the context is cancelled/deadlined or the template construction fails.

Common situations: Running `kops create cluster --controller-nodes ...` style machine-deployment generation with a cancelled context; embedding the clusterapi builders in a tool whose ctx is already done; future validation added to template construction rejecting builder fields.

Related errors


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/4a53b08e85eb54c2. Report an issue: GitHub.