func getIntOrPercentValue(intOrStringValue intstr.IntOrString) int { value, isPercent := getPercentValue(intOrStringValue) if isPercent { return value } return intOrStringValue.IntValue() }
func ValidatePositiveIntOrPercent(intOrPercent intstr.IntOrString, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} if intOrPercent.Type == intstr.String { if !validation.IsValidPercent(intOrPercent.StrVal) { allErrs = append(allErrs, field.Invalid(fldPath, intOrPercent, "must be an integer or percentage (e.g '5%')")) } } else if intOrPercent.Type == intstr.Int { allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(intOrPercent.IntValue()), fldPath)...) } return allErrs }
func ValidatePositiveIntOrPercent(intOrPercent intstr.IntOrString, fldPath *validation.FieldPath) validation.ErrorList { allErrs := validation.ErrorList{} if intOrPercent.Type == intstr.String { if !validation.IsValidPercent(intOrPercent.StrVal) { allErrs = append(allErrs, validation.NewInvalidError(fldPath, intOrPercent, "value should be int(5) or percentage(5%)")) } } else if intOrPercent.Type == intstr.Int { allErrs = append(allErrs, apivalidation.ValidatePositiveField(int64(intOrPercent.IntValue()), fldPath)...) } return allErrs }
func GetIntOrPercentValue(intOrStr *intstr.IntOrString) (int, bool, error) { switch intOrStr.Type { case intstr.Int: return intOrStr.IntValue(), false, nil case intstr.String: s := strings.Replace(intOrStr.StrVal, "%", "", -1) v, err := strconv.Atoi(s) if err != nil { return 0, false, fmt.Errorf("invalid value %q: %v", intOrStr.StrVal, err) } return int(v), true, nil } return 0, false, fmt.Errorf("invalid value: neither int nor percentage") }
func ValidatePositiveIntOrPercent(intOrPercent intstr.IntOrString, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} switch intOrPercent.Type { case intstr.String: for _, msg := range validation.IsValidPercent(intOrPercent.StrVal) { allErrs = append(allErrs, field.Invalid(fldPath, intOrPercent, msg)) } case intstr.Int: allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(intOrPercent.IntValue()), fldPath)...) default: allErrs = append(allErrs, field.Invalid(fldPath, intOrPercent, "must be an integer or percentage (e.g '5%%')")) } return allErrs }
// resolvePort attempts to turn a IntOrString port reference into a concrete port number. // If portReference has an int value, it is treated as a literal, and simply returns that value. // If portReference is a string, an attempt is first made to parse it as an integer. If that fails, // an attempt is made to find a port with the same name in the container spec. // If a port with the same name is found, it's ContainerPort value is returned. If no matching // port is found, an error is returned. func resolvePort(portReference intstr.IntOrString, container *api.Container) (int, error) { if portReference.Type == intstr.Int { return portReference.IntValue(), nil } portName := portReference.StrVal port, err := strconv.Atoi(portName) if err == nil { return port, nil } for _, portSpec := range container.Ports { if portSpec.Name == portName { return portSpec.ContainerPort, nil } } return -1, fmt.Errorf("couldn't find port: %v in %v", portReference, container) }
// getEndpoints returns a list of <endpoint ip>:<port> for a given service/target port combination. func (lbc *loadBalancerController) getEndpoints(s *api.Service, servicePort intstr.IntOrString, proto api.Protocol) []nginx.UpstreamServer { glog.V(3).Infof("getting endpoints for service %v/%v and port %v", s.Namespace, s.Name, servicePort.String()) ep, err := lbc.endpLister.GetServiceEndpoints(s) if err != nil { glog.Warningf("unexpected error obtaining service endpoints: %v", err) return []nginx.UpstreamServer{} } upsServers := []nginx.UpstreamServer{} for _, ss := range ep.Subsets { for _, epPort := range ss.Ports { if !reflect.DeepEqual(epPort.Protocol, proto) { continue } var targetPort int switch servicePort.Type { case intstr.Int: if epPort.Port == servicePort.IntValue() { targetPort = epPort.Port } case intstr.String: if epPort.Name == servicePort.StrVal { targetPort = epPort.Port } } if targetPort == 0 { continue } for _, epAddress := range ss.Addresses { ups := nginx.UpstreamServer{Address: epAddress.IP, Port: fmt.Sprintf("%v", targetPort)} upsServers = append(upsServers, ups) } } } glog.V(3).Infof("endpoints found: %v", upsServers) return upsServers }
// func extractMaxValue is a helper to extract config max values as either // absolute numbers or based on percentages of the given value. func extractMaxValue(field intstr.IntOrString, name string, value int) (int, error) { switch field.Type { case intstr.Int: if field.IntVal < 0 { return 0, fmt.Errorf("%s must be >= 0", name) } return field.IntValue(), nil case intstr.String: s := strings.Replace(field.StrVal, "%", "", -1) v, err := strconv.Atoi(s) if err != nil { return 0, fmt.Errorf("invalid %s value %q: %v", name, field.StrVal, err) } if v < 0 { return 0, fmt.Errorf("%s must be >= 0", name) } return int(math.Ceil(float64(value) * (float64(v)) / 100)), nil } return 0, fmt.Errorf("invalid kind %q for %s", field.Type, name) }
func extractPort(param intstr.IntOrString, container api.Container) (int, error) { port := -1 var err error switch param.Type { case intstr.Int: port = param.IntValue() case intstr.String: if port, err = findPortByName(container, param.StrVal); err != nil { // Last ditch effort - maybe it was an int stored as string? if port, err = strconv.Atoi(param.StrVal); err != nil { return port, err } } default: return port, fmt.Errorf("IntOrString had no kind: %+v", param) } if port > 0 && port < 65536 { return port, nil } return port, fmt.Errorf("invalid port number: %v", port) }
func Convert_intstr_IntOrString_To_intstr_IntOrString(in, out *intstr.IntOrString, s conversion.Scope) error { out.Type = in.Type out.IntVal = in.IntVal out.StrVal = in.StrVal return nil }
func deepCopy_intstr_IntOrString(in intstr.IntOrString, out *intstr.IntOrString, c *conversion.Cloner) error { out.Type = in.Type out.IntVal = in.IntVal out.StrVal = in.StrVal return nil }
// getEndpoints returns a list of <endpoint ip>:<port> for a given service/target port combination. func (lbc *loadBalancerController) getEndpoints(s *api.Service, servicePort intstr.IntOrString, proto api.Protocol, hz *healthcheck.Upstream) []nginx.UpstreamServer { glog.V(3).Infof("getting endpoints for service %v/%v and port %v", s.Namespace, s.Name, servicePort.String()) ep, err := lbc.endpLister.GetServiceEndpoints(s) if err != nil { glog.Warningf("unexpected error obtaining service endpoints: %v", err) return []nginx.UpstreamServer{} } upsServers := []nginx.UpstreamServer{} for _, ss := range ep.Subsets { for _, epPort := range ss.Ports { if !reflect.DeepEqual(epPort.Protocol, proto) { continue } var targetPort int32 switch servicePort.Type { case intstr.Int: if int(epPort.Port) == servicePort.IntValue() { targetPort = epPort.Port } case intstr.String: namedPorts := s.ObjectMeta.Annotations val, ok := namedPortMapping(namedPorts).getPort(servicePort.StrVal) if ok { port, err := strconv.Atoi(val) if err != nil { glog.Warningf("%v is not valid as a port", val) continue } targetPort = int32(port) } else { newnp, err := lbc.checkSvcForUpdate(s) if err != nil { glog.Warningf("error mapping service ports: %v", err) continue } val, ok := namedPortMapping(newnp).getPort(servicePort.StrVal) if ok { port, err := strconv.Atoi(val) if err != nil { glog.Warningf("%v is not valid as a port", val) continue } targetPort = int32(port) } } } if targetPort == 0 { continue } for _, epAddress := range ss.Addresses { ups := nginx.UpstreamServer{ Address: epAddress.IP, Port: fmt.Sprintf("%v", targetPort), MaxFails: hz.MaxFails, FailTimeout: hz.FailTimeout, } upsServers = append(upsServers, ups) } } } glog.V(3).Infof("endpoints found: %v", upsServers) return upsServers }
// getEndpoints returns a list of <endpoint ip>:<port> for a given service/target port combination. func (ic *GenericController) getEndpoints( s *api.Service, servicePort intstr.IntOrString, proto api.Protocol, hz *healthcheck.Upstream) []ingress.Endpoint { glog.V(3).Infof("getting endpoints for service %v/%v and port %v", s.Namespace, s.Name, servicePort.String()) ep, err := ic.endpLister.GetServiceEndpoints(s) if err != nil { glog.Warningf("unexpected error obtaining service endpoints: %v", err) return []ingress.Endpoint{} } upsServers := []ingress.Endpoint{} for _, ss := range ep.Subsets { for _, epPort := range ss.Ports { if !reflect.DeepEqual(epPort.Protocol, proto) { continue } var targetPort int32 switch servicePort.Type { case intstr.Int: if int(epPort.Port) == servicePort.IntValue() { targetPort = epPort.Port } case intstr.String: port, err := service.GetPortMapping(servicePort.StrVal, s) if err == nil { targetPort = port continue } glog.Warningf("error mapping service port: %v", err) err = ic.checkSvcForUpdate(s) if err != nil { glog.Warningf("error mapping service ports: %v", err) continue } port, err = service.GetPortMapping(servicePort.StrVal, s) if err == nil { targetPort = port } } // check for invalid port value if targetPort <= 0 { continue } for _, epAddress := range ss.Addresses { ups := ingress.Endpoint{ Address: epAddress.IP, Port: fmt.Sprintf("%v", targetPort), MaxFails: hz.MaxFails, FailTimeout: hz.FailTimeout, } upsServers = append(upsServers, ups) } } } glog.V(3).Infof("endpoints found: %v", upsServers) return upsServers }