Skip to content

Commit

Permalink
Add scheme feature for SMI
Browse files Browse the repository at this point in the history
  • Loading branch information
mmatur committed Oct 10, 2019
1 parent 5183a57 commit f91a898
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 12 deletions.
1 change: 1 addition & 0 deletions docs/content/configuration.md
Expand Up @@ -33,6 +33,7 @@ maesh.containo.us/traffic-type: "http"
```

This annotation can be set to either `http` or `tcp`, and will specify the mode for that service operation.
If this annotation is not present, the mesh service will operate in the default mode specified in the static configuration.

### Scheme

Expand Down
4 changes: 4 additions & 0 deletions internal/providers/base/base.go
Expand Up @@ -78,6 +78,8 @@ func AddBaseSMIMiddlewares(config *dynamic.Configuration) {
config.HTTP.Middlewares[k8s.BlockAllMiddlewareKey] = blockAll
}

// GetScheme returns the scheme if available in annotations.
// Otherwise returns "http".
func GetScheme(annotations map[string]string) string {
scheme := annotations[k8s.AnnotationScheme]

Expand All @@ -88,6 +90,8 @@ func GetScheme(annotations map[string]string) string {
return scheme
}

// GetServiceMode returns the service type if available in annotations.
// Otherwise returns default mode pass in parameters.
func GetServiceMode(annotations map[string]string, defaultMode string) string {
mode := annotations[k8s.AnnotationServiceType]

Expand Down
26 changes: 15 additions & 11 deletions internal/providers/smi/provider.go
Expand Up @@ -127,26 +127,29 @@ func (p *Provider) BuildConfig() (*dynamic.Configuration, error) {
whitelistKey := groupedTrafficTarget.Name + "-" + groupedTrafficTarget.Namespace + "-" + key + "-whitelist"
whitelistMiddleware := k8s.BlockAllMiddlewareKey

if serviceMode == k8s.ServiceTypeHTTP {
switch serviceMode {
case k8s.ServiceTypeHTTP:
if len(sourceIPs) > 0 {
config.HTTP.Middlewares[whitelistKey] = createWhitelistMiddleware(sourceIPs)
whitelistMiddleware = whitelistKey
}

scheme := base.GetScheme(service.Annotations)

trafficSplit := base.GetTrafficSplitFromList(service.Name, trafficSplitsInNamespace)
if trafficSplit == nil {
config.HTTP.Routers[key] = p.buildHTTPRouterFromTrafficTarget(service.Name, service.Namespace, service.Spec.ClusterIP, groupedTrafficTarget, 5000+id, key, whitelistMiddleware)
config.HTTP.Services[key] = p.buildHTTPServiceFromTrafficTarget(base.GetEndpointsFromList(service.Name, service.Namespace, endpoints), groupedTrafficTarget)
config.HTTP.Services[key] = p.buildHTTPServiceFromTrafficTarget(base.GetEndpointsFromList(service.Name, service.Namespace, endpoints), groupedTrafficTarget, scheme)

continue
}

p.buildTrafficSplit(config, trafficSplit, sp, id, groupedTrafficTarget, whitelistMiddleware)
p.buildTrafficSplit(config, trafficSplit, sp, id, groupedTrafficTarget, whitelistMiddleware, scheme)
case k8s.ServiceTypeTCP:
meshPort := p.getMeshPort(service.Name, service.Namespace, sp.Port)
config.TCP.Routers[key] = p.buildTCPRouterFromTrafficTarget(groupedTrafficTarget, meshPort, key)
config.TCP.Services[key] = p.buildTCPServiceFromTrafficTarget(base.GetEndpointsFromList(service.Name, service.Namespace, endpoints), groupedTrafficTarget)
}

meshPort := p.getMeshPort(service.Name, service.Namespace, sp.Port)
config.TCP.Routers[key] = p.buildTCPRouterFromTrafficTarget(groupedTrafficTarget, meshPort, key)
config.TCP.Services[key] = p.buildTCPServiceFromTrafficTarget(base.GetEndpointsFromList(service.Name, service.Namespace, endpoints), groupedTrafficTarget)
}
}
}
Expand Down Expand Up @@ -362,7 +365,7 @@ func (p *Provider) buildRuleSnippetFromServiceAndMatch(name, namespace, ip strin
return strings.Join(result, " && ")
}

func (p *Provider) buildHTTPServiceFromTrafficTarget(endpoints *corev1.Endpoints, trafficTarget *accessv1alpha1.TrafficTarget) *dynamic.Service {
func (p *Provider) buildHTTPServiceFromTrafficTarget(endpoints *corev1.Endpoints, trafficTarget *accessv1alpha1.TrafficTarget, scheme string) *dynamic.Service {
var servers []dynamic.Server

if endpoints.Namespace != trafficTarget.Destination.Namespace {
Expand Down Expand Up @@ -401,7 +404,7 @@ func (p *Provider) buildHTTPServiceFromTrafficTarget(endpoints *corev1.Endpoints

if pod.Spec.ServiceAccountName == trafficTarget.Destination.Name {
server := dynamic.Server{
URL: "http://" + net.JoinHostPort(address.IP, strconv.FormatInt(int64(endpointPort.Port), 10)),
URL: fmt.Sprintf("%s://%s", scheme, net.JoinHostPort(address.IP, strconv.FormatInt(int64(endpointPort.Port), 10))),
}
servers = append(servers, server)
}
Expand Down Expand Up @@ -480,7 +483,8 @@ func (p *Provider) getServiceMode(mode string) string {
return mode
}

func (p *Provider) buildTrafficSplit(config *dynamic.Configuration, trafficSplit *splitv1alpha1.TrafficSplit, sp corev1.ServicePort, id int, trafficTarget *accessv1alpha1.TrafficTarget, whitelistMiddleware string) {
func (p *Provider) buildTrafficSplit(config *dynamic.Configuration, trafficSplit *splitv1alpha1.TrafficSplit,
sp corev1.ServicePort, id int, trafficTarget *accessv1alpha1.TrafficTarget, whitelistMiddleware string, scheme string) {
var WRRServices []dynamic.WRRService

for _, backend := range trafficSplit.Spec.Backends {
Expand All @@ -496,7 +500,7 @@ func (p *Provider) buildTrafficSplit(config *dynamic.Configuration, trafficSplit
}

splitKey := buildKey(backend.Service, trafficSplit.Namespace, sp.Port, trafficTarget.Name, trafficTarget.Namespace)
config.HTTP.Services[splitKey] = p.buildHTTPServiceFromTrafficTarget(endpoints, trafficTarget)
config.HTTP.Services[splitKey] = p.buildHTTPServiceFromTrafficTarget(endpoints, trafficTarget, scheme)

WRRServices = append(WRRServices, dynamic.WRRService{
Name: splitKey,
Expand Down
2 changes: 1 addition & 1 deletion internal/providers/smi/provider_test.go
Expand Up @@ -1202,7 +1202,7 @@ func TestBuildHTTPServiceFromTrafficTarget(t *testing.T) {

provider := New(clientMock, k8s.ServiceTypeHTTP, meshNamespace, nil, k8s.NewIgnored(meshNamespace, []string{}))

actual := provider.buildHTTPServiceFromTrafficTarget(test.endpoints, test.trafficTarget)
actual := provider.buildHTTPServiceFromTrafficTarget(test.endpoints, test.trafficTarget, k8s.SchemeHTTP)
assert.Equal(t, test.expected, actual)
})
}
Expand Down

0 comments on commit f91a898

Please sign in to comment.