Skip to content
Open
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
12 changes: 12 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
FROM golang:1.11

COPY ./server/server_bin /go/src/
COPY ./server /go/src/server
COPY ./client /go/src/client
RUN go get -u golang.org/x/lint/golint && \
go get golang.org/x/tools/cmd/goimports && \
go get github.com/golang/go/src/cmd/vet

WORKDIR /go/src/
ENTRYPOINT ["/go/src/server_bin"]
EXPOSE 9090
84 changes: 84 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
################ Preparation ####################
REPOSITORY_PATH_SERVER := kv_storage_server
REPOSITORY_PATH_CLIENT := kv_storage_client
REGISTRY := agri88
VERSION := $(shell cat VERSION)
BECOME := sudo -E
DOCKER_IMAGE := $(REGISTRY)/kv_storage:$(VERSION)
DOCKER_BUILDER := golang:1.11
DOCKER_RUNNER_SERVER = docker run --rm -v $(CURDIR)/server/:/go/src/$(REPOSITORY_PATH_SERVER)
DOCKER_RUNNER_SERVER += $(DOCKER_ENVS) -w /go/src/$(REPOSITORY_PATH_SERVER)
DOCKER_RUNNER_CLIENT = docker run --rm -v $(CURDIR)/client/:/go/src/$(REPOSITORY_PATH_CLIENT)
DOCKER_RUNNER_CLIENT += $(DOCKER_ENVS) -w /go/src/$(REPOSITORY_PATH_CLIENT)
# search files for fmt and check targets, excluding "vendor" folder
SEARCH_GOFILES = find -not -path '*/vendor/*' -type f -name "*.go"
BUILDER_SERVER = $(DOCKER_RUNNER_SERVER) $(DOCKER_BUILDER)
BUILDER_CLIENT = $(DOCKER_RUNNER_CLIENT) $(DOCKER_BUILDER)
PORT = 9090
CONTAINER_NAME = kv_server
IMAGE_ID := $(shell $(BECOME) docker images -q $(DOCKER_IMAGE))
################ End Preparation ####################
################ Binary Target ####################
build: clean server_bin client_bin

.PHONY: server_bin
server_bin:
mkdir ./server/common_files && \
mkdir ./server/log && \
$(BECOME) $(BUILDER_SERVER) go build -o $@ ./$(@D)
$(BECOME) docker build -t $(DOCKER_IMAGE) ./
.PHONY: client_bin
client_bin:
$(BECOME) $(BUILDER_CLIENT) go build -o $@ ./$(@D)
################ Clean Target ####################
.PHONY: clean
clean:
$(BECOME) $(RM) ./server/server_bin
$(BECOME) $(RM) ./client/client_bin
$(BECOME) $(RM) -r ./server/log
$(BECOME) $(RM) -r ./server/common_files
ifneq ($(shell $(BECOME) docker ps -q -f name=$(CONTAINER_NAME)), )
$(BECOME) docker rm -f $(CONTAINER_NAME)
endif
ifneq ($(IMAGE_ID), )
$(BECOME) docker image rm $(IMAGE_ID)
endif
################ Format and Validate Targets ####################
.PHONY: check
check:
$(BECOME) docker run --name $(CONTAINER_NAME)_check -d $(DOCKER_IMAGE)
$(BECOME) docker exec -it $(CONTAINER_NAME)_check gofmt -s -l ./server
$(BECOME) docker exec -it $(CONTAINER_NAME)_check golint ./server
$(BECOME) docker exec -it $(CONTAINER_NAME)_check go vet ./server
$(BECOME) docker exec -it $(CONTAINER_NAME)_check gofmt -s -l ./client
$(BECOME) docker exec -it $(CONTAINER_NAME)_check golint ./client
$(BECOME) docker exec -it $(CONTAINER_NAME)_check go vet ./client
$(BECOME) docker rm -f $(CONTAINER_NAME)_check
################ Docker Targets ####################
.PHONY: run
ifneq ($(shell $(BECOME) docker ps -a -q -f name= $(CONTAINER_ID)), )
run:
echo container is created
else
ifneq ($(IMAGE_ID), )
run:
$(BECOME) docker run --name $(CONTAINER_NAME) -p $(PORT):9090 -v $(CURDIR)/server/log/:/go/src/log/ -v $(CURDIR)/server/common_files/:/go/src/common_files/ -d $(DOCKER_IMAGE)
else
run: build
$(BECOME) docker run --name $(CONTAINER_NAME) -p $(PORT):9090 -v $(CURDIR)/server/log/:/go/src/log/ -v $(CURDIR)/server/common_files/:/go/src/common_files/ -d $(DOCKER_IMAGE)
endif

endif

.PHONY: stop
ifneq ($(shell $(BECOME) docker ps -a -q -f name= $(CONTAINER_ID)), )
stop:
$(BECOME) docker rm -f $(CONTAINER_NAME)
else
stop:
echo container not exist
endif
################ Test Targets ####################
.PHONY: test
test:
$(BECOME) docker exec -it $(CONTAINER_NAME) go test ./server/ -coverprofile ./common_files/cover.out
1 change: 1 addition & 0 deletions VERSION
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1
54 changes: 54 additions & 0 deletions client/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package main

import (
"bufio"
"flag"
"fmt"
"net"
"os"
)

func main() {

var port string
flag.StringVar(&port, "port", "9090", "listening port")
flag.StringVar(&port, "p", "9090", "listening port")
var host string
flag.StringVar(&host, "h", "127.0.0.1", "listening IP")
flag.StringVar(&host, "host", "127.0.0.1", "listening IP")

flag.Parse()

address := fmt.Sprintf("%v:%v", host, port)
conn, err := net.Dial("tcp", address)
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
for {
var source string
fmt.Print("Enter command: ")
myscanner := bufio.NewScanner(os.Stdin)
myscanner.Scan()
source = myscanner.Text()
if len(source) == 0 {
fmt.Println("Wrong input: no command")
continue
}
// send message
if n, err := conn.Write([]byte(source)); n == 0 || err != nil {
fmt.Println(err)
return
}
// get response
fmt.Print("Server response:")
buff := make([]byte, 1024)
n, err := conn.Read(buff)
if err != nil {
break
}
fmt.Print(string(buff[0:n]))
fmt.Println()
}
}
45 changes: 45 additions & 0 deletions readme
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
use makefile for all actions

make build:
compiling server & client binaries use latest golang docker images, before do that, runs clean command

make run:
runs docker container using earlier built image. Before, if image not exist, build command run automatically
./server/common_files directory contains storage file. optional may contain cover.out file after tests run
./server/log directory contains server log file

make check:
runs golint, go fmt and go vet for verify code

make test:
runs tests if package contains it. cover.out file put into common_files dir

make stop:
force delete docker container if exist it

make clean:
runs for full cleaning project. Delete docker container, docker image, binaries and created directories and
all created files


Work with application

Server
You may run server using flags:
-p --port listening port, default is 9090;
-h --host ip address, default is 0.0.0.0 (listening all ip);
-m --mode storage mode, default is "memory", alternate mode is "disk" (save storage to disk)


Client
You may run client using flags:
-p --port connect to port, default is 9090;
-h --host connect to ip address, default is 127.0.0.1

Commands:
set key value
get key
del key
keys [searching key]


Loading