func()

in internal/pkg/cli/deploy.go [315:379]


func (o *deployOpts) getDeploymentOrder() ([][]string, error) {

	// Get a map from workload name to deployment priority
	if err := o.parseDeploymentOrderTags(o.workloadNames); err != nil {
		return nil, err
	}

	// Iterate over priority map to invert it and get groups of workloads with the same priority.
	groupsMap := make(map[int][]string)
	for k, v := range o.deploymentOrderMap {
		groupsMap[v] = append(groupsMap[v], k)
	}

	// If --all is specified, we need to add the remainder of workloads with math.MaxInt priority according to whether or not --init-wkld is specified.
	if o.deployAllWorkloads {
		specifiedWorkloadList := make([]string, 0, len(o.deploymentOrderMap))
		for k := range o.deploymentOrderMap {
			specifiedWorkloadList = append(specifiedWorkloadList, k)
		}

		if o.yesInitWkld {
			// Add all unspecified local workloads to the list of workloads to be deployed.
			localWorkloads, err := o.listLocalWorkloads()
			if err != nil {
				return nil, err
			}
			workloadsToAppend := slices.DeleteFunc(slices.Clone(localWorkloads), func(s string) bool { return slices.Contains(specifiedWorkloadList, s) })
			if len(workloadsToAppend) != 0 {
				groupsMap[math.MaxInt] = append(groupsMap[math.MaxInt], workloadsToAppend...)
			}
		} else {
			// Otherwise (--init-wkld is false): get only get initialized local workloads.
			initializedWorkloads, err := o.listInitializedLocalWorkloads()
			if err != nil {
				return nil, err
			}
			workloadsToAppend := slices.DeleteFunc(slices.Clone(initializedWorkloads), func(s string) bool { return slices.Contains(specifiedWorkloadList, s) })
			if len(workloadsToAppend) != 0 {
				groupsMap[math.MaxInt] = append(groupsMap[math.MaxInt], workloadsToAppend...)
			}
		}
	}

	if len(groupsMap) == 0 {
		log.Infoln("No workloads to deploy. Did you mean to specify --init-wkld with --all?")
		return nil, errors.New("generate deployment groups: no workloads were specified")
	}
	deploymentGroups := queue.NewPriorityQueue[workloadPriority]()
	for k, v := range groupsMap {
		deploymentGroups.Push(workloadPriority{
			priority:  k,
			workloads: v,
		})
	}

	res := make([][]string, 0, deploymentGroups.Len())
	for deploymentGroups.Len() > 0 {
		v, ok := deploymentGroups.Pop()
		if !ok || v == nil {
			continue
		}
		res = append(res, v.workloads)
	}
	return res, nil
}