https://github.com/kieronlangdon/go_api_example_with_db
Go REST api example project with minikube deployment steps and postgres db
https://github.com/kieronlangdon/go_api_example_with_db
go helm kubernetes-deployment minikube-setup restapi unit-testing workflow-automation
Last synced: 6 months ago
JSON representation
Go REST api example project with minikube deployment steps and postgres db
- Host: GitHub
- URL: https://github.com/kieronlangdon/go_api_example_with_db
- Owner: kieronlangdon
- License: gpl-3.0
- Created: 2020-10-13T10:00:21.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2023-01-06T01:01:35.000Z (over 3 years ago)
- Last Synced: 2024-06-19T13:49:09.241Z (about 2 years ago)
- Topics: go, helm, kubernetes-deployment, minikube-setup, restapi, unit-testing, workflow-automation
- Language: Go
- Homepage:
- Size: 42 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# go_api_example_with_db
Extending https://github.com/kieronlangdon/go_api_example with a Postgres DB
Simple GO Lang REST API
> Simple RESTful API to create, read and delete books with a postgres DB
Create/update not implemented yet!
## Quick Start
``` bash
# Install mods
go get -u github.com/gorilla/mux
go get -u github.com/go-resty/resty
go get -u github.com/stretchr/testify/assert
go get -u github.com/stretchr/testify/suite
go get -u github.com/jinzhu/gorm
go get -u github.com/rs/cors
go get -u gorm.io/gorm/clause
```
``` bash
go build
./go_postgres
```
## Endpoints
### Get All Books
``` bash
GET api/books
```
### Get Single Book
``` bash
GET api/books/{id}
```
### Get All Authors and if any books
``` bash
GET api/authorsextra/
```
### Delete Book
``` bash
DELETE api/books/{id}
```
### Create Book
``` bash
POST api/books/
Params =
isbn=12346
title=Adentures Of Mick
```
### Create Author
``` bash
POST api/authors/
Params =
firstname=Tony
lastname=O'Holohan
```
### Update Book
TBC
### Health probe
``` bash
GET healthz
```
### Readiness probe
``` bash
GET readyz
```
### Build steps
``` bash
Set Paths:
export GOPATH=/Users/$USER/go
export PATH=$PATH:$GOPATH/bin;
From:
$GOPATH/src/github.com/$USER/postgres
docker build -t my-go-app .
Enter container using Almquist shell after starting:
docker run -it --rm my-go-app /bin/ash
Run container in detached mode
docker run -p 8080:8001 -d my-go-app
Run Unit tests only
go test -v -run Unit
Run tests with coverage report
go test -coverprofile=c.out
See report in browser (generates html file)
go tool cover -html=c.out -o coverage.html
```
### Minikube setup
```
minikube delete
minikube start
eval $(minikube docker-env)
```
### Minikube steps for error:
https://registry-1.docker.io/v2 connection error while pulling image
`minikube ssh`
`sudo vi /etc/systemd/network/10-eth1.network` add `DNS=8.8.8.8` under [Network]
`sudo vi /etc/systemd/network/20-dhcp.network` add `DNS=8.8.8.8` under [Network]
`sudo systemctl restart systemd-networkd`
### Local registry steps:
**Start registry**
`docker run -d -p 5000:5000 --restart=always --name registry registry:2`
**Build image**
`docker build -t my-go-app .`
**Tag image**
`docker tag my-go-app:latest localhost:5000/my-go-app`
**Push to local registry**
`docker push localhost:5000/my-go-app`
**Remove image local - does not remove from registry**
`docker image remove localhost:5000/my-go-app`
### Create deployment in minikube
`minikube kubectl create deployment testdev -- --image=localhost:5000/my-go-app`
### Alt steps for running minikube and to avoid going down a rabbit hole of nonsense
**Build image**
`docker build -t my-go-app .`
**Tag image**
`docker tag my-go-app:latest localhost:5000/my-go-app`
**Point your terminal to use the docker daemon inside minikube**
`eval $(minikube docker-env)`
**Check to see all images**
`docker images`
Notice that the image we just created and tagged is not here? We're using minikube's docker daemon now
**Push to cache in minikube**
`minikube cache add localhost:5000/my-go-app`
This will fail as the image doesn't exist in this daemon
So in another terminal OR after undoing `eval $(minikube docker-env)`
Re-run `minikube cache add localhost:5000/my-go-app`
**Check image is in minikube cache**
`minikube cache list`
We will see an image with no repo & tag, check the imageId, it's the same as the local image in non minikube docker
**Tag image in minikube docker daemon**
`docker tag c22dbba37091 localhost:5000/my-go-app`
**Create deployment in minikube**
`minikube kubectl create deployment testdev -- --image=localhost:5000/my-go-app`
### Alter deployment yaml to pull from minikube local
Get deployment yaml
`minikube kubectl get deploy testdev -- -o yaml --export >> testdev.yaml`
In testdev.yaml
`imagePullPolicy: Always`
change to
`imagePullPolicy: Never`
Apply yaml
`minikube kubectl apply -- -f testdev.yaml`
### Expose container port using service
Set deployment to expose deployment of type node port
`minikube kubectl expose deployment testdev -- --type=NodePort --port=8001`
Get port that has been exposed externally
` minikube kubectl get svc testdev`
Get minikube ip
`minikube ip`
Test interaction with cluster
`curl 192.168.50:32145/api/books`