code: func (d *Driver) Remove() error {
  	if err := d.checkLegacyDriver(false); err != nil {
  		return err
  	}
  
  	// NOTE(ahmetalpbalkan):
  	//   - remove attempts are best effort and if a resource is already gone, we
  	//     continue removing other resources instead of failing.
  	//   - we can probably do a lot of parallelization here but a sequential
  	//     logic works fine too. If we were to detach the NIC from the VM and
  	//     then delete the VM, this could enable some parallelization.
  
  	log.Info("NOTICE: Please check Azure portal/CLI to make sure you have no leftover resources to avoid unexpected charges.")
  	c, err := d.newAzureClient()
  	if err != nil {
  		return err
  	}
  	if err := c.DeleteVirtualMachineIfExists(d.ResourceGroup, d.naming().VM()); err != nil {
  		return err
  	}
  	if err := c.DeleteNetworkInterfaceIfExists(d.ResourceGroup, d.naming().NIC()); err != nil {
  		return err
  	}
  	if err := c.DeletePublicIPAddressIfExists(d.ResourceGroup, d.naming().IP()); err != nil {
  		return err
  	}
  	if err := c.DeleteNetworkSecurityGroupIfExists(d.ResourceGroup, d.naming().NSG()); err != nil {
  		return err
  	}
  	if err := c.CleanupAvailabilitySetIfExists(d.ResourceGroup, d.AvailabilitySet); err != nil {
  		return err
  	}
  	if err := c.CleanupSubnetIfExists(d.ResourceGroup, d.VirtualNetwork, d.SubnetName); err != nil {
  		return err
  	}
  	err = c.CleanupVirtualNetworkIfExists(d.ResourceGroup, d.VirtualNetwork)
  	return err
  }
docs: // Remove deletes the virtual machine and resources associated to it.