From 7d99b4ec474248f806451f4326a2d2f7ccebadb7 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Fri, 24 Jul 2020 18:02:53 +0530 Subject: [PATCH 01/30] add client.RemoveContainer --- pkg/pushmanager/pushmanager.go | 48 ++++++++++++++++++++++++++++++++++ pkg/webhooks/webhooks.go | 8 ++++++ 2 files changed, 56 insertions(+) diff --git a/pkg/pushmanager/pushmanager.go b/pkg/pushmanager/pushmanager.go index 3ec5513..5cc3036 100644 --- a/pkg/pushmanager/pushmanager.go +++ b/pkg/pushmanager/pushmanager.go @@ -1,2 +1,50 @@ package pushmanager +import ( + "log" + + docker "github.com/fsouza/go-dockerclient" +) + +func ContainerCreate(imageName string) (*docker.Container, error) { + + client, err := docker.NewClientFromEnv() + if err != nil { + panic(err) + } + + client.RemoveContainer(docker.RemoveContainerOptions{ + ID: "", + }) + + ports := []string{"80", "8080"} + portBindings := make(map[docker.Port][]docker.PortBinding) + exposedPorts := map[docker.Port]struct{}{} + + for _, p := range ports { + dockerPort := docker.Port(p + "/tcp") + portBindings[dockerPort] = []docker.PortBinding{{HostIP: "0.0.0.0", HostPort: p}} + exposedPorts[dockerPort] = struct{}{} + } + + container, err := client.CreateContainer(docker.CreateContainerOptions{ + Name: "demo-app-name", + Config: &docker.Config{ + Image: imageName, + ExposedPorts: exposedPorts, + }, + }) + + err = client.StopContainer("8e8e3b6a5423", 0) + if err != nil { + log.Println(err) + } + + client.StartContainer(container.ID, &docker.HostConfig{ + PortBindings: portBindings, + PublishAllPorts: true, + }) + + log.Println(imageName) + return client.InspectContainer(container.ID) +} diff --git a/pkg/webhooks/webhooks.go b/pkg/webhooks/webhooks.go index 9746c92..dc51d0e 100644 --- a/pkg/webhooks/webhooks.go +++ b/pkg/webhooks/webhooks.go @@ -6,6 +6,7 @@ import ( "net/http" "strconv" "ukiyo/pkg/pullmanager" + "ukiyo/pkg/pushmanager" "ukiyo/pkg/util" "github.com/gin-gonic/gin" @@ -66,6 +67,13 @@ func HooksListener(r *gin.Engine) { imageName, responseCode, responseDesc, err = pullmanager.PullToDocker(pullObj) log.Println("pull Manager responseCode :" + strconv.Itoa(responseCode) + " responseDesc : " + responseDesc) + + _, err = pushmanager.ContainerCreate(imageName) + if err != nil { + log.Println(err) + return + } + c.String(http.StatusOK, "OK") }) } From 64d328fa681b36e34b3592cf8a4150f64f162c8f Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sat, 25 Jul 2020 00:39:44 +0530 Subject: [PATCH 02/30] update README.md --- README.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/README.md b/README.md index 224ed36..9c25006 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ - Container manager - Push manager (webhooks configuration) +- Scheduler - OPTIONAL - Pull based update implementation ## Execution modes @@ -28,3 +29,51 @@ Two modes of execution ### Go style guide - https://github.com/rajikaimal/go-styleguide + +## Dev Setup Guide + +Setup docker +```sh +$ go mod init ukiyo +$ go mod tidy +``` + +Create docker binary file +```sh +$ set GOARCH=amd64 +$ set GOOS=linux +$ go build -ldflags="-s -w" -o ukiyo main.go +``` + +Docker build command +```sh +$ docker build -f Dockerfile -t agentukiyo/ukiyo . +$ docker push agentukiyo/ukiyo +$ docker run -p 8080:8080 \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v /home/reinventor/dbs:/dbs \ + agentukiyo/ukiyo +``` + +Add webhook to your dockerhub repository +``` +http:{serverIP}:8080/ukiyo-web-hook +``` + +Add your own docker registy details +``` +http:{serverIP}:8080/add-container +{ + "username":"agentukiyo", + "repoName":"Ukiyo Docker registry", + "accessToken":"f44e334e-1440-4166-a16f-d8fc9d0eb188", + "email":"hansika.16@itfac.mrt.ac.lk", + "serverAddress":"http://docker.io/v1" +} + +http:{serverIP}:8080/edit-container-token +{ + "username":"agentukiyo", + "accessToken":"f44e334e-1440-4166-a16f-d8fc9d0eb188" +} +``` \ No newline at end of file From ba98712ede9295292c88a081009f0a15ffd90c4e Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sat, 25 Jul 2020 13:21:20 +0530 Subject: [PATCH 03/30] remove util --- dbs/secret | 0 docker-compose.yml | 0 internal/validator/validator.go | 0 internal/validator/validator_test.go | 0 pkg/apilayer/apilayer.go | 59 ------------- pkg/apilayer/apilayer_test.go | 65 --------------- pkg/auth/dockerauth.go | 119 --------------------------- pkg/container/container.go | 0 pkg/container/container_test.go | 0 pkg/pullmanager/pullmanager.go | 69 ---------------- pkg/pullmanager/pullmanager_test.go | 28 ------- pkg/pushmanager/pushmanager.go | 50 ----------- pkg/pushmanager/pushmanager_test.go | 1 - pkg/scheduler/scheduler_test.go | 1 - pkg/util/util.go | 13 --- pkg/webhooks/webhooks_test.go | 60 -------------- 16 files changed, 465 deletions(-) delete mode 100644 dbs/secret delete mode 100644 docker-compose.yml delete mode 100644 internal/validator/validator.go delete mode 100644 internal/validator/validator_test.go delete mode 100644 pkg/apilayer/apilayer.go delete mode 100644 pkg/apilayer/apilayer_test.go delete mode 100644 pkg/auth/dockerauth.go delete mode 100644 pkg/container/container.go delete mode 100644 pkg/container/container_test.go delete mode 100644 pkg/pullmanager/pullmanager.go delete mode 100644 pkg/pullmanager/pullmanager_test.go delete mode 100644 pkg/pushmanager/pushmanager.go delete mode 100644 pkg/pushmanager/pushmanager_test.go delete mode 100644 pkg/scheduler/scheduler_test.go delete mode 100644 pkg/util/util.go delete mode 100644 pkg/webhooks/webhooks_test.go diff --git a/dbs/secret b/dbs/secret deleted file mode 100644 index e69de29..0000000 diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index e69de29..0000000 diff --git a/internal/validator/validator.go b/internal/validator/validator.go deleted file mode 100644 index e69de29..0000000 diff --git a/internal/validator/validator_test.go b/internal/validator/validator_test.go deleted file mode 100644 index e69de29..0000000 diff --git a/pkg/apilayer/apilayer.go b/pkg/apilayer/apilayer.go deleted file mode 100644 index 4fe3ed0..0000000 --- a/pkg/apilayer/apilayer.go +++ /dev/null @@ -1,59 +0,0 @@ -package apilayer - -import ( - "encoding/json" - "log" - "net/http" - "ukiyo/pkg/auth" - "ukiyo/pkg/util" - - "github.com/gin-gonic/gin" -) - -func AddContainer(r *gin.Engine) { - r.POST("/add-container", func(c *gin.Context) { - var dockerRegistry auth.DockerRegistry - var responseObj util.ResponseObj - c.ShouldBindJSON(&dockerRegistry) - - b, err := json.Marshal(dockerRegistry) - if err != nil { - log.Println(err) - return - } - log.Println("Requested container registry insert details" + string(b)) - - if len(dockerRegistry.Username) > 0 && len(dockerRegistry.AccessToken) > 0 && len(dockerRegistry.ServerAddress) > 0 { - res := auth.InsertDockerRegData(dockerRegistry) - responseObj = res - } else { - responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Invalid Parameter" - } - c.JSON(http.StatusOK, responseObj) - }) -} - -func EditContainerToken(r *gin.Engine) { - r.POST("/edit-container-token", func(c *gin.Context) { - var registryUpdate auth.RegistryUpdate - var responseObj util.ResponseObj - c.ShouldBindJSON(®istryUpdate) - - b, err := json.Marshal(registryUpdate) - if err != nil { - log.Println(err) - return - } - log.Println("Requested container registry update details" + string(b)) - - if len(registryUpdate.Username) > 0 && len(registryUpdate.AccessToken) > 0 { - res := auth.UpdateDockerRegData(registryUpdate) - responseObj = res - } else { - responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Invalid Parameter" - } - c.JSON(http.StatusOK, responseObj) - }) -} diff --git a/pkg/apilayer/apilayer_test.go b/pkg/apilayer/apilayer_test.go deleted file mode 100644 index 9731874..0000000 --- a/pkg/apilayer/apilayer_test.go +++ /dev/null @@ -1,65 +0,0 @@ -package apilayer - -import ( - "encoding/json" - "github.com/gin-gonic/gin" - "github.com/stretchr/testify/assert" - "log" - "net/http" - "net/http/httptest" - "strings" - "testing" -) - -func TestAddContainer(t *testing.T) { - r := gin.Default() - AddContainer(r) - - registry := `{ - "username":"agentukiyo", - "repoName":"Ukiyo Docker registry", - "accessToken":"f44e334e-1440-4166-a16f-d8fc9d0eb188", - "email":"hansika.16@itfac.mrt.ac.lk", - "serverAddress":"http://docker.io/v1" - }` - - w := httptest.NewRecorder() - req, _ := http.NewRequest("POST", "/add-container", strings.NewReader(registry)) - r.ServeHTTP(w, req) - - assert.Equal(t, http.StatusOK, w.Code) - - var response map[string]string - err := json.Unmarshal([]byte(w.Body.String()), &response) - log.Println(response) - value, exists := response["ResponseCode"] - - assert.Nil(t, err) - assert.True(t, exists) - assert.Equal(t, 0, value) -} - -func TestEditContainer(t *testing.T) { - r := gin.Default() - EditContainerToken(r) - - registry := `{ - "username":"agentukiyo", - "accessToken":"f44e334e-1440-4166-a16f-d8fc9d0eb188", - }` - - w := httptest.NewRecorder() - req, _ := http.NewRequest("POST", "/add-container", strings.NewReader(registry)) - r.ServeHTTP(w, req) - - assert.Equal(t, http.StatusOK, w.Code) - - var response map[string]string - err := json.Unmarshal([]byte(w.Body.String()), &response) - log.Println(response) - value, exists := response["ResponseCode"] - - assert.Nil(t, err) - assert.True(t, exists) - assert.Equal(t, 0, value) -} \ No newline at end of file diff --git a/pkg/auth/dockerauth.go b/pkg/auth/dockerauth.go deleted file mode 100644 index d2395bf..0000000 --- a/pkg/auth/dockerauth.go +++ /dev/null @@ -1,119 +0,0 @@ -package auth - -import ( - "log" - "strings" - "ukiyo/pkg/util" - - docker "github.com/fsouza/go-dockerclient" - "github.com/sonyarouje/simdb/db" -) - -type DockerRegistry struct { - Username string `json:"userName"` - RepoName string `json:"repoName"` - AccessToken string `json:"accessToken"` - Email string `json:"email"` - ServerAddress string `json:"serverAddress"` -} - -type RegistryUpdate struct { - Username string `json:"userName"` - AccessToken string `json:"accessToken"` -} - -var val int - -func DockerLogin(userName string) docker.AuthConfiguration { - - driver, err := db.New("dbs") - if err != nil { - panic(err) - } - - var registries DockerRegistry - err = driver.Open(DockerRegistry{}).Where("userName", "=", userName).First().AsEntity(®istries) - if err != nil { - panic(err) - } - - if len(registries.Username) == 0 { - panic("User's Registry Credentials is not exist. : " + userName) - } - - return docker.AuthConfiguration{ - Username: registries.Username, - Password: registries.AccessToken, - Email: registries.Email, - ServerAddress: registries.ServerAddress, - } -} - -func InsertDockerRegData(dockerRegistry DockerRegistry) util.ResponseObj { - var responseObj util.ResponseObj - - driver, err := db.New("dbs") - if err != nil { - panic(err) - } - - var registries []DockerRegistry - err = driver.Open(DockerRegistry{}).Where("userName", "=", dockerRegistry.Username).Get().AsEntity(®istries) - if err != nil { - panic(err) - } - - for _, registry := range registries { - if strings.EqualFold(registry.Username, dockerRegistry.Username) { - val = val + 1 - responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Already Exist" - log.Println("Already Exist The Registry : " + registry.Username) - } - } - - if val == 0 { - err = driver.Insert(dockerRegistry) - if err != nil { - panic(err) - } - responseObj.ResponseCode = 0 - responseObj.ResponseDesc = "Successfully Added" - } - - return responseObj -} - -func UpdateDockerRegData(registryUpdate RegistryUpdate) util.ResponseObj { - var responseObj util.ResponseObj - - driver, err := db.New("dbs") - if err != nil { - panic(err) - } - - var registries DockerRegistry - err = driver.Open(DockerRegistry{}).Where("userName", "=", registryUpdate.Username).First().AsEntity(®istries) - if err != nil { - panic(err) - } - - registries.AccessToken = registryUpdate.AccessToken - err = driver.Update(registries) - if err != nil { - responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Update Failed" - panic(err) - } else { - responseObj.ResponseCode = 0 - responseObj.ResponseDesc = "Successfully Updated" - } - - return responseObj -} - -func (c DockerRegistry) ID() (jsonField string, value interface{}) { - value = c.Username - jsonField = "userName" - return -} diff --git a/pkg/container/container.go b/pkg/container/container.go deleted file mode 100644 index e69de29..0000000 diff --git a/pkg/container/container_test.go b/pkg/container/container_test.go deleted file mode 100644 index e69de29..0000000 diff --git a/pkg/pullmanager/pullmanager.go b/pkg/pullmanager/pullmanager.go deleted file mode 100644 index 31f3960..0000000 --- a/pkg/pullmanager/pullmanager.go +++ /dev/null @@ -1,69 +0,0 @@ -package pullmanager - -import ( - "encoding/json" - "log" - "strings" - "ukiyo/pkg/auth" - "ukiyo/pkg/util" - - docker "github.com/fsouza/go-dockerclient" -) - -var val int -var imageName string - -func PullToDocker(str util.PullObj) (string, int, string, error) { - b, err := json.Marshal(str) - if err != nil { - log.Println(err) - return "", 1, "Invalid pull image Obj", err - } - imageName = str.RepoName + ":" + str.Tag - log.Println("pull images : " + string(b)) - - client, err := docker.NewClientFromEnv() - if err != nil { - panic(err) - } - - err = client.PullImage(DockerPullImage(str), auth.DockerLogin(str.Namespace)) - - if err != nil { - panic(err) - } - - imgs, err := client.ListImages(docker.ListImagesOptions{All: false}) - - if err != nil { - panic(err) - } - - for _, img := range imgs { - for _, repo := range img.RepoTags { - if strings.EqualFold(repo, imageName) { - val = val + 1 - log.Println("Successfully pull the images : " + repo) - } - } - } - - if val > 0 { - return imageName, 0, "Successfully pull the images", err - } else { - return "", 1, "Failed pull the images", err - } -} - -func DockerPullImage(str util.PullObj) docker.PullImageOptions { - return docker.PullImageOptions{ - Repository: str.RepoName, - Tag: str.Tag, - Platform: "", - Registry: "", - OutputStream: nil, - RawJSONStream: false, - InactivityTimeout: 0, - Context: nil, - } -} diff --git a/pkg/pullmanager/pullmanager_test.go b/pkg/pullmanager/pullmanager_test.go deleted file mode 100644 index b922dfb..0000000 --- a/pkg/pullmanager/pullmanager_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package pullmanager - -import ( - "testing" - "ukiyo/pkg/util" - - "github.com/stretchr/testify/assert" -) - -var responseCode int -var responseDesc string - -func TestAddContainer(t *testing.T) { - - var pullObj util.PullObj - pullObj.Namespace = "agentukiyo" - pullObj.RepoName = "agentukiyo/ukiyo" - pullObj.Tag = "02" - pullObj.PushedDate = 2020121234 - imageName, responseCode, responseDesc, err := PullToDocker(pullObj) - if err != nil { - panic(err) - } - - assert.Equal(t, "", imageName) - assert.Equal(t, 0, responseCode) - assert.Equal(t, "Successfully pull the images", responseDesc) -} diff --git a/pkg/pushmanager/pushmanager.go b/pkg/pushmanager/pushmanager.go deleted file mode 100644 index 5cc3036..0000000 --- a/pkg/pushmanager/pushmanager.go +++ /dev/null @@ -1,50 +0,0 @@ -package pushmanager - -import ( - "log" - - docker "github.com/fsouza/go-dockerclient" -) - -func ContainerCreate(imageName string) (*docker.Container, error) { - - client, err := docker.NewClientFromEnv() - if err != nil { - panic(err) - } - - client.RemoveContainer(docker.RemoveContainerOptions{ - ID: "", - }) - - ports := []string{"80", "8080"} - portBindings := make(map[docker.Port][]docker.PortBinding) - exposedPorts := map[docker.Port]struct{}{} - - for _, p := range ports { - dockerPort := docker.Port(p + "/tcp") - portBindings[dockerPort] = []docker.PortBinding{{HostIP: "0.0.0.0", HostPort: p}} - exposedPorts[dockerPort] = struct{}{} - } - - container, err := client.CreateContainer(docker.CreateContainerOptions{ - Name: "demo-app-name", - Config: &docker.Config{ - Image: imageName, - ExposedPorts: exposedPorts, - }, - }) - - err = client.StopContainer("8e8e3b6a5423", 0) - if err != nil { - log.Println(err) - } - - client.StartContainer(container.ID, &docker.HostConfig{ - PortBindings: portBindings, - PublishAllPorts: true, - }) - - log.Println(imageName) - return client.InspectContainer(container.ID) -} diff --git a/pkg/pushmanager/pushmanager_test.go b/pkg/pushmanager/pushmanager_test.go deleted file mode 100644 index bbee683..0000000 --- a/pkg/pushmanager/pushmanager_test.go +++ /dev/null @@ -1 +0,0 @@ -package pushmanager diff --git a/pkg/scheduler/scheduler_test.go b/pkg/scheduler/scheduler_test.go deleted file mode 100644 index 6990da0..0000000 --- a/pkg/scheduler/scheduler_test.go +++ /dev/null @@ -1 +0,0 @@ -package scheduler diff --git a/pkg/util/util.go b/pkg/util/util.go deleted file mode 100644 index 8c5fe43..0000000 --- a/pkg/util/util.go +++ /dev/null @@ -1,13 +0,0 @@ -package util - -type PullObj struct { - RepoName string - Namespace string - Tag string - PushedDate int -} - -type ResponseObj struct { - ResponseCode int - ResponseDesc string -} diff --git a/pkg/webhooks/webhooks_test.go b/pkg/webhooks/webhooks_test.go deleted file mode 100644 index 66de495..0000000 --- a/pkg/webhooks/webhooks_test.go +++ /dev/null @@ -1,60 +0,0 @@ -package webhooks - -import ( - "net/http" - "net/http/httptest" - "strings" - "testing" - - "github.com/gin-gonic/gin" - "github.com/stretchr/testify/assert" -) - -func TestPingRoute(t *testing.T) { - r := gin.Default() - HealthCheck(r) - - w := httptest.NewRecorder() - req, _ := http.NewRequest("GET", "/ping", nil) - r.ServeHTTP(w, req) - - assert.Equal(t, http.StatusOK, w.Code) - assert.Equal(t, "pong", w.Body.String()) -} - -func TestHookRoute(t *testing.T) { - r := gin.Default() - HooksListener(r) - - pushJson := `{ - "push_data": { - "pushed_at": 1591175168, - "images": [], - "tag": "02", - "pusher": "dabare" - }, - "callback_url": "https://registry.hub.docker.com/u/dabare/testing/hook/22fbde3h00hi54a3jdf42j5cf44bebjf1/", - "repository": { - "status": "Active", - "description": "", - "is_trusted": false, - "full_description": "", - "repo_url": "https://hub.docker.com/r/dabare/testing", - "owner": "dabare", - "is_official": false, - "is_private": false, - "name": "testing", - "namespace": "dabare", - "star_count": 0, - "comment_count": 0, - "date_created": 1555438658, - "repo_name": "dabare/testing" - } - }` - - w := httptest.NewRecorder() - req, _ := http.NewRequest("POST", "/ukiyo-web-hook", strings.NewReader(pushJson)) - r.ServeHTTP(w, req) - assert.Equal(t, http.StatusOK, w.Code) - assert.Equal(t, "OK", w.Body.String()) -} From 982b65a124024931588bda9792951dc798a278d8 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sat, 25 Jul 2020 13:31:09 +0530 Subject: [PATCH 04/30] add push manager validation --- api/historyapilayer/historyapilayer.go | 26 +++ api/registryapilayer/registryapilayer.go | 61 +++++++ api/schedulerapilayer/schedulerapilayer.go | 62 +++++++ cmd/ukiyo/main | Bin 0 -> 851968 bytes dbs/app.properties | 0 go.mod | 1 - go.sum | 4 - internal/containeraccess/containeraccess.go | 165 ++++++++++++++++++ internal/containerhistory/containerhistory.go | 85 +++++++++ .../containerscheduler/containerscheduler.go | 152 ++++++++++++++++ internal/dbconfig/dbconfig.go | 13 ++ internal/util/util.go | 17 ++ main.go | 23 ++- pkg/scheduler/scheduler.go | 36 ++++ 14 files changed, 633 insertions(+), 12 deletions(-) create mode 100644 api/historyapilayer/historyapilayer.go create mode 100644 api/registryapilayer/registryapilayer.go create mode 100644 api/schedulerapilayer/schedulerapilayer.go create mode 100644 cmd/ukiyo/main create mode 100644 dbs/app.properties create mode 100644 internal/containeraccess/containeraccess.go create mode 100644 internal/containerhistory/containerhistory.go create mode 100644 internal/containerscheduler/containerscheduler.go create mode 100644 internal/dbconfig/dbconfig.go create mode 100644 internal/util/util.go diff --git a/api/historyapilayer/historyapilayer.go b/api/historyapilayer/historyapilayer.go new file mode 100644 index 0000000..b4e1309 --- /dev/null +++ b/api/historyapilayer/historyapilayer.go @@ -0,0 +1,26 @@ +package historyapilayer + +import ( + "github.com/gin-gonic/gin" + "log" + "net/http" + "ukiyo/internal/containerhistory" +) + +func GetAllContainerHistory(r *gin.Engine) { + r.GET("/get-container-history/:pageNo", func(c *gin.Context) { + var response containerhistory.HistoryResponse + pageNo := c.Param("pageNo") + log.Println("Container History details by pageNo=" + pageNo) + c.JSON(http.StatusOK, response) + }) +} + +func GetAllContainerHistoryByName(r *gin.Engine) { + r.GET("/get-container-history-by-name/:name", func(c *gin.Context) { + var response containerhistory.HistoryResponse + name := c.Param("name") + log.Println("Container History details by name=" + name) + c.JSON(http.StatusOK, response) + }) +} diff --git a/api/registryapilayer/registryapilayer.go b/api/registryapilayer/registryapilayer.go new file mode 100644 index 0000000..d58a720 --- /dev/null +++ b/api/registryapilayer/registryapilayer.go @@ -0,0 +1,61 @@ +package registryapilayer + +import ( + "github.com/gin-gonic/gin" + "log" + "net/http" + "ukiyo/internal/containeraccess" + "ukiyo/pkg/jencoder" +) + +func SaveContainerAccessKeys(r *gin.Engine) { + r.POST("/save-container-access-keys", func(c *gin.Context) { + var containerKey containeraccess.ContainerKeys + var responseObj containeraccess.ResponseObj + c.ShouldBindJSON(&containerKey) + log.Println("Container keys save details" + jencoder.PrintJson(containerKey)) + + if len(containerKey.UserName) > 0 && len(containerKey.AccessToken) > 0 && len(containerKey.ServerAddress) > 0 { + res := containeraccess.InsertDockerRegData(containerKey) + responseObj = res + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Invalid Parameter" + } + c.JSON(http.StatusOK, responseObj) + }) +} + +func EditContainerAccessKeys(r *gin.Engine) { + r.POST("/edit-container-access-keys", func(c *gin.Context) { + var containerKey containeraccess.ContainerKeys + var responseObj containeraccess.ResponseObj + c.ShouldBindJSON(&containerKey) + log.Println("Container keys Update details" + jencoder.PrintJson(containerKey)) + + if len(containerKey.UserName) > 0 && len(containerKey.AccessToken) > 0 { + res := containeraccess.UpdateDockerRegData(containerKey) + responseObj = res + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Invalid Parameter" + } + c.JSON(http.StatusOK, responseObj) + }) +} + +func DeleteContainerAccessKeys(r *gin.Engine) { + r.DELETE("/delete-container-access-keys/:userName", func(c *gin.Context) { + var responseObj containeraccess.ResponseObj + name := c.Param("userName") + log.Println("Container keys Delete details userName=" + name) + if len(name) > 0 { + res := containeraccess.DeleteDockerRegData(name) + responseObj = res + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Invalid Parameter" + } + c.JSON(http.StatusOK, responseObj) + }) +} diff --git a/api/schedulerapilayer/schedulerapilayer.go b/api/schedulerapilayer/schedulerapilayer.go new file mode 100644 index 0000000..93c5392 --- /dev/null +++ b/api/schedulerapilayer/schedulerapilayer.go @@ -0,0 +1,62 @@ +package schedulerapilayer + +import ( + "github.com/gin-gonic/gin" + "log" + "net/http" + "ukiyo/internal/containerscheduler" + "ukiyo/internal/util" + "ukiyo/pkg/jencoder" +) + +func SaveRepositoryScheduledTime(r *gin.Engine) { + r.POST("/save-repository-scheduled-time", func(c *gin.Context) { + var podsDetails containerscheduler.PodsDetails + var responseObj containerscheduler.ResponseObj + c.ShouldBindJSON(&podsDetails) + log.Println("Pods save details" + jencoder.PrintJson(podsDetails)) + + if len(podsDetails.Name) > 0 && util.BindPortValidator(podsDetails.BindingPort) { + res := containerscheduler.InsertPodsData(podsDetails) + responseObj = res + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Invalid Parameter" + } + c.JSON(http.StatusOK, responseObj) + }) +} + +func EditRepositoryScheduledTime(r *gin.Engine) { + r.POST("/edit-repository-scheduled-time", func(c *gin.Context) { + var podsDetails containerscheduler.PodsDetails + var responseObj containerscheduler.ResponseObj + c.ShouldBindJSON(&podsDetails) + log.Println("Pods Update details" + jencoder.PrintJson(podsDetails)) + + if len(podsDetails.Name) > 0 && util.BindPortValidator(podsDetails.BindingPort) { + res := containerscheduler.UpdatePodsData(podsDetails) + responseObj = res + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Invalid Parameter" + } + c.JSON(http.StatusOK, responseObj) + }) +} + +func DeleteRepositoryScheduledTime(r *gin.Engine) { + r.DELETE("/remove-repository-scheduled-time/:name", func(c *gin.Context) { + var responseObj containerscheduler.ResponseObj + name := c.Param("name") + log.Println("Pod Delete details name=" + name) + if len(name) > 0 { + res := containerscheduler.DeleteDockerRegData(name) + responseObj = res + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Invalid Parameter" + } + c.JSON(http.StatusOK, responseObj) + }) +} diff --git a/cmd/ukiyo/main b/cmd/ukiyo/main new file mode 100644 index 0000000000000000000000000000000000000000..4bcdceb64b415120ab1c6af320d977eba0405654 GIT binary patch literal 851968 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 z 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

