Don't strip trailing slashes when generating service profiles (#11519)

When using the `linkerd profile` command with the `--open-api` flag to generate a service profile from a swagger file, we combine each route's base path with it's relative path to get the full path used in the service profile.  However, we use `path.Join` to do so, which strips trailing slashes, leaving the final path different from the intended one.

We avoid using `path.Join`, instead joining the paths manually to avoid stripping trailing slashes.

Signed-off-by: Alex Leong <alex@buoyant.io>
This commit is contained in:
Alex Leong 2023-10-25 13:49:10 -07:00 committed by GitHub
parent 4e7a588a2c
commit ce950d17c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 2 deletions

View File

@ -4,8 +4,8 @@ import (
"fmt"
"io"
"net/http"
"path"
"sort"
"strings"
"github.com/go-openapi/spec"
sp "github.com/linkerd/linkerd2/controller/gen/apis/serviceprofile/v1alpha2"
@ -67,9 +67,10 @@ func swaggerToServiceProfile(swagger spec.Swagger, namespace, name, clusterDomai
sort.Strings(paths)
}
base := strings.TrimRight(swagger.BasePath, "/")
for _, relPath := range paths {
item := swagger.Paths.Paths[relPath]
path := path.Join(swagger.BasePath, relPath)
path := base + "/" + strings.TrimLeft(relPath, "/")
pathRegex := PathToRegex(path)
if item.Delete != nil {
spec := MkRouteSpec(path, pathRegex, http.MethodDelete, item.Delete)

View File

@ -35,6 +35,11 @@ func TestSwaggerToServiceProfile(t *testing.T) {
},
},
},
"/path/with/trailing/slash/": {
PathItemProps: spec.PathItemProps{
Get: &spec.Operation{},
},
},
},
},
},
@ -68,6 +73,13 @@ func TestSwaggerToServiceProfile(t *testing.T) {
IsRetryable: true,
Timeout: "60s",
},
{
Name: "GET /path/with/trailing/slash/",
Condition: &sp.RequestMatch{
PathRegex: "/path/with/trailing/slash/",
Method: "GET",
},
},
},
},
}