Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
final
  • Loading branch information
nickiichak committed Dec 20, 2018
commit 1eadfa1c22c43ec234181d99606e982da197961d
6 changes: 2 additions & 4 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,8 @@ COPY ./serv/ /usr/src/serv

COPY ./client/ /usr/src/client

#CMD ["./serv/serv", "&"]
COPY ./docker-entrypoint.sh /usr/local/bin

#CMD ["echo", "starting client"]

#CMD ["./client/client"]
ENTRYPOINT docker-entrypoint.sh


23 changes: 13 additions & 10 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@ DOCKER_RUNNER += -w $(REPOSITORY_PATH)/
.PHONY: build
build: build_cli build_serv
docker build -t redis:build .
docker run -it --name redis_build redis:build
./serv/serv &
./client/client

.PHONY: build_cli
build_cli:
Expand All @@ -33,20 +30,26 @@ build_serv:

############### Docker Target ####################
.PHONY: run
run: build_serv
docker build -t redis:default ./serv/
docker run --name redis_default redis:default
run: build
docker run -it --name redis_build redis:build

.PHONY: build_check
build_check:
docker build -t redis:check .
docker build -t redis:checkSR ./$(SERVER_PATH)
docker build -t redis:checkCL ./$(CLIENT_PATH)
################# Testing ####################
.PHONY: check
check: build_check
docker run -it --name redis_check redis:check /bin/bash
echo go vet: client
go vet ./client/
docker run --rm --name redis_checkSR redis:checkSR
docker run --rm --name redis_checkCL redis:checkCL

.PHONY: test
test:
$(DOCKER_RUNNER)$(SERVER_PATH) $(DOCKER_BUILDER) go test -cover -coverprofile=coverage.out

.PHONY: clean
clean:
docker rm -f redis_build &>/dev/null
docker rmi -f redis:build &>/dev/null
docker rmi -f redis:checkSR &>/dev/null
docker rmi -f redis:checkCL &>/dev/null
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
Server-client solution for storing KV data, lightweight analog of the Redis

MAKEFILE:
build - Compiles the binaries for server and for client. Binaries will appear in serv and client dir
build - Compiles the binaries for server and for client and creates the ready-to-use docker container (use make run)

test - Runs Unit and Integration tests for the server. File coverage.out will apeear in the serv dir

check - Runs subsequently "go vet", "goimports", "golint" on the project. Fails if any errors occur.

run - Starts the server with default configuration (port: 9090, storage: RAM)
run - Starts the server and the client with default configuration (port: 9090, storage: RAM)

serv:
-p, --port - The port for listening on (default 9090)
Expand Down
17 changes: 14 additions & 3 deletions client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func startup() (addr string, err error) {
case "-h", "--host":
host = args[i+1]
default:
err = errors.New("ERROR: Unknown command\n")
err = errors.New("ERROR: Unknown command")
return
}
}
Expand All @@ -54,8 +54,19 @@ func main() {
reader := bufio.NewReader(os.Stdin)
command, _ := reader.ReadString('\n')
fmt.Fprintf(conn, command)
message, _ := bufio.NewReader(conn).ReadString('\n')
fmt.Print(message)
/*
var message string
for {
str, err := bufio.NewReader(conn).ReadString('\n')
if err != nil {
fmt.Print(err)
break
}
message = message + str + "\n"
}
*/
message, _ := bufio.NewReader(conn).ReadString('\r')
fmt.Println(string(message))
}
}

Expand Down
12 changes: 9 additions & 3 deletions serv/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
FROM ubuntu
FROM golang:1.11

EXPOSE 9090:9090
EXPOSE 9090

WORKDIR /usr/src/serv

COPY ./ /usr/src/serv

ENTRYPOINT ./serv
COPY ./docker-entrypoint.sh /usr/local/bin

RUN go get -u golang.org/x/lint/golint

RUN go get -u golang.org/x/tools/cmd/goimports

ENTRYPOINT docker-entrypoint.sh


