// Creates a name which can be reversed to identify both full pod name and container name.// This function returns stable name, unique name and a unique id.// Although rand.Uint32() is not really unique, but it's enough for us because error will// only occur when instances of the same container in the same pod have the same UID. The// chance is really slim.funcBuildDockerName(dockerName KubeletContainerName, container *v1.Container) (string, string, string) { containerName := dockerName.ContainerName + "." + strconv.FormatUint(kubecontainer.HashContainerLegacy(container), 16)
stableName := fmt.Sprintf("%s_%s_%s_%s", containerNamePrefix, containerName, dockerName.PodFullName, dockerName.PodUID) UID := fmt.Sprintf("%08x", rand.Uint32())return stableName, fmt.Sprintf("%s_%s", stableName, UID), UID}// Unpacks a container name, returning the pod full name and container name we would have used to// construct the docker name. If we are unable to parse the name, an error is returned.funcParseDockerName(name string) (dockerName *KubeletContainerName, hash uint64, err error) {// For some reason docker appears to be appending '/' to names.// If it's there, strip it. name = strings.TrimPrefix(name, "/") parts := strings.Split(name, "_")iflen(parts) ==0|| parts[0] != containerNamePrefix { err = fmt.Errorf("failed to parse Docker container name %q into parts", name)returnnil, 0, err }iflen(parts) <6 {// We have at least 5 fields. We may have more in the future.// Anything with less fields than this is not something we can// manage. glog.Warningf("found a container with the %q prefix, but too few fields (%d): %q", containerNamePrefix, len(parts), name)
err = fmt.Errorf("Docker container name %q has less parts than expected %v", name, parts)returnnil, 0, err } nameParts := strings.Split(parts[1], ".") containerName := nameParts[0]iflen(nameParts) >1 { hash, err = strconv.ParseUint(nameParts[1], 16, 32)if err !=nil { glog.Warningf("invalid container hash %q in container %q", nameParts[1], name) } } podFullName := parts[2] +"_"+ parts[3] podUID := types.UID(parts[4])return&KubeletContainerName{podFullName, podUID, containerName}, hash, nil}