add registries create query update delete function
This commit is contained in:
@@ -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(®istries)
|
||||
|
||||
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(®istries)
|
||||
|
||||
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)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user