func ParseServiceDiscovery(id string, spec *pod.UserPod) error { var containers []pod.UserContainer var serviceType string = "service-discovery" var serviceDir string = path.Join(utils.HYPER_ROOT, "services", id) if len(spec.Services) == 0 || spec.Type == serviceType { return nil } spec.Type = serviceType serviceContainer := pod.UserContainer{ Name: ServiceDiscoveryContainerName(spec.Name), Image: servicediscovery.ServiceImage, Command: []string{"haproxy", "-D", "-f", "/usr/local/etc/haproxy/haproxy.cfg", "-p", "/var/run/haproxy.pid"}, } serviceVolRef := pod.UserVolumeReference{ Volume: "service-volume", Path: servicediscovery.ServiceVolume, ReadOnly: false, } /* PrepareServices will check service volume */ serviceVolume := pod.UserVolume{ Name: "service-volume", Source: serviceDir, Driver: "vfs", } spec.Volumes = append(spec.Volumes, serviceVolume) serviceContainer.Volumes = append(serviceContainer.Volumes, serviceVolRef) containers = append(containers, serviceContainer) for _, c := range spec.Containers { containers = append(containers, c) } spec.Containers = containers return nil }
// TODO: remove convertToRunvPodSpec after pod.UserPod is deleted from runv func convertToRunvPodSpec(podSpec *apitypes.UserPod) (*pod.UserPod, error) { var userPod pod.UserPod userPod.Name = podSpec.Id if podSpec.Id == "" { userPod.Name = utils.RandStr(10, "alphanum") } if podSpec.PortmappingWhiteLists != nil { for _, cidr := range podSpec.PortmappingWhiteLists.ExternalNetworks { _, _, err := net.ParseCIDR(cidr) if err != nil { return nil, fmt.Errorf("PortmappingWhiteLists.ExternalNetwork %s format error", cidr) } } filteredInternalNetworks := make([]string, 0) for _, cidr := range podSpec.PortmappingWhiteLists.InternalNetworks { _, _, err := net.ParseCIDR(cidr) if err != nil { return nil, fmt.Errorf("PortmappingWhiteLists.InternalNetworks %s format error", cidr) } // filter cidr out if the cidr is also in ExternalNetworks found := false for _, ext := range podSpec.PortmappingWhiteLists.ExternalNetworks { if cidr == ext { found = true break } } if !found { filteredInternalNetworks = append(filteredInternalNetworks, cidr) } } userPod.PortmappingWhiteLists = &pod.PortmappingWhiteList{ InternalNetworks: filteredInternalNetworks, ExternalNetworks: podSpec.PortmappingWhiteLists.ExternalNetworks, } } userPod.Hostname = podSpec.Hostname userPod.Type = podSpec.Type userPod.RestartPolicy = podSpec.RestartPolicy userPod.Dns = podSpec.Dns userPod.Tty = podSpec.Tty userPod.Labels = podSpec.Labels if podSpec.Labels == nil { userPod.Labels = make(map[string]string) } if podSpec.Resource != nil { userPod.Resource = pod.UserResource{ Vcpu: int(podSpec.Resource.Vcpu), Memory: int(podSpec.Resource.Memory), } } if userPod.Resource.Vcpu == 0 { userPod.Resource.Vcpu = 1 } if userPod.Resource.Memory == 0 { userPod.Resource.Memory = 128 } if len(podSpec.Containers) > 0 { containers := make([]pod.UserContainer, 0, len(podSpec.Containers)) for _, v := range podSpec.Containers { if v.Image == "" { return nil, fmt.Errorf("Please specific your image for your container, it can not be null!\n") } containers = append(containers, convertToRunvContainerSpec(v, userPod.Tty)) } userPod.Containers = containers } if len(podSpec.Files) > 0 { files := make([]pod.UserFile, 0, len(podSpec.Files)) for _, f := range podSpec.Files { files = append(files, pod.UserFile{ Name: f.Name, Encoding: f.Encoding, Uri: f.Uri, Contents: f.Content, }) } userPod.Files = files } if len(podSpec.Volumes) > 0 { vols := make([]pod.UserVolume, 0, len(podSpec.Volumes)) for _, vol := range podSpec.Volumes { if vol.Name == "" { return nil, fmt.Errorf("Hyper ERROR: please specific your volume name, it can not be null!\n") } v := pod.UserVolume{ Name: vol.Name, Driver: vol.Driver, Source: vol.Source, } if vol.Option != nil { v.Option = pod.UserVolumeOption{ Monitors: vol.Option.Monitors, Keyring: vol.Option.Keyring, User: vol.Option.User, } } vols = append(vols, v) } userPod.Volumes = vols } if len(podSpec.Services) > 0 { services := make([]pod.UserService, 0, len(podSpec.Services)) for _, svc := range podSpec.Services { s := pod.UserService{ ServiceIP: svc.ServiceIP, ServicePort: int(svc.ServicePort), Protocol: svc.Protocol, } if len(svc.Hosts) > 0 { hosts := make([]pod.UserServiceBackend, 0, len(svc.Hosts)) for _, host := range svc.Hosts { hosts = append(hosts, pod.UserServiceBackend{ HostIP: host.HostIP, HostPort: int(host.HostPort), }) } s.Hosts = hosts } services = append(services, s) } userPod.Services = services } if len(podSpec.Interfaces) > 0 { interfaces := make([]pod.UserInterface, 0, len(podSpec.Interfaces)) for _, i := range podSpec.Interfaces { interfaces = append(interfaces, pod.UserInterface{ Bridge: i.Bridge, Ip: i.Ip, Ifname: i.Ifname, Mac: i.Mac, Gw: i.Gateway, }) } userPod.Interfaces = interfaces } if podSpec.Log != nil { userPod.LogConfig = pod.PodLogConfig{ Type: podSpec.Log.Type, Config: podSpec.Log.Config, } } return &userPod, nil }