30 changes: 13 additions & 17 deletions serv/saveToDisk.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,12 @@ import (


//Using disk as storage
func saveData(filePath string, clientCh clientChan) (error) {
func saveData(filePath string, clientCh clientChan) {
//Redis disk storage
file, fileErr := os.Create(filePath)
//file, fileErr := os.OpenFile(filePath, os.O_RDWR, 0600)
if fileErr != nil{
panic(fileErr)
return fileErr
}
defer file.Close()
format := "%" + strconv.Itoa(keyBuffLen) + "s %" + strconv.Itoa(valueBuffLen) + "s\n"
Expand Down Expand Up @@ -61,18 +60,17 @@ func saveData(filePath string, clientCh clientChan) (error) {
default:
go func() {
clientCh.output <- ""
err := errors.New("ERROR: Unknown command\n")
err := errors.New("ERROR: Unknown command")
clientCh.err <- err
}()
}
}
return nil
}


func setDisk(file *os.File, cmdList *[]string, format *string)(value string, err error){
if len(*cmdList) != 3 {
err := errors.New("ERROR: Wrong command\nSET <KEY> <VALUE>\n")
err := errors.New("ERROR: Wrong command\nSET <KEY> <VALUE>")
return "", err
}
key := (*cmdList)[1]
Expand All @@ -95,7 +93,7 @@ func setDisk(file *os.File, cmdList *[]string, format *string)(value string, err

func getDisk(file *os.File, cmdList *[]string)(value string, err error){
if len(*cmdList) != 2 {
err := errors.New("ERROR: Wrong command\nGET <KEY>\n")
err := errors.New("ERROR: Wrong command\nGET <KEY>")
return "", err
}
key := (*cmdList)[1]
Expand All @@ -106,16 +104,15 @@ func getDisk(file *os.File, cmdList *[]string)(value string, err error){
if ok {
//Returning the value
return value, nil
} else {
//There are no such key in db
err = errors.New("ERROR: Unknown key \"" + key + "\"\n")
return "", err
}
//There are no such key in db
err = errors.New("ERROR: Unknown key \"" + key + "\"")
return "", err
}

func delDisk(file *os.File, cmdList *[]string, format *string)(value string, err error){
if len(*cmdList) != 2 {
err := errors.New("ERROR: Wrong command\nGET <KEY>\n")
err := errors.New("ERROR: Wrong command\nGET <KEY>")
return "", err
}
key := (*cmdList)[1]
Expand All @@ -129,11 +126,11 @@ func delDisk(file *os.File, cmdList *[]string, format *string)(value string, err
buff := []byte(str)
_, err := file.WriteAt(buff, offset)
return value, err
} else {
//There are no such key in db
err := errors.New("ERROR: Unknown key \"" + key + "\"\n")
return"", err
}
//There are no such key in db
err = errors.New("ERROR: Unknown key \"" + key + "\"")
return"", err

}

func findKey(file *os.File, key *string)(ok bool, value string, offset int64, err error){
Expand All @@ -157,8 +154,7 @@ func findKey(file *os.File, key *string)(ok bool, value string, offset int64, er
if words[0] == *key {
value = words[1]
return true, value, offset, err
} else {
offset += int64(len(str))
}
offset += int64(len(str))
}
}
45 changes: 19 additions & 26 deletions serv/serv.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func startup() (port string, disk bool, filePath string, err error) {
}
}
default:
err = errors.New("ERROR: Unknown command\n")
err = errors.New("ERROR: Unknown command")
return
}
}
Expand Down Expand Up @@ -92,15 +92,15 @@ Loop:
case "exit":
go func() {
clientCh.output <- ""
err := errors.New("exit")
err := errors.New("ERROR")
clientCh.err <- err
}()
break Loop
default:
// sending error
go func() {
clientCh.output <- ""
err := errors.New("ERROR: Wrong command\nUse:\n SET <KEY> <VALUE>\n GET <KEY>\n DEL <KEY>\n")
err := errors.New("ERROR: Wrong command\nUse:\n SET <KEY> <VALUE>\n GET <KEY>\n DEL <KEY>")
clientCh.err <- err
}()
}
Expand All @@ -113,7 +113,7 @@ Loop:
func setRAM(cmdList *[]string, data *(map[string]string))(value string, err error){

if len(*cmdList) != 3 {
err := errors.New("ERROR: Wrong command\nSET <KEY> <VALUE>\n")
err := errors.New("ERROR: Wrong command\nSET <KEY> <VALUE>")
return "", err
}
(*data)[(*cmdList)[1]] = (*cmdList)[2]
Expand All @@ -123,56 +123,54 @@ func setRAM(cmdList *[]string, data *(map[string]string))(value string, err erro
// GET <KEY>
func getRAM(cmdList *[]string, data *(map[string]string))(value string, err error){
if len(*cmdList) != 2 {
err := errors.New("ERROR: Wrong command\nGET <KEY>\n")
err := errors.New("ERROR: Wrong command\nGET <KEY>")
return "", err
}
value, ok := (*data)[(*cmdList)[1]]
if ok {
return value, nil
} else {
err := errors.New("ERROR: Unknown key \"" + (*cmdList)[1] + "\"\n")
return "", err
}
err = errors.New("ERROR: Unknown key \"" + (*cmdList)[1] + "\"")
return "", err
}

// DEL <KEY>
func delRAM(cmdList *[]string, data *(map[string]string))(value string, err error){
if len(*cmdList) != 2 {
err := errors.New("ERROR: Wrong command\nGET <KEY>\n")
err := errors.New("ERROR: Wrong command\nGET <KEY>")
return "", err
}
value, ok := (*data)[(*cmdList)[1]]
if ok {
delete(*data, (*cmdList)[1])
return value, nil
} else {
err := errors.New("ERROR: Unknown key \"" + (*cmdList)[1] + "\"\n")
return "", err
}
err = errors.New("ERROR: Unknown key \"" + (*cmdList)[1] + "\"")
return "", err
}

//Check client's input
func checkInput(clientCh *clientChan, cmdList *[]string)(bool){
if len(*cmdList) < 1 || len(*cmdList) > 3{
go func() {
clientCh.output <- ""
err := errors.New("ERROR: Wrong command\nUse:\n SET <KEY> <VALUE>\n GET <KEY>\n DEL <KEY>\n")
err := errors.New("ERROR: Wrong command\nUse:\n SET <KEY> <VALUE>\n GET <KEY>\n DEL <KEY>")
clientCh.err <- err
}()
return false
}
if len(*cmdList) == 2 && len((*cmdList)[1]) > keyBuffLen {
go func() {
clientCh.output <- ""
err := errors.New("ERROR: The key is too long\n")
err := errors.New("ERROR: The key is too long")
clientCh.err <- err
}()
return false
}
if len(*cmdList) == 3 && (len((*cmdList)[1]) > keyBuffLen || len((*cmdList)[2]) > valueBuffLen){
go func() {
clientCh.output <- ""
err := errors.New("ERROR: Key or value is too long\n")
err := errors.New("ERROR: Key or value is too long")
clientCh.err <- err
}()
return false
Expand All @@ -195,13 +193,13 @@ Loop:
err := <-clientCh.err
switch err{
case nil:
answer += "\n"
io.WriteString(conn, answer)
answer += "\r\n"
case errors.New("exit"):
break Loop
default:
io.WriteString(conn, err.Error())
answer = err.Error() + "\r\n"
}
io.WriteString(conn, answer)
}
}

Expand Down Expand Up @@ -231,18 +229,13 @@ func main() {
err: clErr,
}

if !disk {
//go saveData(filePath, clientCh)
go redis(clientCh)
fmt.Println(filePath)
}
/*if disk {
if disk {
//Storage - disk
go saveData(filePass, clientCh)
go saveData(filePath, clientCh)
} else {
//Storage - RAM
go redis(clientCh)
}*/
}

for {
conn, err := li.Accept()
Expand Down