Skip to content

Commit

Permalink
Support direct route
Browse files Browse the repository at this point in the history
Signed-off-by: Young Bu Park <youngp@microsoft.com>
  • Loading branch information
youngbupark committed Jan 20, 2024
1 parent ecae47b commit 590e100
Show file tree
Hide file tree
Showing 7 changed files with 309 additions and 212 deletions.
94 changes: 59 additions & 35 deletions pkg/corerp/frontend/controller/applications/graph_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package applications
import (
"context"
"encoding/json"
"net/url"
"sort"
"strings"

Expand All @@ -29,6 +30,7 @@ import (
aztoken "github.com/radius-project/radius/pkg/azure/tokencredentials"
"github.com/radius-project/radius/pkg/cli/clients_new/generated"
corerpv20231001preview "github.com/radius-project/radius/pkg/corerp/api/v20231001preview"
"github.com/radius-project/radius/pkg/to"
"github.com/radius-project/radius/pkg/ucp/resources"
)

Expand Down Expand Up @@ -208,11 +210,11 @@ func computeGraph(applicationName string, applicationResources []generated.Gener
resources = append(resources, resource)

// Application-scoped resources are by definition "in" the application
resourcesByIDInApplication[*resource.ID] = true
resourcesByIDInApplication[to.String(resource.ID)] = true
}

for _, resource := range environmentResources {
_, found := resourcesByIDInApplication[*resource.ID]
_, found := resourcesByIDInApplication[to.String(resource.ID)]
if found {
// Appears in both application and environment lists, avoid duplicates.
continue
Expand All @@ -221,7 +223,7 @@ func computeGraph(applicationName string, applicationResources []generated.Gener
// This is an environment-scoped resource. We need to process the connections
// to determine if it's part of the application.
resources = append(resources, resource)
resourcesByIDInApplication[*resource.ID] = false
resourcesByIDInApplication[to.String(resource.ID)] = false
}

// Next we need to process each entry in the resources list and build up the application graph.
Expand All @@ -244,7 +246,7 @@ func computeGraph(applicationName string, applicationResources []generated.Gener
connections = append(connections, providesFromAPIData(resource)...) // Inbound connections based on 'provides'

sort.Slice(connections, func(i, j int) bool {
return *connections[i].ID < *connections[j].ID
return to.String(connections[i].ID) < to.String(connections[j].ID)
})

applicationGraphResource.Connections = connections
Expand Down Expand Up @@ -275,8 +277,8 @@ func computeGraph(applicationName string, applicationResources []generated.Gener
// First process add resources we *know* are in the application to the queue. As we explore the graph we'll
// visit resources outside the application if necessary.
for _, entry := range applicationGraphResourcesByID {
if resourcesByIDInApplication[*entry.ID] {
queue = append(queue, *entry.ID)
if resourcesByIDInApplication[to.String(entry.ID)] {
queue = append(queue, to.String(entry.ID))
}
}

Expand Down Expand Up @@ -357,7 +359,7 @@ func computeGraph(applicationName string, applicationResources []generated.Gener
// Print connections in stable order.
sort.Slice(entry.Connections, func(i, j int) bool {
// Connections are guaranteed to have a name.
return *entry.Connections[i].ID < *entry.Connections[j].ID
return to.String(entry.Connections[i].ID) < to.String(entry.Connections[j].ID)
})

graph.Resources = append(graph.Resources, &entry)
Expand All @@ -372,29 +374,21 @@ func applicationGraphResourceFromID(id string) *corerpv20231001preview.Applicati
return nil // Invalid resource ID, skip
}

appName := application.Name()
appType := application.Type()
provisioningState := string(v1.ProvisioningStateSucceeded)

return &corerpv20231001preview.ApplicationGraphResource{ID: &id,
Name: &appName,
Type: &appType,
ProvisioningState: &provisioningState,
return &corerpv20231001preview.ApplicationGraphResource{
ID: to.Ptr(id),
Name: to.Ptr(application.Name()),
Type: to.Ptr(application.Type()),
ProvisioningState: to.Ptr(string(v1.ProvisioningStateSucceeded)),
}

}

// outputResourceEntryFromID creates a outputResourceEntry from a resource ID.
func outputResourceEntryFromID(id resources.ID) corerpv20231001preview.ApplicationGraphOutputResource {
orID := id.String()
orName := id.Name()
orType := id.Type()
entry := corerpv20231001preview.ApplicationGraphOutputResource{ID: &orID,
Name: &orName,
Type: &orType,
return corerpv20231001preview.ApplicationGraphOutputResource{
ID: to.Ptr(id.String()),
Name: to.Ptr(id.Name()),
Type: to.Ptr(id.Type()),
}

return entry
}

// outputResourcesFromAPIData processes the generic resource representation returned by the Radius API
Expand Down Expand Up @@ -447,13 +441,13 @@ func outputResourcesFromAPIData(resource generated.GenericResource) []*corerpv20

// Produce a stable output
sort.Slice(entries, func(i, j int) bool {
if entries[i].Type != entries[j].Type {
return *entries[i].Type < *entries[j].Type
if to.String(entries[i].Type) != to.String(entries[j].Type) {
return to.String(entries[i].Type) < to.String(entries[j].Type)
}
if entries[i].Name != entries[j].Name {
return *entries[i].Name < *entries[j].Name
if to.String(entries[i].Name) != to.String(entries[j].Name) {
return to.String(entries[i].Name) < to.String(entries[j].Name)
}
return *entries[i].ID < *entries[j].ID
return to.String(entries[i].ID) < to.String(entries[j].ID)

})

Expand Down Expand Up @@ -497,21 +491,50 @@ func connectionsFromAPIData(resource generated.GenericResource) []*corerpv202310
data := corerpv20231001preview.ConnectionProperties{}
err := toStronglyTypedData(connection, &data)
if err == nil {
sourceID, ok := parseSource(to.String(resource.ID), to.String(data.Source))
if !ok {
continue
}

entries = append(entries, &corerpv20231001preview.ApplicationGraphConnection{
ID: data.Source,
Direction: &dir,
ID: to.Ptr(sourceID),
Direction: to.Ptr(dir),
})
}
}

// Produce a stable output
sort.Slice(entries, func(i, j int) bool {
return *entries[i].ID < *entries[j].ID
return to.String(entries[i].ID) < to.String(entries[j].ID)
})

return entries
}

func parseSource(parentID, source string) (string, bool) {
id, err := resources.Parse(source)
if err == nil && id.IsResource() {
return id.String(), true
}

sourceURL, err := url.Parse(source)
if err != nil {
return "", false
}

if sourceURL.Hostname() == "" || strings.Contains(sourceURL.Hostname(), ".") {
return "", false
}

parentIDParsed, err := resources.Parse(parentID)
if err != nil {
return "", false
}

sourceID := strings.Join([]string{parentIDParsed.RootScope(), resources.ProvidersSegment, parentIDParsed.Type(), sourceURL.Hostname()}, resources.SegmentSeparator)
return sourceID, true
}

// providesFromAPIData is specifically to support HTTPRoute.
func providesFromAPIData(resource generated.GenericResource) []*corerpv20231001preview.ApplicationGraphConnection {
// Any Radius resource type that exposes a port uses the following property path to return them.
Expand Down Expand Up @@ -550,19 +573,20 @@ func providesFromAPIData(resource generated.GenericResource) []*corerpv20231001p
data := corerpv20231001preview.ContainerPortProperties{}
err := toStronglyTypedData(connection, &data)
if err == nil {
if *data.Provides == "" {
if to.String(data.Provides) == "" {
continue
}

entries = append(entries, &corerpv20231001preview.ApplicationGraphConnection{
ID: data.Provides,
Direction: &dir,
Direction: to.Ptr(dir),
})
}
}

// Produce a stable output
sort.Slice(entries, func(i, j int) bool {
return *entries[i].ID < *entries[j].ID
return to.String(entries[i].ID) < to.String(entries[j].ID)
})

return entries
Expand Down
Loading

0 comments on commit 590e100

Please sign in to comment.