Skip to content

Commit

Permalink
Add PointOfContact predicate ingest (#1075)
Browse files Browse the repository at this point in the history
* real first

Signed-off-by: Rebecca Metzman <rmetzman@google.com>

* chaning other files

Signed-off-by: Rebecca Metzman <rmetzman@google.com>

* chaning typo

Signed-off-by: Rebecca Metzman <rmetzman@google.com>

* chaning typo

Signed-off-by: Rebecca Metzman <rmetzman@google.com>

* chaning isDep  typo

Signed-off-by: Rebecca Metzman <rmetzman@google.com>

* typo

Signed-off-by: Rebecca Metzman <rmetzman@google.com>

---------

Signed-off-by: Rebecca Metzman <rmetzman@google.com>
Co-authored-by: Rebecca Metzman <rmetzman@google.com>
  • Loading branch information
rmetzman and Rebecca Metzman committed Jul 20, 2023
1 parent d438521 commit 778091b
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 1 deletion.
35 changes: 35 additions & 0 deletions pkg/assembler/assembler.go
Expand Up @@ -29,6 +29,7 @@ type assembler struct{} //nolint: unused
// ingested based on the GUAC ontology. It only has evidence trees as
// ingestion of the software trees are implicit and handled by the
// client library.
// TODO: fix typo in isDepedency
type IngestPredicates struct {
CertifyScorecard []CertifyScorecardIngest `json:"certifyScorecard,omitempty"`
IsDependency []IsDependencyIngest `json:"isDepedency,omitempty"`
Expand All @@ -43,6 +44,7 @@ type IngestPredicates struct {
HashEqual []HashEqualIngest `json:"hashEqual,omitempty"`
PkgEqual []PkgEqualIngest `json:"pkgEqual,omitempty"`
Vex []VexIngest `json:"vex,omitempty"`
PointOfContact []PointOfContactIngest `json:"contact,omitempty"`
}

type CertifyScorecardIngest struct {
Expand Down Expand Up @@ -146,6 +148,15 @@ type VexIngest struct {
VexData *generated.VexStatementInputSpec `json:"vexData,omitempty"`
}

type PointOfContactIngest struct {
// pointOfContact describes either pkg, src or artifact
Pkg *generated.PkgInputSpec `json:"pkg,omitempty"`
PkgMatchFlag generated.MatchFlags `json:"pkgMatchFlag,omitempty"`
Src *generated.SourceInputSpec `json:"src,omitempty"`
Artifact *generated.ArtifactInputSpec `json:"artifact,omitempty"`
PointOfContact *generated.PointOfContactInputSpec `json:"pointOfContact,omitempty"`
}

type HashEqualIngest struct {
// HashEqualIngest describes two artifacts are the same
Artifact *generated.ArtifactInputSpec `json:"artifact,omitempty"`
Expand Down Expand Up @@ -233,6 +244,14 @@ func (i IngestPredicates) GetPackages(ctx context.Context) []*generated.PkgInput
}
}
}
for _, poc := range i.PointOfContact {
if poc.Pkg != nil {
pkgPurl := helpers.PkgInputSpecToPurl(poc.Pkg)
if _, ok := packageMap[pkgPurl]; !ok {
packageMap[pkgPurl] = poc.Pkg
}
}
}
for _, equal := range i.PkgEqual {
if equal.Pkg != nil {
pkgPurl := helpers.PkgInputSpecToPurl(equal.Pkg)
Expand Down Expand Up @@ -297,6 +316,14 @@ func (i IngestPredicates) GetSources(ctx context.Context) []*generated.SourceInp
}
}
}
for _, poc := range i.PointOfContact {
if poc.Src != nil {
sourceString := concatenateSourceInput(poc.Src)
if _, ok := sourceMap[sourceString]; !ok {
sourceMap[sourceString] = poc.Src
}
}
}
sources := make([]*generated.SourceInputSpec, 0, len(sourceMap))

