Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added cloud-spanner emulator add-on. #15160

Merged
merged 3 commits into from
Oct 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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{
agarwalnit marked this conversation as resolved.
Show resolved Hide resolved
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)
}
}