Skip to content

Commit 7fd2865

Browse files
committed
print when emulator is running
1 parent 8d2bbca commit 7fd2865

7 files changed

Lines changed: 457 additions & 0 deletions

File tree

affectedcoarse.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from google.cloud import ndb
2+
from osv import AffectedVersions, ecosystems
3+
from osv.models import MIN_COARSE_VERSION, MAX_COARSE_VERSION, _get_coarse_min_max
4+
import logging
5+
6+
logging.getLogger().setLevel(logging.INFO)
7+
8+
@ndb.tasklet
9+
def main():
10+
q = AffectedVersions.query()
11+
it: ndb.QueryIterator = q.iter()
12+
fs = []
13+
while (yield it.has_next_async()):
14+
av: AffectedVersions = it.next()
15+
if av.coarse_min:
16+
continue
17+
if av.ecosystem == 'GIT':
18+
continue
19+
coarse_min = MIN_COARSE_VERSION
20+
coarse_max = MAX_COARSE_VERSION
21+
e_helper = ecosystems.get(av.ecosystem)
22+
if e_helper is not None:
23+
if len(av.versions) > 0:
24+
try:
25+
all_coarse = [e_helper.coarse_version(v) for v in av.versions]
26+
coarse_min = min(all_coarse)
27+
coarse_max = max(all_coarse)
28+
except NotImplementedError:
29+
# Coarse versioning not yet implemented for this ecosystem.
30+
pass
31+
except ValueError:
32+
logging.warning('Invalid version in %s', av.vuln_id)
33+
elif len(av.events) > 0:
34+
coarse_min, coarse_max = _get_coarse_min_max(av.events, e_helper, av.vuln_id)
35+
else:
36+
logging.warning('AffectedVersions with no versions: %s', av.vuln_id)
37+
38+
print(coarse_min, coarse_max, av.vuln_id)
39+
av.coarse_min = coarse_min
40+
av.coarse_max = coarse_max
41+
fs.append(av.put_async())
42+
yield fs
43+
44+
45+
with ndb.Client(project='oss-vdb').context(cache_policy=False):
46+
logging.info('starting')
47+
main().result()

go/cmd/importer/bucket.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"errors"
6+
"log/slog"
7+
8+
"cloud.google.com/go/storage"
9+
"github.com/google/osv.dev/go/internal/models"
10+
"github.com/google/osv.dev/go/logger"
11+
"google.golang.org/api/iterator"
12+
)
13+
14+
func handleImportBucket(ctx context.Context, config ImporterConfig, sourceRepo *models.SourceRepository) error {
15+
if sourceRepo.Type != models.SourceRepositoryTypeBucket || sourceRepo.Bucket == nil {
16+
return errors.New("invalid SourceRepository for bucket import")
17+
}
18+
logger.Info("Importing bucket source repository",
19+
slog.String("source_repository", sourceRepo.Name), slog.String("bucket", sourceRepo.Bucket.Name))
20+
21+
bucket := config.GCSClient.Bucket(sourceRepo.Bucket.Name)
22+
query := &storage.Query{Prefix: sourceRepo.Bucket.Path}
23+
it := bucket.Objects(ctx, query)
24+
for {
25+
object, err := it.Next()
26+
if errors.Is(err, iterator.Done) {
27+
break
28+
}
29+
if err != nil {
30+
return err
31+
}
32+
if sourceRepo.Bucket.IgnoreLastImportTime || sourceRepo.Bucket.LastUpdated == nil || object.Created.After(*sourceRepo.Bucket.LastUpdated) {
33+
logger.Info("Found object", slog.String("object", object.Name))
34+
}
35+
}
36+
return nil
37+
}

go/cmd/importer/git.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"log/slog"
6+
7+
"github.com/google/osv.dev/go/internal/models"
8+
"github.com/google/osv.dev/go/logger"
9+
)
10+
11+
func handleImportGit(ctx context.Context, config ImporterConfig, sourceRepo *models.SourceRepository) error {
12+
logger.Info("Importing git source repository",
13+
slog.String("source_repository", sourceRepo.Name), slog.String("repo", sourceRepo.Git.URL))
14+
return nil
15+
}

