Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add registry management page #245

Merged
merged 4 commits into from
Jan 18, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion web/clui/conf/locale/locale_en-US.ini
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Compute_Storage = Compute & Storage
Instances = Instances
Flavors = Flavors
Images = Images
Registry = Registry
Volumes = Volumes
Platform_Service = Platform Service
Openshift = Openshift
Expand Down Expand Up @@ -77,12 +78,16 @@ HyperID = HyperID
ParentID = ParentID
Children = Children
Console = Console
Label = Label
OcpVersion = Ocp Version
RegistryContent = Registry Content

User_Manage_Panel = User Manage Panel
Organization_Manage_Panel = Organization Manage Panel
Key_Manage_Panel = Key Manage Panel
Instance_Manage_Panel = Instance Manage Panel
Flavor_Manage_Panel = Flavor Manage Panel
Registry_Manage_Panel = Registry Manage Panel
Image_Manage_Panel = Image Manage Panel
Volume_Manage_Panel = Volume Manage Panel
Openshift_Cluster_Manage_Panel = Openshift Cluster Manage Panel
Expand Down Expand Up @@ -110,6 +115,7 @@ Create_an_OpenShift_cluster = Create an OpenShift cluster
Advanced = Advanced

Create New Flavor = Create New Flavor
Create New Registry = Create New Registry
Create New Floating Ip = Create New Floating Ip
Address = Address
Type = Type
Expand Down Expand Up @@ -213,6 +219,8 @@ Instance Deletion = Instance Deletion
Instance_Deletion_Confirm = This instance is going to be deleted permanently, do you want to continue?
Flavor Deletion = Flavor Deletion
Flavor_Deletion_Confirm = This flavor is going to be deleted permanently, do you want to continue?
Registry Deletion = Registry Deletion
Registry_Deletion_Confirm = This registry is going to be deleted permanently, do you want to continue?
FloatingIP Deletion = FloatingIP Deletion
FloatingIP_Deletion_Confirm = This floating ip is going to be deleted permanently, do you want to continue?
Gateway Deletion = Gateway Deletion
Expand Down Expand Up @@ -270,4 +278,4 @@ additionalTrustBundle = additionalTrustBundle
imageContentSources = imageContentSources


Default Username = Default Username
Default Username = Default Username
14 changes: 11 additions & 3 deletions web/clui/conf/locale/locale_zh-CN.ini
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Worker_Flavor = Worker配置
Worker Flavor = Worker配置
Console = 控制台
Images = 镜像
Registry = 仓库
Volumes = 卷
Platform_Service = 平台 = 服务
Openshift = Openshift
Expand Down Expand Up @@ -77,12 +78,16 @@ HyperID = 标识
ParentID = 父标识
Children = 下级数
Console = 控制台
Label = 名称
OcpVersion = Ocp版本
RegistryContent = 配置内容

User_Manage_Panel = 用户管理面板
Organization_Manage_Panel = 组织管理面板
Key_Manage_Panel = 密钥管理面板
Instance_Manage_Panel = 实例管理面板
Flavor_Manage_Panel = 配置管理面板
Flavor_Manage_Panel = 配置管理面�
Registry_Manage_Panel = Registry Manage Panel
Image_Manage_Panel = 镜像管理面板
Volume_Manage_Panel = 卷管理面板
Openshift_Cluster_Manage_Panel = Openshift集群管理面板
Expand All @@ -109,7 +114,8 @@ Use_your_instance_content = 其中用户名对应于CentOS, CoreOS, 和Ubuntu镜
Create_an_OpenShift_cluster = 创建OpenShift集群
Advanced = 高级

Create New Flavor = 创建新的配置
Create New Flavor = 创建新的配�
Create New Registry = 创建新的仓库
Create New Floating Ip = 创建新的浮动IP
Address = 地址
Type = 类型
Expand Down Expand Up @@ -212,7 +218,9 @@ No = 否
Instance Deletion = 实例删除
Instance_Deletion_Confirm = 此实例将被永久删除,确定继续?
Flavor Deletion = 配置删除
Flavor_Deletion_Confirm = 此配置将被永久删除,确定继续?
Flavor_Deletion_Confirm = 此配置将被永久删除,确定继续�
Registry Deletion = Registry Deletion
Registry_Deletion_Confirm = This registry is going to be deleted permanently, do you want to continue?��
FloatingIP Deletion = 浮动IP删除
FloatingIP_Deletion_Confirm = 此浮动IP将被永久删除,确定继续?
Gateway Deletion = 网关删除
Expand Down
22 changes: 22 additions & 0 deletions web/clui/model/registry.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
Copyright <holder> All Rights Reserved.

