Skip to content

Commit

Permalink
add get freight command to cli (#1001)
Browse files Browse the repository at this point in the history
Signed-off-by: Kent <[email protected]>
  • Loading branch information
krancour committed Oct 24, 2023
1 parent b2da5b6 commit eb7ebcf
Show file tree
Hide file tree
Showing 8 changed files with 946 additions and 329 deletions.
25 changes: 21 additions & 4 deletions api/v1alpha1/types.proto
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ message Promotion {

message PromotionInfo {
string name = 1 [json_name = "name"];
Freight freight = 2 [json_name = "freight"];
SimpleFreight freight = 2 [json_name = "freight"];
}

message PromotionList {
Expand Down Expand Up @@ -209,17 +209,34 @@ message StageSpec {
}

message Freight {
string api_version = 1 [json_name = "apiVersion"];
string kind = 2 [json_name = "kind"];
github.com.akuity.kargo.pkg.api.metav1.ObjectMeta metadata = 3 [json_name = "metadata"];
string id = 4 [json_name = "id"];
repeated GitCommit commits = 5 [json_name = "commits"];
repeated Image images = 6 [json_name = "images"];
repeated Chart charts = 7 [json_name = "charts"];
FreightStatus status = 8 [json_name = "status"];
}

message FreightStatus {
map<string, Qualification> qualifications = 1;
}

message Qualification {
}

message SimpleFreight {
string id = 1 [json_name = "id"];
optional google.protobuf.Timestamp first_seen = 2 [json_name = "firstSeen"];
repeated GitCommit commits = 4 [json_name = "commits"];
repeated Image images = 5 [json_name = "images"];
repeated Chart charts = 6 [json_name = "charts"];
optional bool qualified = 8 [json_name = "qualified"];
}

message StageStatus {
optional Freight current_freight = 2 [json_name = "currentFreight"];
repeated Freight history = 3 [json_name = "history"];
optional SimpleFreight current_freight = 2 [json_name = "currentFreight"];
repeated SimpleFreight history = 3 [json_name = "history"];
string error = 4 [json_name = "error"];
optional Health health = 5 [json_name = "health"];
optional PromotionInfo current_promotion = 6 [json_name = "currentPromotion"];
Expand Down
25 changes: 16 additions & 9 deletions internal/api/query_freights_v1alpha1.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ func (s *server) QueryFreight(
case GroupByChartRepository:
freightGroups = groupByChartRepo(freight, req.Msg.GetGroup())
default:
freightGroups = noGroupBy(freight)
}

sortFreightGroups(req.Msg.GetOrderBy(), req.Msg.GetReverse(), freightGroups)
Expand Down Expand Up @@ -239,19 +240,23 @@ func groupByChartRepo(
return groups
}

func noGroupBy(freight []kargoapi.Freight) map[string]*svcv1alpha1.FreightList {
freightList := &svcv1alpha1.FreightList{}
for _, f := range freight {
freightList = appendToFreightList(freightList, f)
}
return map[string]*svcv1alpha1.FreightList{
"": freightList,
}
}

func appendToFreightList(list *svcv1alpha1.FreightList, f kargoapi.Freight) *svcv1alpha1.FreightList {
if list == nil {
list = &svcv1alpha1.FreightList{}
}
sf := kargoapi.SimpleFreight{
ID: f.ID,
Commits: f.Commits,
Images: f.Images,
Charts: f.Charts,
}
list.Freight = append(
list.Freight,
v1alpha1.ToFreightProto(sf, &f.CreationTimestamp.Time),
v1alpha1.ToFreightProto(f),
)
return list
}
Expand All @@ -277,7 +282,8 @@ type ByFirstSeen []*apiv1alpha1.Freight
func (a ByFirstSeen) Len() int { return len(a) }
func (a ByFirstSeen) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByFirstSeen) Less(i, j int) bool {
return a[i].FirstSeen.AsTime().Before(a[j].FirstSeen.AsTime())
return a[i].GetMetadata().GetCreationTimestamp().AsTime().
Before(a[j].GetMetadata().GetCreationTimestamp().AsTime())
}

// NOTE: sorting by tag will sort by the first container image we found
Expand All @@ -301,7 +307,8 @@ func (a ByTag) Less(i, j int) bool {
return iTag < jTag
}
// They are not comparable. Fallback to firstSeen
return a[i].FirstSeen.AsTime().Before(a[j].FirstSeen.AsTime())
return a[i].GetMetadata().GetCreationTimestamp().AsTime().
Before(a[j].GetMetadata().GetCreationTimestamp().AsTime())
}

func getRepoAndTag(s *apiv1alpha1.Freight) (string, string, *semver.Version) {
Expand Down
49 changes: 37 additions & 12 deletions internal/api/query_freights_v1alpha1_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"sigs.k8s.io/controller-runtime/pkg/client"

kargoapi "github.com/akuity/kargo/api/v1alpha1"
svcv1meta1 "github.com/akuity/kargo/pkg/api/metav1"
svcv1alpha1 "github.com/akuity/kargo/pkg/api/service/v1alpha1"
"github.com/akuity/kargo/pkg/api/v1alpha1"
)
Expand Down Expand Up @@ -824,38 +825,62 @@ func TestSortFreightGroups(t *testing.T) {
groups: map[string]*svcv1alpha1.FreightList{
"": {
Freight: []*v1alpha1.Freight{
{FirstSeen: timestamppb.New(now)},
{FirstSeen: timestamppb.New(now.Add(time.Hour))},
{FirstSeen: timestamppb.New(now.Add(-time.Hour))},
{
Metadata: &svcv1meta1.ObjectMeta{
CreationTimestamp: timestamppb.New(now),
},
},
{
Metadata: &svcv1meta1.ObjectMeta{
CreationTimestamp: timestamppb.New(now.Add(time.Hour)),
},
},
{
Metadata: &svcv1meta1.ObjectMeta{
CreationTimestamp: timestamppb.New(now.Add(-time.Hour)),
},
},
},
},
},
orderBy: OrderByFirstSeen,
assertions: func(groups map[string]*svcv1alpha1.FreightList) {
require.Len(t, groups[""].Freight, 3)
require.Equal(t, now.Add(-time.Hour), groups[""].Freight[0].FirstSeen.AsTime())
require.Equal(t, now, groups[""].Freight[1].FirstSeen.AsTime())
require.Equal(t, now.Add(time.Hour), groups[""].Freight[2].FirstSeen.AsTime())
require.Equal(t, now.Add(-time.Hour), groups[""].Freight[0].Metadata.CreationTimestamp.AsTime())
require.Equal(t, now, groups[""].Freight[1].Metadata.CreationTimestamp.AsTime())
require.Equal(t, now.Add(time.Hour), groups[""].Freight[2].Metadata.CreationTimestamp.AsTime())
},
},
{
name: "reverse order by first seen",
groups: map[string]*svcv1alpha1.FreightList{
"": {
Freight: []*v1alpha1.Freight{
{FirstSeen: timestamppb.New(now)},
{FirstSeen: timestamppb.New(now.Add(time.Hour))},
{FirstSeen: timestamppb.New(now.Add(-time.Hour))},
{
Metadata: &svcv1meta1.ObjectMeta{
CreationTimestamp: timestamppb.New(now),
},
},
{
Metadata: &svcv1meta1.ObjectMeta{
CreationTimestamp: timestamppb.New(now.Add(time.Hour)),
},
},
{
Metadata: &svcv1meta1.ObjectMeta{
CreationTimestamp: timestamppb.New(now.Add(-time.Hour)),
},
},
},
},
},
orderBy: OrderByFirstSeen,
reverse: true,
assertions: func(groups map[string]*svcv1alpha1.FreightList) {
require.Len(t, groups[""].Freight, 3)
require.Equal(t, now.Add(time.Hour), groups[""].Freight[0].FirstSeen.AsTime())
require.Equal(t, now, groups[""].Freight[1].FirstSeen.AsTime())
require.Equal(t, now.Add(-time.Hour), groups[""].Freight[2].FirstSeen.AsTime())
require.Equal(t, now.Add(time.Hour), groups[""].Freight[0].Metadata.CreationTimestamp.AsTime())
require.Equal(t, now, groups[""].Freight[1].Metadata.CreationTimestamp.AsTime())
require.Equal(t, now.Add(-time.Hour), groups[""].Freight[2].Metadata.CreationTimestamp.AsTime())
},
},
}
Expand Down
111 changes: 91 additions & 20 deletions internal/api/types/v1alpha1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +63,58 @@ func FromStageStatusProto(s *v1alpha1.StageStatus) *kargoapi.StageStatus {
}
history := make(kargoapi.SimpleFreightStack, len(s.GetHistory()))
for idx, freight := range s.GetHistory() {
history[idx] = *FromFreightProto(freight)
history[idx] = *FromSimpleFreightProto(freight)
}
return &kargoapi.StageStatus{
CurrentFreight: FromFreightProto(s.GetCurrentFreight()),
CurrentFreight: FromSimpleFreightProto(s.GetCurrentFreight()),
History: history,
Health: FromHealthProto(s.GetHealth()),
Error: s.GetError(),
}
}

