Skip to content

Commit

Permalink
Fix SpannerDatabase resource name in testdata and improve mockspanner
Browse files Browse the repository at this point in the history
  • Loading branch information
maqiuyujoyce committed Aug 17, 2024
1 parent 04a4757 commit b461d89
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 43 deletions.
24 changes: 22 additions & 2 deletions mockgcp/mockspanner/admin/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,15 @@ import (
"strings"

"cloud.google.com/go/longrunning/autogen/longrunningpb"
"github.com/GoogleCloudPlatform/k8s-config-connector/mockgcp/common/projects"
pb "github.com/GoogleCloudPlatform/k8s-config-connector/mockgcp/generated/mockgcp/spanner/admin/database/v1"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/emptypb"
"google.golang.org/protobuf/types/known/timestamppb"
"k8s.io/klog/v2"

"github.com/GoogleCloudPlatform/k8s-config-connector/mockgcp/common/projects"
pb "github.com/GoogleCloudPlatform/k8s-config-connector/mockgcp/generated/mockgcp/spanner/admin/database/v1"
)

var _ pb.DatabaseAdminServer = &SpannerDatabaseV1{}
Expand Down Expand Up @@ -58,6 +61,13 @@ func (s *SpannerDatabaseV1) GetDatabase(ctx context.Context, req *pb.GetDatabase
func (s *SpannerDatabaseV1) CreateDatabase(ctx context.Context, req *pb.CreateDatabaseRequest) (*longrunningpb.Operation, error) {
databaseName := databaseNameFromCreateStatement(req.GetCreateStatement())
fqn := req.GetParent() + "/databases/" + databaseName
if isValid := validateDatabaseName(databaseName); !isValid {
return nil, status.Errorf(codes.InvalidArgument,
"Expected projects/{project ID}/instances/{instance ID}/databases/{database name}\n"+
"Got: %v\nError: Invalid database name: %q. Database name must start with a lowercase letter, "+
"be 2-30 characters long, contain only lowercase letters, numbers, underscores or hyphens, "+
"and not end with an underscore or hyphen.", fqn, databaseName)
}

obj := &pb.Database{}
obj.Name = fqn
Expand All @@ -84,6 +94,16 @@ func (s *SpannerDatabaseV1) CreateDatabase(ctx context.Context, req *pb.CreateDa
})
}

// validateDatabaseName verifies that the databaseName matches the API's
// requirement:
// "Database name must start with a lowercase letter, be 2-30 characters long,
// contain only lowercase letters, numbers, underscores or hyphens, and not end
// with an underscore or hyphen.
func validateDatabaseName(databaseName string) bool {
validDatabaseName := regexp.MustCompile(`^[a-z][-a-z0-9_]*[a-z0-9]$`)
return validDatabaseName.MatchString(databaseName) && len(databaseName) <= 30 && len(databaseName) >= 2
}

func (s *SpannerDatabaseV1) DropDatabase(ctx context.Context, req *pb.DropDatabaseRequest) (*emptypb.Empty, error) {
name, err := s.parseDatabaseName(req.Database)
if err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ metadata:
generation: 2
labels:
cnrm-test: "true"
name: spannerdatabase-${uniqueId}
name: spannerdb-${uniqueId}
namespace: ${uniqueId}
spec:
databaseDialect: GOOGLE_STANDARD_SQL
ddl:
- CREATE TABLE t1 (t1 INT64 NOT NULL,) PRIMARY KEY(t1)
instanceRef:
name: spannerinstance-${uniqueId}
resourceID: spannerdatabase-${uniqueId}
resourceID: spannerdb-${uniqueId}
versionRetentionPeriod: 1h
status:
conditions:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ X-Xss-Protection: 0

---

GET https://spanner.googleapis.com/v1/projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}?alt=json
GET https://spanner.googleapis.com/v1/projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}?alt=json
Content-Type: application/json
User-Agent: Terraform/ (+https://www.terraform.io) Terraform-Plugin-SDK/2.10.1 terraform-provider-google-beta/kcc/controller-manager

Expand All @@ -143,7 +143,7 @@ X-Xss-Protection: 0
{
"error": {
"code": 404,
"message": "database \"projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}\" not found",
"message": "database \"projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}\" not found",
"status": "NOT_FOUND"
}
}
Expand All @@ -155,7 +155,7 @@ Content-Type: application/json
User-Agent: Terraform/ (+https://www.terraform.io) Terraform-Plugin-SDK/2.10.1 terraform-provider-google-beta/kcc/controller-manager

{
"createStatement": "CREATE DATABASE `spannerdatabase-${uniqueId}`"
"createStatement": "CREATE DATABASE `spannerdb-${uniqueId}`"
}

200 OK
Expand All @@ -172,14 +172,14 @@ X-Xss-Protection: 0
{
"metadata": {
"@type": "type.googleapis.com/google.spanner.admin.database.v1.CreateDatabaseMetadata",
"database": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}"
"database": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}"
},
"name": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}/operations/${operationID}"
"name": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}/operations/${operationID}"
}

