From 01798bae0cc650c48c8528f18848afdbcf5afc6a Mon Sep 17 00:00:00 2001 From: Ewa Socala Date: Fri, 31 Jul 2015 11:37:00 +0200 Subject: [PATCH] Added http API skeleton server. Part of #11570 --- contrib/for-tests/resource-consumer/Makefile | 7 ++ .../resource-consumer/resource_consumer.go | 31 +++++ .../resource_consumer_handler.go | 113 ++++++++++++++++++ contrib/for-tests/resource-consumer/utils.go | 36 ++++++ 4 files changed, 187 insertions(+) create mode 100644 contrib/for-tests/resource-consumer/Makefile create mode 100644 contrib/for-tests/resource-consumer/resource_consumer.go create mode 100644 contrib/for-tests/resource-consumer/resource_consumer_handler.go create mode 100644 contrib/for-tests/resource-consumer/utils.go diff --git a/contrib/for-tests/resource-consumer/Makefile b/contrib/for-tests/resource-consumer/Makefile new file mode 100644 index 00000000000..c47c67450f3 --- /dev/null +++ b/contrib/for-tests/resource-consumer/Makefile @@ -0,0 +1,7 @@ +all: resource_consumer + +resource_consumer: + go build + +clean: + rm -f resource-consumer diff --git a/contrib/for-tests/resource-consumer/resource_consumer.go b/contrib/for-tests/resource-consumer/resource_consumer.go new file mode 100644 index 00000000000..503e49928ff --- /dev/null +++ b/contrib/for-tests/resource-consumer/resource_consumer.go @@ -0,0 +1,31 @@ +/* +Copyright 2015 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "flag" + "fmt" + "log" + "net/http" +) + +var port = flag.Int("port", 8080, "Port number.") + +func main() { + var resourceConsumerHandler ResourceConsumerHandler + log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), resourceConsumerHandler)) +} diff --git a/contrib/for-tests/resource-consumer/resource_consumer_handler.go b/contrib/for-tests/resource-consumer/resource_consumer_handler.go new file mode 100644 index 00000000000..f181b8532a2 --- /dev/null +++ b/contrib/for-tests/resource-consumer/resource_consumer_handler.go @@ -0,0 +1,113 @@ +/* +Copyright 2015 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "fmt" + "net/http" + "net/url" + "strconv" +) + +const ( + unknownFunction = "unknown function" + incorrectFunctionArgument = "incorrect function argument" + notGivenFunctionArgument = "not given function argument" + consumeCPUAddress = "/ConsumeCPU" + consumeMemAddress = "/ConsumeMem" + getCurrentStatusAddress = "/GetCurrentStatus" + milicoresQuery = "milicores" + megabytesQuery = "megabytes" + durationSecQuery = "durationSec" +) + +type ResourceConsumerHandler struct{} + +func (handler ResourceConsumerHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { + // parsing raw query + query, err := url.ParseQuery(req.URL.RawQuery) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + // handle consumeCPU + if req.URL.Path == consumeCPUAddress { + handler.handleConsumeCPU(w, query) + return + } + // handle consumeMem + if req.URL.Path == consumeMemAddress { + handler.handleConsumeMem(w, query) + return + } + // handle getCurrentStatus + if req.URL.Path == getCurrentStatusAddress { + handler.handleGetCurrentStatus(w) + return + } + http.Error(w, unknownFunction, http.StatusNotFound) +} + +func (handler ResourceConsumerHandler) handleConsumeCPU(w http.ResponseWriter, query url.Values) { + // geting string data for consumeCPU + durationSecString := query.Get(durationSecQuery) + milicoresString := query.Get(milicoresQuery) + if durationSecString == "" || milicoresString == "" { + http.Error(w, notGivenFunctionArgument, http.StatusBadRequest) + return + } else { + // convert data (strings to ints) for consumeCPU + durationSec, durationSecError := strconv.Atoi(durationSecString) + milicores, milicoresError := strconv.Atoi(milicoresString) + if durationSecError != nil || milicoresError != nil { + http.Error(w, incorrectFunctionArgument, http.StatusBadRequest) + return + } + ConsumeCPU(milicores, durationSec) + fmt.Fprintln(w, consumeCPUAddress[1:]) + fmt.Fprintln(w, milicores, milicoresQuery) + fmt.Fprintln(w, durationSec, durationSecQuery) + } + +} + +func (handler ResourceConsumerHandler) handleConsumeMem(w http.ResponseWriter, query url.Values) { + // geting string data for consumeMem + durationSecString := query.Get(durationSecQuery) + megabytesString := query.Get(megabytesQuery) + if durationSecString == "" || megabytesString == "" { + http.Error(w, notGivenFunctionArgument, http.StatusBadRequest) + return + } else { + // convert data (strings to ints) for consumeMem + durationSec, durationSecError := strconv.Atoi(durationSecString) + megabytes, megabytesError := strconv.Atoi(megabytesString) + if durationSecError != nil || megabytesError != nil { + http.Error(w, incorrectFunctionArgument, http.StatusBadRequest) + return + } + ConsumeMem(megabytes, durationSec) + fmt.Fprintln(w, consumeMemAddress[1:]) + fmt.Fprintln(w, megabytes, megabytesQuery) + fmt.Fprintln(w, durationSec, durationSecQuery) + } +} + +func (handler ResourceConsumerHandler) handleGetCurrentStatus(w http.ResponseWriter) { + GetCurrentStatus() + fmt.Fprint(w, getCurrentStatusAddress[1:]) +} diff --git a/contrib/for-tests/resource-consumer/utils.go b/contrib/for-tests/resource-consumer/utils.go new file mode 100644 index 00000000000..5d0b472fa19 --- /dev/null +++ b/contrib/for-tests/resource-consumer/utils.go @@ -0,0 +1,36 @@ +/* +Copyright 2015 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "github.com/golang/glog" +) + +func ConsumeCPU(milicores int, durationSec int) { + glog.Infof("ConsumeCPU milicores: %v, durationSec: %v", milicores, durationSec) + // not implemented +} + +func ConsumeMem(megabytes int, durationSec int) { + glog.Infof("ConsumeMem megabytes: %v, durationSec: %v", megabytes, durationSec) + // not implemented +} + +func GetCurrentStatus() { + glog.Infof("GetCurrentStatus") + // not implemented +}