add registries create query update delete function

This commit is contained in:
yanmingfan
2018-06-07 17:29:45 +08:00
parent 1e744d0ad3
commit e1f75e2dc4
4 changed files with 354 additions and 42 deletions

View File

@@ -36,10 +36,25 @@ func Register(ws *restful.WebService, subPath string) {
Consumes(restful.MIME_JSON).
Produces(restful.MIME_JSON)
ws.Route(ws.PUT(subPath + "/{name}").To(handleUpdateRegistries).Filter(route.RouteLogging)).
Consumes(restful.MIME_JSON).
Produces(restful.MIME_JSON)
ws.Route(ws.GET(subPath + "/{project}").To(handleQueryRegistries).Filter(route.RouteLogging)).
Consumes(restful.MIME_JSON).
Produces(restful.MIME_JSON)
ws.Route(ws.GET(subPath).To(handlerListRegistries).Filter(route.RouteLogging)).
Consumes(restful.MIME_JSON).
Produces(restful.MIME_JSON)
ws.Route(ws.DELETE(subPath + "/{name}").To(handlerDeleteRegistries).Filter(route.RouteLogging)).
Consumes(restful.MIME_JSON).
Produces(restful.MIME_JSON)
ws.Route(ws.GET(subPath + "/detail/{name}").To(handlerGetRegistries).Filter(route.RouteLogging)).
Consumes(restful.MIME_JSON).
Produces(restful.MIME_JSON)
}
func handlerRegistryValidation(request *restful.Request, response *restful.Response) {
@@ -68,21 +83,23 @@ func handleCreateRegistries(request *restful.Request, response *restful.Response
err := request.ReadEntity(&registries)
if err != nil {
response.WriteHeaderAndEntity(http.StatusInternalServerError, constants.MessageResponse{Message: err.Error()})
}
result, err := models.CreateRegistries(registries)
if err != nil {
response.WriteHeaderAndEntity(http.StatusInternalServerError, constants.MessageResponse{Message: err.Error()})
} else {
response.WriteAsJson(result)
result, err := models.CreateRegistries(registries)
if err != nil {
response.WriteHeaderAndEntity(http.StatusInternalServerError, constants.MessageResponse{Message: err.Error()})
} else {
response.WriteAsJson(result)
}
}
@@ -104,3 +121,82 @@ func handleQueryRegistries(request *restful.Request, response *restful.Response)
}
}
func handlerListRegistries(request *restful.Request, response *restful.Response) {
result, err := models.ListAllRegistries()
if err != nil {
response.WriteHeaderAndEntity(http.StatusInternalServerError, constants.MessageResponse{Message: err.Error()})
} else {
response.WriteAsJson(result)
}
}
func handlerDeleteRegistries(request *restful.Request, response *restful.Response) {
name := request.PathParameter("name")
result, err := models.DeleteRegistries(name)
if err != nil {
response.WriteHeaderAndEntity(http.StatusInternalServerError, constants.MessageResponse{Message: err.Error()})
} else {
response.WriteAsJson(result)
}
}
func handleUpdateRegistries(request *restful.Request, response *restful.Response) {
name := request.PathParameter("name")
registries := models.Registries{}
err := request.ReadEntity(&registries)
if err != nil {
response.WriteHeaderAndEntity(http.StatusInternalServerError, constants.MessageResponse{Message: err.Error()})
} else {
result, err := models.UpdateRegistries(name, registries)
if err != nil {
response.WriteHeaderAndEntity(http.StatusInternalServerError, constants.MessageResponse{Message: err.Error()})
} else {
response.WriteAsJson(result)
}
}
}
func handlerGetRegistries(request *restful.Request, response *restful.Response) {
name := request.PathParameter("name")
result, err := models.GetReisgtries(name)
if err != nil {
response.WriteHeaderAndEntity(http.StatusInternalServerError, constants.MessageResponse{Message: err.Error()})
} else {
response.WriteAsJson(result)
}
}

View File