x6RNigJ$vkU)9F!)Sl-fc4=>Ti(-IH>DS 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 literal 0 HcmV?d00001 diff --git a/dbs/app.properties b/dbs/app.properties new file mode 100644 index 0000000..e69de29 diff --git a/go.mod b/go.mod index 1ef4462..73cd011 100644 --- a/go.mod +++ b/go.mod @@ -6,5 +6,4 @@ require ( github.com/fsouza/go-dockerclient v1.6.5 github.com/gin-gonic/gin v1.6.3 github.com/sonyarouje/simdb v0.0.0-20181202125413-c2488dfc374a - github.com/stretchr/testify v1.6.1 ) diff --git a/go.sum b/go.sum index 74c8076..b8a9462 100644 --- a/go.sum +++ b/go.sum @@ -126,8 +126,6 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= @@ -204,8 +202,6 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/internal/containeraccess/containeraccess.go b/internal/containeraccess/containeraccess.go new file mode 100644 index 0000000..5b14054 --- /dev/null +++ b/internal/containeraccess/containeraccess.go @@ -0,0 +1,165 @@ +package containeraccess + +import ( + "github.com/fsouza/go-dockerclient" + "log" + "strings" + "ukiyo/internal/dbconfig" +) + +type ContainerKeys struct { + UserName string `json:"userName"` + Desc string `json:"desc"` + AccessToken string `json:"accessToken"` + Email string `json:"email"` + ServerAddress string `json:"serverAddress"` +} + +type ResponseObj struct { + ResponseCode int + ResponseDesc string +} + +const ( + _dockerRegPk = "userName" +) + +func (c ContainerKeys) ID() (jsonField string, value interface{}) { + value = c.UserName + jsonField = _dockerRegPk + return +} + +var val int + +func RequestLoginKeys(userName string) docker.AuthConfiguration { + var registries = QueryRecodeInDB(userName) + + if len(registries.UserName) == 0 { + panic("User's Registry Credentials is not exist. : " + userName) + } + + return docker.AuthConfiguration{ + Username: registries.UserName, + Password: registries.AccessToken, + Email: registries.Email, + ServerAddress: registries.ServerAddress, + } +} + +func InsertDockerRegData(containerKeys ContainerKeys) ResponseObj { + var responseObj ResponseObj + var registries = QueryListRecodeInDB(containerKeys.UserName) + if len(registries) > 0 { + for _, registry := range registries { + if strings.EqualFold(registry.UserName, containerKeys.UserName) { + val++ + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Already Exist" + log.Println("Already Exist The Registry : " + registry.UserName) + } + } + } + log.Println(val) + if val == 0 { + responseObj = InsertDb(containerKeys) + } + return responseObj +} + +func UpdateDockerRegData(containerKeys ContainerKeys) ResponseObj { + var responseObj ResponseObj + + var registries = QueryRecodeInDB(containerKeys.UserName) + + log.Println(registries) + + if len(registries.UserName) != 0 { + registries.Desc = containerKeys.Desc + registries.AccessToken = containerKeys.AccessToken + registries.Email = containerKeys.Email + registries.ServerAddress = containerKeys.ServerAddress + responseObj = UpdateDb(registries) + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Update Failed." + } + + return responseObj +} + +func DeleteDockerRegData(userName string) ResponseObj { + var responseObj ResponseObj + + var registries = QueryRecodeInDB(userName) + + if len(registries.UserName) != 0 { + responseObj = DeleteDb(registries) + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Delete Failed." + } + return responseObj +} + +func QueryListRecodeInDB(Username string) []ContainerKeys { + var registries []ContainerKeys + err := dbconfig.DbConfig().Open(ContainerKeys{}).Where(_dockerRegPk, "=", Username).Get().AsEntity(®istries) + if err != nil { + log.Println(err) + return registries + } + return registries +} + +func QueryRecodeInDB(Username string) ContainerKeys { + var registries ContainerKeys + err := dbconfig.DbConfig().Open(ContainerKeys{}).Where(_dockerRegPk, "=", Username).First().AsEntity(®istries) + if err != nil { + log.Println(err) + return registries + } + return registries +} + +func InsertDb(containerKeys ContainerKeys) ResponseObj { + var responseObj ResponseObj + err := dbconfig.DbConfig().Insert(containerKeys) + if err != nil { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Insert Failed" + log.Println(err) + } else { + responseObj.ResponseCode = 0 + responseObj.ResponseDesc = "Successfully Added" + } + return responseObj +} + +func UpdateDb(containerKeys ContainerKeys) ResponseObj { + var responseObj ResponseObj + err := dbconfig.DbConfig().Update(containerKeys) + if err != nil { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Update Failed" + log.Println(err) + } else { + responseObj.ResponseCode = 0 + responseObj.ResponseDesc = "Successfully Updated" + } + return responseObj +} + +func DeleteDb(containerKeys ContainerKeys) ResponseObj { + var responseObj ResponseObj + err := dbconfig.DbConfig().Delete(containerKeys) + if err != nil { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Delete Failed" + log.Println(err) + } else { + responseObj.ResponseCode = 0 + responseObj.ResponseDesc = "Successfully Deleted" + } + return responseObj +} diff --git a/internal/containerhistory/containerhistory.go b/internal/containerhistory/containerhistory.go new file mode 100644 index 0000000..10e6b71 --- /dev/null +++ b/internal/containerhistory/containerhistory.go @@ -0,0 +1,85 @@ +package containerhistory + +import ( + "log" + "ukiyo/internal/containeraccess" + "ukiyo/internal/containerscheduler" + "ukiyo/internal/dbconfig" +) + +type HistoryDetails struct { + Name string `json:"name"` + EventId string `json:"eventId"` + EventObject EventObject `json:"eventObject"` +} + +type EventObject struct { + EventType string `json:"eventType"` + EventCode int `json:"EventCode"` + EventDesc string `json:"eventDesc"` + EventData EventData `json:"eventData"` + EventAt int `json:"eventAt"` +} + +type EventData struct { + ContainerKeys containeraccess.ContainerKeys `json:"containerKeys"` + PodsDetails containerscheduler.PodsDetails `json:"podsDetails"` + ImagePuller ImagePuller `json:"imagePuller"` + DockerCreator DockerCreator `json:"dockerCreator"` + DockerRunner DockerRunner `json:"dockerRunner"` +} + +type DockerCreator struct { + Name string `json:"name"` + ContainerId string `json:"containerId"` +} + +type ImagePuller struct { + Name string `json:"name"` + ImageName string `json:"imageName"` +} + +type DockerRunner struct { + Name string `json:"name"` +} + +type HistoryResponse struct { + ResponseCode int + ResponseDesc string + PageNumbers int +} + +const ( + _podsPk = "name" + _eventTypeContainerKeys = "Save Container Keys Event" + _eventTypePodsDetails = "Save Pod Details for Deployment Event" + _eventTypeImagePuller = "Pull Image Event" + _eventTypeDockerCreator = "Create Docker Event" + _eventTypeDockerRunner = "Run Image Event" +) + +func (c HistoryDetails) ID() (jsonField string, value interface{}) { + value = c.Name + jsonField = _podsPk + return +} + +func QueryAllHistoryRecodeInDB() []HistoryDetails { + var history []HistoryDetails + err := dbconfig.DbConfig().Open(HistoryDetails{}).Get().AsEntity(&history) + if err != nil { + log.Println(err) + return history + } + return history +} + +func QueryHistoryRecodeInDB(Name string) HistoryDetails { + var history HistoryDetails + err := dbconfig.DbConfig().Open(HistoryDetails{}).Where(_podsPk, "=", Name).First().AsEntity(&history) + if err != nil { + log.Println(err) + return history + } + return history +} diff --git a/internal/containerscheduler/containerscheduler.go b/internal/containerscheduler/containerscheduler.go new file mode 100644 index 0000000..5f9a9f7 --- /dev/null +++ b/internal/containerscheduler/containerscheduler.go @@ -0,0 +1,152 @@ +package containerscheduler + +import ( + "log" + "strings" + "ukiyo/internal/dbconfig" +) + +type PodsDetails struct { + Name string `json:"name"` + BindingPort []BindingPort `json:"bindingPort"` + ScheduledAt int `json:"scheduledAt"` + ScheduledDowntime bool `json:"scheduledDowntime"` +} + +type BindingPort struct { + ExportPort string `json:"exportPort"` + InternalPort string `json:"internalPort"` +} + +type ResponseObj struct { + ResponseCode int + ResponseDesc string +} + +const ( + _podsPk = "name" +) + +var val int + +func (c PodsDetails) ID() (jsonField string, value interface{}) { + value = c.Name + jsonField = _podsPk + return +} + +func GetBindingPortsForContainerCreate(name string) []string { + return []string{"8180:80", "443:443"} +} + +func InsertPodsData(podsDetails PodsDetails) ResponseObj { + var responseObj ResponseObj + var pods = QueryListRecodeInDB() + if len(pods) > 0 { + for _, pod := range pods { + if strings.EqualFold(pod.Name, podsDetails.Name) { + val++ + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Already Exist Pod details" + log.Println("Already Exist The Pods : " + pod.Name) + } + } + } + if val == 0 { + responseObj = InsertDb(podsDetails) + } + return responseObj +} + +func UpdatePodsData(podsDetails PodsDetails) ResponseObj { + var responseObj ResponseObj + + var pod = QueryRecodeInDB(podsDetails.Name) + + if len(pod.Name) != 0 { + pod.BindingPort = podsDetails.BindingPort + pod.ScheduledAt = podsDetails.ScheduledAt + responseObj = UpdateDb(pod) + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Update Failed pod." + } + + return responseObj +} + +func DeleteDockerRegData(name string) ResponseObj { + var responseObj ResponseObj + + var pod = QueryRecodeInDB(name) + + if len(pod.Name) != 0 { + responseObj = DeleteDb(pod) + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Delete Failed pod." + } + return responseObj +} + +func QueryListRecodeInDB() []PodsDetails { + var pods []PodsDetails + err := dbconfig.DbConfig().Open(PodsDetails{}).Get().AsEntity(&pods) + if err != nil { + log.Println(err) + return pods + } + return pods +} + +func QueryRecodeInDB(Name string) PodsDetails { + var pod PodsDetails + err := dbconfig.DbConfig().Open(PodsDetails{}).Where(_podsPk, "=", Name).First().AsEntity(&pod) + if err != nil { + log.Println(err) + return pod + } + return pod +} + +func InsertDb(pods PodsDetails) ResponseObj { + var responseObj ResponseObj + err := dbconfig.DbConfig().Insert(pods) + if err != nil { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Insert Failed pod details" + log.Println(err) + } else { + responseObj.ResponseCode = 0 + responseObj.ResponseDesc = "Successfully Added pod details" + } + return responseObj +} + +func UpdateDb(pod PodsDetails) ResponseObj { + var responseObj ResponseObj + err := dbconfig.DbConfig().Update(pod) + if err != nil { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Update Failed pod details" + log.Println(err) + } else { + responseObj.ResponseCode = 0 + responseObj.ResponseDesc = "Successfully Updated pod details" + } + return responseObj +} + +func DeleteDb(pod PodsDetails) ResponseObj { + var responseObj ResponseObj + err := dbconfig.DbConfig().Delete(pod) + if err != nil { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Delete Failed pod details" + log.Println(err) + } else { + responseObj.ResponseCode = 0 + responseObj.ResponseDesc = "Successfully Deleted pod details" + } + return responseObj +} diff --git a/internal/dbconfig/dbconfig.go b/internal/dbconfig/dbconfig.go new file mode 100644 index 0000000..105a15a --- /dev/null +++ b/internal/dbconfig/dbconfig.go @@ -0,0 +1,13 @@ +package dbconfig + +import ( + "github.com/sonyarouje/simdb/db" +) + +func DbConfig() *db.Driver { + driver, err := db.New("dbs") + if err != nil { + panic(err) + } + return driver +} diff --git a/internal/util/util.go b/internal/util/util.go new file mode 100644 index 0000000..4ece6ed --- /dev/null +++ b/internal/util/util.go @@ -0,0 +1,17 @@ +package util + +import ( + "ukiyo/internal/containerscheduler" +) + +func BindPortValidator(bindingPort []containerscheduler.BindingPort) bool { + if len(bindingPort) > 0 { + for _, ports := range bindingPort { + if len(ports.InternalPort) == 0 && len(ports.ExportPort) == 0 { + return false + } + } + return true + } + return false +} diff --git a/main.go b/main.go index 2e6cef7..2430c27 100644 --- a/main.go +++ b/main.go @@ -1,17 +1,26 @@ package main import ( - "ukiyo/pkg/apilayer" - "ukiyo/pkg/webhooks" - "github.com/gin-gonic/gin" + "ukiyo/api/historyapilayer" + "ukiyo/api/registryapilayer" + "ukiyo/api/schedulerapilayer" + "ukiyo/pkg/scheduler" + "ukiyo/pkg/webhook-listener" ) func main() { r := gin.Default() - webhooks.HooksListener(r) - webhooks.HealthCheck(r) - apilayer.AddContainer(r) - apilayer.EditContainerToken(r) + webhook_listener.HealthCheck(r) + webhook_listener.HooksListener(r) + registryapilayer.SaveContainerAccessKeys(r) + registryapilayer.EditContainerAccessKeys(r) + registryapilayer.DeleteContainerAccessKeys(r) + schedulerapilayer.SaveRepositoryScheduledTime(r) + schedulerapilayer.EditRepositoryScheduledTime(r) + schedulerapilayer.DeleteRepositoryScheduledTime(r) + historyapilayer.GetAllContainerHistory(r) + historyapilayer.GetAllContainerHistoryByName(r) + scheduler.ScheduledRunner() r.Run(":8080") } diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go index 6990da0..0a508dd 100644 --- a/pkg/scheduler/scheduler.go +++ b/pkg/scheduler/scheduler.go @@ -1 +1,37 @@ package scheduler + +import ( + "log" + "time" + "ukiyo/internal/containerscheduler" + "ukiyo/pkg/jencoder" + "ukiyo/pkg/manager/dockercreater" + "ukiyo/pkg/manager/dockerrunner" +) + +func ScheduledRunner() { + pods := containerscheduler.QueryListRecodeInDB() + log.Println("ScheduledRunner trigger ...." + jencoder.PrintJson(pods)) + time.AfterFunc(1*time.Minute, func() { + Foo() + }) +} + +func WebHookScheduler(name string, imageName string) { + pod := containerscheduler.QueryRecodeInDB(name) + if len(pod.Name) > 0 && !pod.ScheduledDowntime { + log.Println("WebHookScheduler trigger ...." + jencoder.PrintJson(pod)) + res, _ := dockercreater.ContainerCreate(name, imageName) + log.Println("WebHookScheduler trigger ...." + jencoder.PrintJson(res)) + + log.Println("Starting Container runner - WebHookScheduler") + resObj, _ := dockerrunner.ContainerRunner(res.ContainerId) + log.Println("Ending Container runner - WebHookScheduler ...." + jencoder.PrintJson(resObj)) + } else { + log.Println("No saved pod details to schedule images") + } +} + +func Foo() { + log.Println("Foo run for more than a minute.") +} From 7c359efb6c48b377267ea5a0e204e84f169daa85 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sat, 25 Jul 2020 13:34:01 +0530 Subject: [PATCH 05/30] add containerrunner --- pkg/jencoder/jencoder.go | 15 +++++ pkg/manager/dockercreater/dockercreater.go | 66 +++++++++++++++++++++ pkg/manager/dockerpull/dockerpull.go | 67 ++++++++++++++++++++++ pkg/manager/dockerrunner/dockerrunner.go | 36 ++++++++++++ 4 files changed, 184 insertions(+) create mode 100644 pkg/jencoder/jencoder.go create mode 100644 pkg/manager/dockercreater/dockercreater.go create mode 100644 pkg/manager/dockerpull/dockerpull.go create mode 100644 pkg/manager/dockerrunner/dockerrunner.go diff --git a/pkg/jencoder/jencoder.go b/pkg/jencoder/jencoder.go new file mode 100644 index 0000000..3b260df --- /dev/null +++ b/pkg/jencoder/jencoder.go @@ -0,0 +1,15 @@ +package jencoder + +import ( + "encoding/json" + "log" +) + +func PrintJson(obj interface{}) string { + b, err := json.Marshal(obj) + if err != nil { + log.Println(err) + return "json marshal error" + } + return string(b) +} diff --git a/pkg/manager/dockercreater/dockercreater.go b/pkg/manager/dockercreater/dockercreater.go new file mode 100644 index 0000000..cd05c6c --- /dev/null +++ b/pkg/manager/dockercreater/dockercreater.go @@ -0,0 +1,66 @@ +package dockercreater + +import ( + docker "github.com/fsouza/go-dockerclient" + "log" + "strings" + "ukiyo/internal/containerscheduler" +) + +type ResponseObj struct { + Name string + ContainerId string + ResponseCode int + ResponseDesc string +} + +func ContainerCreate(name string, imageName string) (ResponseObj, error) { + var responseObj ResponseObj + client, err := docker.NewClientFromEnv() + if err != nil { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Error Creating Docker Client Env for : " + name + return responseObj, err + } + + ports := containerscheduler.GetBindingPortsForContainerCreate(name) + portBindings := make(map[docker.Port][]docker.PortBinding) + exposedPorts := map[docker.Port]struct{}{} + + if len(ports) > 0 { + for _, p := range ports { + s := strings.Split(p, ":") + extPort, intPort := s[0], s[1] + log.Println("extPort : " + extPort + " intPort : " + intPort) + dockerPort := docker.Port(intPort + "/tcp") + portBindings[dockerPort] = []docker.PortBinding{{HostIP: "0.0.0.0", HostPort: extPort}} + exposedPorts[dockerPort] = struct{}{} + } + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "No valid Binding Ports for :" + name + return responseObj, err + } + + container, err := client.CreateContainer(docker.CreateContainerOptions{ + Name: name, + Config: &docker.Config{ + Image: imageName, + ExposedPorts: exposedPorts, + }, + HostConfig: &docker.HostConfig{ + PortBindings: portBindings, + }, + }) + if err != nil { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Error Creating Container for :" + name + return responseObj, err + } + log.Println(container) + + responseObj.ResponseCode = 0 + responseObj.ContainerId = container.ID + responseObj.ResponseDesc = "Successfully Create The Container :" + name + return responseObj, err +} diff --git a/pkg/manager/dockerpull/dockerpull.go b/pkg/manager/dockerpull/dockerpull.go new file mode 100644 index 0000000..1225d32 --- /dev/null +++ b/pkg/manager/dockerpull/dockerpull.go @@ -0,0 +1,67 @@ +package dockerpull + +import ( + docker "github.com/fsouza/go-dockerclient" + "log" + "strings" + "ukiyo/internal/containeraccess" + "ukiyo/pkg/jencoder" + "ukiyo/pkg/webhook" +) + +type ResponseObj struct { + Name string + ImageName string + ResponseCode int + ResponseDesc string +} + +var val int +var ImageName string + +func PullToDocker(str webhook.Response) (ResponseObj, error) { + var responseObj ResponseObj + log.Println("docker pull by repo name : " + jencoder.PrintJson(str)) + ImageName = str.RepoName + ":" + str.Tag + + client, err := docker.NewClientFromEnv() + if err != nil { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Error Creating Docker Client Env" + return responseObj, err + } + + err = client.PullImage(webhook.DockerPullImage(str), containeraccess.RequestLoginKeys(str.Namespace)) + if err != nil { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Error Pulling Images" + return responseObj, err + } + + imgs, err := client.ListImages(docker.ListImagesOptions{All: false}) + if err != nil { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Error List images" + return responseObj, err + } + + for _, img := range imgs { + for _, repo := range img.RepoTags { + if strings.EqualFold(repo, ImageName) { + val++ + log.Println("Successfully pull the images : " + repo) + } + } + } + + if val > 0 { + responseObj.ResponseCode = 0 + responseObj.Name = str.Name + responseObj.ImageName = ImageName + responseObj.ResponseDesc = "Successfully pull the images" + } else { + responseObj.ResponseCode = 0 + responseObj.ResponseDesc = "Failed pull the images" + } + return responseObj, err +} diff --git a/pkg/manager/dockerrunner/dockerrunner.go b/pkg/manager/dockerrunner/dockerrunner.go new file mode 100644 index 0000000..4fc8490 --- /dev/null +++ b/pkg/manager/dockerrunner/dockerrunner.go @@ -0,0 +1,36 @@ +package dockerrunner + +import ( + docker "github.com/fsouza/go-dockerclient" + "log" +) + +type ResponseObj struct { + ResponseCode int + ResponseDesc string +} + +func ContainerRunner(containerId string) (ResponseObj, error) { + var responseObj ResponseObj + log.Println("Starting container Runner : containerId: " + containerId) + client, err := docker.NewClientFromEnv() + if err != nil { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Error Running Docker Container Id: " + containerId + return responseObj, err + } + + err = client.StartContainer(containerId, &docker.HostConfig{ + PublishAllPorts: true, + }) + if err != nil { + log.Println(err) + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Successfully Run failure :" + containerId + } else { + responseObj.ResponseCode = 0 + responseObj.ResponseDesc = "Successfully Run The Container :" + containerId + } + + return responseObj, err +} From ae07fd91798728acc045767439052680a5c1a689 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sat, 25 Jul 2020 13:35:21 +0530 Subject: [PATCH 06/30] add webhook scheduler --- pkg/webhook-listener/webhook-listener.go | 84 ++++++++++++++++++++++++ pkg/webhook/webhook.go | 24 +++++++ 2 files changed, 108 insertions(+) create mode 100644 pkg/webhook-listener/webhook-listener.go create mode 100644 pkg/webhook/webhook.go diff --git a/pkg/webhook-listener/webhook-listener.go b/pkg/webhook-listener/webhook-listener.go new file mode 100644 index 0000000..f4cbe88 --- /dev/null +++ b/pkg/webhook-listener/webhook-listener.go @@ -0,0 +1,84 @@ +package webhook_listener + +import ( + "log" + "net/http" + "ukiyo/pkg/jencoder" + "ukiyo/pkg/manager/dockerpull" + "ukiyo/pkg/scheduler" + "ukiyo/pkg/webhook" + + "github.com/gin-gonic/gin" +) + +type PushData struct { + PushedAt int `json:"pushed_at"` + Images []string `json:"images"` + Tag string `json:"tag"` + Pusher string `json:"pusher"` +} + +type Repository struct { + Status string `json:"status"` + Description string `json:"description"` + IsTrusted bool `json:"is_trusted"` + FullDescription string `json:"full_description"` + RepoUrl string `json:"repo_url"` + Owner string `json:"owner"` + IsOfficial bool `json:"is_official"` + IsPrivate bool `json:"is_private"` + Name string `json:"name"` + Namespace string `json:"namespace"` + StarCount int `json:"star_count"` + CommentCount int `json:"comment_count"` + DateCreated int `json:"date_created"` + RepoName string `json:"repo_name"` +} + +type DockerWebHook struct { + PushData PushData `json:"push_data"` + CallbackUrl string `json:"callback_url"` + Repository Repository `json:"repository"` +} + +func HooksListener(r *gin.Engine) { + r.POST("/ukiyo-web-hook", func(c *gin.Context) { + log.Println("Starting web hook trigger .... ############################") + var dockerWebHook DockerWebHook + c.ShouldBindJSON(&dockerWebHook) + log.Println("web-hook trigger" + jencoder.PrintJson(dockerWebHook)) + + res := SetWebHookResponse(dockerWebHook) + log.Println("Ending web hook trigger ...." + jencoder.PrintJson(res)) + + log.Println("Starting Image Pull .... ############################") + resObj, err := dockerpull.PullToDocker(res) + log.Println(err) + log.Println("Ending Image Pull ...." + jencoder.PrintJson(resObj)) + + if len(resObj.Name) > 0 { + log.Println("Trigger for check the Scheduler ....") + scheduler.WebHookScheduler(resObj.Name, resObj.ImageName) + } else { + log.Println("Error Creating Image ....") + } + + c.String(http.StatusOK, "OK") + }) +} + +func HealthCheck(r *gin.Engine) { + r.GET("/ping", func(c *gin.Context) { + c.String(http.StatusOK, "pong") + }) +} + +func SetWebHookResponse(dockerWebHook DockerWebHook) webhook.Response { + var response webhook.Response + response.Namespace = dockerWebHook.Repository.Namespace + response.RepoName = dockerWebHook.Repository.RepoName + response.Name = dockerWebHook.Repository.Name + response.Tag = dockerWebHook.PushData.Tag + response.PushedAt = dockerWebHook.PushData.PushedAt + return response +} diff --git a/pkg/webhook/webhook.go b/pkg/webhook/webhook.go new file mode 100644 index 0000000..59b2ca8 --- /dev/null +++ b/pkg/webhook/webhook.go @@ -0,0 +1,24 @@ +package webhook + +import docker "github.com/fsouza/go-dockerclient" + +type Response struct { + RepoName string + Namespace string + Name string + Tag string + PushedAt int +} + +func DockerPullImage(str Response) docker.PullImageOptions { + return docker.PullImageOptions{ + Repository: str.RepoName, + Tag: str.Tag, + Platform: "", + Registry: "", + OutputStream: nil, + RawJSONStream: false, + InactivityTimeout: 0, + Context: nil, + } +} From 8bc0ef73b1391a27c4e5fa5e53c515e7e0ae8836 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sat, 25 Jul 2020 15:38:27 +0530 Subject: [PATCH 07/30] remove webhooks --- pkg/webhooks/webhooks.go | 85 ---------------------------------------- 1 file changed, 85 deletions(-) delete mode 100644 pkg/webhooks/webhooks.go diff --git a/pkg/webhooks/webhooks.go b/pkg/webhooks/webhooks.go deleted file mode 100644 index dc51d0e..0000000 --- a/pkg/webhooks/webhooks.go +++ /dev/null @@ -1,85 +0,0 @@ -package webhooks - -import ( - "encoding/json" - "log" - "net/http" - "strconv" - "ukiyo/pkg/pullmanager" - "ukiyo/pkg/pushmanager" - "ukiyo/pkg/util" - - "github.com/gin-gonic/gin" -) - -type PushData struct { - PushedAt int `json:"pushed_at"` - images []string `json:"images"` - Tag string `json:"tag"` - Pusher string `json:"pusher"` -} - -type Repository struct { - Status string `json:"status"` - Description string `json:"description"` - IsTrusted bool `json:"is_trusted"` - FullDescription string `json:"full_description"` - RepoUrl string `json:"repo_url"` - Owner string `json:"owner"` - IsOfficial bool `json:"is_official"` - IsPrivate bool `json:"is_private"` - Name string `json:"name"` - Namespace string `json:"namespace"` - StarCount int `json:"star_count"` - CommentCount int `json:"comment_count"` - DateCreated int `json:"date_created"` - RepoName string `json:"repo_name"` -} - -type DockerWebHook struct { - PushData PushData `json:"push_data"` - CallbackUrl string `json:"callback_url"` - Repository Repository `json:"repository"` -} - -var responseCode int -var responseDesc string -var imageName string - -func HooksListener(r *gin.Engine) { - r.POST("/ukiyo-web-hook", func(c *gin.Context) { - var dockerWebHook DockerWebHook - c.ShouldBindJSON(&dockerWebHook) - - b, err := json.Marshal(dockerWebHook) - if err != nil { - log.Println(err) - return - } - - var pullObj util.PullObj - pullObj.Namespace = dockerWebHook.Repository.Namespace - pullObj.RepoName = dockerWebHook.Repository.RepoName - pullObj.Tag = dockerWebHook.PushData.Tag - pullObj.PushedDate = dockerWebHook.PushData.PushedAt - - log.Println("web-hook trigger" + string(b)) - - imageName, responseCode, responseDesc, err = pullmanager.PullToDocker(pullObj) - log.Println("pull Manager responseCode :" + strconv.Itoa(responseCode) + " responseDesc : " + responseDesc) - - _, err = pushmanager.ContainerCreate(imageName) - if err != nil { - log.Println(err) - return - } - - c.String(http.StatusOK, "OK") - }) -} - -func HealthCheck(r *gin.Engine) { - r.GET("/ping", func(c *gin.Context) { - c.String(http.StatusOK, "pong") - }) -} From 660c4311d8fcd00da76232bcac2afb0f5b41fad0 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sun, 26 Jul 2020 14:59:50 +0530 Subject: [PATCH 08/30] add containerremover --- README.md | 74 +++++++++++++++--- api/historyapilayer/historyapilayer.go | 2 +- internal/containerhistory/containerhistory.go | 76 +++++++++++++++---- pkg/manager/dockerpull/dockerpull.go | 15 ++++ pkg/manager/dockerremove/dockerremove.go | 60 +++++++++++++++ pkg/manager/dockerrunner/dockerrunner.go | 2 +- pkg/scheduler/scheduler.go | 26 +++++-- 7 files changed, 219 insertions(+), 36 deletions(-) create mode 100644 pkg/manager/dockerremove/dockerremove.go diff --git a/README.md b/README.md index 9c25006..a4ef2b8 100644 --- a/README.md +++ b/README.md @@ -47,12 +47,17 @@ $ go build -ldflags="-s -w" -o ukiyo main.go Docker build command ```sh -$ docker build -f Dockerfile -t agentukiyo/ukiyo . -$ docker push agentukiyo/ukiyo +$ docker build -f Dockerfile -t agentukiyo/ukiyo:tag . +$ docker push agentukiyo/ukiyo:tag +``` + +Run ukiyo agent +```sh $ docker run -p 8080:8080 \ + -- name ukiyo \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /home/reinventor/dbs:/dbs \ - agentukiyo/ukiyo + agentukiyo/ukiyo:01 ``` Add webhook to your dockerhub repository @@ -62,18 +67,63 @@ http:{serverIP}:8080/ukiyo-web-hook Add your own docker registy details ``` -http:{serverIP}:8080/add-container +http:{serverIP}:8080/save-container-access-keys { - "username":"agentukiyo", - "repoName":"Ukiyo Docker registry", - "accessToken":"f44e334e-1440-4166-a16f-d8fc9d0eb188", - "email":"hansika.16@itfac.mrt.ac.lk", + "username":"docker registry name" + "desc":"docker registry description" + "accessToken":"docker registry accesstoken" + "email":"your email" "serverAddress":"http://docker.io/v1" } -http:{serverIP}:8080/edit-container-token +http:{serverIP}:8080/edit-container-access-keys { - "username":"agentukiyo", - "accessToken":"f44e334e-1440-4166-a16f-d8fc9d0eb188" + "username":"docker registry name" + "desc":"edited description" + "accessToken":"new docker registry accesstoken" + "email":"new email" + "serverAddress":"http://docker.io/v1" } -``` \ No newline at end of file + +http://{serverIP}:8080/delete-container-access-keys/{registryname} +``` + +Add your deployment details +``` +http://{serverIP}:8080/save-repository-scheduled-time +{ + "name": "repository name", + "bindingPort": + [{ + "exportPort": "8180", + "internalPort": "80" + }, + { + "exportPort": "443", + "internalPort": "443" + }], + "scheduledAt": "1555438658", + "scheduledDowntime": false +} + +http://{serverIP}:8080/edit-repository-scheduled-time +{ + "name": "repository name", + "bindingPort": + [{ + "exportPort": "8180", + "internalPort": "80" + }], + "scheduledAt": "1555438658", + "scheduledDowntime": false +} + +http://{serverIP}:8080/remove-repository-scheduled-time/{repositoryname} +``` + +List your deployment details +``` +http://{serverIP}:8080/get-container-history/1 + +http://{serverIP}:8080/get-container-history-by-name/{repositoryname} +``` diff --git a/api/historyapilayer/historyapilayer.go b/api/historyapilayer/historyapilayer.go index b4e1309..7a14e95 100644 --- a/api/historyapilayer/historyapilayer.go +++ b/api/historyapilayer/historyapilayer.go @@ -9,8 +9,8 @@ import ( func GetAllContainerHistory(r *gin.Engine) { r.GET("/get-container-history/:pageNo", func(c *gin.Context) { - var response containerhistory.HistoryResponse pageNo := c.Param("pageNo") + response := containerhistory.QueryAllHistoryRecodeInDB(pageNo) log.Println("Container History details by pageNo=" + pageNo) c.JSON(http.StatusOK, response) }) diff --git a/internal/containerhistory/containerhistory.go b/internal/containerhistory/containerhistory.go index 10e6b71..8fb6bfe 100644 --- a/internal/containerhistory/containerhistory.go +++ b/internal/containerhistory/containerhistory.go @@ -8,17 +8,21 @@ import ( ) type HistoryDetails struct { - Name string `json:"name"` - EventId string `json:"eventId"` + Name string `json:"name"` + Data []Data `json:"data"` +} + +type Data struct { + Id int `json:"id"` + EventType string `json:"eventType"` EventObject EventObject `json:"eventObject"` + EventData EventData `json:"eventData"` } type EventObject struct { - EventType string `json:"eventType"` - EventCode int `json:"EventCode"` - EventDesc string `json:"eventDesc"` - EventData EventData `json:"eventData"` - EventAt int `json:"eventAt"` + EventCode int `json:"EventCode"` + EventDesc string `json:"eventDesc"` + EventAt int `json:"eventAt"` } type EventData struct { @@ -44,9 +48,10 @@ type DockerRunner struct { } type HistoryResponse struct { - ResponseCode int - ResponseDesc string - PageNumbers int + ResponseCode int + ResponseDesc string + PageNumbers int + HistoryDetails HistoryDetails } const ( @@ -64,14 +69,37 @@ func (c HistoryDetails) ID() (jsonField string, value interface{}) { return } -func QueryAllHistoryRecodeInDB() []HistoryDetails { - var history []HistoryDetails - err := dbconfig.DbConfig().Open(HistoryDetails{}).Get().AsEntity(&history) +func UpdateContainerHistory(name string, data Data) { + var history = QueryHistoryRecodeInDB(name) + if len(history.Name) > 0 { + data.Id = len(history.Data) + 1 + history.Data = append(history.Data, data) + UpdateDb(history) + } else { + var historyDetails HistoryDetails + historyDetails.Name = name + data.Id = 1 + historyDetails.Data = append(historyDetails.Data, data) + InsertDb(historyDetails) + } +} + +func QueryAllHistoryRecodeInDB(pageNo string) HistoryResponse { + var historyRes HistoryResponse + var historyDetails HistoryDetails + err := dbconfig.DbConfig().Open(HistoryDetails{}).First().AsEntity(&historyDetails) if err != nil { log.Println(err) - return history + historyRes.ResponseCode = 1 + historyRes.ResponseDesc = "Failed" + return historyRes + } else { + historyRes.ResponseCode = 0 + historyRes.ResponseDesc = "Success" + historyRes.HistoryDetails = historyDetails + historyRes.PageNumbers = 1 } - return history + return historyRes } func QueryHistoryRecodeInDB(Name string) HistoryDetails { @@ -83,3 +111,21 @@ func QueryHistoryRecodeInDB(Name string) HistoryDetails { } return history } + +func InsertDb(historyDetails HistoryDetails) { + err := dbconfig.DbConfig().Insert(historyDetails) + if err != nil { + log.Println("Fail History Recode Insert") + } else { + log.Println("Successfully Installed History Recode") + } +} + +func UpdateDb(historyDetails HistoryDetails) { + err := dbconfig.DbConfig().Update(historyDetails) + if err != nil { + log.Println("Fail History Recode Update") + } else { + log.Println("Successfully Updated History Recode") + } +} diff --git a/pkg/manager/dockerpull/dockerpull.go b/pkg/manager/dockerpull/dockerpull.go index 1225d32..ef89fbe 100644 --- a/pkg/manager/dockerpull/dockerpull.go +++ b/pkg/manager/dockerpull/dockerpull.go @@ -5,6 +5,7 @@ import ( "log" "strings" "ukiyo/internal/containeraccess" + "ukiyo/internal/containerhistory" "ukiyo/pkg/jencoder" "ukiyo/pkg/webhook" ) @@ -16,6 +17,10 @@ type ResponseObj struct { ResponseDesc string } +const ( + _eventTypeImagePuller = "Pull Image Event" +) + var val int var ImageName string @@ -63,5 +68,15 @@ func PullToDocker(str webhook.Response) (ResponseObj, error) { responseObj.ResponseCode = 0 responseObj.ResponseDesc = "Failed pull the images" } + + var data containerhistory.Data + data.EventType = _eventTypeImagePuller + data.EventObject.EventCode = responseObj.ResponseCode + data.EventObject.EventDesc = responseObj.ResponseDesc + data.EventObject.EventAt = 11111111 + data.EventData.ImagePuller.Name = str.Name + data.EventData.ImagePuller.ImageName = ImageName + containerhistory.UpdateContainerHistory(str.Name, data) + return responseObj, err } diff --git a/pkg/manager/dockerremove/dockerremove.go b/pkg/manager/dockerremove/dockerremove.go new file mode 100644 index 0000000..06a24f3 --- /dev/null +++ b/pkg/manager/dockerremove/dockerremove.go @@ -0,0 +1,60 @@ +package dockerremove + +import ( + docker "github.com/fsouza/go-dockerclient" + "log" + "strings" + "ukiyo/pkg/jencoder" +) + +type ResponseObj struct { + ResponseCode int + ResponseDesc string +} + +func RemoveRunningContainer(name string) (ResponseObj, error) { + var responseObj ResponseObj + log.Println("Starting Remove Running pods: " + name) + + client, err := docker.NewClientFromEnv() + if err != nil { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Error Creating Docker Client Env" + return responseObj, err + } + + imgs, err := client.ListContainers(docker.ListContainersOptions{All: false}) + if err != nil { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Error List Running Docker Services" + return responseObj, err + } + + if len(imgs) > 0 { + log.Println("List Running container ...." + jencoder.PrintJson(imgs)) + for _, img := range imgs { + if len(img.Names) > 0 { + for _, cName := range img.Names { + if strings.EqualFold(cName[1:len(cName)], name) { + err = client.StopContainer(img.ID, 0) + if err != nil { + responseObj.ResponseCode = 0 + responseObj.ResponseDesc = "Error getting Remove Running Container" + return responseObj, err + } else { + client.RemoveContainer(docker.RemoveContainerOptions{ID: img.ID}) + responseObj.ResponseCode = 0 + responseObj.ResponseDesc = "Successfully Remove Running Container" + return responseObj, err + } + } + } + } + } + } else { + responseObj.ResponseCode = 0 + responseObj.ResponseDesc = "No Running Container for Remove" + return responseObj, err + } + return responseObj, err +} diff --git a/pkg/manager/dockerrunner/dockerrunner.go b/pkg/manager/dockerrunner/dockerrunner.go index 4fc8490..9b82245 100644 --- a/pkg/manager/dockerrunner/dockerrunner.go +++ b/pkg/manager/dockerrunner/dockerrunner.go @@ -26,7 +26,7 @@ func ContainerRunner(containerId string) (ResponseObj, error) { if err != nil { log.Println(err) responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Successfully Run failure :" + containerId + responseObj.ResponseDesc = "Container Run failure :" + containerId } else { responseObj.ResponseCode = 0 responseObj.ResponseDesc = "Successfully Run The Container :" + containerId diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go index 0a508dd..e597c6b 100644 --- a/pkg/scheduler/scheduler.go +++ b/pkg/scheduler/scheduler.go @@ -6,6 +6,7 @@ import ( "ukiyo/internal/containerscheduler" "ukiyo/pkg/jencoder" "ukiyo/pkg/manager/dockercreater" + "ukiyo/pkg/manager/dockerremove" "ukiyo/pkg/manager/dockerrunner" ) @@ -20,13 +21,24 @@ func ScheduledRunner() { func WebHookScheduler(name string, imageName string) { pod := containerscheduler.QueryRecodeInDB(name) if len(pod.Name) > 0 && !pod.ScheduledDowntime { - log.Println("WebHookScheduler trigger ...." + jencoder.PrintJson(pod)) - res, _ := dockercreater.ContainerCreate(name, imageName) - log.Println("WebHookScheduler trigger ...." + jencoder.PrintJson(res)) - log.Println("Starting Container runner - WebHookScheduler") - resObj, _ := dockerrunner.ContainerRunner(res.ContainerId) - log.Println("Ending Container runner - WebHookScheduler ...." + jencoder.PrintJson(resObj)) + log.Println("Starting Container Remove - WebHookScheduler") + removeObj, _ := dockerremove.RemoveRunningContainer(name) + log.Println("Ending Container Remove - WebHookScheduler ...." + jencoder.PrintJson(removeObj)) + + if removeObj.ResponseCode == 0 { + + log.Println("WebHookScheduler trigger ContainerCreate...." + jencoder.PrintJson(pod)) + res, _ := dockercreater.ContainerCreate(name, imageName) + log.Println("WebHookScheduler trigger ContainerCreate...." + jencoder.PrintJson(res)) + + log.Println("Starting Container runner - WebHookScheduler") + resObj, _ := dockerrunner.ContainerRunner(res.ContainerId) + log.Println("Ending Container runner - WebHookScheduler ...." + jencoder.PrintJson(resObj)) + + } else { + log.Println("Stop Container runner - WebHookScheduler - Failed Running Container remove process") + } } else { log.Println("No saved pod details to schedule images") } @@ -34,4 +46,4 @@ func WebHookScheduler(name string, imageName string) { func Foo() { log.Println("Foo run for more than a minute.") -} +} \ No newline at end of file From 2ca695208078c91125e6ef5c5cfb6e2c42efe301 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sun, 26 Jul 2020 15:15:37 +0530 Subject: [PATCH 09/30] fixing unit testing and path issue --- test/dockercreater_test.go | 15 ++++++++ test/dockerpull_test.go | 23 ++++++++++++ test/dockerrunner_test.go | 15 ++++++++ test/historyapilayer_test.go | 1 + test/registryapilayer_test.go | 56 +++++++++++++++++++++++++++++ test/schedulerapilayer_test.go | 64 ++++++++++++++++++++++++++++++++++ test/webhook-listner_test.go | 60 +++++++++++++++++++++++++++++++ 7 files changed, 234 insertions(+) create mode 100644 test/dockercreater_test.go create mode 100644 test/dockerpull_test.go create mode 100644 test/dockerrunner_test.go create mode 100644 test/historyapilayer_test.go create mode 100644 test/registryapilayer_test.go create mode 100644 test/schedulerapilayer_test.go create mode 100644 test/webhook-listner_test.go diff --git a/test/dockercreater_test.go b/test/dockercreater_test.go new file mode 100644 index 0000000..1dd44ca --- /dev/null +++ b/test/dockercreater_test.go @@ -0,0 +1,15 @@ +package test + +import ( + "testing" + "ukiyo/pkg/manager/dockercreater" +) + +func TestContainerCreate(t *testing.T) { + docker, _ := dockercreater.ContainerCreate("demo-nginx", "demo-nginx") + if docker.ResponseCode != 0 { + t.Errorf("failed expected %v but got value %v", 0, docker.ResponseCode) + } else { + t.Logf("passed expected %v and got value %v", 0, docker.ResponseCode) + } +} diff --git a/test/dockerpull_test.go b/test/dockerpull_test.go new file mode 100644 index 0000000..f309db3 --- /dev/null +++ b/test/dockerpull_test.go @@ -0,0 +1,23 @@ +package test + +import ( + "testing" + "ukiyo/pkg/manager/dockerpull" + "ukiyo/pkg/webhook" +) + +func TestPullToDocker(t *testing.T) { + var webHook = webhook.Response{ + RepoName: "demo-nginx", + Namespace: "name", + Name: "demo-nginx", + Tag: "02", + PushedAt: 0, + } + docker, _ := dockerpull.PullToDocker(webHook) + if docker.ResponseCode != 0 { + t.Errorf("failed expected %v but got value %v", 0, docker.ResponseCode) + } else { + t.Logf("passed expected %v and got value %v", 0, docker.ResponseCode) + } +} diff --git a/test/dockerrunner_test.go b/test/dockerrunner_test.go new file mode 100644 index 0000000..2669f08 --- /dev/null +++ b/test/dockerrunner_test.go @@ -0,0 +1,15 @@ +package test + +import ( + "testing" + "ukiyo/pkg/manager/dockerrunner" +) + +func TestContainerRunner(t *testing.T) { + docker, _ := dockerrunner.ContainerRunner("6dc636d3c48dad91ee753440bd708888bf1b278040c6732e604b076ee44dd75f") + if docker.ResponseCode != 0 { + t.Errorf("failed expected %v but got value %v", 0, docker.ResponseCode) + } else { + t.Logf("passed expected %v and got value %v", 0, docker.ResponseCode) + } +} diff --git a/test/historyapilayer_test.go b/test/historyapilayer_test.go new file mode 100644 index 0000000..56e5404 --- /dev/null +++ b/test/historyapilayer_test.go @@ -0,0 +1 @@ +package test diff --git a/test/registryapilayer_test.go b/test/registryapilayer_test.go new file mode 100644 index 0000000..dd5a18a --- /dev/null +++ b/test/registryapilayer_test.go @@ -0,0 +1,56 @@ +package test + +import ( + "net/http" + "net/http/httptest" + "strings" + "testing" + "ukiyo/api/registryapilayer" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" +) + +func TestSaveContainerAccessKeys(t *testing.T) { + r := gin.Default() + registryapilayer.SaveContainerAccessKeys(r) + pushJson := `{ + "username":"name", + "desc":"Docker registry keys", + "accessToken":"290e587a-1790-41d7-a053-61a2ef377875", + "email":"username@gmail.com", + "serverAddress":"http://docker.io/v1" + }` + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/save-container-access-keys", strings.NewReader(pushJson)) + r.ServeHTTP(w, req) + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, "OK", w.Body.String()) +} + +func TestEditContainerAccessKeys(t *testing.T) { + r := gin.Default() + registryapilayer.EditContainerAccessKeys(r) + pushJson := `{ + "username":"name", + "desc":"Docker registry keys", + "accessToken":"290e587a-1790-41d7-a053-61a2ef377875", + "email":"username@gmail.com", + "serverAddress":"http://docker.io/v1" + }` + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/edit-container-access-keys", strings.NewReader(pushJson)) + r.ServeHTTP(w, req) + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, "OK", w.Body.String()) +} + +func TestDeleteContainerAccessKeys(t *testing.T) { + r := gin.Default() + registryapilayer.DeleteContainerAccessKeys(r) + w := httptest.NewRecorder() + req, _ := http.NewRequest("DELETE", "/delete-container-access-keys/165090-yy", nil) + r.ServeHTTP(w, req) + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, "OK", w.Body.String()) +} diff --git a/test/schedulerapilayer_test.go b/test/schedulerapilayer_test.go new file mode 100644 index 0000000..d260aba --- /dev/null +++ b/test/schedulerapilayer_test.go @@ -0,0 +1,64 @@ +package test + +import ( + "net/http" + "net/http/httptest" + "strings" + "testing" + "ukiyo/api/schedulerapilayer" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" +) + +func TestSaveRepositoryScheduledTime(t *testing.T) { + r := gin.Default() + schedulerapilayer.SaveRepositoryScheduledTime(r) + pushJson := `{ + "name": "demo-nginx", + "bindingPort": [{ + "exportPort": "8180", + "internalPort": "80" + }, + { + "exportPort": "443", + "internalPort": "443" + }], + "scheduledAt": "1555438658", + "scheduledDowntime": false + }` + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/save-repository-scheduled-time", strings.NewReader(pushJson)) + r.ServeHTTP(w, req) + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, "OK", w.Body.String()) +} + +func TestEditRepositoryScheduledTime(t *testing.T) { + r := gin.Default() + schedulerapilayer.EditRepositoryScheduledTime(r) + pushJson := `{ + "name": "demo-nginx", + "bindingPort": [{ + "exportPort": "8180", + "internalPort": "80" + }], + "scheduledAt": "1555438658", + "scheduledDowntime": false + }` + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/edit-repository-scheduled-time", strings.NewReader(pushJson)) + r.ServeHTTP(w, req) + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, "OK", w.Body.String()) +} + +func TestDeleteRepositoryScheduledTime(t *testing.T) { + r := gin.Default() + schedulerapilayer.DeleteRepositoryScheduledTime(r) + w := httptest.NewRecorder() + req, _ := http.NewRequest("DELETE", "/remove-repository-scheduled-time/demo-nginx", nil) + r.ServeHTTP(w, req) + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, "OK", w.Body.String()) +} diff --git a/test/webhook-listner_test.go b/test/webhook-listner_test.go new file mode 100644 index 0000000..2bb98a2 --- /dev/null +++ b/test/webhook-listner_test.go @@ -0,0 +1,60 @@ +package test + +import ( + "net/http" + "net/http/httptest" + "strings" + "testing" + webHookListener "ukiyo/pkg/webhook-listener" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" +) + +func TestPingRoute(t *testing.T) { + r := gin.Default() + webHookListener.HealthCheck(r) + + w := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "/ping", nil) + r.ServeHTTP(w, req) + + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, "pong", w.Body.String()) +} + +func TestHookRoute(t *testing.T) { + r := gin.Default() + webHookListener.HooksListener(r) + + pushJson := `{ + "push_data": { + "pushed_at": 1591175168, + "images": [], + "tag": "02", + "pusher": "registryName" + }, + "callback_url": "https://registry.hub.docker.com/u/registryName/demo-nginx/hook/22fbde3h00hi54a3jdf42j5cf44bebjf1/", + "repository": { + "status": "Active", + "description": "", + "is_trusted": false, + "full_description": "", + "repo_url": "https://hub.docker.com/r/registryName/demo-nginx", + "owner": "registryName", + "is_official": false, + "is_private": false, + "name": "demo-nginx", + "namespace": "registryName", + "star_count": 0, + "comment_count": 0, + "date_created": 1555438658, + "repo_name": "registryName/demo-nginx" + } + }` + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/ukiyo-web-hook", strings.NewReader(pushJson)) + r.ServeHTTP(w, req) + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, "OK", w.Body.String()) +} From 369f1e957ef42083ffb5141e831ec746503a68bb Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Fri, 14 Aug 2020 23:39:21 +0530 Subject: [PATCH 10/30] add caching module --- go.mod | 2 + go.sum | 2 + internal/caching/caching.go | 104 ++++++++++++++++++++++++++++++++++++ main.go | 2 +- 4 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 internal/caching/caching.go diff --git a/go.mod b/go.mod index 73cd011..6ff6e44 100644 --- a/go.mod +++ b/go.mod @@ -5,5 +5,7 @@ go 1.14 require ( github.com/fsouza/go-dockerclient v1.6.5 github.com/gin-gonic/gin v1.6.3 + github.com/patrickmn/go-cache v2.1.0+incompatible github.com/sonyarouje/simdb v0.0.0-20181202125413-c2488dfc374a + github.com/stretchr/testify v1.4.0 ) diff --git a/go.sum b/go.sum index b8a9462..c5f1e14 100644 --- a/go.sum +++ b/go.sum @@ -106,6 +106,8 @@ github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJ github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= diff --git a/internal/caching/caching.go b/internal/caching/caching.go new file mode 100644 index 0000000..20aa247 --- /dev/null +++ b/internal/caching/caching.go @@ -0,0 +1,104 @@ +package caching + +import ( + "encoding/json" + "github.com/patrickmn/go-cache" + "log" + "time" + "ukiyo/internal/containerscheduler" + "ukiyo/pkg/jencoder" +) + +var buildTimeMilSec int64 +var buildTimeMnt int64 + +type CashObj struct { + ImageName string `json:"imageName"` + ScheduledAt int64 `json:"scheduledAt"` +} + +func ScheduledRunner() { + pods := containerscheduler.QueryListRecodeInDB() + log.Println("ScheduledRunner trigger ...." + jencoder.PrintJson(pods)) + + if len(pods) > 0 { + for _, pod := range pods { + if len(pod.Name) > 0 && pod.ScheduledDowntime { + loc, _ := time.LoadLocation("Asia/Kolkata") + log.Print("current time") + log.Print(time.Now().In(loc).UnixNano() / int64(time.Millisecond)) + if (pod.ScheduledAt - time.Now().In(loc).UnixNano()/int64(time.Millisecond)) >= 0 { + log.Println("Activated scheduling :" + pod.Name) + CacheRunner(pod.Name, "", pod.ScheduledAt) + } else { + log.Println("Time passed for the scheduling :" + pod.Name) + } + } else { + log.Println("Not activate scheduling :" + pod.Name) + } + } + } +} + +func CacheRunner(name string, imageName string, scheduledAt int64) { + var cashObj CashObj + cashObj.ImageName = "FFF" //-->? + cashObj.ScheduledAt = scheduledAt + + loc, _ := time.LoadLocation("Asia/Kolkata") + buildTimeMilSec = scheduledAt - time.Now().In(loc).UnixNano()/int64(time.Millisecond) + buildTimeMnt = (buildTimeMilSec / 60000) + 1 + + c := cache.New(1*time.Minute, 1*time.Minute) + c.Set(name, cashObj, time.Duration(buildTimeMnt+2)*time.Minute) //--> 5 + + log.Println(buildTimeMnt, buildTimeMnt+2) + log.Println("Applied AfterFunc : " + name) + log.Println(c.Items()) + + time.AfterFunc(time.Duration(buildTimeMnt)*time.Minute, func() { + ContainerRunFunc(name, scheduledAt, c) + }) + + for { + log.Print("%%%") + log.Print(c.Items()) + log.Print("$$$") + time.Sleep(30 * time.Second) + } + +} + +func ContainerRunFunc(name string, scheduledAt int64, c *cache.Cache) { + + log.Println(name + "$$$$$$$$$$") + log.Println(scheduledAt) + + loc, _ := time.LoadLocation("Asia/Kolkata") + if (scheduledAt-time.Now().In(loc).UnixNano()/int64(time.Millisecond)) > 60000 || + (scheduledAt-time.Now().In(loc).UnixNano()/int64(time.Millisecond)) < 60000 { + + log.Println("Trigger Start Container @ : " + name) + + var cashObj CashObj + if x, found := c.Get(name); found { + err := json.Unmarshal(jencoder.PassJson(x), &cashObj) + if err != nil { + log.Println(err) + } + log.Println(cashObj.ImageName) + log.Println(cashObj.ScheduledAt) + } + + } else { + log.Println("Not Valid Time for Start Container") + } + + for { + log.Print("##") + log.Print(c.Items()) + log.Print("**") + time.Sleep(30 * time.Second) + } + +} diff --git a/main.go b/main.go index 2430c27..68cf741 100644 --- a/main.go +++ b/main.go @@ -5,7 +5,7 @@ import ( "ukiyo/api/historyapilayer" "ukiyo/api/registryapilayer" "ukiyo/api/schedulerapilayer" - "ukiyo/pkg/scheduler" + "ukiyo/internal/caching" "ukiyo/pkg/webhook-listener" ) From 657b6aee0a7336912d3ec2658cc6d5023c1d8e27 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Fri, 14 Aug 2020 23:41:12 +0530 Subject: [PATCH 11/30] update containerscheduler with cache --- internal/containerscheduler/containerscheduler.go | 2 +- pkg/jencoder/jencoder.go | 9 +++++++++ pkg/scheduler/scheduler.go | 15 ++------------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/internal/containerscheduler/containerscheduler.go b/internal/containerscheduler/containerscheduler.go index 5f9a9f7..af83f12 100644 --- a/internal/containerscheduler/containerscheduler.go +++ b/internal/containerscheduler/containerscheduler.go @@ -9,7 +9,7 @@ import ( type PodsDetails struct { Name string `json:"name"` BindingPort []BindingPort `json:"bindingPort"` - ScheduledAt int `json:"scheduledAt"` + ScheduledAt int64 `json:"scheduledAt"` ScheduledDowntime bool `json:"scheduledDowntime"` } diff --git a/pkg/jencoder/jencoder.go b/pkg/jencoder/jencoder.go index 3b260df..abf12e7 100644 --- a/pkg/jencoder/jencoder.go +++ b/pkg/jencoder/jencoder.go @@ -13,3 +13,12 @@ func PrintJson(obj interface{}) string { } return string(b) } + +func PassJson(obj interface{}) []byte { + b, err := json.Marshal(obj) + if err != nil { + log.Println(err) + return nil + } + return b +} \ No newline at end of file diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go index e597c6b..cefd02e 100644 --- a/pkg/scheduler/scheduler.go +++ b/pkg/scheduler/scheduler.go @@ -2,7 +2,7 @@ package scheduler import ( "log" - "time" + "ukiyo/internal/caching" "ukiyo/internal/containerscheduler" "ukiyo/pkg/jencoder" "ukiyo/pkg/manager/dockercreater" @@ -10,14 +10,6 @@ import ( "ukiyo/pkg/manager/dockerrunner" ) -func ScheduledRunner() { - pods := containerscheduler.QueryListRecodeInDB() - log.Println("ScheduledRunner trigger ...." + jencoder.PrintJson(pods)) - time.AfterFunc(1*time.Minute, func() { - Foo() - }) -} - func WebHookScheduler(name string, imageName string) { pod := containerscheduler.QueryRecodeInDB(name) if len(pod.Name) > 0 && !pod.ScheduledDowntime { @@ -40,10 +32,7 @@ func WebHookScheduler(name string, imageName string) { log.Println("Stop Container runner - WebHookScheduler - Failed Running Container remove process") } } else { + caching.CacheRunner(name, imageName, 0) log.Println("No saved pod details to schedule images") } } - -func Foo() { - log.Println("Foo run for more than a minute.") -} \ No newline at end of file From c7760247a037ec289904fbec30751034bfd9f632 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sat, 15 Aug 2020 23:51:23 +0530 Subject: [PATCH 12/30] add event scheduler --- Dockerfile | 2 +- main.go | 15 +++-- pkg/scheduler/eventsheduler/scheduler.go | 80 ++++++++++++++++++++++++ 3 files changed, 90 insertions(+), 7 deletions(-) create mode 100644 pkg/scheduler/eventsheduler/scheduler.go diff --git a/Dockerfile b/Dockerfile index e37a714..7379c3e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ FROM alpine - +RUN apk add --no-cache tzdata COPY ukiyo . COPY dbs . RUN chmod 777 ./ukiyo diff --git a/main.go b/main.go index 68cf741..e8b6ec0 100644 --- a/main.go +++ b/main.go @@ -2,25 +2,28 @@ package main import ( "github.com/gin-gonic/gin" + "github.com/patrickmn/go-cache" + "time" "ukiyo/api/historyapilayer" "ukiyo/api/registryapilayer" "ukiyo/api/schedulerapilayer" - "ukiyo/internal/caching" + "ukiyo/pkg/scheduler/eventsheduler" "ukiyo/pkg/webhook-listener" ) func main() { r := gin.Default() + c := cache.New(1*time.Minute, 1*time.Minute) webhook_listener.HealthCheck(r) - webhook_listener.HooksListener(r) + webhook_listener.HooksListener(r, c) registryapilayer.SaveContainerAccessKeys(r) registryapilayer.EditContainerAccessKeys(r) registryapilayer.DeleteContainerAccessKeys(r) - schedulerapilayer.SaveRepositoryScheduledTime(r) - schedulerapilayer.EditRepositoryScheduledTime(r) - schedulerapilayer.DeleteRepositoryScheduledTime(r) + schedulerapilayer.SaveRepositoryScheduledTime(r, c) + schedulerapilayer.EditRepositoryScheduledTime(r, c) + schedulerapilayer.DeleteRepositoryScheduledTime(r, c) historyapilayer.GetAllContainerHistory(r) historyapilayer.GetAllContainerHistoryByName(r) - scheduler.ScheduledRunner() + eventsheduler.ScheduledRunner("run", "", 0, c) r.Run(":8080") } diff --git a/pkg/scheduler/eventsheduler/scheduler.go b/pkg/scheduler/eventsheduler/scheduler.go new file mode 100644 index 0000000..2ec8325 --- /dev/null +++ b/pkg/scheduler/eventsheduler/scheduler.go @@ -0,0 +1,80 @@ +package eventsheduler + +import ( + "github.com/patrickmn/go-cache" + "log" + "time" + "ukiyo/internal/caching" + "ukiyo/internal/containerscheduler" + "ukiyo/pkg/jencoder" +) + +const ( + _TimeZone = "Asia/Kolkata" +) + +func ScheduledRunner(event string, name string, ScheduledAt int64, c *cache.Cache) { + switch env := event; env { + case "run": + RunEvent(c) + case "save": + SaveEvent(name, ScheduledAt, c) + case "edit": + EditEvent(name, ScheduledAt, c) + case "delete": + DeleteEvent(name, c) + default: + log.Println("No Matching Event in ScheduledRunner") + } + +} + +func RunEvent(c *cache.Cache) { + log.Println("RunEvent") + pods := containerscheduler.QueryListRecodeInDB() + log.Println("ScheduledRunner trigger ...." + jencoder.PrintJson(pods)) + + if len(pods) > 0 { + for _, pod := range pods { + if len(pod.Name) > 0 && pod.ScheduledDowntime { + loc, _ := time.LoadLocation(_TimeZone) + log.Print(time.Now().In(loc).UnixNano() / int64(time.Millisecond)) + if (pod.ScheduledAt - time.Now().In(loc).UnixNano()/int64(time.Millisecond)) >= 0 { + log.Println("Activated scheduling :" + pod.Name) + caching.CacheRunner(pod.Name, "", pod.ScheduledAt, c) + } else { + log.Println("Time passed for the scheduling :" + pod.Name) + } + } else { + log.Println("Not activate scheduling :" + pod.Name) + } + } + } + log.Println(c.Items()) +} + +func SaveEvent(name string, scheduledAt int64, c *cache.Cache) { + log.Println("SaveEvent") + log.Println(c.Items()) + loc, _ := time.LoadLocation(_TimeZone) + if (scheduledAt - time.Now().In(loc).UnixNano()/int64(time.Millisecond)) >= 0 { + caching.CacheRunner(name, "", scheduledAt, c) + } else { + log.Println("Time passed for the scheduling :" + name) + } + log.Println(c.Items()) +} + +func EditEvent(name string, scheduledAt int64, c *cache.Cache) { + log.Println("EditEvent") + log.Println(c.Items()) + caching.CacheRunner(name, "", scheduledAt, c) + log.Println(c.Items()) +} + +func DeleteEvent(name string, c *cache.Cache) { + log.Println("DeleteEvent") + log.Println(c.Items()) + c.Delete(name) + log.Println(c.Items()) +} From 3fa7d1ffcae845d4b8dc3c8ac82637e71d28e0d0 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sun, 16 Aug 2020 21:20:25 +0530 Subject: [PATCH 13/30] change event scheduler --- README.md | 57 +++++++++++++++++++++++++++++++++-- test/registryapilayer_test.go | 2 +- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a4ef2b8..14e6f8f 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,6 @@ - Container manager - Push manager (webhooks configuration) - Scheduler -- OPTIONAL - Pull based update implementation ## Execution modes @@ -75,7 +74,18 @@ http:{serverIP}:8080/save-container-access-keys "email":"your email" "serverAddress":"http://docker.io/v1" } +``` +```sh +curl -X POST \ +-H "Accept: Application/json" \ +-H "Content-Type: application/json" http://{serverIP}:8080/save-container-access-keys \ +-d '{"username":"docker registry name","desc":"docker registry description", +"accessToken":"docker registry accesstoken","email":"your email", +"serverAddress":"http://docker.io/v1"}' +``` +Update your own docker registy details +``` http:{serverIP}:8080/edit-container-access-keys { "username":"docker registry name" @@ -84,11 +94,27 @@ http:{serverIP}:8080/edit-container-access-keys "email":"new email" "serverAddress":"http://docker.io/v1" } +``` +```sh +curl -X POST \ +-H "Accept: Application/json" \ +-H "Content-Type: application/json" http://{serverIP}:8080/edit-container-access-keys \ +-d '{"username":"docker registry name","desc":"docker registry description", +"accessToken":"docker registry accesstoken","email":"your email", +"serverAddress":"http://docker.io/v1"}' +``` +Delete your docker registy details +``` http://{serverIP}:8080/delete-container-access-keys/{registryname} ``` +```sh +curl -X DELETE \ +-H "Accept: Application/json" \ +-H "Content-Type: application/json" http://{serverIP}:8080/delete-container-access-keys/{registryname} +``` -Add your deployment details +Add your deployment details and set schedule deployment time ``` http://{serverIP}:8080/save-repository-scheduled-time { @@ -105,7 +131,17 @@ http://{serverIP}:8080/save-repository-scheduled-time "scheduledAt": "1555438658", "scheduledDowntime": false } - +``` +```sh +curl -X POST \ +-H "Accept: Application/json" \ +-H "Content-Type: application/json" http://{serverIP}:8080/save-repository-scheduled-time \ +-d '{"name": "repository name","bindingPort": [{ "exportPort": "8180", "internalPort": "80" }, +{ "exportPort": "443", "internalPort": "443" }], "scheduledAt": 1555438658, "scheduledDowntime": false}' +``` + +Change the deployment schedule +``` http://{serverIP}:8080/edit-repository-scheduled-time { "name": "repository name", @@ -117,9 +153,24 @@ http://{serverIP}:8080/edit-repository-scheduled-time "scheduledAt": "1555438658", "scheduledDowntime": false } +``` +```sh +curl -X POST \ +-H "Accept: Application/json" \ +-H "Content-Type: application/json" http://{serverIP}:8080/edit-repository-scheduled-time \ +-d '{"name": "repository name","bindingPort": [{ "exportPort": "8180", "internalPort": "80" }, +{ "exportPort": "443", "internalPort": "443" }], "scheduledAt": 1555438658, "scheduledDowntime": false}' +``` +Delete your deployment details +``` http://{serverIP}:8080/remove-repository-scheduled-time/{repositoryname} ``` +```sh +curl -X DELETE \ +-H "Accept: Application/json" \ +-H "Content-Type: application/json" http://{serverIP}:8080/remove-repository-scheduled-time/{repositoryname} +``` List your deployment details ``` diff --git a/test/registryapilayer_test.go b/test/registryapilayer_test.go index dd5a18a..04223a6 100644 --- a/test/registryapilayer_test.go +++ b/test/registryapilayer_test.go @@ -49,7 +49,7 @@ func TestDeleteContainerAccessKeys(t *testing.T) { r := gin.Default() registryapilayer.DeleteContainerAccessKeys(r) w := httptest.NewRecorder() - req, _ := http.NewRequest("DELETE", "/delete-container-access-keys/165090-yy", nil) + req, _ := http.NewRequest("DELETE", "/delete-container-access-keys/registryName", nil) r.ServeHTTP(w, req) assert.Equal(t, http.StatusOK, w.Code) assert.Equal(t, "OK", w.Body.String()) From 4517f89798f05046bd2d98adb1a2b4ea7b4a516f Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Tue, 18 Aug 2020 16:48:15 +0530 Subject: [PATCH 14/30] remove containerhistory --- api/historyapilayer/historyapilayer.go | 26 ---- internal/containerhistory/containerhistory.go | 131 ------------------ test/historyapilayer_test.go | 1 - 3 files changed, 158 deletions(-) delete mode 100644 api/historyapilayer/historyapilayer.go delete mode 100644 internal/containerhistory/containerhistory.go delete mode 100644 test/historyapilayer_test.go diff --git a/api/historyapilayer/historyapilayer.go b/api/historyapilayer/historyapilayer.go deleted file mode 100644 index 7a14e95..0000000 --- a/api/historyapilayer/historyapilayer.go +++ /dev/null @@ -1,26 +0,0 @@ -package historyapilayer - -import ( - "github.com/gin-gonic/gin" - "log" - "net/http" - "ukiyo/internal/containerhistory" -) - -func GetAllContainerHistory(r *gin.Engine) { - r.GET("/get-container-history/:pageNo", func(c *gin.Context) { - pageNo := c.Param("pageNo") - response := containerhistory.QueryAllHistoryRecodeInDB(pageNo) - log.Println("Container History details by pageNo=" + pageNo) - c.JSON(http.StatusOK, response) - }) -} - -func GetAllContainerHistoryByName(r *gin.Engine) { - r.GET("/get-container-history-by-name/:name", func(c *gin.Context) { - var response containerhistory.HistoryResponse - name := c.Param("name") - log.Println("Container History details by name=" + name) - c.JSON(http.StatusOK, response) - }) -} diff --git a/internal/containerhistory/containerhistory.go b/internal/containerhistory/containerhistory.go deleted file mode 100644 index 8fb6bfe..0000000 --- a/internal/containerhistory/containerhistory.go +++ /dev/null @@ -1,131 +0,0 @@ -package containerhistory - -import ( - "log" - "ukiyo/internal/containeraccess" - "ukiyo/internal/containerscheduler" - "ukiyo/internal/dbconfig" -) - -type HistoryDetails struct { - Name string `json:"name"` - Data []Data `json:"data"` -} - -type Data struct { - Id int `json:"id"` - EventType string `json:"eventType"` - EventObject EventObject `json:"eventObject"` - EventData EventData `json:"eventData"` -} - -type EventObject struct { - EventCode int `json:"EventCode"` - EventDesc string `json:"eventDesc"` - EventAt int `json:"eventAt"` -} - -type EventData struct { - ContainerKeys containeraccess.ContainerKeys `json:"containerKeys"` - PodsDetails containerscheduler.PodsDetails `json:"podsDetails"` - ImagePuller ImagePuller `json:"imagePuller"` - DockerCreator DockerCreator `json:"dockerCreator"` - DockerRunner DockerRunner `json:"dockerRunner"` -} - -type DockerCreator struct { - Name string `json:"name"` - ContainerId string `json:"containerId"` -} - -type ImagePuller struct { - Name string `json:"name"` - ImageName string `json:"imageName"` -} - -type DockerRunner struct { - Name string `json:"name"` -} - -type HistoryResponse struct { - ResponseCode int - ResponseDesc string - PageNumbers int - HistoryDetails HistoryDetails -} - -const ( - _podsPk = "name" - _eventTypeContainerKeys = "Save Container Keys Event" - _eventTypePodsDetails = "Save Pod Details for Deployment Event" - _eventTypeImagePuller = "Pull Image Event" - _eventTypeDockerCreator = "Create Docker Event" - _eventTypeDockerRunner = "Run Image Event" -) - -func (c HistoryDetails) ID() (jsonField string, value interface{}) { - value = c.Name - jsonField = _podsPk - return -} - -func UpdateContainerHistory(name string, data Data) { - var history = QueryHistoryRecodeInDB(name) - if len(history.Name) > 0 { - data.Id = len(history.Data) + 1 - history.Data = append(history.Data, data) - UpdateDb(history) - } else { - var historyDetails HistoryDetails - historyDetails.Name = name - data.Id = 1 - historyDetails.Data = append(historyDetails.Data, data) - InsertDb(historyDetails) - } -} - -func QueryAllHistoryRecodeInDB(pageNo string) HistoryResponse { - var historyRes HistoryResponse - var historyDetails HistoryDetails - err := dbconfig.DbConfig().Open(HistoryDetails{}).First().AsEntity(&historyDetails) - if err != nil { - log.Println(err) - historyRes.ResponseCode = 1 - historyRes.ResponseDesc = "Failed" - return historyRes - } else { - historyRes.ResponseCode = 0 - historyRes.ResponseDesc = "Success" - historyRes.HistoryDetails = historyDetails - historyRes.PageNumbers = 1 - } - return historyRes -} - -func QueryHistoryRecodeInDB(Name string) HistoryDetails { - var history HistoryDetails - err := dbconfig.DbConfig().Open(HistoryDetails{}).Where(_podsPk, "=", Name).First().AsEntity(&history) - if err != nil { - log.Println(err) - return history - } - return history -} - -func InsertDb(historyDetails HistoryDetails) { - err := dbconfig.DbConfig().Insert(historyDetails) - if err != nil { - log.Println("Fail History Recode Insert") - } else { - log.Println("Successfully Installed History Recode") - } -} - -func UpdateDb(historyDetails HistoryDetails) { - err := dbconfig.DbConfig().Update(historyDetails) - if err != nil { - log.Println("Fail History Recode Update") - } else { - log.Println("Successfully Updated History Recode") - } -} diff --git a/test/historyapilayer_test.go b/test/historyapilayer_test.go deleted file mode 100644 index 56e5404..0000000 --- a/test/historyapilayer_test.go +++ /dev/null @@ -1 +0,0 @@ -package test From 1747f577324f4eef7a3309a529540eeee836532f Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Tue, 18 Aug 2020 16:51:34 +0530 Subject: [PATCH 15/30] add port change func --- internal/caching/caching.go | 72 +++++-------------- .../containerscheduler/containerscheduler.go | 17 ++++- 2 files changed, 34 insertions(+), 55 deletions(-) diff --git a/internal/caching/caching.go b/internal/caching/caching.go index 20aa247..ef7440b 100644 --- a/internal/caching/caching.go +++ b/internal/caching/caching.go @@ -5,52 +5,32 @@ import ( "github.com/patrickmn/go-cache" "log" "time" - "ukiyo/internal/containerscheduler" "ukiyo/pkg/jencoder" + "ukiyo/pkg/scheduler" ) var buildTimeMilSec int64 var buildTimeMnt int64 +const ( + _TimeZone = "Asia/Kolkata" +) + type CashObj struct { ImageName string `json:"imageName"` ScheduledAt int64 `json:"scheduledAt"` } -func ScheduledRunner() { - pods := containerscheduler.QueryListRecodeInDB() - log.Println("ScheduledRunner trigger ...." + jencoder.PrintJson(pods)) - - if len(pods) > 0 { - for _, pod := range pods { - if len(pod.Name) > 0 && pod.ScheduledDowntime { - loc, _ := time.LoadLocation("Asia/Kolkata") - log.Print("current time") - log.Print(time.Now().In(loc).UnixNano() / int64(time.Millisecond)) - if (pod.ScheduledAt - time.Now().In(loc).UnixNano()/int64(time.Millisecond)) >= 0 { - log.Println("Activated scheduling :" + pod.Name) - CacheRunner(pod.Name, "", pod.ScheduledAt) - } else { - log.Println("Time passed for the scheduling :" + pod.Name) - } - } else { - log.Println("Not activate scheduling :" + pod.Name) - } - } - } -} - -func CacheRunner(name string, imageName string, scheduledAt int64) { +func CacheRunner(name string, imageName string, scheduledAt int64, c *cache.Cache) { var cashObj CashObj - cashObj.ImageName = "FFF" //-->? + cashObj.ImageName = imageName cashObj.ScheduledAt = scheduledAt - loc, _ := time.LoadLocation("Asia/Kolkata") + loc, _ := time.LoadLocation(_TimeZone) buildTimeMilSec = scheduledAt - time.Now().In(loc).UnixNano()/int64(time.Millisecond) buildTimeMnt = (buildTimeMilSec / 60000) + 1 - c := cache.New(1*time.Minute, 1*time.Minute) - c.Set(name, cashObj, time.Duration(buildTimeMnt+2)*time.Minute) //--> 5 + c.Set(name, cashObj, time.Duration(buildTimeMnt+2)*time.Minute) log.Println(buildTimeMnt, buildTimeMnt+2) log.Println("Applied AfterFunc : " + name) @@ -59,24 +39,12 @@ func CacheRunner(name string, imageName string, scheduledAt int64) { time.AfterFunc(time.Duration(buildTimeMnt)*time.Minute, func() { ContainerRunFunc(name, scheduledAt, c) }) - - for { - log.Print("%%%") - log.Print(c.Items()) - log.Print("$$$") - time.Sleep(30 * time.Second) - } - } func ContainerRunFunc(name string, scheduledAt int64, c *cache.Cache) { - - log.Println(name + "$$$$$$$$$$") - log.Println(scheduledAt) - - loc, _ := time.LoadLocation("Asia/Kolkata") - if (scheduledAt-time.Now().In(loc).UnixNano()/int64(time.Millisecond)) > 60000 || - (scheduledAt-time.Now().In(loc).UnixNano()/int64(time.Millisecond)) < 60000 { + loc, _ := time.LoadLocation(_TimeZone) + if ((scheduledAt - time.Now().In(loc).UnixNano()/int64(time.Millisecond)) > 60000) || + ((scheduledAt - time.Now().In(loc).UnixNano()/int64(time.Millisecond)) < 60000) { log.Println("Trigger Start Container @ : " + name) @@ -86,19 +54,15 @@ func ContainerRunFunc(name string, scheduledAt int64, c *cache.Cache) { if err != nil { log.Println(err) } - log.Println(cashObj.ImageName) - log.Println(cashObj.ScheduledAt) + if len(cashObj.ImageName) > 0 { + log.Println("Starting to create scheduled container : " + cashObj.ImageName) + scheduler.DeploymentProcess(name, cashObj.ImageName) + } else { + log.Println("Failed to create scheduled container, No image in cache : null") + } } } else { log.Println("Not Valid Time for Start Container") } - - for { - log.Print("##") - log.Print(c.Items()) - log.Print("**") - time.Sleep(30 * time.Second) - } - } diff --git a/internal/containerscheduler/containerscheduler.go b/internal/containerscheduler/containerscheduler.go index af83f12..c4b089c 100644 --- a/internal/containerscheduler/containerscheduler.go +++ b/internal/containerscheduler/containerscheduler.go @@ -28,6 +28,13 @@ const ( ) var val int +var buildTimeMilSec int64 +var buildTimeMnt int64 + +type CashObj struct { + ImageName string `json:"imageName"` + ScheduledAt int64 `json:"scheduledAt"` +} func (c PodsDetails) ID() (jsonField string, value interface{}) { value = c.Name @@ -36,7 +43,14 @@ func (c PodsDetails) ID() (jsonField string, value interface{}) { } func GetBindingPortsForContainerCreate(name string) []string { - return []string{"8180:80", "443:443"} + var data []string + pod := QueryRecodeInDB(name) + if len(pod.BindingPort) > 0 { + for _, port := range pod.BindingPort { + data = append(data, port.ExportPort+":"+port.InternalPort) + } + } + return data } func InsertPodsData(podsDetails PodsDetails) ResponseObj { @@ -66,6 +80,7 @@ func UpdatePodsData(podsDetails PodsDetails) ResponseObj { if len(pod.Name) != 0 { pod.BindingPort = podsDetails.BindingPort pod.ScheduledAt = podsDetails.ScheduledAt + pod.ScheduledDowntime = podsDetails.ScheduledDowntime responseObj = UpdateDb(pod) } else { responseObj.ResponseCode = 1 From c70d9bdf04d653e50eeb6618381407b0de450b93 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Tue, 18 Aug 2020 16:54:04 +0530 Subject: [PATCH 16/30] remove deployment detail --- README.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 14e6f8f..a1d297e 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ http:{serverIP}:8080/save-container-access-keys "serverAddress":"http://docker.io/v1" } ``` + ```sh curl -X POST \ -H "Accept: Application/json" \ @@ -95,6 +96,7 @@ http:{serverIP}:8080/edit-container-access-keys "serverAddress":"http://docker.io/v1" } ``` + ```sh curl -X POST \ -H "Accept: Application/json" \ @@ -108,6 +110,7 @@ Delete your docker registy details ``` http://{serverIP}:8080/delete-container-access-keys/{registryname} ``` + ```sh curl -X DELETE \ -H "Accept: Application/json" \ @@ -128,16 +131,17 @@ http://{serverIP}:8080/save-repository-scheduled-time "exportPort": "443", "internalPort": "443" }], - "scheduledAt": "1555438658", + "scheduledTime": "Aug 17 2020 00:40:50 AM", "scheduledDowntime": false } ``` + ```sh curl -X POST \ -H "Accept: Application/json" \ -H "Content-Type: application/json" http://{serverIP}:8080/save-repository-scheduled-time \ -d '{"name": "repository name","bindingPort": [{ "exportPort": "8180", "internalPort": "80" }, -{ "exportPort": "443", "internalPort": "443" }], "scheduledAt": 1555438658, "scheduledDowntime": false}' +{ "exportPort": "443", "internalPort": "443" }], "scheduledTime": "Aug 17 2020 00:40:50 AM", "scheduledDowntime": false}' ``` Change the deployment schedule @@ -150,31 +154,26 @@ http://{serverIP}:8080/edit-repository-scheduled-time "exportPort": "8180", "internalPort": "80" }], - "scheduledAt": "1555438658", + "scheduledTime": "Aug 17 2020 00:40:50 AM", "scheduledDowntime": false } ``` + ```sh curl -X POST \ -H "Accept: Application/json" \ -H "Content-Type: application/json" http://{serverIP}:8080/edit-repository-scheduled-time \ --d '{"name": "repository name","bindingPort": [{ "exportPort": "8180", "internalPort": "80" }, -{ "exportPort": "443", "internalPort": "443" }], "scheduledAt": 1555438658, "scheduledDowntime": false}' +-d '{"name": "repository name","bindingPort": [{ "exportPort": "8180", "internalPort": "80" }, { "exportPort": "443", "internalPort": "443" }], "scheduledTime": "Aug 17 2020 00:40:50 AM", "scheduledDowntime": true}' ``` Delete your deployment details ``` http://{serverIP}:8080/remove-repository-scheduled-time/{repositoryname} ``` + ```sh curl -X DELETE \ -H "Accept: Application/json" \ -H "Content-Type: application/json" http://{serverIP}:8080/remove-repository-scheduled-time/{repositoryname} ``` -List your deployment details -``` -http://{serverIP}:8080/get-container-history/1 - -http://{serverIP}:8080/get-container-history-by-name/{repositoryname} -``` From 571274c6305d3a1e8afa42e8198c6d6c39e2cf33 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Wed, 19 Aug 2020 23:47:05 +0530 Subject: [PATCH 17/30] add cache updater --- go.mod | 3 +++ go.sum | 4 ++++ main.go | 15 ++++++++++++--- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6ff6e44..89a8bd9 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,10 @@ go 1.14 require ( github.com/fsouza/go-dockerclient v1.6.5 github.com/gin-gonic/gin v1.6.3 + github.com/golang/protobuf v1.3.3 + github.com/olekukonko/tablewriter v0.0.4 github.com/patrickmn/go-cache v2.1.0+incompatible + github.com/sirupsen/logrus v1.4.1 github.com/sonyarouje/simdb v0.0.0-20181202125413-c2488dfc374a github.com/stretchr/testify v1.4.0 ) diff --git a/go.sum b/go.sum index c5f1e14..3754fe2 100644 --- a/go.sum +++ b/go.sum @@ -87,12 +87,16 @@ github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= diff --git a/main.go b/main.go index e8b6ec0..9a72384 100644 --- a/main.go +++ b/main.go @@ -3,15 +3,25 @@ package main import ( "github.com/gin-gonic/gin" "github.com/patrickmn/go-cache" + "log" + "os" "time" - "ukiyo/api/historyapilayer" "ukiyo/api/registryapilayer" "ukiyo/api/schedulerapilayer" + "ukiyo/pkg/process" "ukiyo/pkg/scheduler/eventsheduler" "ukiyo/pkg/webhook-listener" ) func main() { + + file, err := os.OpenFile("info.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) + if err != nil { + log.Fatal(err) + } + defer file.Close() + log.SetOutput(file) + r := gin.Default() c := cache.New(1*time.Minute, 1*time.Minute) webhook_listener.HealthCheck(r) @@ -22,8 +32,7 @@ func main() { schedulerapilayer.SaveRepositoryScheduledTime(r, c) schedulerapilayer.EditRepositoryScheduledTime(r, c) schedulerapilayer.DeleteRepositoryScheduledTime(r, c) - historyapilayer.GetAllContainerHistory(r) - historyapilayer.GetAllContainerHistoryByName(r) eventsheduler.ScheduledRunner("run", "", 0, c) + go process.Process(c) r.Run(":8080") } From 62fda056d318b861b93dff87031cb4d2ade15376 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Wed, 19 Aug 2020 23:48:46 +0530 Subject: [PATCH 18/30] recreate process --- pkg/process/process.go | 70 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 pkg/process/process.go diff --git a/pkg/process/process.go b/pkg/process/process.go new file mode 100644 index 0000000..b61f599 --- /dev/null +++ b/pkg/process/process.go @@ -0,0 +1,70 @@ +package process + +import ( + "github.com/olekukonko/tablewriter" + "github.com/patrickmn/go-cache" + "os" + "os/exec" + "time" + "ukiyo/internal/caching/cacheupdate" + "ukiyo/internal/containerscheduler" +) + +type DataObj struct { + Name string + ImageName string + ScheduleType string + TimeMnt string + Ports string +} + +func Process(c *cache.Cache) string { + for { + var dataObjList []DataObj + var data [][]string + + pods := containerscheduler.QueryListRecodeInDB() + if len(pods) > 0 { + for _, pod := range pods { + var dataObj DataObj + dataObj.Name = pod.Name + if pod.ScheduledDowntime { + dataObj.ScheduleType = "true" + a, b, c := cacheupdate.TimeCalculator(pod.Name, c) + dataObj.ImageName = c + dataObj.TimeMnt = a + " [mm]: " + b + " [SS]" + } else { + dataObj.ScheduleType = "false" + dataObj.ImageName = "-" + dataObj.TimeMnt = "00 [mm]: " + "00 [SS]" + } + + if len(pod.BindingPort) > 0 { + for _, port := range pod.BindingPort { + dataObj.Ports = dataObj.Ports + port.InternalPort + "->" + port.ExportPort + ", " + } + } + dataObjList = append(dataObjList, dataObj) + } + } + + if len(dataObjList) > 0 { + for _, dataObj := range dataObjList { + data = append(data, []string{dataObj.Name, dataObj.ImageName, dataObj.ScheduleType, dataObj.TimeMnt, dataObj.Ports}) + } + } + + table := tablewriter.NewWriter(os.Stdout) + table.SetHeader([]string{"Name", "Image Name", "Build Scheduled", "Time", "Exec Command"}) + + for _, v := range data { + table.Append(v) + } + table.Render() + + time.Sleep(1 * time.Second) + c := exec.Command("clear") + c.Stdout = os.Stdout + c.Run() + } +} From dae8b5033f89994a8527bd5714af175bd3e40fec Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Fri, 21 Aug 2020 23:25:28 +0530 Subject: [PATCH 19/30] recreate dockerpuller with cacheupdater --- api/registryapilayer/registryapilayer.go | 9 +- api/schedulerapilayer/schedulerapilayer.go | 108 ++++++++++++++++++--- pkg/jencoder/jencoder.go | 2 +- pkg/manager/dockerpull/dockerpull.go | 14 --- 4 files changed, 99 insertions(+), 34 deletions(-) diff --git a/api/registryapilayer/registryapilayer.go b/api/registryapilayer/registryapilayer.go index d58a720..2a89134 100644 --- a/api/registryapilayer/registryapilayer.go +++ b/api/registryapilayer/registryapilayer.go @@ -13,7 +13,7 @@ func SaveContainerAccessKeys(r *gin.Engine) { var containerKey containeraccess.ContainerKeys var responseObj containeraccess.ResponseObj c.ShouldBindJSON(&containerKey) - log.Println("Container keys save details" + jencoder.PrintJson(containerKey)) + log.Println("save-container-access-keys | request : " + jencoder.PrintJson(containerKey)) if len(containerKey.UserName) > 0 && len(containerKey.AccessToken) > 0 && len(containerKey.ServerAddress) > 0 { res := containeraccess.InsertDockerRegData(containerKey) @@ -22,6 +22,7 @@ func SaveContainerAccessKeys(r *gin.Engine) { responseObj.ResponseCode = 1 responseObj.ResponseDesc = "Invalid Parameter" } + log.Println("save-container-access-keys | response : " + jencoder.PrintJson(responseObj)) c.JSON(http.StatusOK, responseObj) }) } @@ -31,7 +32,7 @@ func EditContainerAccessKeys(r *gin.Engine) { var containerKey containeraccess.ContainerKeys var responseObj containeraccess.ResponseObj c.ShouldBindJSON(&containerKey) - log.Println("Container keys Update details" + jencoder.PrintJson(containerKey)) + log.Println("edit-container-access-keys | request : " + jencoder.PrintJson(containerKey)) if len(containerKey.UserName) > 0 && len(containerKey.AccessToken) > 0 { res := containeraccess.UpdateDockerRegData(containerKey) @@ -40,6 +41,7 @@ func EditContainerAccessKeys(r *gin.Engine) { responseObj.ResponseCode = 1 responseObj.ResponseDesc = "Invalid Parameter" } + log.Println("edit-container-access-keys | response :" + jencoder.PrintJson(responseObj)) c.JSON(http.StatusOK, responseObj) }) } @@ -48,7 +50,7 @@ func DeleteContainerAccessKeys(r *gin.Engine) { r.DELETE("/delete-container-access-keys/:userName", func(c *gin.Context) { var responseObj containeraccess.ResponseObj name := c.Param("userName") - log.Println("Container keys Delete details userName=" + name) + log.Println("delete-container-access-keys | request : userName=" + name) if len(name) > 0 { res := containeraccess.DeleteDockerRegData(name) responseObj = res @@ -56,6 +58,7 @@ func DeleteContainerAccessKeys(r *gin.Engine) { responseObj.ResponseCode = 1 responseObj.ResponseDesc = "Invalid Parameter" } + log.Println("delete-container-access-keys | response : " + jencoder.PrintJson(responseObj)) c.JSON(http.StatusOK, responseObj) }) } diff --git a/api/schedulerapilayer/schedulerapilayer.go b/api/schedulerapilayer/schedulerapilayer.go index 93c5392..85656b8 100644 --- a/api/schedulerapilayer/schedulerapilayer.go +++ b/api/schedulerapilayer/schedulerapilayer.go @@ -2,61 +2,137 @@ package schedulerapilayer import ( "github.com/gin-gonic/gin" + "github.com/patrickmn/go-cache" "log" "net/http" + "time" "ukiyo/internal/containerscheduler" "ukiyo/internal/util" "ukiyo/pkg/jencoder" + "ukiyo/pkg/scheduler/eventsheduler" ) -func SaveRepositoryScheduledTime(r *gin.Engine) { +const ( + _TimeZone = "Asia/Kolkata" + _format = "Jan _2 2006 3:04:05 PM" +) + +type PodsDetailsObj struct { + Name string `json:"name"` + BindingPort []containerscheduler.BindingPort `json:"bindingPort"` + ScheduledTime string `json:"scheduledTime"` + ScheduledDowntime bool `json:"scheduledDowntime"` +} + +func SaveRepositoryScheduledTime(r *gin.Engine, cache *cache.Cache) { r.POST("/save-repository-scheduled-time", func(c *gin.Context) { - var podsDetails containerscheduler.PodsDetails + var podsDetailsObj PodsDetailsObj var responseObj containerscheduler.ResponseObj - c.ShouldBindJSON(&podsDetails) - log.Println("Pods save details" + jencoder.PrintJson(podsDetails)) + c.ShouldBindJSON(&podsDetailsObj) + log.Println("save-repository-scheduled-time | request : " + jencoder.PrintJson(podsDetailsObj)) - if len(podsDetails.Name) > 0 && util.BindPortValidator(podsDetails.BindingPort) { - res := containerscheduler.InsertPodsData(podsDetails) - responseObj = res + loc, _ := time.LoadLocation(_TimeZone) + if len(podsDetailsObj.Name) > 0 && util.BindPortValidator(podsDetailsObj.BindingPort) { + podsDetails, status := RequestDateConverter(podsDetailsObj) + if podsDetails.ScheduledDowntime && status == 0 { + if ((podsDetails.ScheduledAt - time.Now().In(loc).UnixNano()/int64(time.Millisecond)) / 60000) >= 5 { + res := containerscheduler.InsertPodsData(podsDetails) + if res.ResponseCode == 0 { + eventsheduler.ScheduledRunner("save", podsDetails.Name, podsDetails.ScheduledAt, cache) + } + responseObj = res + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Invalid Scheduled Time. Minimum 5Mnt Required" + } + } else if status == 0 { + res := containerscheduler.InsertPodsData(podsDetails) + responseObj = res + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Invalid Parameter" + } } else { responseObj.ResponseCode = 1 responseObj.ResponseDesc = "Invalid Parameter" } + log.Println("save-repository-scheduled-time | response : " + jencoder.PrintJson(responseObj)) c.JSON(http.StatusOK, responseObj) }) } -func EditRepositoryScheduledTime(r *gin.Engine) { +func EditRepositoryScheduledTime(r *gin.Engine, cache *cache.Cache) { r.POST("/edit-repository-scheduled-time", func(c *gin.Context) { - var podsDetails containerscheduler.PodsDetails + var podsDetailsObj PodsDetailsObj var responseObj containerscheduler.ResponseObj - c.ShouldBindJSON(&podsDetails) - log.Println("Pods Update details" + jencoder.PrintJson(podsDetails)) + c.ShouldBindJSON(&podsDetailsObj) + log.Println("edit-repository-scheduled-time | request : " + jencoder.PrintJson(podsDetailsObj)) - if len(podsDetails.Name) > 0 && util.BindPortValidator(podsDetails.BindingPort) { - res := containerscheduler.UpdatePodsData(podsDetails) - responseObj = res + if len(podsDetailsObj.Name) > 0 && util.BindPortValidator(podsDetailsObj.BindingPort) { + podsDetails, status := RequestDateConverter(podsDetailsObj) + loc, _ := time.LoadLocation(_TimeZone) + if podsDetails.ScheduledDowntime && status == 0 { + log.Println((podsDetails.ScheduledAt - time.Now().In(loc).UnixNano()/int64(time.Millisecond)) / 60000) + if ((podsDetails.ScheduledAt - time.Now().In(loc).UnixNano()/int64(time.Millisecond)) / 60000) >= 5 { + res := containerscheduler.UpdatePodsData(podsDetails) + if res.ResponseCode == 0 { + eventsheduler.ScheduledRunner("edit", podsDetails.Name, podsDetails.ScheduledAt, cache) + } + responseObj = res + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Invalid Scheduled Time. Minimum 5Mnt Required" + } + } else if !podsDetails.ScheduledDowntime && status == 0 { + res := containerscheduler.UpdatePodsData(podsDetails) + if res.ResponseCode == 0 { + eventsheduler.ScheduledRunner("delete", podsDetails.Name, 0, cache) + } + responseObj = res + } else { + responseObj.ResponseCode = 1 + responseObj.ResponseDesc = "Invalid Parameter." + } } else { responseObj.ResponseCode = 1 responseObj.ResponseDesc = "Invalid Parameter" } + log.Println("edit-repository-scheduled-time | response : " + jencoder.PrintJson(responseObj)) c.JSON(http.StatusOK, responseObj) }) } -func DeleteRepositoryScheduledTime(r *gin.Engine) { +func DeleteRepositoryScheduledTime(r *gin.Engine, cache *cache.Cache) { r.DELETE("/remove-repository-scheduled-time/:name", func(c *gin.Context) { var responseObj containerscheduler.ResponseObj name := c.Param("name") - log.Println("Pod Delete details name=" + name) + log.Println("remove-repository-scheduled-time | request : name=" + name) if len(name) > 0 { res := containerscheduler.DeleteDockerRegData(name) + if res.ResponseCode == 0 { + eventsheduler.ScheduledRunner("delete", name, 0, cache) + } responseObj = res } else { responseObj.ResponseCode = 1 responseObj.ResponseDesc = "Invalid Parameter" } + log.Println("remove-repository-scheduled-time | response : " + jencoder.PrintJson(responseObj)) c.JSON(http.StatusOK, responseObj) }) } + +func RequestDateConverter(podsDetailsObj PodsDetailsObj) (containerscheduler.PodsDetails, int) { + var podsDetails containerscheduler.PodsDetails + podsDetails.Name = podsDetailsObj.Name + podsDetails.BindingPort = podsDetailsObj.BindingPort + podsDetails.ScheduledDowntime = podsDetailsObj.ScheduledDowntime + loc, _ := time.LoadLocation(_TimeZone) + time1, err := time.ParseInLocation(_format, podsDetailsObj.ScheduledTime, loc) + if err != nil { + log.Println("Error while parsing date :", err) + return podsDetails, 1 + } + podsDetails.ScheduledAt = time.Time(time1).In(loc).UnixNano() / int64(time.Millisecond) + return podsDetails, 0 +} diff --git a/pkg/jencoder/jencoder.go b/pkg/jencoder/jencoder.go index abf12e7..4dfdeb7 100644 --- a/pkg/jencoder/jencoder.go +++ b/pkg/jencoder/jencoder.go @@ -21,4 +21,4 @@ func PassJson(obj interface{}) []byte { return nil } return b -} \ No newline at end of file +} diff --git a/pkg/manager/dockerpull/dockerpull.go b/pkg/manager/dockerpull/dockerpull.go index ef89fbe..f384aeb 100644 --- a/pkg/manager/dockerpull/dockerpull.go +++ b/pkg/manager/dockerpull/dockerpull.go @@ -5,7 +5,6 @@ import ( "log" "strings" "ukiyo/internal/containeraccess" - "ukiyo/internal/containerhistory" "ukiyo/pkg/jencoder" "ukiyo/pkg/webhook" ) @@ -17,10 +16,6 @@ type ResponseObj struct { ResponseDesc string } -const ( - _eventTypeImagePuller = "Pull Image Event" -) - var val int var ImageName string @@ -69,14 +64,5 @@ func PullToDocker(str webhook.Response) (ResponseObj, error) { responseObj.ResponseDesc = "Failed pull the images" } - var data containerhistory.Data - data.EventType = _eventTypeImagePuller - data.EventObject.EventCode = responseObj.ResponseCode - data.EventObject.EventDesc = responseObj.ResponseDesc - data.EventObject.EventAt = 11111111 - data.EventData.ImagePuller.Name = str.Name - data.EventData.ImagePuller.ImageName = ImageName - containerhistory.UpdateContainerHistory(str.Name, data) - return responseObj, err } From ca21684d359334554e7e3ded414ce601acaf2557 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Fri, 21 Aug 2020 23:27:15 +0530 Subject: [PATCH 20/30] add cacheupadte --- internal/caching/cacheupdate/cacheupdate.go | 61 +++++++++++++++++++++ pkg/scheduler/scheduler.go | 42 ++++++++------ pkg/webhook-listener/webhook-listener.go | 8 +-- 3 files changed, 90 insertions(+), 21 deletions(-) create mode 100644 internal/caching/cacheupdate/cacheupdate.go diff --git a/internal/caching/cacheupdate/cacheupdate.go b/internal/caching/cacheupdate/cacheupdate.go new file mode 100644 index 0000000..28e7506 --- /dev/null +++ b/internal/caching/cacheupdate/cacheupdate.go @@ -0,0 +1,61 @@ +package cacheupdate + +import ( + "encoding/json" + "github.com/patrickmn/go-cache" + "log" + "strconv" + "time" + "ukiyo/pkg/jencoder" +) + +type CashObj struct { + ImageName string `json:"imageName"` + ScheduledAt int64 `json:"scheduledAt"` +} + +const ( + _TimeZone = "Asia/Kolkata" +) + +var val int +var mnt int +var imageName string + +func CacheUpdate(name string, imageName string, c *cache.Cache) { + var cashObj CashObj + if x, y, found := c.GetWithExpiration(name); found { + err := json.Unmarshal(jencoder.PassJson(x), &cashObj) + if err != nil { + log.Println(err) + } + cashObj.ImageName = imageName + c.Set(name, cashObj, time.Duration(time.Time(y).Sub(time.Now()).Minutes()+1)*time.Minute) + log.Println("Successfully Cash update for the deployment") + } +} + +func TimeCalculator(name string, c *cache.Cache) (string, string, string) { + var cashObj CashObj + loc, _ := time.LoadLocation(_TimeZone) + if x, _, found := c.GetWithExpiration(name); found { + err := json.Unmarshal(jencoder.PassJson(x), &cashObj) + if err != nil { + log.Println(err) + } + val = int(cashObj.ScheduledAt-time.Now().In(loc).UnixNano()/int64(time.Millisecond)) + 60000 + if val > 0 { + mnt = val / 60000 + if len(cashObj.ImageName) > 0 { + imageName = cashObj.ImageName + } else { + imageName = "waiting" + } + return strconv.Itoa(mnt), strconv.Itoa((val - mnt*60000) / 1000), imageName + } else { + return "-", "-", "-" + } + } else { + return "-", "-", "-" + } +} diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go index cefd02e..5be5077 100644 --- a/pkg/scheduler/scheduler.go +++ b/pkg/scheduler/scheduler.go @@ -1,8 +1,9 @@ package scheduler import ( + "github.com/patrickmn/go-cache" "log" - "ukiyo/internal/caching" + "ukiyo/internal/caching/cacheupdate" "ukiyo/internal/containerscheduler" "ukiyo/pkg/jencoder" "ukiyo/pkg/manager/dockercreater" @@ -10,29 +11,36 @@ import ( "ukiyo/pkg/manager/dockerrunner" ) -func WebHookScheduler(name string, imageName string) { +func WebHookScheduler(name string, imageName string, c *cache.Cache) { pod := containerscheduler.QueryRecodeInDB(name) + log.Println("WebHookScheduler " + jencoder.PrintJson(pod)) if len(pod.Name) > 0 && !pod.ScheduledDowntime { + log.Println("Starting Non scheduled deployment") + DeploymentProcess(name, imageName) + } else if len(pod.Name) > 0 && pod.ScheduledDowntime { + log.Println("Starting scheduled deployment") + cacheupdate.CacheUpdate(name, imageName, c) + } else { + log.Println("Error pod details to schedule images") + } +} - log.Println("Starting Container Remove - WebHookScheduler") - removeObj, _ := dockerremove.RemoveRunningContainer(name) - log.Println("Ending Container Remove - WebHookScheduler ...." + jencoder.PrintJson(removeObj)) +func DeploymentProcess(name string, imageName string) { + log.Println("Starting Container Remove - WebHookScheduler") + removeObj, _ := dockerremove.RemoveRunningContainer(name) + log.Println("Ending Container Remove - WebHookScheduler ...." + jencoder.PrintJson(removeObj)) - if removeObj.ResponseCode == 0 { + if removeObj.ResponseCode == 0 { - log.Println("WebHookScheduler trigger ContainerCreate...." + jencoder.PrintJson(pod)) - res, _ := dockercreater.ContainerCreate(name, imageName) - log.Println("WebHookScheduler trigger ContainerCreate...." + jencoder.PrintJson(res)) + log.Println("WebHookScheduler trigger ContainerCreate...." + jencoder.PrintJson(name)) + res, _ := dockercreater.ContainerCreate(name, imageName) + log.Println("WebHookScheduler trigger ContainerCreate...." + jencoder.PrintJson(res)) - log.Println("Starting Container runner - WebHookScheduler") - resObj, _ := dockerrunner.ContainerRunner(res.ContainerId) - log.Println("Ending Container runner - WebHookScheduler ...." + jencoder.PrintJson(resObj)) + log.Println("Starting Container runner - WebHookScheduler") + resObj, _ := dockerrunner.ContainerRunner(res.ContainerId) + log.Println("Ending Container runner - WebHookScheduler ...." + jencoder.PrintJson(resObj)) - } else { - log.Println("Stop Container runner - WebHookScheduler - Failed Running Container remove process") - } } else { - caching.CacheRunner(name, imageName, 0) - log.Println("No saved pod details to schedule images") + log.Println("Stop Container runner - WebHookScheduler - Failed Running Container remove process") } } diff --git a/pkg/webhook-listener/webhook-listener.go b/pkg/webhook-listener/webhook-listener.go index f4cbe88..a598028 100644 --- a/pkg/webhook-listener/webhook-listener.go +++ b/pkg/webhook-listener/webhook-listener.go @@ -1,14 +1,14 @@ package webhook_listener import ( + "github.com/gin-gonic/gin" + "github.com/patrickmn/go-cache" "log" "net/http" "ukiyo/pkg/jencoder" "ukiyo/pkg/manager/dockerpull" "ukiyo/pkg/scheduler" "ukiyo/pkg/webhook" - - "github.com/gin-gonic/gin" ) type PushData struct { @@ -41,7 +41,7 @@ type DockerWebHook struct { Repository Repository `json:"repository"` } -func HooksListener(r *gin.Engine) { +func HooksListener(r *gin.Engine, cash *cache.Cache) { r.POST("/ukiyo-web-hook", func(c *gin.Context) { log.Println("Starting web hook trigger .... ############################") var dockerWebHook DockerWebHook @@ -58,7 +58,7 @@ func HooksListener(r *gin.Engine) { if len(resObj.Name) > 0 { log.Println("Trigger for check the Scheduler ....") - scheduler.WebHookScheduler(resObj.Name, resObj.ImageName) + scheduler.WebHookScheduler(resObj.Name, resObj.ImageName, cash) } else { log.Println("Error Creating Image ....") } From e96e8cfd53a931a26bd3dfeae084ddc8a9a240eb Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sat, 22 Aug 2020 14:12:26 +0530 Subject: [PATCH 21/30] issue fixed[remove static array] --- internal/caching/caching.go | 2 +- internal/util/util.go | 29 ++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/internal/caching/caching.go b/internal/caching/caching.go index ef7440b..e92fbe8 100644 --- a/internal/caching/caching.go +++ b/internal/caching/caching.go @@ -56,7 +56,7 @@ func ContainerRunFunc(name string, scheduledAt int64, c *cache.Cache) { } if len(cashObj.ImageName) > 0 { log.Println("Starting to create scheduled container : " + cashObj.ImageName) - scheduler.DeploymentProcess(name, cashObj.ImageName) + scheduler.DeploymentProcess(name, cashObj.ImageName, c) } else { log.Println("Failed to create scheduled container, No image in cache : null") } diff --git a/internal/util/util.go b/internal/util/util.go index 4ece6ed..82792ba 100644 --- a/internal/util/util.go +++ b/internal/util/util.go @@ -1,17 +1,44 @@ package util import ( + "log" "ukiyo/internal/containerscheduler" ) -func BindPortValidator(bindingPort []containerscheduler.BindingPort) bool { +func BindPortValidator(bindingPort []containerscheduler.BindingPort, name string) bool { + + pods := containerscheduler.QueryListRecodeInDB() + var portArr []string + if len(pods) > 0 { + for _, pod := range pods { + if len(pod.BindingPort) > 0 && pod.Name != name { + for _, bindingPort := range pod.BindingPort { + portArr = append(portArr, bindingPort.ExportPort) + } + } + } + } + log.Println(portArr) + if len(bindingPort) > 0 { for _, ports := range bindingPort { if len(ports.InternalPort) == 0 && len(ports.ExportPort) == 0 { return false } + if contains(portArr, ports.ExportPort) { + return false + } } return true } return false } + +func contains(arr []string, str string) bool { + for _, a := range arr { + if a == str { + return true + } + } + return false +} From f5725715386a92acffedaa5e29a64e3533241791 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sat, 22 Aug 2020 15:11:26 +0530 Subject: [PATCH 22/30] info log location changes and history table view --- README.md | 7 ++- api/schedulerapilayer/schedulerapilayer.go | 4 +- internal/caching/cacheupdate/cacheupdate.go | 47 ++++++++++++++++++--- main.go | 2 +- pkg/manager/dockercreater/dockercreater.go | 38 ++++++++++++++++- pkg/manager/dockerpull/dockerpull.go | 37 +++++++++++++++- pkg/manager/dockerremove/dockerremove.go | 38 ++++++++++++++++- pkg/manager/dockerrunner/dockerrunner.go | 45 ++++++++++++++++++-- pkg/process/process.go | 30 ++++++++++--- pkg/scheduler/scheduler.go | 11 +++-- pkg/webhook-listener/webhook-listener.go | 13 ++---- 11 files changed, 231 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index a1d297e..2ee9195 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,8 @@ curl -X POST \ -H "Accept: Application/json" \ -H "Content-Type: application/json" http://{serverIP}:8080/save-repository-scheduled-time \ -d '{"name": "repository name","bindingPort": [{ "exportPort": "8180", "internalPort": "80" }, -{ "exportPort": "443", "internalPort": "443" }], "scheduledTime": "Aug 17 2020 00:40:50 AM", "scheduledDowntime": false}' +{ "exportPort": "443", "internalPort": "443" }], +"scheduledTime": "Aug 17 2020 00:40:50 AM", "scheduledDowntime": false}' ``` Change the deployment schedule @@ -163,7 +164,9 @@ http://{serverIP}:8080/edit-repository-scheduled-time curl -X POST \ -H "Accept: Application/json" \ -H "Content-Type: application/json" http://{serverIP}:8080/edit-repository-scheduled-time \ --d '{"name": "repository name","bindingPort": [{ "exportPort": "8180", "internalPort": "80" }, { "exportPort": "443", "internalPort": "443" }], "scheduledTime": "Aug 17 2020 00:40:50 AM", "scheduledDowntime": true}' +-d '{"name": "repository name","bindingPort": [{ "exportPort": "8180", "internalPort": "80" }, +{ "exportPort": "443", "internalPort": "443" }], +"scheduledTime": "Aug 17 2020 00:40:50 AM", "scheduledDowntime": true}' ``` Delete your deployment details diff --git a/api/schedulerapilayer/schedulerapilayer.go b/api/schedulerapilayer/schedulerapilayer.go index 85656b8..79879b8 100644 --- a/api/schedulerapilayer/schedulerapilayer.go +++ b/api/schedulerapilayer/schedulerapilayer.go @@ -32,7 +32,7 @@ func SaveRepositoryScheduledTime(r *gin.Engine, cache *cache.Cache) { log.Println("save-repository-scheduled-time | request : " + jencoder.PrintJson(podsDetailsObj)) loc, _ := time.LoadLocation(_TimeZone) - if len(podsDetailsObj.Name) > 0 && util.BindPortValidator(podsDetailsObj.BindingPort) { + if len(podsDetailsObj.Name) > 0 && util.BindPortValidator(podsDetailsObj.BindingPort, "") { podsDetails, status := RequestDateConverter(podsDetailsObj) if podsDetails.ScheduledDowntime && status == 0 { if ((podsDetails.ScheduledAt - time.Now().In(loc).UnixNano()/int64(time.Millisecond)) / 60000) >= 5 { @@ -68,7 +68,7 @@ func EditRepositoryScheduledTime(r *gin.Engine, cache *cache.Cache) { c.ShouldBindJSON(&podsDetailsObj) log.Println("edit-repository-scheduled-time | request : " + jencoder.PrintJson(podsDetailsObj)) - if len(podsDetailsObj.Name) > 0 && util.BindPortValidator(podsDetailsObj.BindingPort) { + if len(podsDetailsObj.Name) > 0 && util.BindPortValidator(podsDetailsObj.BindingPort, podsDetailsObj.Name) { podsDetails, status := RequestDateConverter(podsDetailsObj) loc, _ := time.LoadLocation(_TimeZone) if podsDetails.ScheduledDowntime && status == 0 { diff --git a/internal/caching/cacheupdate/cacheupdate.go b/internal/caching/cacheupdate/cacheupdate.go index 28e7506..d9fbf36 100644 --- a/internal/caching/cacheupdate/cacheupdate.go +++ b/internal/caching/cacheupdate/cacheupdate.go @@ -9,14 +9,21 @@ import ( "ukiyo/pkg/jencoder" ) +const ( + _TimeZone = "Asia/Kolkata" +) + type CashObj struct { ImageName string `json:"imageName"` ScheduledAt int64 `json:"scheduledAt"` } -const ( - _TimeZone = "Asia/Kolkata" -) +type History struct { + Time string + Action string + Status int + Comment string +} var val int var mnt int @@ -35,7 +42,7 @@ func CacheUpdate(name string, imageName string, c *cache.Cache) { } } -func TimeCalculator(name string, c *cache.Cache) (string, string, string) { +func TimeCalculator(name string, c *cache.Cache) (int, int, string) { var cashObj CashObj loc, _ := time.LoadLocation(_TimeZone) if x, _, found := c.GetWithExpiration(name); found { @@ -51,11 +58,37 @@ func TimeCalculator(name string, c *cache.Cache) (string, string, string) { } else { imageName = "waiting" } - return strconv.Itoa(mnt), strconv.Itoa((val - mnt*60000) / 1000), imageName + return mnt, (val - mnt*60000) / 1000, imageName } else { - return "-", "-", "-" + return 0, 0, "-" } } else { - return "-", "-", "-" + return 0, 0, "-" + } +} + +func HistoryFetch(c *cache.Cache) [][]string { + var historyArr []History + var historyData [][]string + if x, _, found := c.GetWithExpiration("history"); found { + err := json.Unmarshal(jencoder.PassJson(x), &historyArr) + if err != nil { + log.Println(err) + } + } + if len(historyArr) > 10 { + for x := 0; x < (len(historyArr) - 10); x++ { + historyArr = RemoveIndex(historyArr, 8) + } + } + if len(historyArr) > 0 { + for _, histor := range historyArr { + historyData = append(historyData, []string{histor.Time, histor.Action, strconv.Itoa(histor.Status), histor.Comment}) + } } + return historyData +} + +func RemoveIndex(s []History, index int) []History { + return append(s[:index], s[index+1:]...) } diff --git a/main.go b/main.go index 9a72384..7ed0921 100644 --- a/main.go +++ b/main.go @@ -15,7 +15,7 @@ import ( func main() { - file, err := os.OpenFile("info.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) + file, err := os.OpenFile("dbs/info.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { log.Fatal(err) } diff --git a/pkg/manager/dockercreater/dockercreater.go b/pkg/manager/dockercreater/dockercreater.go index cd05c6c..dd053a9 100644 --- a/pkg/manager/dockercreater/dockercreater.go +++ b/pkg/manager/dockercreater/dockercreater.go @@ -1,10 +1,14 @@ package dockercreater import ( + "encoding/json" docker "github.com/fsouza/go-dockerclient" + "github.com/patrickmn/go-cache" "log" "strings" + "time" "ukiyo/internal/containerscheduler" + "ukiyo/pkg/jencoder" ) type ResponseObj struct { @@ -14,7 +18,18 @@ type ResponseObj struct { ResponseDesc string } -func ContainerCreate(name string, imageName string) (ResponseObj, error) { +type History struct { + Time string + Action string + Status int + Comment string +} + +const ( + _TimeZone = "Asia/Kolkata" +) + +func ContainerCreate(name string, imageName string, c *cache.Cache) (ResponseObj, error) { var responseObj ResponseObj client, err := docker.NewClientFromEnv() if err != nil { @@ -62,5 +77,26 @@ func ContainerCreate(name string, imageName string) (ResponseObj, error) { responseObj.ResponseCode = 0 responseObj.ContainerId = container.ID responseObj.ResponseDesc = "Successfully Create The Container :" + name + SetHistory(responseObj, c) return responseObj, err } + +func SetHistory(obj ResponseObj, cash *cache.Cache) { + var historyArray []History + var history History + loc, _ := time.LoadLocation(_TimeZone) + history.Time = time.Now().In(loc).Format("2006-01-02 15:04:05") + history.Status = obj.ResponseCode + history.Action = obj.ResponseDesc + history.Comment = obj.ResponseDesc + + if x, _, found := cash.GetWithExpiration("history"); found { + err := json.Unmarshal(jencoder.PassJson(x), &historyArray) + if err != nil { + log.Println(err) + } + } + + historyArray = append(historyArray, history) + cash.Set("history", historyArray, 5*time.Minute) +} diff --git a/pkg/manager/dockerpull/dockerpull.go b/pkg/manager/dockerpull/dockerpull.go index f384aeb..b389821 100644 --- a/pkg/manager/dockerpull/dockerpull.go +++ b/pkg/manager/dockerpull/dockerpull.go @@ -1,9 +1,12 @@ package dockerpull import ( + "encoding/json" docker "github.com/fsouza/go-dockerclient" + "github.com/patrickmn/go-cache" "log" "strings" + "time" "ukiyo/internal/containeraccess" "ukiyo/pkg/jencoder" "ukiyo/pkg/webhook" @@ -16,10 +19,21 @@ type ResponseObj struct { ResponseDesc string } +type History struct { + Time string + Action string + Status int + Comment string +} + +const ( + _TimeZone = "Asia/Kolkata" +) + var val int var ImageName string -func PullToDocker(str webhook.Response) (ResponseObj, error) { +func PullToDocker(str webhook.Response, cash *cache.Cache) (ResponseObj, error) { var responseObj ResponseObj log.Println("docker pull by repo name : " + jencoder.PrintJson(str)) ImageName = str.RepoName + ":" + str.Tag @@ -64,5 +78,26 @@ func PullToDocker(str webhook.Response) (ResponseObj, error) { responseObj.ResponseDesc = "Failed pull the images" } + SetHistory(responseObj, cash) return responseObj, err } + +func SetHistory(obj ResponseObj, cash *cache.Cache) { + var historyArray []History + var history History + loc, _ := time.LoadLocation(_TimeZone) + history.Time = time.Now().In(loc).Format("2006-01-02 15:04:05") + history.Status = obj.ResponseCode + history.Action = obj.ResponseDesc + history.Comment = obj.ResponseDesc + + if x, _, found := cash.GetWithExpiration("history"); found { + err := json.Unmarshal(jencoder.PassJson(x), &historyArray) + if err != nil { + log.Println(err) + } + } + + historyArray = append(historyArray, history) + cash.Set("history", historyArray, 5*time.Minute) +} diff --git a/pkg/manager/dockerremove/dockerremove.go b/pkg/manager/dockerremove/dockerremove.go index 06a24f3..07063b6 100644 --- a/pkg/manager/dockerremove/dockerremove.go +++ b/pkg/manager/dockerremove/dockerremove.go @@ -1,9 +1,12 @@ package dockerremove import ( + "encoding/json" docker "github.com/fsouza/go-dockerclient" + "github.com/patrickmn/go-cache" "log" "strings" + "time" "ukiyo/pkg/jencoder" ) @@ -12,7 +15,18 @@ type ResponseObj struct { ResponseDesc string } -func RemoveRunningContainer(name string) (ResponseObj, error) { +type History struct { + Time string + Action string + Status int + Comment string +} + +const ( + _TimeZone = "Asia/Kolkata" +) + +func RemoveRunningContainer(name string, cash *cache.Cache) (ResponseObj, error) { var responseObj ResponseObj log.Println("Starting Remove Running pods: " + name) @@ -56,5 +70,27 @@ func RemoveRunningContainer(name string) (ResponseObj, error) { responseObj.ResponseDesc = "No Running Container for Remove" return responseObj, err } + + SetHistory(responseObj, cash) return responseObj, err } + +func SetHistory(obj ResponseObj, cash *cache.Cache) { + var historyArray []History + var history History + loc, _ := time.LoadLocation(_TimeZone) + history.Time = time.Now().In(loc).Format("2006-01-02 15:04:05") + history.Status = obj.ResponseCode + history.Action = obj.ResponseDesc + history.Comment = obj.ResponseDesc + + if x, _, found := cash.GetWithExpiration("history"); found { + err := json.Unmarshal(jencoder.PassJson(x), &historyArray) + if err != nil { + log.Println(err) + } + } + + historyArray = append(historyArray, history) + cash.Set("history", historyArray, 5*time.Minute) +} diff --git a/pkg/manager/dockerrunner/dockerrunner.go b/pkg/manager/dockerrunner/dockerrunner.go index 9b82245..53e4d1e 100644 --- a/pkg/manager/dockerrunner/dockerrunner.go +++ b/pkg/manager/dockerrunner/dockerrunner.go @@ -1,8 +1,12 @@ package dockerrunner import ( + "encoding/json" docker "github.com/fsouza/go-dockerclient" + "github.com/patrickmn/go-cache" "log" + "time" + "ukiyo/pkg/jencoder" ) type ResponseObj struct { @@ -10,7 +14,18 @@ type ResponseObj struct { ResponseDesc string } -func ContainerRunner(containerId string) (ResponseObj, error) { +type History struct { + Time string + Action string + Status int + Comment string +} + +const ( + _TimeZone = "Asia/Kolkata" +) + +func ContainerRunner(containerId string, c *cache.Cache) (ResponseObj, error) { var responseObj ResponseObj log.Println("Starting container Runner : containerId: " + containerId) client, err := docker.NewClientFromEnv() @@ -24,13 +39,35 @@ func ContainerRunner(containerId string) (ResponseObj, error) { PublishAllPorts: true, }) if err != nil { - log.Println(err) + log.Println("Container Run failure :" + containerId) responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Container Run failure :" + containerId + responseObj.ResponseDesc = "Container Run failure" } else { + log.Println("Successfully Run The Container :" + containerId) responseObj.ResponseCode = 0 - responseObj.ResponseDesc = "Successfully Run The Container :" + containerId + responseObj.ResponseDesc = "Successfully Run The Container" } + SetHistory(responseObj, c) return responseObj, err } + +func SetHistory(obj ResponseObj, cash *cache.Cache) { + var historyArray []History + var history History + loc, _ := time.LoadLocation(_TimeZone) + history.Time = time.Now().In(loc).Format("2006-01-02 15:04:05") + history.Status = obj.ResponseCode + history.Action = obj.ResponseDesc + history.Comment = obj.ResponseDesc + + if x, _, found := cash.GetWithExpiration("history"); found { + err := json.Unmarshal(jencoder.PassJson(x), &historyArray) + if err != nil { + log.Println(err) + } + } + + historyArray = append(historyArray, history) + cash.Set("history", historyArray, 5*time.Minute) +} diff --git a/pkg/process/process.go b/pkg/process/process.go index b61f599..5a35871 100644 --- a/pkg/process/process.go +++ b/pkg/process/process.go @@ -5,6 +5,7 @@ import ( "github.com/patrickmn/go-cache" "os" "os/exec" + "strconv" "time" "ukiyo/internal/caching/cacheupdate" "ukiyo/internal/containerscheduler" @@ -29,12 +30,15 @@ func Process(c *cache.Cache) string { var dataObj DataObj dataObj.Name = pod.Name if pod.ScheduledDowntime { - dataObj.ScheduleType = "true" + dataObj.ScheduleType = "Waiting For Scheduled" a, b, c := cacheupdate.TimeCalculator(pod.Name, c) dataObj.ImageName = c - dataObj.TimeMnt = a + " [mm]: " + b + " [SS]" + if a > 0 || b > 0 { + dataObj.ScheduleType = "Scheduled" + } + dataObj.TimeMnt = strconv.Itoa(a) + " [mm]: " + strconv.Itoa(b) + " [SS]" } else { - dataObj.ScheduleType = "false" + dataObj.ScheduleType = "ON THE FLY" dataObj.ImageName = "-" dataObj.TimeMnt = "00 [mm]: " + "00 [SS]" } @@ -55,16 +59,28 @@ func Process(c *cache.Cache) string { } table := tablewriter.NewWriter(os.Stdout) - table.SetHeader([]string{"Name", "Image Name", "Build Scheduled", "Time", "Exec Command"}) + table.SetRowLine(true) + table.SetHeader([]string{"Name", "Version", "Deployment Status", "Time Remaining to Deployment", "Ports"}) + table.SetCaption(true, "Caching Table in Ukiyo") for _, v := range data { table.Append(v) } table.Render() + table2 := tablewriter.NewWriter(os.Stdout) + table2.SetRowLine(true) + table2.SetHeader([]string{"Time", "Action", "Status", "Comment"}) + table2.SetCaption(true, "History Table") + + for _, v := range cacheupdate.HistoryFetch(c) { + table2.Append(v) + } + table2.Render() + time.Sleep(1 * time.Second) - c := exec.Command("clear") - c.Stdout = os.Stdout - c.Run() + exec := exec.Command("clear") + exec.Stdout = os.Stdout + exec.Run() } } diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go index 5be5077..c210bd5 100644 --- a/pkg/scheduler/scheduler.go +++ b/pkg/scheduler/scheduler.go @@ -16,7 +16,7 @@ func WebHookScheduler(name string, imageName string, c *cache.Cache) { log.Println("WebHookScheduler " + jencoder.PrintJson(pod)) if len(pod.Name) > 0 && !pod.ScheduledDowntime { log.Println("Starting Non scheduled deployment") - DeploymentProcess(name, imageName) + DeploymentProcess(name, imageName, c) } else if len(pod.Name) > 0 && pod.ScheduledDowntime { log.Println("Starting scheduled deployment") cacheupdate.CacheUpdate(name, imageName, c) @@ -25,19 +25,18 @@ func WebHookScheduler(name string, imageName string, c *cache.Cache) { } } -func DeploymentProcess(name string, imageName string) { - log.Println("Starting Container Remove - WebHookScheduler") - removeObj, _ := dockerremove.RemoveRunningContainer(name) +func DeploymentProcess(name string, imageName string, c *cache.Cache) { + removeObj, _ := dockerremove.RemoveRunningContainer(name, c) log.Println("Ending Container Remove - WebHookScheduler ...." + jencoder.PrintJson(removeObj)) if removeObj.ResponseCode == 0 { log.Println("WebHookScheduler trigger ContainerCreate...." + jencoder.PrintJson(name)) - res, _ := dockercreater.ContainerCreate(name, imageName) + res, _ := dockercreater.ContainerCreate(name, imageName, c) log.Println("WebHookScheduler trigger ContainerCreate...." + jencoder.PrintJson(res)) log.Println("Starting Container runner - WebHookScheduler") - resObj, _ := dockerrunner.ContainerRunner(res.ContainerId) + resObj, _ := dockerrunner.ContainerRunner(res.ContainerId, c) log.Println("Ending Container runner - WebHookScheduler ...." + jencoder.PrintJson(resObj)) } else { diff --git a/pkg/webhook-listener/webhook-listener.go b/pkg/webhook-listener/webhook-listener.go index a598028..59ef589 100644 --- a/pkg/webhook-listener/webhook-listener.go +++ b/pkg/webhook-listener/webhook-listener.go @@ -43,24 +43,19 @@ type DockerWebHook struct { func HooksListener(r *gin.Engine, cash *cache.Cache) { r.POST("/ukiyo-web-hook", func(c *gin.Context) { - log.Println("Starting web hook trigger .... ############################") var dockerWebHook DockerWebHook c.ShouldBindJSON(&dockerWebHook) - log.Println("web-hook trigger" + jencoder.PrintJson(dockerWebHook)) + log.Println("ukiyo web-hook trigger request" + jencoder.PrintJson(dockerWebHook)) res := SetWebHookResponse(dockerWebHook) - log.Println("Ending web hook trigger ...." + jencoder.PrintJson(res)) + log.Println("ukiyo web-hook trigger response" + jencoder.PrintJson(res)) - log.Println("Starting Image Pull .... ############################") - resObj, err := dockerpull.PullToDocker(res) - log.Println(err) - log.Println("Ending Image Pull ...." + jencoder.PrintJson(resObj)) + resObj, _ := dockerpull.PullToDocker(res, cash) if len(resObj.Name) > 0 { - log.Println("Trigger for check the Scheduler ....") scheduler.WebHookScheduler(resObj.Name, resObj.ImageName, cash) } else { - log.Println("Error Creating Image ....") + log.Println("Error Creating Image .." + jencoder.PrintJson(resObj)) } c.String(http.StatusOK, "OK") From ac3f6a10617472f7634bd0d8a6d512c786ad24e3 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sun, 23 Aug 2020 23:15:39 +0530 Subject: [PATCH 23/30] add flag -d --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2ee9195..585b0d7 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,8 @@ $ docker push agentukiyo/ukiyo:tag Run ukiyo agent ```sh -$ docker run -p 8080:8080 \ +$ docker run -d \ + -p 8080:8080 \ -- name ukiyo \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /home/reinventor/dbs:/dbs \ From 033f81a57833c4dbcb5fc3cf5ffb2075f6c4f804 Mon Sep 17 00:00:00 2001 From: Hansika Wanniarachchi Date: Sun, 23 Aug 2020 23:21:34 +0530 Subject: [PATCH 24/30] add curl commands --- README.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 585b0d7..dad1318 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ ## Idea incubation -- ukiyo will act as a watcher for docker containers. It will run alongside with the other running containers and will be responsible for automatic updates. Updates will be based on push based model compared to existing solutions such as [watchtower](https://github.com/containrrr/watchtower) and [ouroboros](https://github.com/pyouroboros/ouroboros) +- ukiyo will act as a watcher for docker containers. It will run alongside with the other running containers and will be responsible for automatic updates and schedule the container deployment time. Updates will be based on push based model compared to existing solutions such as [watchtower](https://github.com/containrrr/watchtower) and [ouroboros](https://github.com/pyouroboros/ouroboros) - Push events will be recived from ukiyo via webhooks. Docker registries provide webhooks to subscribe and listen to image changes. Locally running images will change only after such an event is received by ukiyo. -- Pull based model can be implemented as an optional way of updating the running containers. +- ukiyo itself runs as a Docker container or else runs as a separate background process a daemon. ## Components @@ -21,14 +21,6 @@ Two modes of execution - As a container running alongside other containers (Should mount docker.sock to run docker commands inside the ukiyo docker container) - As a standalone executable -## Language - -- Go lang - -### Go style guide - -- https://github.com/rajikaimal/go-styleguide - ## Dev Setup Guide Setup docker From 503c9488ffffc98e08b68009fbbfefdc293135a0 Mon Sep 17 00:00:00 2001 From: Hansika Wanniarachchi Date: Sun, 23 Aug 2020 23:35:37 +0530 Subject: [PATCH 25/30] add ukiyo-agent --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dad1318..4429175 100644 --- a/README.md +++ b/README.md @@ -42,14 +42,16 @@ $ docker build -f Dockerfile -t agentukiyo/ukiyo:tag . $ docker push agentukiyo/ukiyo:tag ``` -Run ukiyo agent +The ukiyo-agent is available at https://hub.docker.com/r/agentukiyo/ukiyo + +Run ukiyo-agent ```sh $ docker run -d \ -p 8080:8080 \ -- name ukiyo \ -v /var/run/docker.sock:/var/run/docker.sock \ - -v /home/reinventor/dbs:/dbs \ - agentukiyo/ukiyo:01 + -v /home/ukiyo/dbs:/dbs \ + agentukiyo/ukiyo:tag ``` Add webhook to your dockerhub repository From c8fdf3cdecc81e0561e0bdd08b97530b5dea81d7 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sun, 23 Aug 2020 23:43:36 +0530 Subject: [PATCH 26/30] fixing unit testing --- test/dockercreater_test.go | 5 ++++- test/dockerpull_test.go | 7 +++++-- test/dockerrunner_test.go | 5 ++++- test/schedulerapilayer_test.go | 10 ++++++---- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/test/dockercreater_test.go b/test/dockercreater_test.go index 1dd44ca..dd76b9e 100644 --- a/test/dockercreater_test.go +++ b/test/dockercreater_test.go @@ -1,12 +1,15 @@ package test import ( + "github.com/patrickmn/go-cache" "testing" + "time" "ukiyo/pkg/manager/dockercreater" ) func TestContainerCreate(t *testing.T) { - docker, _ := dockercreater.ContainerCreate("demo-nginx", "demo-nginx") + c := cache.New(1*time.Minute, 1*time.Minute) + docker, _ := dockercreater.ContainerCreate("demo-nginx", "demo-nginx", c) if docker.ResponseCode != 0 { t.Errorf("failed expected %v but got value %v", 0, docker.ResponseCode) } else { diff --git a/test/dockerpull_test.go b/test/dockerpull_test.go index f309db3..b1eb830 100644 --- a/test/dockerpull_test.go +++ b/test/dockerpull_test.go @@ -1,20 +1,23 @@ package test import ( + "github.com/patrickmn/go-cache" "testing" + "time" "ukiyo/pkg/manager/dockerpull" "ukiyo/pkg/webhook" ) func TestPullToDocker(t *testing.T) { + c := cache.New(1*time.Minute, 1*time.Minute) var webHook = webhook.Response{ RepoName: "demo-nginx", - Namespace: "name", + Namespace: "165090", Name: "demo-nginx", Tag: "02", PushedAt: 0, } - docker, _ := dockerpull.PullToDocker(webHook) + docker, _ := dockerpull.PullToDocker(webHook, c) if docker.ResponseCode != 0 { t.Errorf("failed expected %v but got value %v", 0, docker.ResponseCode) } else { diff --git a/test/dockerrunner_test.go b/test/dockerrunner_test.go index 2669f08..5f3de4e 100644 --- a/test/dockerrunner_test.go +++ b/test/dockerrunner_test.go @@ -1,12 +1,15 @@ package test import ( + "github.com/patrickmn/go-cache" "testing" + "time" "ukiyo/pkg/manager/dockerrunner" ) func TestContainerRunner(t *testing.T) { - docker, _ := dockerrunner.ContainerRunner("6dc636d3c48dad91ee753440bd708888bf1b278040c6732e604b076ee44dd75f") + c := cache.New(1*time.Minute, 1*time.Minute) + docker, _ := dockerrunner.ContainerRunner("6dc636d3c48dad91ee753440bd708888bf1b278040c6732e604b076ee44dd75f", c) if docker.ResponseCode != 0 { t.Errorf("failed expected %v but got value %v", 0, docker.ResponseCode) } else { diff --git a/test/schedulerapilayer_test.go b/test/schedulerapilayer_test.go index d260aba..ac87d06 100644 --- a/test/schedulerapilayer_test.go +++ b/test/schedulerapilayer_test.go @@ -1,19 +1,21 @@ package test import ( + "github.com/gin-gonic/gin" + "github.com/patrickmn/go-cache" + "github.com/stretchr/testify/assert" "net/http" "net/http/httptest" "strings" "testing" + "time" "ukiyo/api/schedulerapilayer" - - "github.com/gin-gonic/gin" - "github.com/stretchr/testify/assert" ) func TestSaveRepositoryScheduledTime(t *testing.T) { r := gin.Default() - schedulerapilayer.SaveRepositoryScheduledTime(r) + c := cache.New(1*time.Minute, 1*time.Minute) + schedulerapilayer.SaveRepositoryScheduledTime(r, c) pushJson := `{ "name": "demo-nginx", "bindingPort": [{ From c1e0bd83cb07b472681aae7f8bc97ead5ff4e529 Mon Sep 17 00:00:00 2001 From: Hansika Wanniarachchi Date: Thu, 27 Aug 2020 00:20:26 +0530 Subject: [PATCH 27/30] add scheduled feature --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index a21c891..57d236b 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ Add webhook to your dockerhub repository ``` http:{serverIP}:8080/ukiyo-web-hook ``` +For pull the containers, require the save Docker Hub authentications inside the ukiyo agent. Therefore you need to use curl or postman request to save the Docker keys. Add your own docker registy details ``` @@ -112,6 +113,8 @@ curl -X DELETE \ -H "Content-Type: application/json" http://{serverIP}:8080/delete-container-access-keys/{registryname} ``` +Ukiyo will do the deployment in order to configured deployment details. Using save-repository-scheduled-time API you can apply the deployment on the fly or scheduled time + Add your deployment details and set schedule deployment time ``` http://{serverIP}:8080/save-repository-scheduled-time From fec705118ccf6222e6ac561f112cf9991a983656 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sat, 29 Aug 2020 16:34:36 +0530 Subject: [PATCH 28/30] minor fixes --- api/registryapilayer/registryapilayer.go | 49 ++++++++++++++++++--- api/schedulerapilayer/schedulerapilayer.go | 41 ++++++++++++++--- go.mod | 2 - internal/containeraccess/containeraccess.go | 21 +++++---- main.go | 6 +-- 5 files changed, 92 insertions(+), 27 deletions(-) diff --git a/api/registryapilayer/registryapilayer.go b/api/registryapilayer/registryapilayer.go index 2a89134..493e053 100644 --- a/api/registryapilayer/registryapilayer.go +++ b/api/registryapilayer/registryapilayer.go @@ -1,14 +1,28 @@ package registryapilayer import ( + "encoding/json" "github.com/gin-gonic/gin" + "github.com/patrickmn/go-cache" "log" "net/http" + "time" "ukiyo/internal/containeraccess" "ukiyo/pkg/jencoder" ) -func SaveContainerAccessKeys(r *gin.Engine) { +type History struct { + Time string + Action string + Status int + Comment string +} + +const ( + _TimeZone = "Asia/Kolkata" +) + +func SaveContainerAccessKeys(r *gin.Engine, cache *cache.Cache) { r.POST("/save-container-access-keys", func(c *gin.Context) { var containerKey containeraccess.ContainerKeys var responseObj containeraccess.ResponseObj @@ -20,14 +34,15 @@ func SaveContainerAccessKeys(r *gin.Engine) { responseObj = res } else { responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Invalid Parameter" + responseObj.ResponseDesc = "Invalid Parameter : save-container key" } log.Println("save-container-access-keys | response : " + jencoder.PrintJson(responseObj)) + SetHistory(responseObj, cache) c.JSON(http.StatusOK, responseObj) }) } -func EditContainerAccessKeys(r *gin.Engine) { +func EditContainerAccessKeys(r *gin.Engine, cache *cache.Cache) { r.POST("/edit-container-access-keys", func(c *gin.Context) { var containerKey containeraccess.ContainerKeys var responseObj containeraccess.ResponseObj @@ -39,14 +54,15 @@ func EditContainerAccessKeys(r *gin.Engine) { responseObj = res } else { responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Invalid Parameter" + responseObj.ResponseDesc = "Invalid Parameter edit-container key" } log.Println("edit-container-access-keys | response :" + jencoder.PrintJson(responseObj)) + SetHistory(responseObj, cache) c.JSON(http.StatusOK, responseObj) }) } -func DeleteContainerAccessKeys(r *gin.Engine) { +func DeleteContainerAccessKeys(r *gin.Engine, cache *cache.Cache) { r.DELETE("/delete-container-access-keys/:userName", func(c *gin.Context) { var responseObj containeraccess.ResponseObj name := c.Param("userName") @@ -56,9 +72,30 @@ func DeleteContainerAccessKeys(r *gin.Engine) { responseObj = res } else { responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Invalid Parameter" + responseObj.ResponseDesc = "Invalid Parameter delete-container key" } log.Println("delete-container-access-keys | response : " + jencoder.PrintJson(responseObj)) + SetHistory(responseObj, cache) c.JSON(http.StatusOK, responseObj) }) } + +func SetHistory(obj containeraccess.ResponseObj, cash *cache.Cache) { + var historyArray []History + var history History + loc, _ := time.LoadLocation(_TimeZone) + history.Time = time.Now().In(loc).Format("2006-01-02 15:04:05") + history.Status = obj.ResponseCode + history.Action = obj.ResponseDesc + history.Comment = obj.ResponseDesc + + if x, _, found := cash.GetWithExpiration("history"); found { + err := json.Unmarshal(jencoder.PassJson(x), &historyArray) + if err != nil { + log.Println(err) + } + } + + historyArray = append(historyArray, history) + cash.Set("history", historyArray, 5*time.Minute) +} diff --git a/api/schedulerapilayer/schedulerapilayer.go b/api/schedulerapilayer/schedulerapilayer.go index 79879b8..010b028 100644 --- a/api/schedulerapilayer/schedulerapilayer.go +++ b/api/schedulerapilayer/schedulerapilayer.go @@ -1,6 +1,7 @@ package schedulerapilayer import ( + "encoding/json" "github.com/gin-gonic/gin" "github.com/patrickmn/go-cache" "log" @@ -12,6 +13,13 @@ import ( "ukiyo/pkg/scheduler/eventsheduler" ) +type History struct { + Time string + Action string + Status int + Comment string +} + const ( _TimeZone = "Asia/Kolkata" _format = "Jan _2 2006 3:04:05 PM" @@ -50,13 +58,14 @@ func SaveRepositoryScheduledTime(r *gin.Engine, cache *cache.Cache) { responseObj = res } else { responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Invalid Parameter" + responseObj.ResponseDesc = "Invalid Parameter : save-repository" } } else { responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Invalid Parameter" + responseObj.ResponseDesc = "Invalid Parameter : save-repository" } log.Println("save-repository-scheduled-time | response : " + jencoder.PrintJson(responseObj)) + SetHistory(responseObj, cache, "save-repository") c.JSON(http.StatusOK, responseObj) }) } @@ -91,13 +100,14 @@ func EditRepositoryScheduledTime(r *gin.Engine, cache *cache.Cache) { responseObj = res } else { responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Invalid Parameter." + responseObj.ResponseDesc = "Invalid Parameter : edit-repository" } } else { responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Invalid Parameter" + responseObj.ResponseDesc = "Invalid Parameter : edit-repository" } log.Println("edit-repository-scheduled-time | response : " + jencoder.PrintJson(responseObj)) + SetHistory(responseObj, cache, "edit-repository") c.JSON(http.StatusOK, responseObj) }) } @@ -115,9 +125,10 @@ func DeleteRepositoryScheduledTime(r *gin.Engine, cache *cache.Cache) { responseObj = res } else { responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Invalid Parameter" + responseObj.ResponseDesc = "Invalid Parameter : remove-repository" } log.Println("remove-repository-scheduled-time | response : " + jencoder.PrintJson(responseObj)) + SetHistory(responseObj, cache, "remove-repository") c.JSON(http.StatusOK, responseObj) }) } @@ -136,3 +147,23 @@ func RequestDateConverter(podsDetailsObj PodsDetailsObj) (containerscheduler.Pod podsDetails.ScheduledAt = time.Time(time1).In(loc).UnixNano() / int64(time.Millisecond) return podsDetails, 0 } + +func SetHistory(obj containerscheduler.ResponseObj, cash *cache.Cache, desc string) { + var historyArray []History + var history History + loc, _ := time.LoadLocation(_TimeZone) + history.Time = time.Now().In(loc).Format("2006-01-02 15:04:05") + history.Status = obj.ResponseCode + history.Action = obj.ResponseDesc + history.Comment = desc + + if x, _, found := cash.GetWithExpiration("history"); found { + err := json.Unmarshal(jencoder.PassJson(x), &historyArray) + if err != nil { + log.Println(err) + } + } + + historyArray = append(historyArray, history) + cash.Set("history", historyArray, 5*time.Minute) +} diff --git a/go.mod b/go.mod index 89a8bd9..934a0c4 100644 --- a/go.mod +++ b/go.mod @@ -5,10 +5,8 @@ go 1.14 require ( github.com/fsouza/go-dockerclient v1.6.5 github.com/gin-gonic/gin v1.6.3 - github.com/golang/protobuf v1.3.3 github.com/olekukonko/tablewriter v0.0.4 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/sirupsen/logrus v1.4.1 github.com/sonyarouje/simdb v0.0.0-20181202125413-c2488dfc374a github.com/stretchr/testify v1.4.0 ) diff --git a/internal/containeraccess/containeraccess.go b/internal/containeraccess/containeraccess.go index 5b14054..dc3433d 100644 --- a/internal/containeraccess/containeraccess.go +++ b/internal/containeraccess/containeraccess.go @@ -55,12 +55,11 @@ func InsertDockerRegData(containerKeys ContainerKeys) ResponseObj { if strings.EqualFold(registry.UserName, containerKeys.UserName) { val++ responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Already Exist" - log.Println("Already Exist The Registry : " + registry.UserName) + responseObj.ResponseDesc = "Already Exist Container key :" + containerKeys.UserName + log.Println("Already Exist The Container key: " + registry.UserName) } } } - log.Println(val) if val == 0 { responseObj = InsertDb(containerKeys) } @@ -82,7 +81,7 @@ func UpdateDockerRegData(containerKeys ContainerKeys) ResponseObj { responseObj = UpdateDb(registries) } else { responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Update Failed." + responseObj.ResponseDesc = "Update Failed Container Key :" + containerKeys.UserName } return responseObj @@ -97,7 +96,7 @@ func DeleteDockerRegData(userName string) ResponseObj { responseObj = DeleteDb(registries) } else { responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Delete Failed." + responseObj.ResponseDesc = "Delete Failed Container key :" + userName } return responseObj } @@ -127,11 +126,11 @@ func InsertDb(containerKeys ContainerKeys) ResponseObj { err := dbconfig.DbConfig().Insert(containerKeys) if err != nil { responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Insert Failed" + responseObj.ResponseDesc = "Insert Failed Container key : " + containerKeys.UserName log.Println(err) } else { responseObj.ResponseCode = 0 - responseObj.ResponseDesc = "Successfully Added" + responseObj.ResponseDesc = "Successfully Added Container Key :" + containerKeys.UserName } return responseObj } @@ -141,11 +140,11 @@ func UpdateDb(containerKeys ContainerKeys) ResponseObj { err := dbconfig.DbConfig().Update(containerKeys) if err != nil { responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Update Failed" + responseObj.ResponseDesc = "Update Failed Container key :" + containerKeys.UserName log.Println(err) } else { responseObj.ResponseCode = 0 - responseObj.ResponseDesc = "Successfully Updated" + responseObj.ResponseDesc = "Successfully Updated Container key :" + containerKeys.UserName } return responseObj } @@ -155,11 +154,11 @@ func DeleteDb(containerKeys ContainerKeys) ResponseObj { err := dbconfig.DbConfig().Delete(containerKeys) if err != nil { responseObj.ResponseCode = 1 - responseObj.ResponseDesc = "Delete Failed" + responseObj.ResponseDesc = "Delete Failed Container Key :" + containerKeys.UserName log.Println(err) } else { responseObj.ResponseCode = 0 - responseObj.ResponseDesc = "Successfully Deleted" + responseObj.ResponseDesc = "Successfully Deleted Container Key :" + containerKeys.UserName } return responseObj } diff --git a/main.go b/main.go index 7ed0921..3f952f2 100644 --- a/main.go +++ b/main.go @@ -26,9 +26,9 @@ func main() { c := cache.New(1*time.Minute, 1*time.Minute) webhook_listener.HealthCheck(r) webhook_listener.HooksListener(r, c) - registryapilayer.SaveContainerAccessKeys(r) - registryapilayer.EditContainerAccessKeys(r) - registryapilayer.DeleteContainerAccessKeys(r) + registryapilayer.SaveContainerAccessKeys(r, c) + registryapilayer.EditContainerAccessKeys(r, c) + registryapilayer.DeleteContainerAccessKeys(r, c) schedulerapilayer.SaveRepositoryScheduledTime(r, c) schedulerapilayer.EditRepositoryScheduledTime(r, c) schedulerapilayer.DeleteRepositoryScheduledTime(r, c) From ebb6630477ff7d831e61a22a8e7bbe57c00b6c37 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sat, 29 Aug 2020 16:36:09 +0530 Subject: [PATCH 29/30] add caching_test --- test/caching_test.go | 31 +++++++++++++++++++++++++++++++ test/registryapilayer_test.go | 30 +++++++++++++++++------------- test/schedulerapilayer_test.go | 18 ++++++++++-------- 3 files changed, 58 insertions(+), 21 deletions(-) create mode 100644 test/caching_test.go diff --git a/test/caching_test.go b/test/caching_test.go new file mode 100644 index 0000000..f6ef058 --- /dev/null +++ b/test/caching_test.go @@ -0,0 +1,31 @@ +package test + +import ( + "github.com/patrickmn/go-cache" + "testing" + "time" + "ukiyo/internal/caching/cacheupdate" +) + +const ( + _TimeZone = "Asia/Kolkata" +) + +func TestHistoryFetch(t *testing.T) { + c := cache.New(1*time.Minute, 1*time.Minute) + var history cacheupdate.History + var historyArr []cacheupdate.History + loc, _ := time.LoadLocation(_TimeZone) + history.Action = "" + history.Comment = "" + history.Status = 0 + history.Time = time.Now().In(loc).Format("2006-01-02 15:04:05") + historyArr = append(historyArr, history) + c.Set("history", historyArr, 2*time.Minute) + val := cacheupdate.HistoryFetch(c) + if len(val) > 0 { + t.Logf("passed expected %v and got value %v", len(val), len(val)) + } else { + t.Errorf("failed expected %v but got value %v", 0, len(val)) + } +} \ No newline at end of file diff --git a/test/registryapilayer_test.go b/test/registryapilayer_test.go index 04223a6..6f9f96e 100644 --- a/test/registryapilayer_test.go +++ b/test/registryapilayer_test.go @@ -1,21 +1,23 @@ package test import ( + "github.com/gin-gonic/gin" + "github.com/patrickmn/go-cache" + "github.com/stretchr/testify/assert" "net/http" "net/http/httptest" "strings" "testing" + "time" "ukiyo/api/registryapilayer" - - "github.com/gin-gonic/gin" - "github.com/stretchr/testify/assert" ) func TestSaveContainerAccessKeys(t *testing.T) { r := gin.Default() - registryapilayer.SaveContainerAccessKeys(r) + c := cache.New(1*time.Minute, 1*time.Minute) + registryapilayer.SaveContainerAccessKeys(r, c) pushJson := `{ - "username":"name", + "username":"registry_name", "desc":"Docker registry keys", "accessToken":"290e587a-1790-41d7-a053-61a2ef377875", "email":"username@gmail.com", @@ -25,14 +27,15 @@ func TestSaveContainerAccessKeys(t *testing.T) { req, _ := http.NewRequest("POST", "/save-container-access-keys", strings.NewReader(pushJson)) r.ServeHTTP(w, req) assert.Equal(t, http.StatusOK, w.Code) - assert.Equal(t, "OK", w.Body.String()) + assert.Equal(t, "{\"ResponseCode\":0,\"ResponseDesc\":\"Successfully Added Container Key :registry_name\"}", w.Body.String()) } func TestEditContainerAccessKeys(t *testing.T) { r := gin.Default() - registryapilayer.EditContainerAccessKeys(r) + c := cache.New(1*time.Minute, 1*time.Minute) + registryapilayer.EditContainerAccessKeys(r, c) pushJson := `{ - "username":"name", + "username":"registry_name", "desc":"Docker registry keys", "accessToken":"290e587a-1790-41d7-a053-61a2ef377875", "email":"username@gmail.com", @@ -42,15 +45,16 @@ func TestEditContainerAccessKeys(t *testing.T) { req, _ := http.NewRequest("POST", "/edit-container-access-keys", strings.NewReader(pushJson)) r.ServeHTTP(w, req) assert.Equal(t, http.StatusOK, w.Code) - assert.Equal(t, "OK", w.Body.String()) + assert.Equal(t, "{\"ResponseCode\":0,\"ResponseDesc\":\"Successfully Updated Container key :registry_name\"}", w.Body.String()) } func TestDeleteContainerAccessKeys(t *testing.T) { r := gin.Default() - registryapilayer.DeleteContainerAccessKeys(r) + c := cache.New(1*time.Minute, 1*time.Minute) + registryapilayer.DeleteContainerAccessKeys(r, c) w := httptest.NewRecorder() - req, _ := http.NewRequest("DELETE", "/delete-container-access-keys/registryName", nil) + req, _ := http.NewRequest("DELETE", "/delete-container-access-keys/registry_name", nil) r.ServeHTTP(w, req) assert.Equal(t, http.StatusOK, w.Code) - assert.Equal(t, "OK", w.Body.String()) -} + assert.Equal(t, "{\"ResponseCode\":0,\"ResponseDesc\":\"Successfully Deleted Container Key :registry_name\"}", w.Body.String()) +} \ No newline at end of file diff --git a/test/schedulerapilayer_test.go b/test/schedulerapilayer_test.go index ac87d06..5cff6f2 100644 --- a/test/schedulerapilayer_test.go +++ b/test/schedulerapilayer_test.go @@ -26,41 +26,43 @@ func TestSaveRepositoryScheduledTime(t *testing.T) { "exportPort": "443", "internalPort": "443" }], - "scheduledAt": "1555438658", + "scheduledTime": "Aug 17 2020 00:19:50 AM", "scheduledDowntime": false }` w := httptest.NewRecorder() req, _ := http.NewRequest("POST", "/save-repository-scheduled-time", strings.NewReader(pushJson)) r.ServeHTTP(w, req) assert.Equal(t, http.StatusOK, w.Code) - assert.Equal(t, "OK", w.Body.String()) + assert.Equal(t, "{\"ResponseCode\":0,\"ResponseDesc\":\"Successfully Added pod details\"}", w.Body.String()) } func TestEditRepositoryScheduledTime(t *testing.T) { r := gin.Default() - schedulerapilayer.EditRepositoryScheduledTime(r) + c := cache.New(1*time.Minute, 1*time.Minute) + schedulerapilayer.EditRepositoryScheduledTime(r, c) pushJson := `{ "name": "demo-nginx", "bindingPort": [{ "exportPort": "8180", "internalPort": "80" }], - "scheduledAt": "1555438658", + "scheduledTime": "Aug 17 2020 00:19:50 AM", "scheduledDowntime": false }` w := httptest.NewRecorder() req, _ := http.NewRequest("POST", "/edit-repository-scheduled-time", strings.NewReader(pushJson)) r.ServeHTTP(w, req) assert.Equal(t, http.StatusOK, w.Code) - assert.Equal(t, "OK", w.Body.String()) + assert.Equal(t, "{\"ResponseCode\":0,\"ResponseDesc\":\"Successfully Updated pod details\"}", w.Body.String()) } func TestDeleteRepositoryScheduledTime(t *testing.T) { r := gin.Default() - schedulerapilayer.DeleteRepositoryScheduledTime(r) + c := cache.New(1*time.Minute, 1*time.Minute) + schedulerapilayer.DeleteRepositoryScheduledTime(r, c) w := httptest.NewRecorder() req, _ := http.NewRequest("DELETE", "/remove-repository-scheduled-time/demo-nginx", nil) r.ServeHTTP(w, req) assert.Equal(t, http.StatusOK, w.Code) - assert.Equal(t, "OK", w.Body.String()) -} + assert.Equal(t, "{\"ResponseCode\":0,\"ResponseDesc\":\"Successfully Deleted pod details\"}", w.Body.String()) +} \ No newline at end of file From 014615f5ab2a0740eb8cb803755647099ceeda58 Mon Sep 17 00:00:00 2001 From: Hansika123 Date: Sat, 29 Aug 2020 16:44:59 +0530 Subject: [PATCH 30/30] add GitHub actions --- .github/workflows/main.yml | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..5ede701 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,37 @@ +name: CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + + build: + name: Build + runs-on: ubuntu-latest + steps: + + - name: Set up Go 1.x + uses: actions/setup-go@v2 + with: + go-version: ^1.13 + id: go + + - name: Check out code into the Go module directory + uses: actions/checkout@v2 + + - name: Get dependencies + run: | + go get -v -t -d ./... + if [ -f Gopkg.toml ]; then + curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh + dep ensure + fi + + - name: Build + run: go build -v . + + - name: Test + run: go test ./test/registryapilayer_test.go ./test/schedulerapilayer_test.go ./test/caching_test.go