---

GET https://spanner.googleapis.com/v1/projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}/operations/${operationID}?alt=json
GET https://spanner.googleapis.com/v1/projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}/operations/${operationID}?alt=json
Content-Type: application/json
User-Agent: Terraform/ (+https://www.terraform.io) Terraform-Plugin-SDK/2.10.1 terraform-provider-google-beta/kcc/controller-manager

Expand All @@ -198,22 +198,22 @@ X-Xss-Protection: 0
"done": true,
"metadata": {
"@type": "type.googleapis.com/google.spanner.admin.database.v1.CreateDatabaseMetadata",
"database": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}"
"database": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}"
},
"name": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}/operations/${operationID}",
"name": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}/operations/${operationID}",
"response": {
"@type": "type.googleapis.com/google.spanner.admin.database.v1.Database",
"createTime": "2024-04-01T12:34:56.123456Z",
"databaseDialect": "GOOGLE_STANDARD_SQL",
"name": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}",
"name": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}",
"state": "READY",
"versionRetentionPeriod": "1h"
}
}

---

PATCH https://spanner.googleapis.com/v1/projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}/ddl?alt=json
PATCH https://spanner.googleapis.com/v1/projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}/ddl?alt=json
Content-Type: application/json
User-Agent: Terraform/ (+https://www.terraform.io) Terraform-Plugin-SDK/2.10.1 terraform-provider-google-beta/kcc/controller-manager

Expand All @@ -237,17 +237,17 @@ X-Xss-Protection: 0
{
"metadata": {
"@type": "type.googleapis.com/google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata",
"database": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}",
"database": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}",
"statements": [
"CREATE TABLE t1 (t1 INT64 NOT NULL,) PRIMARY KEY(t1)"
]
},
"name": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}/operations/${operationID}"
"name": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}/operations/${operationID}"
}

---

GET https://spanner.googleapis.com/v1/projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}/operations/${operationID}?alt=json
GET https://spanner.googleapis.com/v1/projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}/operations/${operationID}?alt=json
Content-Type: application/json
User-Agent: Terraform/ (+https://www.terraform.io) Terraform-Plugin-SDK/2.10.1 terraform-provider-google-beta/kcc/controller-manager

Expand All @@ -266,25 +266,25 @@ X-Xss-Protection: 0
"done": true,
"metadata": {
"@type": "type.googleapis.com/google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata",
"database": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}",
"database": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}",
"statements": [
"CREATE TABLE t1 (t1 INT64 NOT NULL,) PRIMARY KEY(t1)"
]
},
"name": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}/operations/${operationID}",
"name": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}/operations/${operationID}",
"response": {
"@type": "type.googleapis.com/google.spanner.admin.database.v1.Database",
"createTime": "2024-04-01T12:34:56.123456Z",
"databaseDialect": "GOOGLE_STANDARD_SQL",
"name": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}",
"name": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}",
"state": "READY",
"versionRetentionPeriod": "1h"
}
}

---

GET https://spanner.googleapis.com/v1/projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}?alt=json
GET https://spanner.googleapis.com/v1/projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}?alt=json
Content-Type: application/json
User-Agent: Terraform/ (+https://www.terraform.io) Terraform-Plugin-SDK/2.10.1 terraform-provider-google-beta/kcc/controller-manager

Expand All @@ -302,14 +302,14 @@ X-Xss-Protection: 0
{
"createTime": "2024-04-01T12:34:56.123456Z",
"databaseDialect": "GOOGLE_STANDARD_SQL",
"name": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}",
"name": "projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}",
"state": "READY",
"versionRetentionPeriod": "1h"
}

---

