func()

in pkg/executables/govc.go [619:718]


func (g *Govc) ValidateVCenterSetupMachineConfig(ctx context.Context, datacenterConfig *v1alpha1.VSphereDatacenterConfig, machineConfig *v1alpha1.VSphereMachineConfig, _ *bool) error {
	envMap, err := g.validateAndSetupCreds()
	if err != nil {
		return fmt.Errorf("failed govc validations: %v", err)
	}
	machineConfig.Spec.Datastore, err = prependPath(datastore, machineConfig.Spec.Datastore, datacenterConfig.Spec.Datacenter)
	if err != nil {
		return err
	}
	params := []string{"datastore.info", machineConfig.Spec.Datastore}
	err = g.retrier.Retry(func() error {
		_, err = g.ExecuteWithEnv(ctx, envMap, params...)
		if err != nil {
			datastorePath := filepath.Dir(machineConfig.Spec.Datastore)
			isValidDatastorePath := g.isValidPath(ctx, envMap, datastorePath)
			if isValidDatastorePath {
				leafDir := filepath.Base(machineConfig.Spec.Datastore)
				return fmt.Errorf("valid path, but '%s' is not a datastore", leafDir)
			} else {
				return fmt.Errorf("failed to get datastore: %v", err)
			}
		}
		return nil
	})
	if err != nil {
		return fmt.Errorf("failed to get datastore: %v", err)
	}
	logger.MarkPass("Datastore validated")

	if len(machineConfig.Spec.Folder) > 0 {
		machineConfig.Spec.Folder, err = prependPath(vm, machineConfig.Spec.Folder, datacenterConfig.Spec.Datacenter)
		if err != nil {
			return err
		}
		params = []string{"folder.info", machineConfig.Spec.Folder}
		err = g.retrier.Retry(func() error {
			_, err := g.ExecuteWithEnv(ctx, envMap, params...)
			if err != nil {
				err = g.createFolder(ctx, envMap, machineConfig)
				if err != nil {
					currPath := "/" + datacenterConfig.Spec.Datacenter + "/"
					dirs := strings.Split(machineConfig.Spec.Folder, "/")
					for _, dir := range dirs[2:] {
						currPath += dir + "/"
						if !g.isValidPath(ctx, envMap, currPath) {
							return fmt.Errorf("%s is an invalid intermediate directory", currPath)
						}
					}
					return err
				}
			}
			return nil
		})
		if err != nil {
			return fmt.Errorf("failed to get folder: %v", err)
		}
		logger.MarkPass("Folder validated")
	}

	var poolInfoResponse bytes.Buffer
	params = []string{"find", "-json", "/" + datacenterConfig.Spec.Datacenter, "-type", "p", "-name", filepath.Base(machineConfig.Spec.ResourcePool)}
	err = g.retrier.Retry(func() error {
		poolInfoResponse, err = g.ExecuteWithEnv(ctx, envMap, params...)
		return err
	})
	if err != nil {
		return fmt.Errorf("error getting resource pool: %v", err)
	}

	poolInfoJson := poolInfoResponse.String()
	poolInfoJson = strings.TrimSuffix(poolInfoJson, "\n")
	if poolInfoJson == "null" || poolInfoJson == "" {
		return fmt.Errorf("resource pool '%s' not found", machineConfig.Spec.ResourcePool)
	}

	poolInfo := make([]string, 0)
	if err = json.Unmarshal([]byte(poolInfoJson), &poolInfo); err != nil {
		return fmt.Errorf("failed unmarshalling govc response: %v", err)
	}

	machineConfig.Spec.ResourcePool = strings.TrimPrefix(machineConfig.Spec.ResourcePool, "*/")
	bPoolFound := false
	var foundPool string
	for _, p := range poolInfo {
		if strings.HasSuffix(p, machineConfig.Spec.ResourcePool) {
			if bPoolFound {
				return fmt.Errorf("specified resource pool '%s' maps to multiple paths within the datacenter '%s'", machineConfig.Spec.ResourcePool, datacenterConfig.Spec.Datacenter)
			}
			bPoolFound = true
			foundPool = p
		}
	}
	if !bPoolFound {
		return fmt.Errorf("resource pool '%s' not found", machineConfig.Spec.ResourcePool)
	}
	machineConfig.Spec.ResourcePool = foundPool

	logger.MarkPass("Resource pool validated")
	return nil
}