@@ -48,12 +48,11 @@ type Components struct {
* there are master component, node component,addons component , kubesphere component
*
*/
func GetComponents() (result []Components, err error) {
func GetComponents() ([]Components, error) {
result := make([]Components, 0)
k8sClient := client.NewK8sClient()
label := "tier=control-plane"
option := meta_v1.ListOptions{
LabelSelector: label,
@@ -120,7 +119,6 @@ func GetComponents() (result []Components, err error) {
}
label = "component=kube-addon-manager"
option.LabelSelector = label
kubeaddon, err := k8sClient.CoreV1().Pods(KUBESYSTEM).List(option)
@@ -172,7 +170,6 @@ func GetComponents() (result []Components, err error) {
}
option.LabelSelector = ""
dsList, err := k8sClient.AppsV1beta2().DaemonSets(KUBESYSTEM).List(option)
if err != nil {
@@ -231,7 +228,6 @@ func GetComponents() (result []Components, err error) {
}
templates = []string{"kube-dns", "heapster", "monitoring-influxdb", "iam", "openpitrix", "istio", "kubesphere"}
namespaces := []string{KUBESYSTEM, OPENPITRIX, ISTIO, KUBESPHERE}
for _, ns := range namespaces {

View File

@@ -18,19 +18,16 @@ package models
import (
"encoding/json"
"fmt"
"strconv"
"strings"
"github.com/golang/glog"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"kubesphere.io/kubesphere/pkg/client"
ksutil "kubesphere.io/kubesphere/pkg/util"
"fmt"
"strconv"
)
const (

View File

@@ -68,13 +68,12 @@ func convert2DockerJson(authinfo AuthInfo) []byte {
}
type Registries struct {
DisplayName string `json:"display_name,omitempty"`
Description string `json:"description,omitempty"`
AuthProject string `json:"auth_project,omitempty"`
RegServerHost string `json:"reg_server_host,omitempty"`
RegUsername string `json:"reg_username,omitempty"`
RegPassword string `json:"reg_password,omitempty"`
CreateUser string `json:"create_user,omitempty"`
DisplayName string `json:"display_name,omitempty"`
AuthProject string `json:"auth_project,omitempty"`
RegServerHost string `json:"reg_server_host,omitempty"`
RegUsername string `json:"reg_username,omitempty"`
RegPassword string `json:"reg_password,omitempty"`
Annotations interface{} `json:"annotations"`
}
type ValidationMsg struct {
@@ -82,8 +81,6 @@ type ValidationMsg struct {
Reason string `json:"reason"`
}
const DOCKERCLIENTERROR = "Docker client error"
func RegistryLoginAuth(authinfo AuthInfo) ValidationMsg {
var result ValidationMsg
@@ -142,7 +139,7 @@ func CreateRegistries(registries Registries) (msg constants.MessageResponse, err
secret.Kind = SECRET
secret.APIVersion = APIVERSION
secret.Type = TYPE
secret.Name = registries.DisplayName + ".key"
secret.Name = registries.DisplayName
authinfo := NewAuthInfo(registries)
data := make(map[string][]byte)
@@ -152,12 +149,17 @@ func CreateRegistries(registries Registries) (msg constants.MessageResponse, err
k8sclient := kubeclient.NewK8sClient()
labels := make(map[string]string)
annotations := make(map[string]string)
labels["app"] = "dockerhubkey"
secret.Labels = labels
annotations["description"] = registries.Description
annotations["createuser"] = registries.CreateUser
annotations := make(map[string]string)
for key, value := range registries.Annotations.(map[string]interface{}) {
annotations[key] = value.(string)
}
secret.Annotations = annotations
for _, pro := range projects {
@@ -179,7 +181,9 @@ func CreateRegistries(registries Registries) (msg constants.MessageResponse, err
}
//query registries host
func QueryRegistries(project string) (regList []Registries, err error) {
func QueryRegistries(project string) ([]Registries, error) {
regList := make([]Registries, 0)
k8sclient := kubeclient.NewK8sClient()
@@ -203,14 +207,6 @@ func QueryRegistries(project string) (regList []Registries, err error) {
reg.DisplayName = secret.Name
reg.AuthProject = project
if err != nil {
glog.Errorln(err)
return regList, err
}
var data map[string]interface{}
err := json.Unmarshal(secret.Data[".dockerconfigjson"], &data)
@@ -238,3 +234,230 @@ func QueryRegistries(project string) (regList []Registries, err error) {
return regList, nil
}
//list all registries
func ListAllRegistries() ([]Registries, error) {
result := make([]Registries, 0)
var registries Registries
var options meta_v1.ListOptions
k8sclient := kubeclient.NewK8sClient()
projects, err := k8sclient.CoreV1().Namespaces().List(options)
if err != nil {
return result, err
}
options.LabelSelector = "app=dockerhubkey"
for _, project := range projects.Items {
secrets, err := k8sclient.CoreV1().Secrets(project.Name).List(options)
if err != nil {
return result, err
}
if len(secrets.Items) > 0 {
for _, secret := range secrets.Items {
registries.DisplayName = secret.Name
registries.AuthProject = secret.Namespace
var data map[string]interface{}
err := json.Unmarshal(secret.Data[".dockerconfigjson"], &data)
if err != nil {
glog.Errorln(err)
return result, err
}
hostMap := data["auths"].(map[string]interface{})
for key, val := range hostMap {
registries.RegServerHost = key
info := val.(map[string]interface{})
registries.RegUsername = info["username"].(string)
registries.RegPassword = info["password"].(string)
}
registries.Annotations = secret.Annotations
if len(result) == 0 {
result = append(result, registries)
} else {
if !containSame(registries, result) {
result = append(result, registries)
}
}
}
}
}
return result, nil
}
//delete registries
func DeleteRegistries(name string) (constants.MessageResponse, error) {
var msg constants.MessageResponse
k8sclient := kubeclient.NewK8sClient()
var options meta_v1.ListOptions
projects, err := k8sclient.CoreV1().Namespaces().List(options)
if err != nil {
return msg, err
}
var deloptions *meta_v1.DeleteOptions
for _, project := range projects.Items {
k8sclient.CoreV1().Secrets(project.Name).Delete(name, deloptions)
}
msg.Message = "success"
return msg, nil
}
func containSame(registries Registries, list []Registries) bool {
flag := false
for ind, reg := range list {
if reg.DisplayName == registries.DisplayName {
list[ind].AuthProject = reg.AuthProject + "," + registries.AuthProject
flag = true
}
}
return flag
}
func UpdateRegistries(name string, registries Registries) (Registries, error) {
DeleteRegistries(name)
k8sclient := kubeclient.NewK8sClient()
projects := strings.Split(registries.AuthProject, ",")
var secret v1.Secret
secret.Kind = SECRET
secret.APIVersion = APIVERSION
secret.Type = TYPE
secret.Name = registries.DisplayName
authinfo := NewAuthInfo(registries)
data := make(map[string][]byte)
data[".dockerconfigjson"] = convert2DockerJson(*authinfo)
secret.Data = data
labels := make(map[string]string)
labels["app"] = "dockerhubkey"
secret.Labels = labels
annotations := make(map[string]string)
for key, value := range registries.Annotations.(map[string]interface{}) {
annotations[key] = value.(string)
}
secret.Annotations = annotations
for _, pro := range projects {
glog.Infof("alter secret %s in %s ", registries.DisplayName, pro)
_, err := k8sclient.CoreV1().Secrets(pro).Create(&secret)
if err != nil {
glog.Error(err)
return registries, err
}
} //end for
return registries, nil
}
func GetReisgtries(name string) (Registries, error) {
var reg Registries
k8sclient := kubeclient.NewK8sClient()
var getoptions meta_v1.GetOptions
getoptions.Kind = SECRET
var options meta_v1.ListOptions
projects, err := k8sclient.CoreV1().Namespaces().List(options)
if err != nil {
return reg, err
}
if len(projects.Items) > 0 {
for _, project := range projects.Items {
secret, err := k8sclient.CoreV1().Secrets(project.Name).Get(name, getoptions)
if err == nil {
reg.DisplayName = secret.Name
var data map[string]interface{}
json.Unmarshal(secret.Data[".dockerconfigjson"], &data)
if len(reg.AuthProject) == 0 {
reg.AuthProject = secret.Namespace
} else {
reg.AuthProject = reg.AuthProject + "," + secret.Namespace
}
hostMap := data["auths"].(map[string]interface{})
for key, val := range hostMap {
reg.RegServerHost = key
info := val.(map[string]interface{})
reg.RegUsername = info["username"].(string)
reg.RegPassword = info["password"].(string)
}
reg.Annotations = secret.Annotations
}
}
}
return reg, nil
}