func FleetScopedUniqueName()

in pkg/common/uniquename/uniquename.go [131:194]


func FleetScopedUniqueName(format Format, clusterID, namespace, name string) (string, error) {
	reservedSlots := 3 + uuidLength // 3 dashes + 5 character UUID string

	switch format {
	case DNS1123Subdomain:
		availableSlots := validation.DNS1123SubdomainMaxLength // 253 characters
		slotsPerSeg := (availableSlots - reservedSlots) / 3
		uniqueName := fmt.Sprintf("%s-%s-%s-%s",
			clusterID[:minInt(slotsPerSeg, len(clusterID))],
			namespace[:minInt(slotsPerSeg, len(namespace))],
			name[:minInt(slotsPerSeg, len(name))],
			uuid.NewUUID()[:uuidLength],
		)

		if errs := validation.IsDNS1123Subdomain(uniqueName); len(errs) != 0 {
			return "", fmt.Errorf("failed to format a unique RFC 1123 DNS subdomain name with cluster ID %s, namespace %s, name %s: %v",
				clusterID, namespace, name, errs)
		}
		return uniqueName, nil
	case DNS1123Label:
		availableSlots := validation.DNS1123LabelMaxLength // 63 characters
		slotsPerSeg := (availableSlots - reservedSlots) / 3

		// If the cluster ID and object name are valid RFC 1123 DNS subdomains, they may include dot characters,
		// which is not allowed in RFC 1123 DNS labels.
		clusterID = removeDots(clusterID)
		name = removeDots(name)

		uniqueName := fmt.Sprintf("%s-%s-%s-%s",
			clusterID[:minInt(slotsPerSeg, len(clusterID))],
			namespace[:minInt(slotsPerSeg, len(namespace))],
			name[:minInt(slotsPerSeg, len(name))],
			uuid.NewUUID()[:uuidLength],
		)

		if errs := validation.IsDNS1123Label(uniqueName); len(errs) != 0 {
			return "", fmt.Errorf("failed to format a unique RFC 1123 DNS label name with cluster ID %s, namespace %s, name %s: %v",
				clusterID, namespace, name, errs)
		}
		return uniqueName, nil
	case DNS1035Label:
		availableSlots := validation.DNS1035LabelMaxLength // 63 characters
		slotsPerSeg := (availableSlots - reservedSlots) / 3

		// If the cluster ID and object name are valid RFC 1123 DNS subdomains, they may include dot characters,
		// which is not allowed in RFC 1123 DNS labels.
		clusterID = removeDots(clusterID)
		name = removeDots(name)

		uniqueName := fmt.Sprintf("%s-%s-%s-%s",
			clusterID[:minInt(slotsPerSeg, len(clusterID))],
			namespace[:minInt(slotsPerSeg, len(namespace))],
			name[:minInt(slotsPerSeg, len(name))],
			uuid.NewUUID()[:uuidLength],
		)

		if errs := validation.IsDNS1035Label(uniqueName); len(errs) != 0 {
			return "", fmt.Errorf("failed to format a unique RFC 1035 DNS label name with cluster ID %s, namespace %s, name %s: %v",
				clusterID, namespace, name, errs)
		}
		return uniqueName, nil
	}
	return "", fmt.Errorf("not a valid name format: %d", format)
}