go/cmd/importer/importer.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"flag"
6+
"log/slog"
7+
"os"
8+
"sync"
9+
10+
"cloud.google.com/go/datastore"
11+
"cloud.google.com/go/pubsub/v2"
12+
"cloud.google.com/go/storage"
13+
db "github.com/google/osv.dev/go/internal/database/datastore"
14+
"github.com/google/osv.dev/go/internal/models"
15+
"github.com/google/osv.dev/go/logger"
16+
)
17+
18+
type ImporterConfig struct {
19+
SourceRepoStore models.SourceRepositoryStore
20+
PubSubClient *pubsub.Client
21+
GCSClient *storage.Client
22+
23+
StrictValidation bool
24+
}
25+
26+
func main() {
27+
logger.InitGlobalLogger()
28+
29+
strictValidation := flag.Bool("strict-validation", false, "Fail to import entries that do not pass validation.")
30+
delete := flag.Bool("delete", false, "Bypass importing and propagate record deletions from source to Datastore")
31+
deleteThresholdPct := flag.Float64("delete-threshold-pct", 10.0, "More than this percent of records for a given source being deleted triggers an error")
32+
33+
flag.Parse()
34+
35+
project := os.Getenv("GOOGLE_CLOUD_PROJECT")
36+
if project == "" {
37+
logger.Fatal("GOOGLE_CLOUD_PROJECT environment variable is not set")
38+
}
39+
40+
config := ImporterConfig{
41+
StrictValidation: *strictValidation,
42+
}
43+
44+
datastoreClient, err := datastore.NewClient(context.Background(), project)
45+
if err != nil {
46+
logger.Fatal("Failed to create datastore client", slog.Any("error", err))
47+
}
48+
config.SourceRepoStore = db.NewSourceRepositoryStore(datastoreClient)
49+
50+
config.PubSubClient, err = pubsub.NewClient(context.Background(), project)
51+
if err != nil {
52+
logger.Fatal("Failed to create pubsub client", slog.Any("error", err))
53+
}
54+
55+
config.GCSClient, err = storage.NewClient(context.Background())
56+
if err != nil {
57+
logger.Fatal("Failed to create GCS client", slog.Any("error", err))
58+
}
59+
60+
if *delete {
61+
_ = deleteThresholdPct
62+
logger.Fatal("delete not implemented yet")
63+
}
64+
65+
if err := RunImporter(context.Background(), config); err != nil {
66+
logger.Fatal("Importer failed", slog.Any("error", err))
67+
}
68+
}
69+
70+
func RunImporter(ctx context.Context, config ImporterConfig) error {
71+
logger.Info("Importer started")
72+
var wg sync.WaitGroup
73+
for sourceRepo, err := range config.SourceRepoStore.All(ctx) {
74+
if err != nil {
75+
return err
76+
}
77+
wg.Go(func() {
78+
switch sourceRepo.Type {
79+
case models.SourceRepositoryTypeGit:
80+
if err := handleImportGit(ctx, config, sourceRepo); err != nil {
81+
logger.Error("Failed to import git source repository", slog.Any("error", err), slog.String("source_repository", sourceRepo.Name))
82+
}
83+
case models.SourceRepositoryTypeBucket:
84+
if err := handleImportBucket(ctx, config, sourceRepo); err != nil {
85+
logger.Error("Failed to import bucket source repository", slog.Any("error", err), slog.String("source_repository", sourceRepo.Name))
86+
}
87+
case models.SourceRepositoryTypeREST:
88+
if err := handleImportREST(ctx, config, sourceRepo); err != nil {
89+
logger.Error("Failed to import REST source repository", slog.Any("error", err), slog.String("source_repository", sourceRepo.Name))
90+
}
91+
default:
92+
logger.Error("Unsupported source repository type", slog.String("source_repository", sourceRepo.Name), slog.Any("type", sourceRepo.Type))
93+
}
94+
})
95+
}
96+
wg.Wait()
97+
return nil
98+
}

go/cmd/importer/rest.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"log/slog"
6+
7+
"github.com/google/osv.dev/go/internal/models"
8+
"github.com/google/osv.dev/go/logger"
9+
)
10+
11+
func handleImportREST(ctx context.Context, config ImporterConfig, sourceRepo *models.SourceRepository) error {
12+
logger.Info("Importing REST source repository",
13+
slog.String("source_repository", sourceRepo.Name), slog.String("url", sourceRepo.REST.URL))
14+
return nil
15+
}

go/internal/database/datastore/internal/validate/validate.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,5 +158,6 @@ def main() -> int:
158158

159159
if __name__ == '__main__':
160160
with osv.tests.datastore_emulator(), ndb.Client().context():
161+
print('Datastore emulator running')
161162
ret = main()
162163
sys.exit(ret)

0 commit comments

Comments
 (0)