Merge pull request #15160 from agarwalnit/master

Added cloud-spanner emulator add-on.
pull/15240/head^2
Steven Powell 2022-10-28 13:58:41 -07:00 committed by GitHub
commit 074e681975
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 139 additions and 2 deletions

View File

@ -77,7 +77,7 @@ func TestAddonsList(t *testing.T) {
Ambassador *interface{} `json:"ambassador"`
}
b := make([]byte, 571)
b := make([]byte, 590)
r, w, err := os.Pipe()
if err != nil {
t.Fatalf("failed to create pipe: %v", err)

View File

@ -151,4 +151,8 @@ var (
// HeadlampAssets assets for headlamp addon
//go:embed headlamp/*.yaml headlamp/*.tmpl
HeadlampAssets embed.FS
// CloudSpanner assets for cloud-spanner addon
//go:embed cloud-spanner/*.yaml
CloudSpanner embed.FS
)

View File

@ -0,0 +1,45 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: cloud-spanner-emulator
labels:
app: cloud-spanner-emulator
gcp-auth-skip-secret: "true"
kubernetes.io/minikube-addons-endpoint: cloud-spanner
spec:
replicas: 1
selector:
matchLabels:
app: cloud-spanner-emulator
template:
metadata:
labels:
app: cloud-spanner-emulator
spec:
containers:
- name: cloud-spanner-emulator
image: gcr.io/cloud-spanner-emulator/emulator:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9020
name: http
- containerPort: 9010
name: grpc
---
apiVersion: v1
kind: Service
metadata:
name: cloud-spanner-emulator
labels:
app: cloud-spanner-emulator
spec:
type: NodePort
ports:
- port: 9020
name: http
- port: 9010
name: grpc
selector:
app: cloud-spanner-emulator

View File

@ -207,4 +207,9 @@ var Addons = []*Addon{
set: SetBool,
callbacks: []setFn{EnableOrDisableAddon},
},
{
name: "cloud-spanner",
set: SetBool,
callbacks: []setFn{EnableOrDisableAddon},
},
}

View File

@ -742,6 +742,13 @@ var Addons = map[string]*Addon{
map[string]string{
"Headlamp": "ghcr.io",
}),
"cloud-spanner": NewAddon([]*BinAsset{
MustBinAsset(addons.CloudSpanner, "cloud-spanner/deployment.yaml", vmpath.GuestAddonsDir, "deployment.yaml", "6040"),
}, false, "cloud-spanner", "Google", "", "https://minikube.sigs.k8s.io/docs/handbook/addons/cloud-spanner/", map[string]string{
"CloudSpannerAddon": "cloud-spanner-emulator/emulator",
}, map[string]string{
"CloudSpannerAddon": "gcr.io",
}),
}
// parseMapString creates a map based on `str` which is encoded as <key1>=<value1>,<key2>=<value2>,...

View File

@ -44,6 +44,9 @@ tests the GCP Auth addon with either phony or real credentials and makes sure th
#### validateHeadlampAddon
#### validateCloudSpannerAddon
tests the cloud-spanner addon by ensuring the deployment and pod come up and addon disables
## TestCertOptions
makes sure minikube certs respect the --apiserver-ips and --apiserver-names parameters

View File

@ -0,0 +1,53 @@
---
title: "Using Cloud Spanner Addon"
linkTitle: "Cloud Spanner"
weight: 1
date: 2022-10-14
---
## Cloud Spanner Addon
[Cloud Spanner](https://cloud.google.com/spanner) is a fully managed relational database. The Cloud Spanner addon provides a local emulator to test your local application without incurring the cost of an actual spanner instance.
### Enable Cloud Spanner on minikube
To enable this addon, simply run:
```shell script
minikube addons enable cloud-spanner
```
### Cloud Spanner Endpoints
Cloud Spanner provides two different ports, HTTP and GRPC. List Cloud Spanner emulator urls by running:
``` shell
minikube service cloud-spanner-emulator
####################Sample Output#########################
|-----------|------------------------|-------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|------------------------|-------------|---------------------------|
| default | cloud-spanner-emulator | http/9020 | http://192.168.49.2:30233 |
| | | grpc/9010 | http://192.168.49.2:30556 |
|-----------|------------------------|-------------|---------------------------|
[default cloud-spanner-emulator http/9020
grpc/9010 http://192.168.49.2:30233
http://192.168.49.2:30556]
```
### Using Cloud Spanner within a cluster
Cloud Spanner emulator can be used via endpoint `cloud-spanner-emulator:9020` for http clients and `cloud-spanner-emulator:9010` for grpc clients respectively. If you're using the standard client library for Cloud Spanner then set `SPANNER_EMULATOR_HOST` to the GRPC endpoint `cloud-spanner-emulator:9010`.
### Testing installation
```shell script
kubectl get pods -n cloud-spanner-emulator
```
If everything went well, there should be no errors about Cloud Spanner's installation in your minikube cluster.
### Disable Cloud Spanner
To disable this addon, simply run:
```shell script
minikube addons disable cloud-spanner
```

View File

@ -66,7 +66,7 @@ func TestAddons(t *testing.T) {
t.Fatalf("Failed setting GOOGLE_CLOUD_PROJECT env var: %v", err)
}
args := append([]string{"start", "-p", profile, "--wait=true", "--memory=4000", "--alsologtostderr", "--addons=registry", "--addons=metrics-server", "--addons=volumesnapshots", "--addons=csi-hostpath-driver", "--addons=gcp-auth"}, StartArgs()...)
args := append([]string{"start", "-p", profile, "--wait=true", "--memory=4000", "--alsologtostderr", "--addons=registry", "--addons=metrics-server", "--addons=volumesnapshots", "--addons=csi-hostpath-driver", "--addons=gcp-auth", "--addons=cloud-spanner"}, StartArgs()...)
if !NoneDriver() { // none driver does not support ingress
args = append(args, "--addons=ingress", "--addons=ingress-dns")
}
@ -97,6 +97,7 @@ func TestAddons(t *testing.T) {
{"Olm", validateOlmAddon},
{"CSI", validateCSIDriverAndSnapshots},
{"Headlamp", validateHeadlampAddon},
{"CloudSpanner", validateCloudSpannerAddon},
}
for _, tc := range tests {
tc := tc
@ -743,3 +744,22 @@ func validateHeadlampAddon(ctx context.Context, t *testing.T, profile string) {
t.Fatalf("failed waiting for headlamp pod: %v", err)
}
}
// validateCloudSpannerAddon tests the cloud-spanner addon by ensuring the deployment and pod come up and addon disables
func validateCloudSpannerAddon(ctx context.Context, t *testing.T, profile string) {
defer PostMortemLogs(t, profile)
client, err := kapi.Client(profile)
if err != nil {
t.Fatalf("failed to get Kubernetes client for %s: %v", profile, err)
}
if err := kapi.WaitForDeploymentToStabilize(client, "default", "cloud-spanner-emulator", Minutes(6)); err != nil {
t.Errorf("failed waiting for cloud-spanner-emulator deployment to stabilize: %v", err)
}
if _, err := PodWait(ctx, t, profile, "default", "app=cloud-spanner-emulator", Minutes(6)); err != nil {
t.Errorf("failed waiting for app=cloud-spanner-emulator pod: %v", err)
}
if rr, err := Run(t, exec.CommandContext(ctx, Target(), "addons", "disable", "cloud-spanner", "-p", profile)); err != nil {
t.Errorf("failed to disable cloud-spanner addon: args %q : %v", rr.Command(), err)
}
}