Skip to content

Commit

Permalink
Merge pull request #15160 from agarwalnit/master
Browse files Browse the repository at this point in the history
Added cloud-spanner emulator add-on.
  • Loading branch information
spowelljr authored Oct 28, 2022
2 parents cdc9bf6 + e4b7598 commit 074e681
Show file tree
Hide file tree
Showing 8 changed files with 139 additions and 2 deletions.
2 changes: 1 addition & 1 deletion cmd/minikube/cmd/config/addons_list_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 4 additions & 0 deletions deploy/addons/assets.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
45 changes: 45 additions & 0 deletions deploy/addons/cloud-spanner/deployment.yaml
Original file line number Diff line number Diff line change
@@ -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
5 changes: 5 additions & 0 deletions pkg/addons/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -207,4 +207,9 @@ var Addons = []*Addon{
set: SetBool,
callbacks: []setFn{EnableOrDisableAddon},
},
{
name: "cloud-spanner",
set: SetBool,
callbacks: []setFn{EnableOrDisableAddon},
},
}
7 changes: 7 additions & 0 deletions pkg/minikube/assets/addons.go
Original file line number Diff line number Diff line change
Expand Up @@ -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>,...
Expand Down
3 changes: 3 additions & 0 deletions site/content/en/docs/contrib/tests.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
53 changes: 53 additions & 0 deletions site/content/en/docs/handbook/addons/cloud-spanner.md
Original file line number Diff line number Diff line change
@@ -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
```
22 changes: 21 additions & 1 deletion test/integration/addons_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
Expand Down Expand Up @@ -97,6 +97,7 @@ func TestAddons(t *testing.T) {
{"Olm", validateOlmAddon},
{"CSI", validateCSIDriverAndSnapshots},
{"Headlamp", validateHeadlampAddon},
{"CloudSpanner", validateCloudSpannerAddon},
}
for _, tc := range tests {
tc := tc
Expand Down Expand Up @@ -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)
}
}

0 comments on commit 074e681

Please sign in to comment.