Skip to content

Commit 5c43ea9

Browse files
authored
Merge branch 'GoogleCloudPlatform:main' into logscope
2 parents 72b1e16 + c1708c6 commit 5c43ea9

File tree

100 files changed

+5579
-528
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

100 files changed

+5579
-528
lines changed

.ci/infra/terraform/main.tf

+15
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,21 @@ resource "google_project_iam_member" "aiplatform_agent_encrypter_decrypter" {
423423
member = "serviceAccount:service-${google_project.proj.number}@gcp-sa-aiplatform.iam.gserviceaccount.com"
424424
}
425425

426+
# TestAccComputeInstance_confidentialHyperDiskBootDisk
427+
resource "google_project_iam_member" "compute_default_sa_encrypter_decrypter" {
428+
project = google_project.proj.project_id
429+
role = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
430+
member = "serviceAccount:${google_project.proj.number}[email protected]"
431+
}
432+
433+
# TestAccComputeInstance_confidentialHyperDiskBootDisk
434+
resource "google_project_iam_member" "compute_agent_encrypter_decrypter" {
435+
project = google_project.proj.project_id
436+
role = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
437+
member = "serviceAccount:service-${google_project.proj.number}@compute-system.iam.gserviceaccount.com"
438+
}
439+
440+
426441
data "google_organization" "org2" {
427442
organization = var.org2_id
428443
}

