Skip to content

Commit

Permalink
Don't strip trailing slashes when generating service profiles (#11519)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
adleong committed Oct 25, 2023
1 parent 4e7a588 commit ce950d1
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
5 changes: 3 additions & 2 deletions pkg/profiles/openapi.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
Expand Down
12 changes: 12 additions & 0 deletions pkg/profiles/openapi_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ func TestSwaggerToServiceProfile(t *testing.T) {
},
},
},
"/path/with/trailing/slash/": {
PathItemProps: spec.PathItemProps{
Get: &spec.Operation{},
},
},
},
},
},
Expand Down Expand Up @@ -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",
},
},
},
},
}
Expand Down

0 comments on commit ce950d1

Please sign in to comment.