Skip to content

Commit

Permalink
add backwards compatibility for listing apps (#29816)
Browse files Browse the repository at this point in the history
  • Loading branch information
rudream committed Jul 31, 2023
1 parent 359347b commit 2a54884
Showing 1 changed file with 41 additions and 1 deletion.
42 changes: 41 additions & 1 deletion lib/web/apps.go
Expand Up @@ -60,8 +60,25 @@ func (h *Handler) clusterAppsGet(w http.ResponseWriter, r *http.Request, p httpr
}

page, err := apiclient.GetResourcePage[types.AppServerOrSAMLIdPServiceProvider](r.Context(), clt, req)

if err != nil {
return nil, trace.Wrap(err)
// If the error returned is due to types.KindAppOrSAMLIdPServiceProvider being unsupported, then fallback to attempting to just fetch types.AppServers.
// This is for backwards compatibility with leaf clusters that don't support this new type yet.
// DELETE IN 15.0
if trace.IsNotImplemented(err) {
req, err = convertListResourcesRequest(r, types.KindAppServer)
if err != nil {
return nil, trace.Wrap(err)
}
appServerPage, err := apiclient.GetResourcePage[types.AppServer](r.Context(), clt, req)
if err != nil {
return nil, trace.Wrap(err)
}
// Convert the ResourcePage returned containing AppServers to a ResourcePage containing AppServerOrSAMLIdPServiceProviders.
page = appServerOrSPPageFromAppServerPage(appServerPage)
} else {
return nil, trace.Wrap(err)
}
}

userGroups, err := apiclient.GetAllResources[types.UserGroup](r.Context(), clt, &proto.ListResourcesRequest{
Expand Down Expand Up @@ -406,3 +423,26 @@ func (h *Handler) proxyDNSNames() (dnsNames []string) {
}
return dnsNames
}

// appServerOrSPPageFromAppServerPage converts a ResourcePage containing AppServers to a ResourcePage containing AppServerOrSAMLIdPServiceProviders.
// DELETE IN 15.0
func appServerOrSPPageFromAppServerPage(appServerPage apiclient.ResourcePage[types.AppServer]) apiclient.ResourcePage[types.AppServerOrSAMLIdPServiceProvider] {
resources := make([]types.AppServerOrSAMLIdPServiceProvider, len(appServerPage.Resources))

for i, appServer := range appServerPage.Resources {
// Create AppServerOrSAMLIdPServiceProvider object from appServer.
appServerOrSP := &types.AppServerOrSAMLIdPServiceProviderV1{
Resource: &types.AppServerOrSAMLIdPServiceProviderV1_AppServer{
AppServer: appServer.(*types.AppServerV3),
},
}

resources[i] = appServerOrSP
}

return apiclient.ResourcePage[types.AppServerOrSAMLIdPServiceProvider]{
Resources: resources,
Total: appServerPage.Total,
NextKey: appServerPage.NextKey,
}
}

0 comments on commit 2a54884

Please sign in to comment.