Skip to content

Commit

Permalink
feat: display events in UI (#1871)
Browse files Browse the repository at this point in the history
Signed-off-by: Remington Breeze <[email protected]>
Signed-off-by: Sunghoon Kang <[email protected]>
Co-authored-by: Sunghoon Kang <[email protected]>
  • Loading branch information
rbreeze and devholic committed Apr 22, 2024
1 parent c931876 commit b44fcc7
Show file tree
Hide file tree
Showing 16 changed files with 1,013 additions and 486 deletions.
12 changes: 12 additions & 0 deletions api/service/v1alpha1/service.proto
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ service KargoService {
rpc GetAnalysisTemplate(GetAnalysisTemplateRequest) returns (GetAnalysisTemplateResponse);
rpc DeleteAnalysisTemplate(DeleteAnalysisTemplateRequest) returns (DeleteAnalysisTemplateResponse);
rpc GetAnalysisRun(GetAnalysisRunRequest) returns (GetAnalysisRunResponse);

/* Event APIs */

rpc ListProjectEvents(ListProjectEventsRequest) returns (ListProjectEventsResponse);
}

message ComponentVersions {
Expand Down Expand Up @@ -579,3 +583,11 @@ message DeleteAnalysisTemplateRequest {
message DeleteAnalysisTemplateResponse {
/* explicitly empty */
}

message ListProjectEventsRequest {
string project = 1;
}

message ListProjectEventsResponse {
repeated k8s.io.api.core.v1.Event events = 1;
}
3 changes: 3 additions & 0 deletions charts/kargo/templates/api/cluster-role.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ rules:
resources:
- events
verbs:
- get
- list
- watch
- create
- patch
- apiGroups:
Expand Down
5 changes: 5 additions & 0 deletions cmd/controlplane/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,11 @@ func registerKargoIndexers(ctx context.Context, mgr ctrl.Manager) error {
return fmt.Errorf("index ServiceAccounts by OIDC subjects: %w", err)
}

// Index Events by InvolvedObject's API Group
if err := kubeclient.IndexEventsByInvolvedObjectAPIGroup(ctx, mgr); err != nil {
return fmt.Errorf("index Events by InvolvedObject's API group: %w", err)
}

return nil
}

Expand Down
59 changes: 59 additions & 0 deletions internal/api/list_project_events_v1alpha1.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package api

import (
"context"
"fmt"
"sort"

"connectrpc.com/connect"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/fields"
"sigs.k8s.io/controller-runtime/pkg/client"

kargoapi "github.com/akuity/kargo/api/v1alpha1"
"github.com/akuity/kargo/internal/kubeclient"
svcv1alpha1 "github.com/akuity/kargo/pkg/api/service/v1alpha1"
)

func (s *server) ListProjectEvents(
ctx context.Context,
req *connect.Request[svcv1alpha1.ListProjectEventsRequest],
) (*connect.Response[svcv1alpha1.ListProjectEventsResponse], error) {
project := req.Msg.GetProject()
if err := validateFieldNotEmpty("project", project); err != nil {
return nil, err
}

if err := s.validateProjectExists(ctx, project); err != nil {
return nil, err
}

var eventsList corev1.EventList
if err := s.client.List(
ctx,
&eventsList,
client.InNamespace(req.Msg.GetProject()),
// List Kargo related events only
client.MatchingFieldsSelector{
Selector: fields.OneTermEqualSelector(
kubeclient.EventsByInvolvedObjectAPIGroupIndexField,
kargoapi.GroupVersion.Group,
),
},
); err != nil {
return nil, fmt.Errorf("list events: %w", err)
}

sort.Slice(eventsList.Items, func(i, j int) bool {
return eventsList.Items[i].LastTimestamp.Time.After(eventsList.Items[j].LastTimestamp.Time)
})

events := make([]*corev1.Event, len(eventsList.Items))
for i := range eventsList.Items {
events[i] = &eventsList.Items[i]
}

return connect.NewResponse(&svcv1alpha1.ListProjectEventsResponse{
Events: events,
}), nil
}
22 changes: 22 additions & 0 deletions internal/kubeclient/indexer.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"strings"

corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime/schema"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"

Expand All @@ -15,6 +16,8 @@ import (
)

const (
EventsByInvolvedObjectAPIGroupIndexField = "involvedObject.apiGroup"

FreightByVerifiedStagesIndexField = "verifiedIn"
FreightApprovedForStagesIndexField = "approvedFor"
FreightByWarehouseIndexField = "warehouse"
Expand All @@ -39,6 +42,25 @@ const (
ServiceAccountsByOIDCSubjectIndexField = "subjects"
)

func IndexEventsByInvolvedObjectAPIGroup(ctx context.Context, mgr ctrl.Manager) error {
return mgr.GetFieldIndexer().IndexField(
ctx,
&corev1.Event{},
EventsByInvolvedObjectAPIGroupIndexField,
indexEventsByInvolvedObjectAPIGroup,
)
}

func indexEventsByInvolvedObjectAPIGroup(obj client.Object) []string {
event := obj.(*corev1.Event) // nolint: forcetypeassert
// Ignore invalid APIVersion
gv, _ := schema.ParseGroupVersion(event.InvolvedObject.APIVersion)
if gv.Empty() {
return nil
}
return []string{gv.Group}
}

func IndexStagesByAnalysisRun(ctx context.Context, mgr ctrl.Manager, shardName string) error {
return mgr.GetFieldIndexer().IndexField(
ctx,
Expand Down
1,096 changes: 619 additions & 477 deletions pkg/api/service/v1alpha1/service.pb.go

Large diffs are not rendered by default.

30 changes: 30 additions & 0 deletions pkg/api/service/v1alpha1/svcv1alpha1connect/service.connect.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@
"dependencies": {
"@bufbuild/protobuf": "1.8.0",
"@connectrpc/connect": "1.4.0",
"@connectrpc/connect-web": "1.4.0",
"@connectrpc/connect-query": "1.3.1",
"@connectrpc/connect-web": "1.4.0",
"@fortawesome/fontawesome-svg-core": "^6.5.1",
"@fortawesome/free-brands-svg-icons": "^6.5.1",
"@fortawesome/free-solid-svg-icons": "^6.5.1",
Expand All @@ -61,6 +61,7 @@
"classnames": "^2.5.1",
"dagre": "^0.8.5",
"date-fns": "^2.30.0",
"moment": "^2.30.1",
"monaco-editor": "^0.45.0",
"monaco-yaml": "^5.1.1",
"oauth4webapi": "^2.6.0",
Expand Down
16 changes: 12 additions & 4 deletions ui/pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions ui/src/app.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ export const App = () => (
path={paths.projectAnalysisTemplates}
element={<Project tab='analysisTemplates' />}
/>
<Route path={paths.projectEvents} element={<Project tab='events' />} />
<Route path={paths.stage} element={<Project />} />
<Route path={paths.freight} element={<Project />} />
</Route>
Expand Down
1 change: 1 addition & 0 deletions ui/src/config/paths.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ export const paths = {
project: '/project/:name',
projectCredentials: '/project/:name/credentials',
projectAnalysisTemplates: '/project/:name/analysis-templates',
projectEvents: '/project/:name/events',
stage: '/project/:name/stage/:stageName',
freight: '/project/:name/freight/:freightName',

Expand Down
Loading

0 comments on commit b44fcc7

Please sign in to comment.