SPDX-License-Identifier: Apache-2.0
*/

package model

import (
"github.com/IBM/cloudland/web/sca/dbs"
)

type Registry struct {
Model
Label string `gorm:"type:varchar(128)"`
OcpVersion string `gorm:"type:varchar(128)"`
RegistryContent string `gorm:"type:varchar(128)"`
}

func init() {
dbs.AutoMigrate(&Registry{})
}
2 changes: 1 addition & 1 deletion web/clui/routes/instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ func (a *InstanceAdmin) Create(ctx context.Context, count int, prefix, userdata
}
}
}
hyperGroup, err := instanceAdmin.getHyperGroup(image.HypervisorType, zoneID)
hyperGroup, err := instanceAdmin.getHyperGroup(image.VirtType, zoneID)
if err != nil {
log.Println("No valid hypervisor", err)
return
Expand Down
190 changes: 190 additions & 0 deletions web/clui/routes/registry.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
/*
Copyright <holder> All Rights Reserved.

SPDX-License-Identifier: Apache-2.0

*/

package routes

import (
"fmt"
"log"
"net/http"

"github.com/IBM/cloudland/web/clui/model"
"github.com/IBM/cloudland/web/sca/dbs"
"github.com/go-macaron/session"
macaron "gopkg.in/macaron.v1"
)

var (
registryAdmin = &RegistryAdmin{}
registryView = &RegistryView{}
)

type RegistryAdmin struct{}
type RegistryView struct{}

func (a *RegistryAdmin) Create(label, ocpVersion, registryContent string) (registry *model.Registry, err error) {
db := DB()
registry = &model.Registry{
Label: label,
OcpVersion: ocpVersion,
RegistryContent: registryContent,
}
err = db.Create(registry).Error
return
}

func (a *RegistryAdmin) Delete(id int64) (err error) {
db := DB()
db = db.Begin()
defer func() {
if err == nil {
db.Commit()
} else {
db.Rollback()
}
}()
if err = db.Delete(&model.Registry{Model: model.Model{ID: id}}).Error; err != nil {
log.Println("Failed to delete registry", err)
return
}
return
}

func (a *RegistryAdmin) List(offset, limit int64, order, query string) (total int64, registrys []*model.Registry, err error) {
db := DB()
if limit == 0 {
limit = 16
}

if order == "" {
order = "created_at"
}
if query != "" {
query = fmt.Sprintf("label like '%%%s%%'", query)
}

registrys = []*model.Registry{}
if err = db.Model(&model.Registry{}).Where(query).Count(&total).Error; err != nil {
return
}
db = dbs.Sortby(db.Offset(offset).Limit(limit), order)
if err = db.Where(query).Find(&registrys).Error; err != nil {
return
}

return
}

func (v *RegistryView) List(c *macaron.Context, store session.Store) {
offset := c.QueryInt64("offset")
limit := c.QueryInt64("limit")
if limit == 0 {
limit = 16
}
order := c.Query("order")
if order == "" {
order = "-created_at"
}
query := c.QueryTrim("q")
total, registrys, err := registryAdmin.List(offset, limit, order, query)
if err != nil {
if c.Req.Header.Get("X-Json-Format") == "yes" {
c.JSON(500, map[string]interface{}{
"error": err.Error(),
})
return
}
c.Data["ErrorMsg"] = err.Error()
c.HTML(500, "500")
return
}
pages := GetPages(total, limit)
c.Data["Registrys"] = registrys
c.Data["Total"] = total
c.Data["Pages"] = pages
c.Data["Query"] = query
if c.Req.Header.Get("X-Json-Format") == "yes" {
c.JSON(200, map[string]interface{}{
"registrys": registrys,
"total": total,
"pages": pages,
"query": query,
})
return
}
c.HTML(200, "registrys")
}

func (v *RegistryView) Delete(c *macaron.Context, store session.Store) (err error) {
memberShip := GetMemberShip(c.Req.Context())
permit := memberShip.CheckPermission(model.Admin)
if !permit {
log.Println("Not authorized for this operation")
c.Data["ErrorMsg"] = "Not authorized for this operation"
c.HTML(http.StatusBadRequest, "error")
return
}
id := c.ParamsInt64("id")
if id <= 0 {
c.Data["ErrorMsg"] = "id <= 0"
c.HTML(http.StatusBadRequest, "error")
return
}
err = registryAdmin.Delete(id)
if err != nil {
c.Data["ErrorMsg"] = err.Error()
c.HTML(http.StatusBadRequest, "error")
return
}
c.JSON(200, map[string]interface{}{
"redirect": "registrys",
})
return
}

func (v *RegistryView) New(c *macaron.Context, store session.Store) {
memberShip := GetMemberShip(c.Req.Context())
permit := memberShip.CheckPermission(model.Admin)
if !permit {
log.Println("Not authorized for this operation")
c.Data["ErrorMsg"] = "Not authorized for this operation"
c.HTML(http.StatusBadRequest, "error")
return
}
c.HTML(200, "registrys_new")
}

func (v *RegistryView) Create(c *macaron.Context, store session.Store) {
memberShip := GetMemberShip(c.Req.Context())
permit := memberShip.CheckPermission(model.Admin)
if !permit {
log.Println("Not authorized for this operation")
c.Data["ErrorMsg"] = "Not authorized for this operation"
c.HTML(http.StatusBadRequest, "error")
return
}
redirectTo := "../registrys"
label := c.Query("label")
ocpVersion := c.Query("ocpversion")
registryContent := c.Query("registrycontent")
registry, err := registryAdmin.Create(label, ocpVersion, registryContent)
if err != nil {
log.Println("Create registry failed", err)
if c.Req.Header.Get("X-Json-Format") == "yes" {
c.JSON(500, map[string]interface{}{
"error": err.Error(),
})
return
}
c.HTML(500, "500")
return
} else if c.Req.Header.Get("X-Json-Format") == "yes" {
c.JSON(200, registry)
return
}
c.Redirect(redirectTo)
}
4 changes: 4 additions & 0 deletions web/clui/routes/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,10 @@ func New() (m *macaron.Macaron) {
m.Get("/flavors/new", flavorView.New)
m.Post("/flavors/new", flavorView.Create)
m.Delete("/flavors/:id", flavorView.Delete)
m.Get("/registrys", registryView.List)
m.Get("/registrys/new", registryView.New)
m.Post("/registrys/new", registryView.Create)
m.Delete("/registrys/:id", registryView.Delete)
m.Get("/images", imageView.List)
m.Get("/images/new", imageView.New)
m.Post("/images/new", imageView.Create)
Expand Down
5 changes: 5 additions & 0 deletions web/clui/templates/_left.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@
<a {{ if eq .Link "/images" }} class="active item" {{ else }} class="item" {{ end }} href="/images">
{{.i18n.Tr "Images"}}
</a>
{{ if $.IsAdmin }}
<a {{ if eq .Link "/registrys" }} class="active item" {{ else }} class="item" {{ end }} href="/registrys">
{{.i18n.Tr "Registry"}}
</a>
{{ end }}
<div class="header item">{{.i18n.Tr "Platform_Service"}}</div>
<a {{ if eq .Link "/openshifts" }} class="active item" {{ else }} class="item" {{ end }} href="/openshifts">
{{.i18n.Tr "Openshift"}}
Expand Down
4 changes: 2 additions & 2 deletions web/clui/templates/images.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@
<td><span title="Tue, 18 Dec 2018 14:24:59 &#43;0800">{{.CreatedAt}}</span></td>
<td>{{.OsVersion}}</td>
<td>
{{ if eq .HypervisorType "zkvm" }}
{{ if eq .VirtType "zkvm" }}
KVM on Z
{{ else }}
{{ if eq .HypervisorType "zvm" }}
{{ if eq .VirtType "zvm" }}
z/VM
{{ else }}
KVM on x86-64
Expand Down
6 changes: 3 additions & 3 deletions web/clui/templates/instances_new.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -107,15 +107,15 @@
{{ if eq .Status "available" }}

<div class="item" data-value={{.ID}} data-text={{.Name}}>
{{ if eq .HypervisorType "zvm" }}
{{ if eq .VirtType "zvm" }}

{{.Name}} for z/VM

{{ else if eq .HypervisorType "zkvm" }}
{{ else if eq .VirtType "zkvm" }}

{{.Name}} for KVM on Z

{{ else if eq .HypervisorType "xkvm" }}
{{ else if eq .VirtType "xkvm" }}

{{.Name}} for KVM on x86-64

Expand Down
Loading