mirror of https://github.com/portainer/portainer
fix(waiting-room): search endpoints by edge group name EE-5965 (#10072)
parent
95424c322d
commit
6290e9facc
|
@ -66,6 +66,11 @@ func (handler *Handler) endpointList(w http.ResponseWriter, r *http.Request) *ht
|
||||||
return httperror.InternalServerError("Unable to retrieve environment groups from the database", err)
|
return httperror.InternalServerError("Unable to retrieve environment groups from the database", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
edgeGroups, err := handler.DataStore.EdgeGroup().ReadAll()
|
||||||
|
if err != nil {
|
||||||
|
return httperror.InternalServerError("Unable to retrieve edge groups from the database", err)
|
||||||
|
}
|
||||||
|
|
||||||
endpoints, err := handler.DataStore.Endpoint().Endpoints()
|
endpoints, err := handler.DataStore.Endpoint().Endpoints()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return httperror.InternalServerError("Unable to retrieve environments from the database", err)
|
return httperror.InternalServerError("Unable to retrieve environments from the database", err)
|
||||||
|
@ -88,7 +93,7 @@ func (handler *Handler) endpointList(w http.ResponseWriter, r *http.Request) *ht
|
||||||
|
|
||||||
filteredEndpoints := security.FilterEndpoints(endpoints, endpointGroups, securityContext)
|
filteredEndpoints := security.FilterEndpoints(endpoints, endpointGroups, securityContext)
|
||||||
|
|
||||||
filteredEndpoints, totalAvailableEndpoints, err := handler.filterEndpointsByQuery(filteredEndpoints, query, endpointGroups, settings)
|
filteredEndpoints, totalAvailableEndpoints, err := handler.filterEndpointsByQuery(filteredEndpoints, query, endpointGroups, edgeGroups, settings)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return httperror.InternalServerError("Unable to filter endpoints", err)
|
return httperror.InternalServerError("Unable to filter endpoints", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,7 +118,13 @@ func parseQuery(r *http.Request) (EnvironmentsQuery, error) {
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (handler *Handler) filterEndpointsByQuery(filteredEndpoints []portainer.Endpoint, query EnvironmentsQuery, groups []portainer.EndpointGroup, settings *portainer.Settings) ([]portainer.Endpoint, int, error) {
|
func (handler *Handler) filterEndpointsByQuery(
|
||||||
|
filteredEndpoints []portainer.Endpoint,
|
||||||
|
query EnvironmentsQuery,
|
||||||
|
groups []portainer.EndpointGroup,
|
||||||
|
edgeGroups []portainer.EdgeGroup,
|
||||||
|
settings *portainer.Settings,
|
||||||
|
) ([]portainer.Endpoint, int, error) {
|
||||||
totalAvailableEndpoints := len(filteredEndpoints)
|
totalAvailableEndpoints := len(filteredEndpoints)
|
||||||
|
|
||||||
if len(query.endpointIds) > 0 {
|
if len(query.endpointIds) > 0 {
|
||||||
|
@ -190,7 +196,7 @@ func (handler *Handler) filterEndpointsByQuery(filteredEndpoints []portainer.End
|
||||||
tagsMap[tag.ID] = tag.Name
|
tagsMap[tag.ID] = tag.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
filteredEndpoints = filterEndpointsBySearchCriteria(filteredEndpoints, groups, tagsMap, query.search)
|
filteredEndpoints = filterEndpointsBySearchCriteria(filteredEndpoints, groups, edgeGroups, tagsMap, query.search)
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(query.types) > 0 {
|
if len(query.types) > 0 {
|
||||||
|
@ -285,7 +291,13 @@ func filterEndpointsByGroupIDs(endpoints []portainer.Endpoint, endpointGroupIDs
|
||||||
return endpoints[:n]
|
return endpoints[:n]
|
||||||
}
|
}
|
||||||
|
|
||||||
func filterEndpointsBySearchCriteria(endpoints []portainer.Endpoint, endpointGroups []portainer.EndpointGroup, tagsMap map[portainer.TagID]string, searchCriteria string) []portainer.Endpoint {
|
func filterEndpointsBySearchCriteria(
|
||||||
|
endpoints []portainer.Endpoint,
|
||||||
|
endpointGroups []portainer.EndpointGroup,
|
||||||
|
edgeGroups []portainer.EdgeGroup,
|
||||||
|
tagsMap map[portainer.TagID]string,
|
||||||
|
searchCriteria string,
|
||||||
|
) []portainer.Endpoint {
|
||||||
n := 0
|
n := 0
|
||||||
for _, endpoint := range endpoints {
|
for _, endpoint := range endpoints {
|
||||||
endpointTags := convertTagIDsToTags(tagsMap, endpoint.TagIDs)
|
endpointTags := convertTagIDsToTags(tagsMap, endpoint.TagIDs)
|
||||||
|
@ -300,6 +312,11 @@ func filterEndpointsBySearchCriteria(endpoints []portainer.Endpoint, endpointGro
|
||||||
endpoints[n] = endpoint
|
endpoints[n] = endpoint
|
||||||
n++
|
n++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if edgeGroupMatchSearchCriteria(&endpoint, edgeGroups, searchCriteria) {
|
||||||
|
endpoints[n] = endpoint
|
||||||
|
n++
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return endpoints[:n]
|
return endpoints[:n]
|
||||||
|
@ -378,6 +395,24 @@ func endpointGroupMatchSearchCriteria(endpoint *portainer.Endpoint, endpointGrou
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func edgeGroupMatchSearchCriteria(
|
||||||
|
endpoint *portainer.Endpoint,
|
||||||
|
edgeGroups []portainer.EdgeGroup,
|
||||||
|
searchCriteria string,
|
||||||
|
) bool {
|
||||||
|
for _, edgeGroup := range edgeGroups {
|
||||||
|
for _, endpointID := range edgeGroup.Endpoints {
|
||||||
|
if endpointID == endpoint.ID {
|
||||||
|
if strings.Contains(strings.ToLower(edgeGroup.Name), searchCriteria) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func filterEndpointsByTypes(endpoints []portainer.Endpoint, endpointTypes []portainer.EndpointType) []portainer.Endpoint {
|
func filterEndpointsByTypes(endpoints []portainer.Endpoint, endpointTypes []portainer.EndpointType) []portainer.Endpoint {
|
||||||
typeSet := map[portainer.EndpointType]bool{}
|
typeSet := map[portainer.EndpointType]bool{}
|
||||||
for _, endpointType := range endpointTypes {
|
for _, endpointType := range endpointTypes {
|
||||||
|
|
|
@ -158,7 +158,13 @@ func runTests(tests []filterTest, t *testing.T, handler *Handler, endpoints []po
|
||||||
func runTest(t *testing.T, test filterTest, handler *Handler, endpoints []portainer.Endpoint) {
|
func runTest(t *testing.T, test filterTest, handler *Handler, endpoints []portainer.Endpoint) {
|
||||||
is := assert.New(t)
|
is := assert.New(t)
|
||||||
|
|
||||||
filteredEndpoints, _, err := handler.filterEndpointsByQuery(endpoints, test.query, []portainer.EndpointGroup{}, &portainer.Settings{})
|
filteredEndpoints, _, err := handler.filterEndpointsByQuery(
|
||||||
|
endpoints,
|
||||||
|
test.query,
|
||||||
|
[]portainer.EndpointGroup{},
|
||||||
|
[]portainer.EdgeGroup{},
|
||||||
|
&portainer.Settings{},
|
||||||
|
)
|
||||||
|
|
||||||
is.NoError(err)
|
is.NoError(err)
|
||||||
|
|
||||||
|
|
|
@ -70,6 +70,7 @@ export function useEnvironments({
|
||||||
select: (groups) =>
|
select: (groups) =>
|
||||||
Object.fromEntries(groups.map((g) => [g.Id, g.Name] as const)),
|
Object.fromEntries(groups.map((g) => [g.Id, g.Name] as const)),
|
||||||
});
|
});
|
||||||
|
|
||||||
const environmentEdgeGroupsQuery = useEdgeGroups({
|
const environmentEdgeGroupsQuery = useEdgeGroups({
|
||||||
select: (groups) =>
|
select: (groups) =>
|
||||||
_.groupBy(
|
_.groupBy(
|
||||||
|
@ -80,6 +81,7 @@ export function useEnvironments({
|
||||||
(env) => env.id
|
(env) => env.id
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
|
|
||||||
const tagsQuery = useTags({
|
const tagsQuery = useTags({
|
||||||
select: (tags) =>
|
select: (tags) =>
|
||||||
Object.fromEntries(tags.map((tag) => [tag.ID, tag.Name] as const)),
|
Object.fromEntries(tags.map((tag) => [tag.ID, tag.Name] as const)),
|
||||||
|
|
Loading…
Reference in New Issue