func ServiceSpec(srvcSpecs []interface{}) api.ServiceSpec { if len(srvcSpecs) == 0 { return api.ServiceSpec{} } userServiceSpec := srvcSpecs[0].(map[string]interface{}) srvcSpec := api.ServiceSpec{ Ports: ServicePorts(userServiceSpec["ports"].([]interface{})), } if _, ok := userServiceSpec["selector"]; ok { srvcSpec.Selector = convertMapTypeToStringMap(userServiceSpec["selector"].(map[string]interface{})) } if _, ok := userServiceSpec["cluster_ip"]; ok { srvcSpec.ClusterIP = userServiceSpec["cluster_ip"].(string) } if _, ok := userServiceSpec["type"]; ok { srvcSpec.Type = api.ServiceType(userServiceSpec["type"].(string)) } if _, ok := userServiceSpec["session_affinity"]; ok { srvcSpec.SessionAffinity = api.ServiceAffinity(userServiceSpec["session_affinity"].(string)) } return srvcSpec }
// ServiceUsageFunc knows how to measure usage associated with services func ServiceUsageFunc(object runtime.Object) api.ResourceList { result := api.ResourceList{} var serviceType api.ServiceType var ports int switch t := object.(type) { case *v1.Service: serviceType = api.ServiceType(t.Spec.Type) ports = len(t.Spec.Ports) case *api.Service: serviceType = t.Spec.Type ports = len(t.Spec.Ports) default: panic(fmt.Sprintf("expect *api.Service or *v1.Service, got %v", t)) } // default service usage result[api.ResourceServices] = resource.MustParse("1") result[api.ResourceServicesLoadBalancers] = resource.MustParse("0") result[api.ResourceServicesNodePorts] = resource.MustParse("0") switch serviceType { case api.ServiceTypeNodePort: // node port services need to count node ports value := resource.NewQuantity(int64(ports), resource.DecimalSI) result[api.ResourceServicesNodePorts] = *value case api.ServiceTypeLoadBalancer: // load balancer services need to count load balancers result[api.ResourceServicesLoadBalancers] = resource.MustParse("1") } return result }
//GetQuotaServiceType returns ServiceType if the service type is eligible to track against a quota, nor return "" func GetQuotaServiceType(service *api.Service) api.ServiceType { switch service.Spec.Type { case api.ServiceTypeNodePort: return api.ServiceTypeNodePort case api.ServiceTypeLoadBalancer: return api.ServiceTypeLoadBalancer } return api.ServiceType("") }
func (s ServiceCommonGeneratorV1) StructuredGenerate() (runtime.Object, error) { err := s.validate() if err != nil { return nil, err } ports := []api.ServicePort{} for _, tcpString := range s.TCP { port, targetPort, err := parsePorts(tcpString) if err != nil { return nil, err } portName := strings.Replace(tcpString, ":", "-", -1) ports = append(ports, api.ServicePort{ Name: portName, Port: port, TargetPort: targetPort, Protocol: api.Protocol("TCP"), NodePort: int32(s.NodePort), }) } // setup default label and selector labels := map[string]string{} labels["app"] = s.Name selector := map[string]string{} selector["app"] = s.Name service := api.Service{ ObjectMeta: api.ObjectMeta{ Name: s.Name, Labels: labels, }, Spec: api.ServiceSpec{ Type: api.ServiceType(s.Type), Selector: selector, Ports: ports, ExternalName: s.ExternalName, }, } if len(s.ClusterIP) > 0 { service.Spec.ClusterIP = s.ClusterIP } return &service, nil }
func (testServiceGenerator) Generate(genericParams map[string]interface{}) (runtime.Object, error) { params := map[string]string{} for key, value := range genericParams { strVal, isString := value.(string) if !isString { return nil, fmt.Errorf("expected string, saw %v for '%s'", value, key) } params[key] = strVal } labelsString, found := params["labels"] var labels map[string]string var err error if found && len(labelsString) > 0 { labels, err = kubectl.ParseLabels(labelsString) if err != nil { return nil, err } } name, found := params["name"] if !found || len(name) == 0 { name, found = params["default-name"] if !found || len(name) == 0 { return nil, fmt.Errorf("'name' is a required parameter.") } } portString, found := params["port"] if !found { return nil, fmt.Errorf("'port' is a required parameter.") } port, err := strconv.Atoi(portString) if err != nil { return nil, err } servicePortName, found := params["port-name"] if !found { // Leave the port unnamed. servicePortName = "" } service := api.Service{ ObjectMeta: api.ObjectMeta{ Name: name, Labels: labels, }, Spec: api.ServiceSpec{ Ports: []api.ServicePort{ { Name: servicePortName, Port: port, Protocol: api.Protocol(params["protocol"]), }, }, }, } targetPort, found := params["target-port"] if !found { targetPort, found = params["container-port"] } if found && len(targetPort) > 0 { if portNum, err := strconv.Atoi(targetPort); err != nil { service.Spec.Ports[0].TargetPort = intstr.FromString(targetPort) } else { service.Spec.Ports[0].TargetPort = intstr.FromInt(portNum) } } else { service.Spec.Ports[0].TargetPort = intstr.FromInt(port) } if params["create-external-load-balancer"] == "true" { service.Spec.Type = api.ServiceTypeLoadBalancer } if len(params["external-ip"]) > 0 { service.Spec.ExternalIPs = []string{params["external-ip"]} } if len(params["type"]) != 0 { service.Spec.Type = api.ServiceType(params["type"]) } if len(params["session-affinity"]) != 0 { switch api.ServiceAffinity(params["session-affinity"]) { case api.ServiceAffinityNone: service.Spec.SessionAffinity = api.ServiceAffinityNone case api.ServiceAffinityClientIP: service.Spec.SessionAffinity = api.ServiceAffinityClientIP default: return nil, fmt.Errorf("unknown session affinity: %s", params["session-affinity"]) } } return &service, nil }
func generate(genericParams map[string]interface{}) (runtime.Object, error) { params := map[string]string{} for key, value := range genericParams { strVal, isString := value.(string) if !isString { return nil, fmt.Errorf("expected string, saw %v for '%s'", value, key) } params[key] = strVal } selectorString, found := params["selector"] if !found || len(selectorString) == 0 { return nil, fmt.Errorf("'selector' is a required parameter.") } selector, err := ParseLabels(selectorString) if err != nil { return nil, err } labelsString, found := params["labels"] var labels map[string]string if found && len(labelsString) > 0 { labels, err = ParseLabels(labelsString) if err != nil { return nil, err } } name, found := params["name"] if !found || len(name) == 0 { name, found = params["default-name"] if !found || len(name) == 0 { return nil, fmt.Errorf("'name' is a required parameter.") } } ports := []api.ServicePort{} servicePortName, found := params["port-name"] if !found { // Leave the port unnamed. servicePortName = "" } protocolsString, found := params["protocols"] var portProtocolMap map[string]string if found && len(protocolsString) > 0 { portProtocolMap, err = ParseProtocols(protocolsString) if err != nil { return nil, err } } // ports takes precedence over port since it will be // specified only when the user hasn't specified a port // via --port and the exposed object has multiple ports. var portString string if portString, found = params["ports"]; !found { portString, found = params["port"] if !found { return nil, fmt.Errorf("'port' is a required parameter.") } } portStringSlice := strings.Split(portString, ",") for i, stillPortString := range portStringSlice { port, err := strconv.Atoi(stillPortString) if err != nil { return nil, err } name := servicePortName // If we are going to assign multiple ports to a service, we need to // generate a different name for each one. if len(portStringSlice) > 1 { name = fmt.Sprintf("port-%d", i+1) } protocol := params["protocol"] switch { case len(protocol) == 0 && len(portProtocolMap) == 0: // Default to TCP, what the flag was doing previously. protocol = "TCP" case len(protocol) > 0 && len(portProtocolMap) > 0: // User has specified the --protocol while exposing a multiprotocol resource // We should stomp multiple protocols with the one specified ie. do nothing case len(protocol) == 0 && len(portProtocolMap) > 0: // no --protocol and we expose a multiprotocol resource protocol = "TCP" // have the default so we can stay sane if exposeProtocol, found := portProtocolMap[stillPortString]; found { protocol = exposeProtocol } } ports = append(ports, api.ServicePort{ Name: name, Port: int32(port), Protocol: api.Protocol(protocol), }) } service := api.Service{ ObjectMeta: api.ObjectMeta{ Name: name, Labels: labels, }, Spec: api.ServiceSpec{ Selector: selector, Ports: ports, }, } targetPortString, found := params["target-port"] if !found { targetPortString, found = params["container-port"] } if found && len(targetPortString) > 0 { var targetPort intstr.IntOrString if portNum, err := strconv.Atoi(targetPortString); err != nil { targetPort = intstr.FromString(targetPortString) } else { targetPort = intstr.FromInt(portNum) } // Use the same target-port for every port for i := range service.Spec.Ports { service.Spec.Ports[i].TargetPort = targetPort } } else { // If --target-port or --container-port haven't been specified, this // should be the same as Port for i := range service.Spec.Ports { port := service.Spec.Ports[i].Port service.Spec.Ports[i].TargetPort = intstr.FromInt(int(port)) } } if params["create-external-load-balancer"] == "true" { service.Spec.Type = api.ServiceTypeLoadBalancer } if len(params["external-ip"]) > 0 { service.Spec.ExternalIPs = []string{params["external-ip"]} } if len(params["type"]) != 0 { service.Spec.Type = api.ServiceType(params["type"]) } if service.Spec.Type == api.ServiceTypeLoadBalancer { service.Spec.LoadBalancerIP = params["load-balancer-ip"] } if len(params["session-affinity"]) != 0 { switch api.ServiceAffinity(params["session-affinity"]) { case api.ServiceAffinityNone: service.Spec.SessionAffinity = api.ServiceAffinityNone case api.ServiceAffinityClientIP: service.Spec.SessionAffinity = api.ServiceAffinityClientIP default: return nil, fmt.Errorf("unknown session affinity: %s", params["session-affinity"]) } } return &service, nil }
func generate(params map[string]string) (runtime.Object, error) { selectorString, found := params["selector"] if !found || len(selectorString) == 0 { return nil, fmt.Errorf("'selector' is a required parameter.") } selector, err := ParseLabels(selectorString) if err != nil { return nil, err } labelsString, found := params["labels"] var labels map[string]string if found && len(labelsString) > 0 { labels, err = ParseLabels(labelsString) if err != nil { return nil, err } } name, found := params["name"] if !found || len(name) == 0 { name, found = params["default-name"] if !found || len(name) == 0 { return nil, fmt.Errorf("'name' is a required parameter.") } } portString, found := params["port"] if !found { return nil, fmt.Errorf("'port' is a required parameter.") } port, err := strconv.Atoi(portString) if err != nil { return nil, err } servicePortName, found := params["port-name"] if !found { // Leave the port unnamed. servicePortName = "" } service := api.Service{ ObjectMeta: api.ObjectMeta{ Name: name, Labels: labels, }, Spec: api.ServiceSpec{ Selector: selector, Ports: []api.ServicePort{ { Name: servicePortName, Port: port, Protocol: api.Protocol(params["protocol"]), }, }, }, } targetPort, found := params["target-port"] if !found { targetPort, found = params["container-port"] } if found && len(targetPort) > 0 { if portNum, err := strconv.Atoi(targetPort); err != nil { service.Spec.Ports[0].TargetPort = util.NewIntOrStringFromString(targetPort) } else { service.Spec.Ports[0].TargetPort = util.NewIntOrStringFromInt(portNum) } } else { service.Spec.Ports[0].TargetPort = util.NewIntOrStringFromInt(port) } if params["create-external-load-balancer"] == "true" { service.Spec.Type = api.ServiceTypeLoadBalancer } if len(params["public-ip"]) != 0 { service.Spec.DeprecatedPublicIPs = []string{params["public-ip"]} } if len(params["type"]) != 0 { service.Spec.Type = api.ServiceType(params["type"]) } return &service, nil }