kubernetes/kops · error

found VMSS without properties

Error message

found VMSS without properties

What it means

Find requires the VMSS model to carry a non-nil Properties block; without it kops cannot read provisioning state or the VM profile. This invariant check fires when Azure returns a scale set whose Properties pointer is nil, meaning the response is structurally incomplete for reconciliation.

Source

Thrown at upup/pkg/fi/cloudup/azuretasks/vmscaleset.go:109

	return s.Name
}

// Find discovers the VMScaleSet in the cloud provider.
func (s *VMScaleSet) Find(c *fi.CloudupContext) (*VMScaleSet, error) {
	cloud := c.T.Cloud.(azure.AzureCloud)
	found, err := cloud.VMScaleSet().Get(context.TODO(), *s.ResourceGroup.Name, *s.Name)
	if err != nil && !strings.Contains(err.Error(), "NotFound") {
		return nil, err
	}
	if found == nil {
		return nil, nil
	}

	if found.ID == nil {
		return nil, fmt.Errorf("found VMSS without ID")
	}
	if found.Properties == nil {
		return nil, fmt.Errorf("found VMSS without properties")
	}
	if fi.ValueOf(found.Properties.ProvisioningState) == "Failed" {
		klog.Warningf("found VMSS %q in failed provisioning state", *s.Name)
		return nil, nil
	}
	if found.Properties.VirtualMachineProfile == nil {
		return nil, fmt.Errorf("found VMSS without VM profile")
	}
	if found.Properties.VirtualMachineProfile.NetworkProfile == nil {
		return nil, fmt.Errorf("found VMSS without network profile")
	}
	if found.Properties.VirtualMachineProfile.OSProfile == nil {
		return nil, fmt.Errorf("found VMSS without OS profile")
	}

	profile := found.Properties.VirtualMachineProfile

	nwConfigs := profile.NetworkProfile.NetworkInterfaceConfigurations

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Verify the VMSS exists fully in Azure (az vmss show) and re-run kops apply to recreate it.
  2. Fix test fixtures so the mocked VirtualMachineScaleSet sets Properties.
  3. Align the azure-sdk-for-go version with kops expectations so Properties is populated.

Example fix

// before
found := &compute.VirtualMachineScaleSet{ID: &id}
// after
found := &compute.VirtualMachineScaleSet{ID: &id, Properties: &compute.VirtualMachineScaleSetProperties{}}
Defensive patterns

Strategy: validation

Validate before calling

if vmss == nil || vmss.Properties == nil {
    return fmt.Errorf("VMSS %s has no properties; delete and re-apply", name)
}

Type guard

func hasProperties(v *compute.VirtualMachineScaleSet) bool { return v != nil && v.Properties != nil }

Try / catch

task, err := s.Find(context, cloud)
if err != nil {
    if strings.Contains(err.Error(), "without properties") {
        return markForRecreate(err)
    }
    return err
}

Prevention

When it happens

Trigger: A Get/List VirtualMachineScaleSets response deserialized with Properties == nil — typically a stub response, an empty/half-provisioned resource, or an API shape mismatch.

Common situations: VMSS deleted concurrently with reconciliation; mock/test fixtures omitting Properties; SDK upgrade where fields moved out of Properties.

Related errors


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