func FromFreightProto(s *v1alpha1.Freight) *kargoapi.SimpleFreight {
func FromFreightProto(f *v1alpha1.Freight) *kargoapi.Freight {
if f == nil {
return nil
}
var objectMeta kubemetav1.ObjectMeta
if f.GetMetadata() != nil {
objectMeta = *typesmetav1.FromObjectMetaProto(f.GetMetadata())
}
commits := make([]kargoapi.GitCommit, len(f.GetCommits()))
for idx, commit := range f.GetCommits() {
commits[idx] = *FromGitCommitProto(commit)
}
images := make([]kargoapi.Image, len(f.GetImages()))
for idx, image := range f.GetImages() {
images[idx] = *FromImageProto(image)
}
charts := make([]kargoapi.Chart, len(f.GetCharts()))
for idx, chart := range f.GetCharts() {
charts[idx] = *FromChartProto(chart)
}
qualifications :=
make(map[string]kargoapi.Qualification, len(f.Status.Qualifications))
for stageName := range f.Status.Qualifications {
qualifications[stageName] = kargoapi.Qualification{}
}
return &kargoapi.Freight{
TypeMeta: kubemetav1.TypeMeta{
APIVersion: kargoapi.GroupVersion.String(),
Kind: "Freight",
},
ObjectMeta: objectMeta,
ID: f.GetId(),
Commits: commits,
Images: images,
Charts: charts,
Status: kargoapi.FreightStatus{
Qualifications: qualifications,
},
}
}

func FromSimpleFreightProto(s *v1alpha1.SimpleFreight) *kargoapi.SimpleFreight {
if s == nil {
return nil
}
Expand Down Expand Up @@ -480,13 +521,13 @@ func FromPromotionPolicyProto(p *v1alpha1.PromotionPolicy) *kargoapi.PromotionPo

func ToStageProto(e kargoapi.Stage) *v1alpha1.Stage {
// Status
var currentFreight *v1alpha1.Freight
var currentFreight *v1alpha1.SimpleFreight
if e.Status.CurrentFreight != nil {
currentFreight = ToFreightProto(*e.Status.CurrentFreight, nil)
currentFreight = ToSimpleFreightProto(*e.Status.CurrentFreight, nil)
}
history := make([]*v1alpha1.Freight, len(e.Status.History))
history := make([]*v1alpha1.SimpleFreight, len(e.Status.History))
for idx := range e.Status.History {
history[idx] = ToFreightProto(e.Status.History[idx], nil)
history[idx] = ToSimpleFreightProto(e.Status.History[idx], nil)
}
var health *v1alpha1.Health
if e.Status.Health != nil {
Expand All @@ -510,7 +551,7 @@ func ToStageProto(e kargoapi.Stage) *v1alpha1.Stage {
}
currentPromotion = &v1alpha1.PromotionInfo{
Name: e.Status.CurrentPromotion.Name,
Freight: ToFreightProto(sf, nil),
Freight: ToSimpleFreightProto(sf, nil),
}
}
return &v1alpha1.Stage{
Expand Down Expand Up @@ -723,25 +764,55 @@ func ToArgoCDHelmImageUpdateProto(a kargoapi.ArgoCDHelmImageUpdate) *v1alpha1.Ar
}
}

func ToFreightProto(e kargoapi.SimpleFreight, firstSeen *time.Time) *v1alpha1.Freight {
func ToFreightProto(f kargoapi.Freight) *v1alpha1.Freight {
metadata := f.ObjectMeta.DeepCopy()
metadata.SetManagedFields(nil)
commits := make([]*v1alpha1.GitCommit, len(f.Commits))
for idx := range f.Commits {
commits[idx] = ToGitCommitProto(f.Commits[idx])
}
images := make([]*v1alpha1.Image, len(f.Images))
for idx := range f.Images {
images[idx] = ToImageProto(f.Images[idx])
}
charts := make([]*v1alpha1.Chart, len(f.Charts))
for idx := range f.Charts {
charts[idx] = ToChartProto(f.Charts[idx])
}
qualifications :=
make(map[string]*v1alpha1.Qualification, len(f.Status.Qualifications))
for stageName := range f.Status.Qualifications {
qualifications[stageName] = &v1alpha1.Qualification{}
}
return &v1alpha1.Freight{
ApiVersion: f.APIVersion,
Kind: f.Kind,
Metadata: typesmetav1.ToObjectMetaProto(*metadata),
Status: &v1alpha1.FreightStatus{
Qualifications: qualifications,
},
}
}

func ToSimpleFreightProto(s kargoapi.SimpleFreight, firstSeen *time.Time) *v1alpha1.SimpleFreight {
var firstSeenProto *timestamppb.Timestamp
if firstSeen != nil {
firstSeenProto = timestamppb.New(*firstSeen)
}
commits := make([]*v1alpha1.GitCommit, len(e.Commits))
for idx := range e.Commits {
commits[idx] = ToGitCommitProto(e.Commits[idx])
commits := make([]*v1alpha1.GitCommit, len(s.Commits))
for idx := range s.Commits {
commits[idx] = ToGitCommitProto(s.Commits[idx])
}
images := make([]*v1alpha1.Image, len(e.Images))
for idx := range e.Images {
images[idx] = ToImageProto(e.Images[idx])
images := make([]*v1alpha1.Image, len(s.Images))
for idx := range s.Images {
images[idx] = ToImageProto(s.Images[idx])
}
charts := make([]*v1alpha1.Chart, len(e.Charts))
for idx := range e.Charts {
charts[idx] = ToChartProto(e.Charts[idx])
charts := make([]*v1alpha1.Chart, len(s.Charts))
for idx := range s.Charts {
charts[idx] = ToChartProto(s.Charts[idx])
}
return &v1alpha1.Freight{
Id: e.ID,
return &v1alpha1.SimpleFreight{
Id: s.ID,
FirstSeen: firstSeenProto,
Commits: commits,
Images: images,
Expand Down
Loading

0 comments on commit eb7ebcf

Please sign in to comment.