.ci/magician/cmd/check_cassettes.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ var checkCassettesCmd = &cobra.Command{
6464

6565
ctlr := source.NewController(env["GOPATH"], "modular-magician", githubToken, rnr)
6666

67-
vt, err := vcr.NewTester(env, rnr)
67+
vt, err := vcr.NewTester(env, "vcr-check-cassettes", "ci-vcr-cassettes", rnr)
6868
if err != nil {
6969
return fmt.Errorf("error creating VCR tester: %w", err)
7070
}
@@ -110,7 +110,10 @@ func execCheckCassettes(commit string, vt *vcr.Tester, ctlr *source.Controller)
110110
if err != nil {
111111
fmt.Println("Error running VCR: ", err)
112112
}
113-
if err := vt.UploadLogs("vcr-check-cassettes", "", "", false, false, vcr.Replaying, provider.Beta); err != nil {
113+
if err := vt.UploadLogs(vcr.UploadLogsOptions{
114+
Mode: vcr.Replaying,
115+
Version: provider.Beta,
116+
}); err != nil {
114117
return fmt.Errorf("error uploading logs: %w", err)
115118
}
116119
fmt.Println(len(result.FailedTests), " failed tests: ", result.FailedTests)

.ci/magician/cmd/test_terraform_vcr.go

+24-5
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ var testTerraformVCRCmd = &cobra.Command{
120120
}
121121
ctlr := source.NewController(env["GOPATH"], "modular-magician", env["GITHUB_TOKEN_DOWNSTREAMS"], rnr)
122122

123-
vt, err := vcr.NewTester(env, rnr)
123+
vt, err := vcr.NewTester(env, "ci-vcr-logs", "ci-vcr-cassettes", rnr)
124124
if err != nil {
125125
return fmt.Errorf("error creating VCR tester: %w", err)
126126
}
@@ -195,7 +195,12 @@ func execTestTerraformVCR(prNumber, mmCommitSha, buildID, projectID, buildStep,
195195
testState = "failure"
196196
}
197197

198-
if err := vt.UploadLogs("ci-vcr-logs", prNumber, buildID, false, false, vcr.Replaying, provider.Beta); err != nil {
198+
if err := vt.UploadLogs(vcr.UploadLogsOptions{
199+
PRNumber: prNumber,
200+
BuildID: buildID,
201+
Mode: vcr.Replaying,
202+
Version: provider.Beta,
203+
}); err != nil {
199204
return fmt.Errorf("error uploading replaying logs: %w", err)
200205
}
201206

@@ -256,11 +261,17 @@ func execTestTerraformVCR(prNumber, mmCommitSha, buildID, projectID, buildStep,
256261
testState = "success"
257262
}
258263

259-
if err := vt.UploadCassettes("ci-vcr-cassettes", prNumber, provider.Beta); err != nil {
264+
if err := vt.UploadCassettes(prNumber, provider.Beta); err != nil {
260265
return fmt.Errorf("error uploading cassettes: %w", err)
261266
}
262267

263-
if err := vt.UploadLogs("ci-vcr-logs", prNumber, buildID, true, false, vcr.Recording, provider.Beta); err != nil {
268+
if err := vt.UploadLogs(vcr.UploadLogsOptions{
269+
PRNumber: prNumber,
270+
BuildID: buildID,
271+
Parallel: true,
272+
Mode: vcr.Recording,
273+
Version: provider.Beta,
274+
}); err != nil {
264275
return fmt.Errorf("error uploading recording logs: %w", err)
265276
}
266277

@@ -283,9 +294,17 @@ func execTestTerraformVCR(prNumber, mmCommitSha, buildID, projectID, buildStep,
283294
testState = "failure"
284295
}
285296

286-
if err := vt.UploadLogs("ci-vcr-logs", prNumber, buildID, true, true, vcr.Replaying, provider.Beta); err != nil {
297+
if err := vt.UploadLogs(vcr.UploadLogsOptions{
298+
PRNumber: prNumber,
299+
BuildID: buildID,
300+
Parallel: true,
301+
AfterRecording: true,
302+
Mode: vcr.Replaying,
303+
Version: provider.Beta,
304+
}); err != nil {
287305
return fmt.Errorf("error uploading recording logs: %w", err)
288306
}
307+
289308
}
290309

291310
hasTerminatedTests := (len(recordingResult.PassedTests) + len(recordingResult.FailedTests)) < len(replayingResult.FailedTests)

.ci/magician/cmd/vcr_cassette_update.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ var vcrCassetteUpdateCmd = &cobra.Command{
9090
}
9191
ctlr := source.NewController(env["GOPATH"], "hashicorp", env["GITHUB_TOKEN_CLASSIC"], rnr)
9292

93-
vt, err := vcr.NewTester(env, rnr)
93+
vt, err := vcr.NewTester(env, "", "ci-vcr-cassettes", rnr)
9494
if err != nil {
9595
return fmt.Errorf("error creating VCR tester: %w", err)
9696
}

.ci/magician/cmd/vcr_cassette_update_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ func TestExecVCRCassetteUpdate(t *testing.T) {
389389
ctlr := source.NewController("gopath", "hashicorp", "token", rnr)
390390
vt, err := vcr.NewTester(map[string]string{
391391
"SA_KEY": "sa_key",
392-
}, rnr)
392+
}, "", "ci-vcr-cassettes", rnr)
393393
if err != nil {
394394
t.Fatalf("Failed to create new tester: %v", err)
395395
}

.ci/magician/vcr/tester.go

+87-36
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,15 @@ type logKey struct {
4848
}
4949

5050
type Tester struct {
51-
env map[string]string // shared environment variables for running tests
52-
rnr ExecRunner // for running commands and manipulating files
53-
baseDir string // the directory in which this tester was created
54-
saKeyPath string // where sa_key.json is relative to baseDir
55-
cassettePaths map[provider.Version]string // where cassettes are relative to baseDir by version
56-
logPaths map[logKey]string // where logs are relative to baseDir by version and mode
57-
repoPaths map[provider.Version]string // relative paths of already cloned repos by version
51+
env map[string]string // shared environment variables for running tests
52+
rnr ExecRunner // for running commands and manipulating files
53+
logBucket string // GCS bucket name to store logs
54+
cassetteBucket string // GCS bucket name to store cassettes
55+
baseDir string // the directory in which this tester was created
56+
saKeyPath string // where sa_key.json is relative to baseDir
57+
cassettePaths map[provider.Version]string // where cassettes are relative to baseDir by version
58+
logPaths map[logKey]string // where logs are relative to baseDir by version and mode
59+
repoPaths map[provider.Version]string // relative paths of already cloned repos by version
5860
}
5961

6062
const accTestParallelism = 32
@@ -67,19 +69,24 @@ var testResultsExpression = regexp.MustCompile(`(?m:^--- (PASS|FAIL|SKIP): (Test
6769
var testPanicExpression = regexp.MustCompile(`^panic: .*`)
6870

6971
// Create a new tester in the current working directory and write the service account key file.
70-
func NewTester(env map[string]string, rnr ExecRunner) (*Tester, error) {
71-
saKeyPath := "sa_key.json"
72-
if err := rnr.WriteFile(saKeyPath, env["SA_KEY"]); err != nil {
73-
return nil, err
72+
func NewTester(env map[string]string, logBucket, cassetteBucket string, rnr ExecRunner) (*Tester, error) {
73+
var saKeyPath string
74+
if saKeyVal, ok := env["SA_KEY"]; ok {
75+
saKeyPath = "sa_key.json"
76+
if err := rnr.WriteFile(saKeyPath, saKeyVal); err != nil {
77+
return nil, err
78+
}
7479
}
7580
return &Tester{
76-
env: env,
77-
rnr: rnr,
78-
baseDir: rnr.GetCWD(),
79-
saKeyPath: saKeyPath,
80-
cassettePaths: make(map[provider.Version]string, provider.NumVersions),
81-
logPaths: make(map[logKey]string, provider.NumVersions*numModes),
82-
repoPaths: make(map[provider.Version]string, provider.NumVersions),
81+
env: env,
82+
rnr: rnr,
83+
logBucket: logBucket,
84+
cassetteBucket: cassetteBucket,
85+
baseDir: rnr.GetCWD(),
86+
saKeyPath: saKeyPath,
87+
cassettePaths: make(map[provider.Version]string, provider.NumVersions),
88+
logPaths: make(map[logKey]string, provider.NumVersions*numModes),
89+
repoPaths: make(map[provider.Version]string, provider.NumVersions),
8390
}, nil
8491
}
8592

@@ -98,19 +105,19 @@ func (vt *Tester) FetchCassettes(version provider.Version, baseBranch, prNumber
98105
vt.rnr.Mkdir(cassettePath)
99106
if baseBranch != "FEATURE-BRANCH-major-release-6.0.0" {
100107
// pull main cassettes (major release uses branch specific casssettes as primary ones)
101-
bucketPath := fmt.Sprintf("gs://ci-vcr-cassettes/%sfixtures/*", version.BucketPath())
108+
bucketPath := fmt.Sprintf("gs://%s/%sfixtures/*", vt.cassetteBucket, version.BucketPath())
102109
if err := vt.fetchBucketPath(bucketPath, cassettePath); err != nil {
103110
fmt.Println("Error fetching cassettes: ", err)
104111
}
105112
}
106113
if baseBranch != "main" {
107-
bucketPath := fmt.Sprintf("gs://ci-vcr-cassettes/%srefs/branches/%s/fixtures/*", version.BucketPath(), baseBranch)
114+
bucketPath := fmt.Sprintf("gs://%s/%srefs/branches/%s/fixtures/*", vt.cassetteBucket, version.BucketPath(), baseBranch)
108115
if err := vt.fetchBucketPath(bucketPath, cassettePath); err != nil {
109116
fmt.Println("Error fetching cassettes: ", err)
110117
}
111118
}
112119
if prNumber != "" {
113-
bucketPath := fmt.Sprintf("gs://ci-vcr-cassettes/%srefs/heads/auto-pr-%s/fixtures/*", version.BucketPath(), prNumber)
120+
bucketPath := fmt.Sprintf("gs://%s/%srefs/heads/auto-pr-%s/fixtures/*", vt.cassetteBucket, version.BucketPath(), prNumber)
114121
if err := vt.fetchBucketPath(bucketPath, cassettePath); err != nil {
115122
fmt.Println("Error fetching cassettes: ", err)
116123
}
@@ -396,49 +403,93 @@ func (vt *Tester) getLogPath(mode Mode, version provider.Version) (string, error
396403
return logPath, nil
397404
}
398405

399-
func (vt *Tester) UploadLogs(logBucket, prNumber, buildID string, parallel, afterRecording bool, mode Mode, version provider.Version) error {
400-
bucketPath := fmt.Sprintf("gs://%s/%s/", logBucket, version)
401-
if prNumber != "" {
402-
bucketPath += fmt.Sprintf("refs/heads/auto-pr-%s/", prNumber)
406+
// UploadLogsOptions defines options for uploading logs.
407+
type UploadLogsOptions struct {
408+
PRNumber string
409+
BuildID string
410+
Parallel bool
411+
AfterRecording bool
412+
Mode Mode
413+
Version provider.Version
414+
}
415+
416+
// UploadLogs uploads logs to Google Cloud Storage.
417+
func (vt *Tester) UploadLogs(opts UploadLogsOptions) error {
418+
bucketPath := fmt.Sprintf("gs://%s/%s/", vt.logBucket, opts.Version)
419+
if opts.PRNumber != "" {
420+
bucketPath += fmt.Sprintf("refs/heads/auto-pr-%s/", opts.PRNumber)
403421
}
404-
if buildID != "" {
405-
bucketPath += fmt.Sprintf("artifacts/%s/", buildID)
422+
if opts.BuildID != "" {
423+
bucketPath += fmt.Sprintf("artifacts/%s/", opts.BuildID)
406424
}
407-
lgky := logKey{mode, version}
425+
lgky := logKey{opts.Mode, opts.Version}
408426
logPath, ok := vt.logPaths[lgky]
409427
if !ok {
410-
return fmt.Errorf("no log path found for mode %s and version %s", mode.Lower(), version)
428+
return fmt.Errorf("no log path found for mode %s and version %s", opts.Mode.Lower(), opts.Version)
429+
}
430+
args := []string{
431+
"-h",
432+
"Content-Type:text/plain",
433+
"-q",
434+
"cp",
435+
"-r",
436+
filepath.Join(vt.baseDir, "testlogs", fmt.Sprintf("%s_test.log", opts.Mode.Lower())),
437+
bucketPath + "build-log/",
411438
}
412-
args := []string{"-h", "Content-Type:text/plain", "-q", "cp", "-r", filepath.Join(vt.baseDir, "testlogs", fmt.Sprintf("%s_test.log", mode.Lower())), bucketPath + "build-log/"}
413439
fmt.Println("Uploading build log:\n", "gsutil", strings.Join(args, " "))
414440
if _, err := vt.rnr.Run("gsutil", args, nil); err != nil {
415441
fmt.Println("Error uploading build log: ", err)
416442
}
417443
var suffix string
418-
if afterRecording {
444+
if opts.AfterRecording {
419445
suffix = "_after_recording"
420446
}
421-
if parallel {
422-
args := []string{"-h", "Content-Type:text/plain", "-m", "-q", "cp", "-r", filepath.Join(vt.baseDir, "testlogs", mode.Lower()+"_build", "*"), fmt.Sprintf("%sbuild-log/%s_build%s/", bucketPath, mode.Lower(), suffix)}
447+
if opts.Parallel {
448+
args := []string{
449+
"-h",
450+
"Content-Type:text/plain",
451+
"-m",
452+
"-q",
453+
"cp",
454+
"-r",
455+
filepath.Join(vt.baseDir, "testlogs", opts.Mode.Lower()+"_build", "*"),
456+
fmt.Sprintf("%sbuild-log/%s_build%s/", bucketPath, opts.Mode.Lower(), suffix),
457+
}
423458
fmt.Println("Uploading build logs:\n", "gsutil", strings.Join(args, " "))
424459
if _, err := vt.rnr.Run("gsutil", args, nil); err != nil {
425460
fmt.Println("Error uploading build logs: ", err)
426461
}
427462
}
428-
args = []string{"-h", "Content-Type:text/plain", "-m", "-q", "cp", "-r", filepath.Join(logPath, "*"), fmt.Sprintf("%s%s%s/", bucketPath, mode.Lower(), suffix)}
463+
args = []string{
464+
"-h",
465+
"Content-Type:text/plain",
466+
"-m",
467+
"-q",
468+
"cp",
469+
"-r",
470+
filepath.Join(logPath, "*"),
471+
fmt.Sprintf("%s%s%s/", bucketPath, opts.Mode.Lower(), suffix),
472+
}
429473
fmt.Println("Uploading logs:\n", "gsutil", strings.Join(args, " "))
430474
if _, err := vt.rnr.Run("gsutil", args, nil); err != nil {
431475
fmt.Println("Error uploading logs: ", err)
476+
vt.printLogs(logPath)
432477
}
433478
return nil
434479
}
435480

436-
func (vt *Tester) UploadCassettes(logBucket, prNumber string, version provider.Version) error {
481+
func (vt *Tester) UploadCassettes(prNumber string, version provider.Version) error {
437482
cassettePath, ok := vt.cassettePaths[version]
438483
if !ok {
439484
return fmt.Errorf("no cassettes found for version %s", version)
440485
}
441-
args := []string{"-m", "-q", "cp", filepath.Join(cassettePath, "*"), fmt.Sprintf("gs://%s/%s/refs/heads/auto-pr-%s/fixtures/", logBucket, version, prNumber)}
486+
args := []string{
487+
"-m",
488+
"-q",
489+
"cp",
490+
filepath.Join(cassettePath, "*"),
491+
fmt.Sprintf("gs://%s/%s/refs/heads/auto-pr-%s/fixtures/", vt.cassetteBucket, version, prNumber),
492+
}
442493
fmt.Println("Uploading cassettes:\n", "gsutil", strings.Join(args, " "))
443494
if _, err := vt.rnr.Run("gsutil", args, nil); err != nil {
444495
fmt.Println("Error uploading cassettes: ", err)

mmv1/api/resource.go

+37-3
Original file line numberDiff line numberDiff line change
@@ -1192,8 +1192,7 @@ func (r Resource) ExtractIdentifiers(url string) []string {
11921192
return result
11931193
}
11941194

1195-
// For example, "projects/{{project}}/schemas/{{name}}", "{{project}}/{{name}}", "{{name}}"
1196-
func (r Resource) RawImportIdFormatsFromIam() []string {
1195+
func (r Resource) IamImportFormats() []string {
11971196
var importFormat []string
11981197

11991198
if r.IamPolicy != nil {
@@ -1202,8 +1201,12 @@ func (r Resource) RawImportIdFormatsFromIam() []string {
12021201
if len(importFormat) == 0 {
12031202
importFormat = r.ImportFormat
12041203
}
1204+
return importFormat
1205+
}
12051206

1206-
return ImportIdFormats(importFormat, r.Identity, r.BaseUrl)
1207+
// For example, "projects/{{project}}/schemas/{{name}}", "{{project}}/{{name}}", "{{name}}"
1208+
func (r Resource) RawImportIdFormatsFromIam() []string {
1209+
return ImportIdFormats(r.IamImportFormats(), r.Identity, r.BaseUrl)
12071210
}
12081211

12091212
// For example, projects/(?P<project>[^/]+)/schemas/(?P<schema>[^/]+)", "(?P<project>[^/]+)/(?P<schema>[^/]+)", "(?P<schema>[^/]+)
@@ -1668,3 +1671,34 @@ func (r Resource) CaiApiVersion(productBackendName, caiProductBaseUrl string) st
16681671
}
16691672
return ""
16701673
}
1674+
1675+
// For example: the uri "projects/{{project}}/schemas/{{name}}"
1676+
// The paramerter is "schema" as "project" is not returned.
1677+
func (r Resource) CaiIamResourceParams() []string {
1678+
resourceUri := strings.ReplaceAll(r.IamResourceUri(), "{{name}}", fmt.Sprintf("{{%s}}", r.IamParentResourceName()))
1679+
1680+
return google.Reject(r.ExtractIdentifiers(resourceUri), func(param string) bool {
1681+
return param == "project"
1682+
})
1683+
}
1684+
1685+
// Gets the Cai IAM asset name template
1686+
// For example: //monitoring.googleapis.com/v3/projects/{{project}}/services/{{service_id}}
1687+
func (r Resource) CaiIamAssetNameTemplate(productBackendName string) string {
1688+
iamImportFormat := r.IamImportFormats()
1689+
if len(iamImportFormat) > 0 {
1690+
name := strings.ReplaceAll(iamImportFormat[0], "{{name}}", fmt.Sprintf("{{%s}}", r.IamParentResourceName()))
1691+
name = strings.ReplaceAll(name, "%", "")
1692+
return fmt.Sprintf("//%s.googleapis.com/%s", productBackendName, name)
1693+
}
1694+
1695+
caiBaseUrl := r.CaiBaseUrl
1696+
1697+
if caiBaseUrl == "" {
1698+
caiBaseUrl = r.SelfLink
1699+
}
1700+
if caiBaseUrl == "" {
1701+
caiBaseUrl = r.BaseUrl
1702+
}
1703+
return fmt.Sprintf("//%s.googleapis.com/%s/{{%s}}", productBackendName, caiBaseUrl, r.IamParentResourceName())
1704+
}

mmv1/google/slice_utils.go

+16
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,19 @@ func Reject[T any](S []T, test func(T) bool) (ret []T) {
3939
func Concat[T any](S1 []T, S2 []T) (ret []T) {
4040
return append(S1, S2...)
4141
}
42+
43+
// difference returns the elements in `S1` that aren't in `S2`.
44+
func Diff(S1, S2 []string) []string {
45+
var ret []string
46+
mb := make(map[string]bool, len(S2))
47+
for _, x := range S2 {
48+
mb[x] = true
49+
}
50+
51+
for _, x := range S1 {
52+
if _, found := mb[x]; !found {
53+
ret = append(ret, x)
54+
}
55+
}
56+
return ret
57+
}

0 commit comments

Comments
 (0)