for _, source := range sourceMap {
Expand Down Expand Up @@ -355,6 +382,14 @@ func (i IngestPredicates) GetArtifacts(ctx context.Context) []*generated.Artifac
}
}
}
for _, poc := range i.PointOfContact {
if poc.Artifact != nil {
artifactString := poc.Artifact.Algorithm + ":" + poc.Artifact.Digest
if _, ok := artifactMap[artifactString]; !ok {
artifactMap[artifactString] = poc.Artifact
}
}
}
for _, equal := range i.HashEqual {
if equal.Artifact != nil {
artifactString := equal.Artifact.Algorithm + ":" + equal.Artifact.Digest
Expand Down
26 changes: 25 additions & 1 deletion pkg/assembler/clients/helpers/assembler.go
Expand Up @@ -155,6 +155,13 @@ func GetAssembler(ctx context.Context, gqlclient graphql.Client) func([]assemble
}
}

logger.Infof("assembling PointOfContact: %v", len(p.PointOfContact))
for _, poc := range p.PointOfContact {
if err := ingestPointOfContact(ctx, gqlclient, poc); err != nil {
return err
}
}

logger.Infof("assembling HasSBOM: %v", len(p.HasSBOM))
for _, hb := range p.HasSBOM {
if err := ingestHasSBOM(ctx, gqlclient, hb); err != nil {
Expand Down Expand Up @@ -319,7 +326,7 @@ func ingestCertifyBad(ctx context.Context, client graphql.Client, bad assembler.

func ingestCertifyGood(ctx context.Context, client graphql.Client, good assembler.CertifyGoodIngest) error {
if err := validatePackageSourceOrArtifactInput(good.Pkg, good.Src, good.Artifact, "certifyGood"); err != nil {
return fmt.Errorf("input validation failed for certifyBad: %w", err)
return fmt.Errorf("input validation failed for certifyGood: %w", err)
}

if good.Pkg != nil {
Expand All @@ -334,6 +341,23 @@ func ingestCertifyGood(ctx context.Context, client graphql.Client, good assemble
return err
}

func ingestPointOfContact(ctx context.Context, client graphql.Client, poc assembler.PointOfContactIngest) error {
if err := validatePackageSourceOrArtifactInput(poc.Pkg, poc.Src, poc.Artifact, "pointOfContact"); err != nil {
return fmt.Errorf("input validation failed for pointOfContact: %w", err)
}

if poc.Pkg != nil {
_, err := model.PointOfContactPkg(ctx, client, *poc.Pkg, &poc.PkgMatchFlag, *poc.PointOfContact)
return err
}
if poc.Src != nil {
_, err := model.PointOfContactSrc(ctx, client, *poc.Src, *poc.PointOfContact)
return err
}
_, err := model.PointOfContactArtifact(ctx, client, *poc.Artifact, *poc.PointOfContact)
return err
}

func ingestHasSBOM(ctx context.Context, client graphql.Client, hb assembler.HasSBOMIngest) error {
if hb.Pkg != nil && hb.Artifact != nil {
return fmt.Errorf("unable to create hasSBOM with both Pkg and Src subject specified")
Expand Down
9 changes: 9 additions & 0 deletions pkg/assembler/clients/helpers/bulk.go
Expand Up @@ -183,6 +183,15 @@ func GetBulkAssembler(ctx context.Context, gqlclient graphql.Client) func([]asse
}
}

// TODO: add bulk ingestion for PointOfContact
logger.Infof("assembling PointOfContact: %v", len(p.CertifyGood))
for _, poc := range p.PointOfContact {
if err := ingestPointOfContact(ctx, gqlclient, poc); err != nil {
return fmt.Errorf("ingestPointOfContact failed with error: %w", err)

}
}

// TODO(pxp928): add bulk ingestion for HasSBOM
logger.Infof("assembling HasSBOM: %v", len(p.HasSBOM))
for _, hb := range p.HasSBOM {
Expand Down
9 changes: 9 additions & 0 deletions pkg/assembler/clients/helpers/parallel.go
Expand Up @@ -206,6 +206,15 @@ func GetParallelAssembler(ctx context.Context, gqlclient graphql.Client) func([]
verbs.Go(func() error { return ingestCertifyGood(errGroupVerbCtx, gqlclient, good) })
}

logger.Infof("assembling PointOfContact: %v", len(p.PointOfContact))
for _, poc := range p.PointOfContact {
if errGroupVerbCtx.Err() != nil {
break
}
poc := poc
verbs.Go(func() error { return ingestPointOfContact(errGroupVerbCtx, gqlclient, poc) })
}

logger.Infof("assembling HasSBOM: %v", len(p.HasSBOM))
for _, hb := range p.HasSBOM {
if errGroupVerbCtx.Err() != nil {
Expand Down

0 comments on commit 778091b

Please sign in to comment.