DELETE https://spanner.googleapis.com/v1/projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdatabase-${uniqueId}?alt=json
DELETE https://spanner.googleapis.com/v1/projects/${projectId}/instances/spannerinstance-${uniqueId}/databases/spannerdb-${uniqueId}?alt=json
Content-Type: application/json
User-Agent: Terraform/ (+https://www.terraform.io) Terraform-Plugin-SDK/2.10.1 terraform-provider-google-beta/kcc/controller-manager

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ interactions:
headers:
Content-Type:
- application/json
url: https://spanner.googleapis.com/v1/projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6?alt=json
url: https://spanner.googleapis.com/v1/projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6?alt=json
method: GET
response:
proto: HTTP/2.0
Expand Down Expand Up @@ -329,7 +329,7 @@ interactions:
remote_addr: ""
request_uri: ""
body: |
{"createStatement":"CREATE DATABASE `spannerdatabase-3eej62fms64k6`"}
{"createStatement":"CREATE DATABASE `spannerdb-3eej62fms64k6`"}
form: {}
headers:
Content-Type:
Expand All @@ -346,10 +346,10 @@ interactions:
uncompressed: true
body: |
{
"name": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6/operations/_auto_op_7b3efdd90c06b543",
"name": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6/operations/_auto_op_7b3efdd90c06b543",
"metadata": {
"@type": "type.googleapis.com/google.spanner.admin.database.v1.CreateDatabaseMetadata",
"database": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6"
"database": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6"
}
}
headers:
Expand All @@ -376,7 +376,7 @@ interactions:
headers:
Content-Type:
- application/json
url: https://spanner.googleapis.com/v1/projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6/operations/_auto_op_7b3efdd90c06b543?alt=json
url: https://spanner.googleapis.com/v1/projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6/operations/_auto_op_7b3efdd90c06b543?alt=json
method: GET
response:
proto: HTTP/2.0
Expand All @@ -388,15 +388,15 @@ interactions:
uncompressed: true
body: |
{
"name": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6/operations/_auto_op_7b3efdd90c06b543",
"name": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6/operations/_auto_op_7b3efdd90c06b543",
"metadata": {
"@type": "type.googleapis.com/google.spanner.admin.database.v1.CreateDatabaseMetadata",
"database": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6"
"database": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6"
},
"done": true,
"response": {
"@type": "type.googleapis.com/google.spanner.admin.database.v1.Database",
"name": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6",
"name": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6",
"state": "READY",
"createTime": "2024-06-18T23:37:24.573540Z",
"versionRetentionPeriod": "1h",
Expand Down Expand Up @@ -429,7 +429,7 @@ interactions:
headers:
Content-Type:
- application/json
url: https://spanner.googleapis.com/v1/projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6/ddl?alt=json
url: https://spanner.googleapis.com/v1/projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6/ddl?alt=json
method: PATCH
response:
proto: HTTP/2.0
Expand All @@ -441,10 +441,10 @@ interactions:
uncompressed: true
body: |
{
"name": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6/operations/_auto_op_f2e2ff6f79751456",
"name": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6/operations/_auto_op_f2e2ff6f79751456",
"metadata": {
"@type": "type.googleapis.com/google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata",
"database": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6",
"database": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6",
"statements": [
"CREATE TABLE t1 (\n t1 INT64 NOT NULL,\n) PRIMARY KEY(t1)"
],
Expand Down Expand Up @@ -488,7 +488,7 @@ interactions:
headers:
Content-Type:
- application/json
url: https://spanner.googleapis.com/v1/projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6/operations/_auto_op_f2e2ff6f79751456?alt=json
url: https://spanner.googleapis.com/v1/projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6/operations/_auto_op_f2e2ff6f79751456?alt=json
method: GET
response:
proto: HTTP/2.0
Expand All @@ -500,10 +500,10 @@ interactions:
uncompressed: true
body: |
{
"name": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6/operations/_auto_op_f2e2ff6f79751456",
"name": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6/operations/_auto_op_f2e2ff6f79751456",
"metadata": {
"@type": "type.googleapis.com/google.spanner.admin.database.v1.UpdateDatabaseDdlMetadata",
"database": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6",
"database": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6",
"statements": [
"CREATE TABLE t1 (\n t1 INT64 NOT NULL,\n) PRIMARY KEY(t1)"
],
Expand Down Expand Up @@ -556,7 +556,7 @@ interactions:
headers:
Content-Type:
- application/json
url: https://spanner.googleapis.com/v1/projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6?alt=json
url: https://spanner.googleapis.com/v1/projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6?alt=json
method: GET
response:
proto: HTTP/2.0
Expand All @@ -568,7 +568,7 @@ interactions:
uncompressed: true
body: |
{
"name": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6",
"name": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6",
"state": "READY",
"createTime": "2024-06-18T23:37:24.573540Z",
"versionRetentionPeriod": "1h",
Expand Down Expand Up @@ -604,7 +604,7 @@ interactions:
headers:
Content-Type:
- application/json
url: https://spanner.googleapis.com/v1/projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6?alt=json
url: https://spanner.googleapis.com/v1/projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6?alt=json
method: GET
response:
proto: HTTP/2.0
Expand All @@ -616,7 +616,7 @@ interactions:
uncompressed: true
body: |
{
"name": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdatabase-3eej62fms64k6",
"name": "projects/example-project/instances/spannerinstance-3eej62fms64k6/databases/spannerdb-3eej62fms64k6",
"state": "READY",
"createTime": "2024-06-18T23:37:24.573540Z",
"versionRetentionPeriod": "1h",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@
apiVersion: spanner.cnrm.cloud.google.com/v1beta1
kind: SpannerDatabase
metadata:
# Database names can be only 30 characters max
name: spannerdatabase-${uniqueId}
# Database names can be only 30 characters max. As ${uniqueId} is a 20-char
# long random alphanumeric string, the prefix can be at most 9-char long.
name: spannerdb-${uniqueId}
spec:
instanceRef:
name: spannerinstance-${uniqueId}
Expand Down

0 comments on commit b461d89

Please sign in to comment.