17
17
package deploy
18
18
19
19
import (
20
+ "context"
20
21
"fmt"
21
22
"os"
22
23
"strings"
23
24
24
25
_ "embed"
25
26
27
+ apiv1 "cloud.google.com/go/firestore/apiv1/admin"
28
+ "cloud.google.com/go/firestore/apiv1/admin/adminpb"
26
29
"github.com/nitrictech/nitric/cloud/common/deploy"
27
30
"github.com/nitrictech/nitric/cloud/common/deploy/provider"
28
31
deploymentspb "github.com/nitrictech/nitric/core/pkg/proto/deployments/v1"
29
32
"github.com/pkg/errors"
30
33
"github.com/pulumi/pulumi-gcp/sdk/v6/go/gcp/apigateway"
31
34
"github.com/pulumi/pulumi-gcp/sdk/v6/go/gcp/cloudtasks"
35
+ "github.com/pulumi/pulumi-gcp/sdk/v6/go/gcp/firestore"
32
36
"github.com/pulumi/pulumi-gcp/sdk/v6/go/gcp/organizations"
33
37
"github.com/pulumi/pulumi-gcp/sdk/v6/go/gcp/projects"
34
38
"github.com/pulumi/pulumi-gcp/sdk/v6/go/gcp/pubsub"
@@ -37,6 +41,7 @@ import (
37
41
"github.com/pulumi/pulumi-random/sdk/v4/go/random"
38
42
"github.com/pulumi/pulumi/sdk/v3/go/auto"
39
43
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
44
+ "github.com/samber/lo"
40
45
"golang.org/x/oauth2"
41
46
"golang.org/x/oauth2/google"
42
47
"google.golang.org/api/iamcredentials/v1"
@@ -235,6 +240,19 @@ func (a *NitricGcpPulumiProvider) Pre(ctx *pulumi.Context, resources []*deployme
235
240
return errors .WithMessage (err , "base customRole" )
236
241
}
237
242
243
+ // Check if a key value store exists, if so get/create a (default) firestore database
244
+ kvStoreExists := lo .SomeBy (resources , func (res * deploymentspb.Resource ) bool {
245
+ _ , ok := res .Config .(* deploymentspb.Resource_KeyValueStore )
246
+ return ok
247
+ })
248
+
249
+ if kvStoreExists {
250
+ err := createFirestoreDatabase (ctx , * project .ProjectId , a .region )
251
+ if err != nil {
252
+ return err
253
+ }
254
+ }
255
+
238
256
return nil
239
257
}
240
258
@@ -342,3 +360,35 @@ func NewNitricGcpProvider() *NitricGcpPulumiProvider {
342
360
secrets : make (map [string ]* secretmanager.Secret ),
343
361
}
344
362
}
363
+
364
+ func createFirestoreDatabase (ctx * pulumi.Context , projectId string , location string ) error {
365
+ fsAdminClient , err := apiv1 .NewFirestoreAdminClient (context .TODO ())
366
+ if err != nil {
367
+ return err
368
+ }
369
+
370
+ defaultDb , _ := fsAdminClient .GetDatabase (context .TODO (), & adminpb.GetDatabaseRequest {
371
+ Name : fmt .Sprintf ("projects/%s/databases/(default)" , projectId ),
372
+ })
373
+
374
+ defaultFirestoreId := pulumi .ID ("(default)" )
375
+
376
+ if defaultDb != nil {
377
+ _ , err = firestore .GetDatabase (ctx , "default" , defaultFirestoreId , nil )
378
+ if err != nil {
379
+ return err
380
+ }
381
+ } else {
382
+ _ , err = firestore .NewDatabase (ctx , "default" , & firestore.DatabaseArgs {
383
+ Name : defaultFirestoreId ,
384
+ AppEngineIntegrationMode : pulumi .String ("DISABLED" ),
385
+ LocationId : pulumi .String (location ),
386
+ Type : pulumi .String ("FIRESTORE_NATIVE" ),
387
+ }, pulumi .RetainOnDelete (true ))
388
+ if err != nil {
389
+ return err
390
+ }
391
+ }
392
+
393
+ return nil
394
+ }
0 commit comments