mirror of
https://hubproxy.babadafafafafa.cn/https://github.com/yunionio/cloudpods.git
synced 2026-09-21 00:24:07 +08:00
Compare commits
46 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
99818a7c0f | ||
|
|
6cab61ecb8 | ||
|
|
01a8384071 | ||
|
|
b5875e00d1 | ||
|
|
d91f5fa87e | ||
|
|
a346fd47fe | ||
|
|
cedd4ccdfa | ||
|
|
f5d1adcbd0 | ||
|
|
66a5410e7d | ||
|
|
3637b671ed | ||
|
|
7a58d9f197 | ||
|
|
5c8a7769e3 | ||
|
|
ebe1eb603b | ||
|
|
eb67c681d3 | ||
|
|
e099f006fa | ||
|
|
c9b485b9f3 | ||
|
|
22231edba6 | ||
|
|
0742afb487 | ||
|
|
3b036e6c30 | ||
|
|
227fa57883 | ||
|
|
5439457bb4 | ||
|
|
57cd48354f | ||
|
|
3c63af8de0 | ||
|
|
52488eeb50 | ||
|
|
9114556da3 | ||
|
|
abe44154ba | ||
|
|
89de86a243 | ||
|
|
6cdbae22a4 | ||
|
|
6f5be444c3 | ||
|
|
13d165e3c1 | ||
|
|
d3d977a359 | ||
|
|
0f37875b40 | ||
|
|
bb1752fb7b | ||
|
|
b152aa3337 | ||
|
|
bb01236942 | ||
|
|
7a81820cd3 | ||
|
|
525a18dde2 | ||
|
|
39bcc36c2d | ||
|
|
138088027e | ||
|
|
a023cf56e4 | ||
|
|
a17e90ed3b | ||
|
|
2153a79dcb | ||
|
|
780cf826c7 | ||
|
|
62d2a732e2 | ||
|
|
f6409e8511 | ||
|
|
4cbe29d0c5 |
@@ -1152,6 +1152,7 @@ func init() {
|
||||
ID string `help:"ID or name of VM"`
|
||||
DisableIsaSerial string `help:"disable isa serial device" choices:"true|false"`
|
||||
DisablePvpanic string `help:"disable pvpanic device" choices:"true|false"`
|
||||
DisableUsbKbd string `help:"disable usb kbd" choices:"true|false"`
|
||||
}
|
||||
|
||||
R(&ServerQemuParams{}, "server-set-qemu-params", "config qemu params", func(s *mcclient.ClientSession,
|
||||
@@ -1163,6 +1164,9 @@ func init() {
|
||||
if len(opts.DisablePvpanic) > 0 {
|
||||
params.Set("disable_pvpanic", jsonutils.NewString(opts.DisablePvpanic))
|
||||
}
|
||||
if len(opts.DisableUsbKbd) > 0 {
|
||||
params.Set("disable_usb_kbd", jsonutils.NewString(opts.DisableUsbKbd))
|
||||
}
|
||||
result, err := modules.Servers.PerformAction(s, opts.ID, "set-qemu-params", params)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -35,7 +35,10 @@ type BaseEventListOptions struct {
|
||||
Action []string `help:"Log action"`
|
||||
|
||||
User string `help:"filter by operator user"`
|
||||
Project string `help:"filter by owner project"`
|
||||
Project string `help:"filter by operator user's project"`
|
||||
|
||||
OwnerProjectIds []string `help:"filter by owner project ids"`
|
||||
OwnerDomainIds []string `help:"filter by owner domain ids"`
|
||||
|
||||
PagingMarker string `help:"marker for pagination"`
|
||||
}
|
||||
@@ -107,6 +110,12 @@ func doEventList(man modulebase.ResourceManager, s *mcclient.ClientSession, args
|
||||
if len(args.Scope) > 0 {
|
||||
params.Add(jsonutils.NewString(args.Scope), "scope")
|
||||
}
|
||||
if len(args.OwnerProjectIds) > 0 {
|
||||
params.Add(jsonutils.NewStringArray(args.OwnerProjectIds), "owner_project_ids")
|
||||
}
|
||||
if len(args.OwnerDomainIds) > 0 {
|
||||
params.Add(jsonutils.NewStringArray(args.OwnerDomainIds), "owner_domain_ids")
|
||||
}
|
||||
if len(args.PagingMarker) > 0 {
|
||||
params.Add(jsonutils.NewString(args.PagingMarker), "paging_marker")
|
||||
}
|
||||
|
||||
@@ -54,6 +54,7 @@ type ImageOptionalOptions struct {
|
||||
Hypervisor []string `help:"Prefer hypervisor type" choices:"kvm|esxi|baremetal|container|openstack|ctyun"`
|
||||
DiskDriver string `help:"Perfer disk driver" choices:"virtio|scsi|pvscsi|ide|sata"`
|
||||
NetDriver string `help:"Preferred network driver" choices:"virtio|e1000|vmxnet3"`
|
||||
DisableUsbKbd bool `help:"Disable usb keyboard on this image(for hypervisor kvm)"`
|
||||
}
|
||||
|
||||
func addImageOptionalOptions(s *mcclient.ClientSession, params *jsonutils.JSONDict, args ImageOptionalOptions) error {
|
||||
@@ -131,6 +132,9 @@ func addImageOptionalOptions(s *mcclient.ClientSession, params *jsonutils.JSONDi
|
||||
if len(args.Hypervisor) > 0 {
|
||||
params.Add(jsonutils.NewString(strings.Join(args.Hypervisor, ",")), "properties", "hypervisor")
|
||||
}
|
||||
if args.DisableUsbKbd {
|
||||
params.Add(jsonutils.NewString("true"), "properties", "disable_usb_kbd")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
8
go.mod
8
go.mod
@@ -131,13 +131,13 @@ require (
|
||||
k8s.io/cluster-bootstrap v0.17.3
|
||||
k8s.io/kubernetes v1.16.0
|
||||
yunion.io/x/executor v0.0.0-20200227030256-a18417815e74
|
||||
yunion.io/x/jsonutils v0.0.0-20200710080709-7ca71cdb9383
|
||||
yunion.io/x/jsonutils v0.0.0-20200814075449-927b118adbd8
|
||||
yunion.io/x/log v0.0.0-20200313080802-57a4ce5966b3
|
||||
yunion.io/x/ovsdb v0.0.0-20200526071744-27bf0940cbc7
|
||||
yunion.io/x/pkg v0.0.0-20200713121502-18154120c49b
|
||||
yunion.io/x/pkg v0.0.0-20200814072949-4f1b541857d6
|
||||
yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e
|
||||
yunion.io/x/sqlchemy v0.0.0-20200702064124-195445bc4b11
|
||||
yunion.io/x/structarg v0.0.0-20200708124353-ea9a441ecaf8
|
||||
yunion.io/x/sqlchemy v0.0.0-20200814052348-164f1f20f8a6
|
||||
yunion.io/x/structarg v0.0.0-20200720093445-9f850fa222ce
|
||||
)
|
||||
|
||||
replace (
|
||||
|
||||
18
go.sum
18
go.sum
@@ -1126,8 +1126,8 @@ vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj
|
||||
yunion.io/x/executor v0.0.0-20200227030256-a18417815e74 h1:A15C6VdVRWvmQ9pAJHrUs9yan5qKlYH7uaRxHg1kRbk=
|
||||
yunion.io/x/executor v0.0.0-20200227030256-a18417815e74/go.mod h1:Uxuou9WQIeJXNpy7t2fPLL0BYLvLiMvGQwY7Qc6aSws=
|
||||
yunion.io/x/jsonutils v0.0.0-20190625054549-a964e1e8a051/go.mod h1:4N0/RVzsYL3kH3WE/H1BjUQdFiWu50JGCFQuuy+Z634=
|
||||
yunion.io/x/jsonutils v0.0.0-20200710080709-7ca71cdb9383 h1:XEhTD+FGjBjEIWwcY0Ez1lY3oTTzjUOcRgH/i4eFM5A=
|
||||
yunion.io/x/jsonutils v0.0.0-20200710080709-7ca71cdb9383/go.mod h1:3U5hspYn9apQHaXKY+fJ4Qgwjey32Kc+Mq+mUe9NamQ=
|
||||
yunion.io/x/jsonutils v0.0.0-20200814075449-927b118adbd8 h1:KQVw5EmohJCqBDMdZ3fAcOQNNMIYgVuNCNWNwg4EM3A=
|
||||
yunion.io/x/jsonutils v0.0.0-20200814075449-927b118adbd8/go.mod h1:p0nyMqGA/apTxxyLIU/o1k4V7Vujl2O6ey30L594sYE=
|
||||
yunion.io/x/log v0.0.0-20190514041436-04ce53b17c6b/go.mod h1:+gauLs73omeJAPlsXcevLsJLKixV+sR/E7WSYTSx1fE=
|
||||
yunion.io/x/log v0.0.0-20190629062853-9f6483a7103d/go.mod h1:LC6f/4FozL0iaAbnFt2eDX9jlsyo3WiOUPm03d7+U4U=
|
||||
yunion.io/x/log v0.0.0-20200313080802-57a4ce5966b3 h1:5Wc5hkB8PtMudmHuzCyok960RuOa9I55imIGrigSdjs=
|
||||
@@ -1136,13 +1136,11 @@ yunion.io/x/ovsdb v0.0.0-20200526071744-27bf0940cbc7 h1:gjqNa2uQzIEXyySsbvVz0Ult
|
||||
yunion.io/x/ovsdb v0.0.0-20200526071744-27bf0940cbc7/go.mod h1:0vLkNEhlmA64HViPBAnSTUMrx5QP1CLsxXmxDKQ80tc=
|
||||
yunion.io/x/pkg v0.0.0-20190620104149-945c25821dbf/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
|
||||
yunion.io/x/pkg v0.0.0-20190628082551-f4033ba2ea30/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
|
||||
yunion.io/x/pkg v0.0.0-20200708071451-a663dc94e16b h1:wwPzH8iMRYjtaSM2pBN7nOqeZxR4XW5wdz2VE1KH/Ug=
|
||||
yunion.io/x/pkg v0.0.0-20200708071451-a663dc94e16b/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
|
||||
yunion.io/x/pkg v0.0.0-20200713121502-18154120c49b h1:Ov/eKwwNeQje7SggkopExzcCW/GfaUouvXkcY6RUEcM=
|
||||
yunion.io/x/pkg v0.0.0-20200713121502-18154120c49b/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
|
||||
yunion.io/x/pkg v0.0.0-20200814072949-4f1b541857d6 h1:UarEDTBGkgcgc+nc+PZ75uo9M9+jiOGd5P2B90TxDNw=
|
||||
yunion.io/x/pkg v0.0.0-20200814072949-4f1b541857d6/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
|
||||
yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e h1:v+EzIadodSwkdZ/7bremd7J8J50Cise/HCylsOJngmo=
|
||||
yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e/go.mod h1:0iFKpOs1y4lbCxeOmq3Xx/0AcQoewVPwj62eRluioEo=
|
||||
yunion.io/x/sqlchemy v0.0.0-20200702064124-195445bc4b11 h1:srrssomGJLh4OaDaY/1so+2FUBjZxdwQx/1pZ6403YU=
|
||||
yunion.io/x/sqlchemy v0.0.0-20200702064124-195445bc4b11/go.mod h1:FTdwPdGhMgh4E+UFXc9klI1Ok34fMuybTT+jLhOaIjI=
|
||||
yunion.io/x/structarg v0.0.0-20200708124353-ea9a441ecaf8 h1:35Q2ce/gI2cuVhsuLS7WsL2K9SxwMEtWTopt/99iYsk=
|
||||
yunion.io/x/structarg v0.0.0-20200708124353-ea9a441ecaf8/go.mod h1:EP6NSv2C0zzqBDTKumv8hPWLb3XvgMZDHQRfyuOrQng=
|
||||
yunion.io/x/sqlchemy v0.0.0-20200814052348-164f1f20f8a6 h1:k7E8Zjwzyk/lo1dDO0jtLbODwYRNv+w/zsUJrKWCXvo=
|
||||
yunion.io/x/sqlchemy v0.0.0-20200814052348-164f1f20f8a6/go.mod h1:FTdwPdGhMgh4E+UFXc9klI1Ok34fMuybTT+jLhOaIjI=
|
||||
yunion.io/x/structarg v0.0.0-20200720093445-9f850fa222ce h1:kU8xE7O5uZ1GSJVMZHoJ+jrNL7csUQHYGyAPW9QfNpE=
|
||||
yunion.io/x/structarg v0.0.0-20200720093445-9f850fa222ce/go.mod h1:EP6NSv2C0zzqBDTKumv8hPWLb3XvgMZDHQRfyuOrQng=
|
||||
|
||||
129
pkg/apigateway/handler/imageutils.go
Normal file
129
pkg/apigateway/handler/imageutils.go
Normal file
@@ -0,0 +1,129 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"mime/multipart"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/appsrv"
|
||||
"yunion.io/x/onecloud/pkg/httperrors"
|
||||
"yunion.io/x/onecloud/pkg/mcclient/auth"
|
||||
"yunion.io/x/onecloud/pkg/mcclient/modules"
|
||||
)
|
||||
|
||||
func readImageForm(r *multipart.Reader) (map[string]string, *multipart.Part, error) {
|
||||
params := make(map[string]string)
|
||||
|
||||
maxValueBytes := int64(10 << 20)
|
||||
for {
|
||||
p, err := r.NextPart()
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
name := p.FormName()
|
||||
if name == "" {
|
||||
continue
|
||||
}
|
||||
filename := p.FileName()
|
||||
|
||||
var b bytes.Buffer
|
||||
|
||||
_, hasContentTypeHeader := p.Header["Content-Type"]
|
||||
if !hasContentTypeHeader && filename == "" {
|
||||
// value, store as string in memory
|
||||
n, err := io.CopyN(&b, p, maxValueBytes+1)
|
||||
if err != nil && err != io.EOF {
|
||||
return nil, nil, err
|
||||
}
|
||||
maxValueBytes -= n
|
||||
if maxValueBytes < 0 {
|
||||
return nil, nil, multipart.ErrMessageTooLarge
|
||||
}
|
||||
params[name] = b.String()
|
||||
continue
|
||||
}
|
||||
|
||||
if name == "image" || name == "file" {
|
||||
return params, p, nil
|
||||
} else {
|
||||
return nil, nil, fmt.Errorf("no file uploaded")
|
||||
}
|
||||
}
|
||||
return nil, nil, fmt.Errorf("empty form")
|
||||
}
|
||||
|
||||
func imageUploadHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
reader, e := r.MultipartReader()
|
||||
if e != nil {
|
||||
httperrors.InvalidInputError(w, "无效的表单")
|
||||
return
|
||||
}
|
||||
|
||||
p, f, e := readImageForm(reader)
|
||||
if e != nil {
|
||||
httperrors.InvalidInputError(w, "无效的表单")
|
||||
return
|
||||
}
|
||||
|
||||
params := jsonutils.NewDict()
|
||||
|
||||
name, ok := p["name"]
|
||||
if !ok {
|
||||
httperrors.InvalidInputError(w, "缺少镜像名称")
|
||||
return
|
||||
}
|
||||
params.Add(jsonutils.NewString(name), "name")
|
||||
|
||||
_imageSize, ok := p["image_size"]
|
||||
if !ok {
|
||||
httperrors.InvalidInputError(w, "缺少文件信息")
|
||||
return
|
||||
}
|
||||
imageSize, e := strconv.ParseInt(_imageSize, 10, 64)
|
||||
if e != nil {
|
||||
httperrors.InvalidInputError(w, "文件信息错误")
|
||||
return
|
||||
}
|
||||
|
||||
// add all other params
|
||||
for k, v := range p {
|
||||
if k == "name" || k == "image_size" {
|
||||
continue
|
||||
}
|
||||
params.Add(jsonutils.NewString(v), k)
|
||||
}
|
||||
|
||||
token := AppContextToken(ctx)
|
||||
s := auth.GetSession(ctx, token, FetchRegion(r), "")
|
||||
|
||||
res, e := modules.Images.Upload(s, params, f, imageSize)
|
||||
if e != nil {
|
||||
httperrors.GeneralServerError(w, e)
|
||||
return
|
||||
} else {
|
||||
appsrv.SendJSON(w, res)
|
||||
}
|
||||
}
|
||||
|
||||
func uploadHandlerInfo(method, prefix string, handler func(context.Context, http.ResponseWriter, *http.Request)) *appsrv.SHandlerInfo {
|
||||
log.Debugf("%s - %s", method, prefix)
|
||||
hi := appsrv.SHandlerInfo{}
|
||||
hi.SetMethod(method)
|
||||
hi.SetPath(prefix)
|
||||
hi.SetHandler(handler)
|
||||
hi.SetProcessTimeout(6 * time.Hour)
|
||||
hi.SetWorkerManager(GetUploaderWorker())
|
||||
return &hi
|
||||
}
|
||||
@@ -20,6 +20,7 @@ import (
|
||||
"encoding/csv"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -90,6 +91,10 @@ func (h *MiscHandler) Bind(app *appsrv.Application) {
|
||||
app.AddHandler3(uploader)
|
||||
app.AddHandler(GET, prefix+"downloads/<template_id>", FetchAuthToken(h.getDownloadsHandler))
|
||||
app.AddHandler(POST, prefix+"piuploads", FetchAuthToken(h.postPIUploads)) // itsm process instances upload api
|
||||
imageUploader := uploadHandlerInfo("POST", prefix+"/imageutils/upload", FetchAuthToken(imageUploadHandler))
|
||||
app.AddHandler3(imageUploader)
|
||||
s3upload := uploadHandlerInfo(POST, prefix+"s3uploads", FetchAuthToken(h.postS3UploadHandler))
|
||||
app.AddHandler3(s3upload)
|
||||
}
|
||||
|
||||
func UploadHandlerInfo(method, prefix string, handler func(context.Context, http.ResponseWriter, *http.Request)) *appsrv.SHandlerInfo {
|
||||
@@ -509,6 +514,61 @@ func (mh *MiscHandler) postPIUploads(ctx context.Context, w http.ResponseWriter,
|
||||
appsrv.SendJSON(w, resp)
|
||||
}
|
||||
|
||||
func (mh *MiscHandler) postS3UploadHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
|
||||
reader, e := r.MultipartReader()
|
||||
if e != nil {
|
||||
log.Debugf("postS3UploadHandler.MultipartReader %s", e)
|
||||
httperrors.InvalidInputError(w, "invalid form")
|
||||
return
|
||||
}
|
||||
|
||||
p, f, e := readImageForm(reader)
|
||||
if e != nil {
|
||||
log.Debugf("postS3UploadHandler.readImageForm %s", e)
|
||||
httperrors.InvalidInputError(w, "invalid form")
|
||||
return
|
||||
}
|
||||
|
||||
bucket_id, ok := p["bucket_id"]
|
||||
if !ok {
|
||||
httperrors.MissingParameterError(w, "bucket_id")
|
||||
return
|
||||
}
|
||||
|
||||
key, ok := p["key"]
|
||||
if !ok {
|
||||
httperrors.MissingParameterError(w, "key")
|
||||
return
|
||||
}
|
||||
|
||||
_content_length, ok := p["content_length"]
|
||||
if !ok {
|
||||
httperrors.MissingParameterError(w, "content_length")
|
||||
return
|
||||
}
|
||||
|
||||
content_length, e := strconv.ParseInt(_content_length, 10, 64)
|
||||
if e != nil {
|
||||
httperrors.InvalidInputError(w, "invalid content_length %s", _content_length)
|
||||
return
|
||||
}
|
||||
|
||||
storage_class, _ := p["storage_class"]
|
||||
acl, _ := p["acl"]
|
||||
|
||||
token := AppContextToken(ctx)
|
||||
s := auth.GetSession(ctx, token, FetchRegion(r), "")
|
||||
|
||||
meta := http.Header{}
|
||||
meta.Set("Content-Type", "application/octet-stream")
|
||||
e = modules.Buckets.Upload(s, bucket_id, key, f, content_length, storage_class, acl, meta)
|
||||
if e != nil {
|
||||
httperrors.GeneralServerError(w, e)
|
||||
return
|
||||
}
|
||||
appsrv.SendJSON(w, jsonutils.NewDict())
|
||||
}
|
||||
|
||||
func writeCsv(records [][]string) (bytes.Buffer, error) {
|
||||
var content bytes.Buffer
|
||||
content.WriteString("\xEF\xBB\xBF") // 写入UTF-8 BOM, 防止office打开后中文乱码
|
||||
|
||||
@@ -57,7 +57,7 @@ type ProxySettingResourceInput struct {
|
||||
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
ProxySettingId string `json:"proxy_setting_id" "yunion:deprecated-by":"proxy_setting"`
|
||||
ProxySettingId string `json:"proxy_setting_id" yunion-deprecated-by:"proxy_setting"`
|
||||
}
|
||||
|
||||
type ProxySettingTestInput struct {
|
||||
|
||||
@@ -22,7 +22,7 @@ type CloudaccountResourceListInput struct {
|
||||
Provider []string `json:"provider"`
|
||||
|
||||
// swagger:ignore
|
||||
CloudaccountId string `json:"cloudaccount_id" "yunion:deprecated-by":"cloudaccount"`
|
||||
CloudaccountId string `json:"cloudaccount_id" yunion-deprecated-by:"cloudaccount"`
|
||||
}
|
||||
|
||||
type CloudproviderResourceListInput struct {
|
||||
@@ -30,7 +30,7 @@ type CloudproviderResourceListInput struct {
|
||||
Cloudprovider string `json:"cloudprovider"`
|
||||
|
||||
// swagger:ignore
|
||||
CloudproviderId string `json:"cloudprovider_id" "yunion:deprecated-by":"cloudprovider"`
|
||||
CloudproviderId string `json:"cloudprovider_id" yunion-deprecated-by:"cloudprovider"`
|
||||
}
|
||||
|
||||
type CloudaccountResourceDetails struct {
|
||||
|
||||
@@ -37,7 +37,7 @@ type CloudgroupJointsListInput struct {
|
||||
// 根据公有云用户组过滤资源
|
||||
Cloudgroup string `json:"cloudgroup"`
|
||||
// swagger:ignore
|
||||
CloudgroupId string `json:"cloudgroup_id" "yunion:deprecated-by":"cloudgroup"`
|
||||
CloudgroupId string `json:"cloudgroup_id" yunion-deprecated-by:"cloudgroup"`
|
||||
}
|
||||
|
||||
type CloudgroupJointBaseUpdateInput struct {
|
||||
|
||||
@@ -56,7 +56,7 @@ type CloudpolicyResourceListInput struct {
|
||||
Cloudpolicy string `json:"cloudpolicy"`
|
||||
|
||||
// swagger:ignore
|
||||
CloudpolicyId string `json:"cloudpolicy_id" "yunion:deprecated-by":"cloudpolicy"`
|
||||
CloudpolicyId string `json:"cloudpolicy_id" yunion-deprecated-by:"cloudpolicy"`
|
||||
}
|
||||
|
||||
type CloudpolicyResourceDetails struct {
|
||||
|
||||
@@ -162,7 +162,7 @@ type ClouduserResourceListInput struct {
|
||||
Clouduser string `json:"clouduser"`
|
||||
|
||||
// swagger:ignore
|
||||
ClouduserId string `json:"clouduser_id" "yunion:deprecated-by":"clouduser"`
|
||||
ClouduserId string `json:"clouduser_id" yunion-deprecated-by:"clouduser"`
|
||||
}
|
||||
|
||||
type ClouduserResourceDetails struct {
|
||||
|
||||
@@ -285,7 +285,7 @@ type ServerConfigs struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// alias for InstanceType
|
||||
Sku string `json:"sku" "yunion:deprecated-by":"instance_type"`
|
||||
Sku string `json:"sku" yunion-deprecated-by:"instance_type"`
|
||||
|
||||
// 虚拟机高可用(创建备机)
|
||||
// default: false
|
||||
@@ -359,7 +359,7 @@ type ServerCreateInput struct {
|
||||
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
KeypairId string `json:"keypair_id" "yunion:deprecated-by":"keypair"`
|
||||
KeypairId string `json:"keypair_id" yunion-deprecated-by:"keypair"`
|
||||
|
||||
// 秘钥对Id
|
||||
// required: false
|
||||
@@ -471,7 +471,8 @@ type ServerCreateInput struct {
|
||||
|
||||
// swagger:ignore
|
||||
OsType string `json:"os_type"`
|
||||
|
||||
// swagger:ignore
|
||||
DisableUsbKbd bool `json:"disable_usb_kbd"`
|
||||
// swagger:ignore
|
||||
OsProfile jsonutils.JSONObject `json:"__os_profile__"`
|
||||
// swagger:ignore
|
||||
|
||||
@@ -66,7 +66,7 @@ type CloudenvResourceListInput struct {
|
||||
Providers []string `json:"providers"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
Provider []string `json:"provider" "yunion:deprecated-by":"providers"`
|
||||
Provider []string `json:"provider" yunion-deprecated-by:"providers"`
|
||||
|
||||
// 列出指定云平台品牌的资源,一般来说brand和provider相同,除了以上支持的provider之外,还支持以下band
|
||||
//
|
||||
@@ -77,7 +77,7 @@ type CloudenvResourceListInput struct {
|
||||
Brands []string `json:"brands"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
Brand []string `json:"brand" "yunion:deprecated-by":"brands"`
|
||||
Brand []string `json:"brand" yunion-deprecated-by:"brands"`
|
||||
|
||||
// 列出指定云环境的资源,支持云环境如下:
|
||||
//
|
||||
@@ -227,7 +227,7 @@ type CloudaccountListInput struct {
|
||||
// 代理
|
||||
ProxySetting string `json:"proxy_setting"`
|
||||
// swagger:ignore
|
||||
ProxySettingId string `json:"proxy_setting_id" "yunion:deprecated-by":"proxy_setting"`
|
||||
ProxySettingId string `json:"proxy_setting_id" yunion-deprecated-by:"proxy_setting"`
|
||||
}
|
||||
|
||||
type ProviderProject struct {
|
||||
|
||||
@@ -147,15 +147,15 @@ type CloudproviderResourceInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
Manager string `json:"manager" "yunion:deprecated-by":"cloudprovider"`
|
||||
Manager string `json:"manager" yunion-deprecated-by:"cloudprovider"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
ManagerId string `json:"manager_id" "yunion:deprecated-by":"cloudprovider"`
|
||||
ManagerId string `json:"manager_id" yunion-deprecated-by:"cloudprovider"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
CloudproviderId string `json:"cloudprovider_id" "yunion:deprecated-by":"cloudprovider"`
|
||||
CloudproviderId string `json:"cloudprovider_id" yunion-deprecated-by:"cloudprovider"`
|
||||
}
|
||||
|
||||
type ManagedResourceListInput struct {
|
||||
@@ -169,15 +169,15 @@ type ManagedResourceListInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
CloudaccountId string `json:"cloudaccount_id" "yunion:deprecated-by":"cloudaccount"`
|
||||
CloudaccountId string `json:"cloudaccount_id" yunion-deprecated-by:"cloudaccount"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
Account string `json:"account" "yunion:deprecated-by":"cloudaccount"`
|
||||
Account string `json:"account" yunion-deprecated-by:"cloudaccount"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
AccountId string `json:"account_id" "yunion:deprecated-by":"cloudaccount"`
|
||||
AccountId string `json:"account_id" yunion-deprecated-by:"cloudaccount"`
|
||||
|
||||
// 过滤资源,是否为非OneCloud内置私有云管理的资源
|
||||
// default: false
|
||||
|
||||
@@ -180,7 +180,7 @@ type SDBInstanceRecoveryConfigInput struct {
|
||||
apis.Meta
|
||||
|
||||
// swagger:ignore
|
||||
DBInstancebackup string `json:"dbinstancebackup" "yunion:deprecated-by":"dbinstancebackup_id"`
|
||||
DBInstancebackup string `json:"dbinstancebackup" yunion-deprecated-by:"dbinstancebackup_id"`
|
||||
|
||||
// 备份Id
|
||||
//
|
||||
@@ -335,7 +335,7 @@ type DBInstanceResourceInput struct {
|
||||
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
DBInstanceId string `json:"dbinstance_id" "yunion:deprecated-by":"dbinstance"`
|
||||
DBInstanceId string `json:"dbinstance_id" yunion-deprecated-by:"dbinstance"`
|
||||
}
|
||||
|
||||
type DBInstanceFilterListInputBase struct {
|
||||
|
||||
@@ -88,7 +88,7 @@ type SnapshotPolicyResourceInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter disk by snapshotpolicy_id
|
||||
SnapshotpolicyId string `json:"snapshotpolicy_id" "yunion:deprecated-by":"snapshotpolicy"`
|
||||
SnapshotpolicyId string `json:"snapshotpolicy_id" yunion-deprecated-by:"snapshotpolicy"`
|
||||
}
|
||||
|
||||
type SnapshotPolicyFilterListInput struct {
|
||||
@@ -113,7 +113,7 @@ type DiskListInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by disk type
|
||||
Type string `json:"type" "yunion:deprecated-by":"disk_type"`
|
||||
Type string `json:"type" yunion-deprecated-by:"disk_type"`
|
||||
// 过滤指定disk_type的磁盘列表,可能的值为:sys, data, swap. volume
|
||||
//
|
||||
// | disk_type值 | 说明 |
|
||||
@@ -137,13 +137,13 @@ type DiskListInput struct {
|
||||
Template string `json:"template"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
TemplateId string `json:"template_id" "yunion:deprecated-by":"template"`
|
||||
TemplateId string `json:"template_id" yunion-deprecated-by:"template"`
|
||||
|
||||
// 快照
|
||||
Snapshot string `json:"snapshot"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
SnapshotId string `json:"snapshot_id" "yunion:deprecated-by":"snapshot"`
|
||||
SnapshotId string `json:"snapshot_id" yunion-deprecated-by:"snapshot"`
|
||||
}
|
||||
|
||||
type DiskResourceInput struct {
|
||||
@@ -152,7 +152,7 @@ type DiskResourceInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by disk_id
|
||||
DiskId string `json:"disk_id" "yunion:deprecated-by":"disk"`
|
||||
DiskId string `json:"disk_id" yunion-deprecated-by:"disk"`
|
||||
}
|
||||
|
||||
type DiskFilterListInputBase struct {
|
||||
|
||||
@@ -14,5 +14,11 @@
|
||||
|
||||
package compute
|
||||
|
||||
import "yunion.io/x/onecloud/pkg/apis"
|
||||
|
||||
type DnsRecordCreateInput struct {
|
||||
apis.AdminSharableVirtualResourceBaseCreateInput
|
||||
}
|
||||
|
||||
type DnsRecordUpdateInput struct {
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ type ELasticcacheResourceInput struct {
|
||||
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
ElasticcacheId string `json:"elasticcache_id" "yunion:deprecated-by":"elasticcache"`
|
||||
ElasticcacheId string `json:"elasticcache_id" yunion-deprecated-by:"elasticcache"`
|
||||
}
|
||||
|
||||
type ElasticcacheFilterListInput struct {
|
||||
|
||||
@@ -24,15 +24,15 @@ type CloudregionResourceInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
CloudregionId string `json:"cloudregion_id" "yunion:deprecated-by":"cloudregion"`
|
||||
CloudregionId string `json:"cloudregion_id" yunion-deprecated-by:"cloudregion"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
Region string `json:"region" "yunion:deprecated-by":"cloudregion"`
|
||||
Region string `json:"region" yunion-deprecated-by:"cloudregion"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// description: this param will be deprecate at 3.0
|
||||
RegionId string `json:"region_id" "yunion:deprecated-by":"cloudregion"`
|
||||
RegionId string `json:"region_id" yunion-deprecated-by:"cloudregion"`
|
||||
}
|
||||
|
||||
type RegionalFilterListInput struct {
|
||||
@@ -134,5 +134,5 @@ type ZoneResourceInput struct {
|
||||
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
ZoneId string `json:"zone_id" "yunion:deprecated-by":"zone"`
|
||||
ZoneId string `json:"zone_id" yunion-deprecated-by:"zone"`
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ type GlobalVpcResourceInput struct {
|
||||
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
GlobalvpcId string `json:"globalvpc_id" "yunion:deprecated-by":"globalvpc"`
|
||||
GlobalvpcId string `json:"globalvpc_id" yunion-deprecated-by:"globalvpc"`
|
||||
}
|
||||
|
||||
type GlobalVpcResourceListInput struct {
|
||||
|
||||
@@ -28,13 +28,13 @@ type ServerListInput struct {
|
||||
|
||||
HostFilterListInput
|
||||
|
||||
NetworkFilterListInput `"yunion:ambiguous-prefix":"vpc_"`
|
||||
NetworkFilterListInput `yunion-ambiguous-prefix:"vpc_"`
|
||||
|
||||
billing.BillingResourceListInput
|
||||
|
||||
GroupFilterListInput
|
||||
SecgroupFilterListInput
|
||||
//DiskFilterListInput `"yunion:ambiguous-prefix":"storage_"`
|
||||
//DiskFilterListInput `yunion-ambiguous-prefix:"storage_"`
|
||||
ScalingGroupFilterListInput
|
||||
|
||||
// 只列出裸金属主机
|
||||
@@ -64,7 +64,7 @@ type ServerListInput struct {
|
||||
// 列出可以挂载磁盘的主机
|
||||
AttachableServersForDisk string `json:"attachable_servers_for_disk"`
|
||||
// Deprecated:列出可以挂载磁盘的主机
|
||||
Disk string `json:"disk" "yunion:deprecated-by":"attachable_servers_for_disk"`
|
||||
Disk string `json:"disk" yunion-deprecated-by:"attachable_servers_for_disk"`
|
||||
|
||||
// 按主机资源类型进行排序
|
||||
// enum: shared,prepaid,dedicated
|
||||
@@ -285,15 +285,15 @@ type ServerResourceInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// Filter by guest Id
|
||||
ServerId string `json:"server_id" "yunion:deprecated-by":"server"`
|
||||
ServerId string `json:"server_id" yunion-deprecated-by:"server"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// Filter by guest Id
|
||||
Guest string `json:"guest" "yunion:deprecated-by":"server"`
|
||||
Guest string `json:"guest" yunion-deprecated-by:"server"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// Filter by guest Id
|
||||
GuestId string `json:"guest_id" "yunion:deprecated-by":"server"`
|
||||
GuestId string `json:"guest_id" yunion-deprecated-by:"server"`
|
||||
}
|
||||
|
||||
type ServerFilterListInput struct {
|
||||
|
||||
@@ -141,7 +141,7 @@ type HostDetails struct {
|
||||
NonsystemGuests int `json:"nonsystem_guests"`
|
||||
// 运行中云主机数量
|
||||
// example: 2
|
||||
RunningGuests int `json:"running_geusts"`
|
||||
RunningGuests int `json:"running_guests"`
|
||||
// CPU超分率
|
||||
CpuCommitRate float64 `json:"cpu_commit_rate"`
|
||||
// 内存超分率
|
||||
@@ -232,7 +232,7 @@ type HostResourceInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by host_id
|
||||
HostId string `json:"host_id" "yunion:deprecated-by":"host"`
|
||||
HostId string `json:"host_id" yunion-deprecated-by:"host"`
|
||||
}
|
||||
|
||||
type HostRegisterMetadata struct {
|
||||
|
||||
@@ -21,7 +21,7 @@ type HostJointResourceDetailsBase struct {
|
||||
Host string `json:"host"`
|
||||
// 裸金属服务器名称
|
||||
// Deprecated
|
||||
Baremetal string `json:"baremetal" "yunion:deprecated-by":"host"`
|
||||
Baremetal string `json:"baremetal" yunion-deprecated-by:"host"`
|
||||
}
|
||||
|
||||
type HostJointResourceDetails struct {
|
||||
|
||||
@@ -144,7 +144,7 @@ type GuestTemplateFilterListInput struct {
|
||||
GuestTemplate string `json:"guest_template"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
GuestTemplateId string `json:"guest_template_id" "yunion:deprecated-by":"guest_template"`
|
||||
GuestTemplateId string `json:"guest_template_id" yunion-deprecated-by:"guest_template"`
|
||||
}
|
||||
|
||||
type ServiceCatalogListInput struct {
|
||||
|
||||
@@ -50,7 +50,7 @@ type GroupResourceInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// Filter by instance group Id
|
||||
GroupId string `json:"group_id" "yunion:deprecated-by":"group"`
|
||||
GroupId string `json:"group_id" yunion-deprecated-by:"group"`
|
||||
}
|
||||
|
||||
type GroupFilterListInput struct {
|
||||
|
||||
@@ -210,7 +210,7 @@ type LoadbalancerResourceInput struct {
|
||||
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
LoadbalancerId string `json:"loadbalancer_id" "yunion:deprecated-by":"loadbalancer"`
|
||||
LoadbalancerId string `json:"loadbalancer_id" yunion-deprecated-by:"loadbalancer"`
|
||||
}
|
||||
|
||||
type LoadbalancerFilterListInput struct {
|
||||
|
||||
@@ -35,7 +35,7 @@ type LoadbalancerAclResourceInput struct {
|
||||
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
Acl string `json:"acl" "yunion:deprecated-by":"acl_id"`
|
||||
Acl string `json:"acl" yunion-deprecated-by:"acl_id"`
|
||||
}
|
||||
|
||||
type LoadbalancerAclFilterListInput struct {
|
||||
|
||||
@@ -39,7 +39,7 @@ type LoadbalancerBackendGroupResourceInput struct {
|
||||
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
BackendGroupId string `json:"backend_group_id" "yunion:deprecated-by":"backend_group"`
|
||||
BackendGroupId string `json:"backend_group_id" yunion-deprecated-by:"backend_group"`
|
||||
}
|
||||
|
||||
type LoadbalancerBackendGroupFilterListInput struct {
|
||||
|
||||
@@ -32,7 +32,7 @@ type LoadbalancerCertificateResourceInput struct {
|
||||
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
CertificateId string `json:"certificate_id" "yunion:deprecated-by":"certificate"`
|
||||
CertificateId string `json:"certificate_id" yunion-deprecated-by:"certificate"`
|
||||
}
|
||||
|
||||
type LoadbalancerCertificateFilterListInput struct {
|
||||
|
||||
@@ -45,7 +45,7 @@ type LoadbalancerClusterResourceInput struct {
|
||||
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
ClusterId string `json:"cluster_id" "yunion:deprecated-by":"cluster"`
|
||||
ClusterId string `json:"cluster_id" yunion-deprecated-by:"cluster"`
|
||||
}
|
||||
|
||||
type LoadbalancerClusterFilterListInput struct {
|
||||
|
||||
@@ -46,7 +46,7 @@ type LoadbalancerListenerResourceInput struct {
|
||||
// 负载均衡监听器ID
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
ListenerId string `json:"listener_id" "yunion:deprecated-by":"listener"`
|
||||
ListenerId string `json:"listener_id" yunion-deprecated-by:"listener"`
|
||||
}
|
||||
|
||||
type LoadbalancerListenerFilterListInput struct {
|
||||
|
||||
@@ -89,7 +89,7 @@ type NatGatewayResourceInput struct {
|
||||
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
NatgatewayId string `json:"natgateway_id" "yunion:deprecated-by":"natgateway"`
|
||||
NatgatewayId string `json:"natgateway_id" yunion-deprecated-by:"natgateway"`
|
||||
}
|
||||
|
||||
type NatGatewayFilterListInput struct {
|
||||
|
||||
@@ -24,7 +24,7 @@ type WireResourceInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// fitler by wire id
|
||||
WireId string `json:"wire_id" "yunion:deprecated-by":"wire"`
|
||||
WireId string `json:"wire_id" yunion-deprecated-by:"wire"`
|
||||
}
|
||||
|
||||
type WireFilterListBase struct {
|
||||
@@ -47,7 +47,7 @@ type NetworkResourceInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by networkId
|
||||
NetworkId string `json:"network_id" "yunion:deprecated-by":"network"`
|
||||
NetworkId string `json:"network_id" yunion-deprecated-by:"network"`
|
||||
}
|
||||
|
||||
type NetworkFilterListBase struct {
|
||||
|
||||
@@ -45,7 +45,7 @@ type SchedtagResourceInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by schedtag_id
|
||||
SchedtagId string `json:"schedtag_id" "yunion:deprecated-by":"schedtag"`
|
||||
SchedtagId string `json:"schedtag_id" yunion-deprecated-by:"schedtag"`
|
||||
}
|
||||
|
||||
type SchedtagFilterListInput struct {
|
||||
@@ -69,7 +69,7 @@ type SchedtagListInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by type, alias for resource_type
|
||||
Type string `json:"type" "yunion:deprecated-by":"resource_type"`
|
||||
Type string `json:"type" yunion-deprecated-by:"resource_type"`
|
||||
|
||||
DefaultStrategy []string `json:"default_strategy"`
|
||||
}
|
||||
|
||||
@@ -194,7 +194,7 @@ type SecgroupResourceInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by secgroup_id
|
||||
SecgroupId string `json:"secgroup_id" "yunion:deprecated-by":"secgroup"`
|
||||
SecgroupId string `json:"secgroup_id" yunion-deprecated-by:"secgroup"`
|
||||
|
||||
// 模糊匹配安全组规则名称
|
||||
SecgroupName string `json:"secgroup_name"`
|
||||
|
||||
@@ -144,7 +144,7 @@ type StorageResourceInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by storage_id
|
||||
StorageId string `json:"storage_id" "yunion:deprecated-by":"storage"`
|
||||
StorageId string `json:"storage_id" yunion-deprecated-by:"storage"`
|
||||
}
|
||||
|
||||
type StorageFilterListInputBase struct {
|
||||
|
||||
@@ -48,13 +48,13 @@ type StoragecachedimageListInput struct {
|
||||
Storagecache string `json:"storagecache"`
|
||||
// Deprecated
|
||||
// swagger:ignore
|
||||
StoragecacheId string `json:"storagecache_id" "yunion:deprecated-by":"storagecache"`
|
||||
StoragecacheId string `json:"storagecache_id" yunion-deprecated-by:"storagecache"`
|
||||
|
||||
// 以镜像缓存过滤
|
||||
Cachedimage string `json:"cachedimage"`
|
||||
// Deprecated
|
||||
// swagger:ignore
|
||||
CachedimageId string `json:"cachedimage_id" "yunion:deprecated-by":"cachedimage"`
|
||||
CachedimageId string `json:"cachedimage_id" yunion-deprecated-by:"cachedimage"`
|
||||
|
||||
// 镜像状态
|
||||
Status []string `json:"status"`
|
||||
|
||||
@@ -90,7 +90,7 @@ type VpcResourceInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by vpc Id
|
||||
VpcId string `json:"vpc_id" "yunion:deprecated-by":"vpc"`
|
||||
VpcId string `json:"vpc_id" yunion-deprecated-by:"vpc"`
|
||||
|
||||
// Vpc外网访问模式
|
||||
ExternalAccessMode string `json:"external_access_mode"`
|
||||
|
||||
@@ -32,6 +32,34 @@ var (
|
||||
}
|
||||
)
|
||||
|
||||
const (
|
||||
sVpcInterCidr = "100.65.0.0/17"
|
||||
sVpcInterExtCidr = "100.65.0.0/30"
|
||||
VpcInterExtMask = 30
|
||||
sVpcInterExtIP1 = "100.65.0.1"
|
||||
sVpcInterExtIP2 = "100.65.0.2"
|
||||
VpcInterExtMac1 = "ee:ee:ee:ee:ee:f0"
|
||||
VpcInterExtMac2 = "ee:ee:ee:ee:ee:f1"
|
||||
)
|
||||
|
||||
var (
|
||||
vpcInterCidr netutils.IPV4Prefix
|
||||
vpcInterExtIP1 netutils.IPV4Addr
|
||||
vpcInterExtIP2 netutils.IPV4Addr
|
||||
)
|
||||
|
||||
func VpcInterCidr() netutils.IPV4Prefix {
|
||||
return vpcInterCidr
|
||||
}
|
||||
|
||||
func VpcInterExtIP1() netutils.IPV4Addr {
|
||||
return vpcInterExtIP1
|
||||
}
|
||||
|
||||
func VpcInterExtIP2() netutils.IPV4Addr {
|
||||
return vpcInterExtIP2
|
||||
}
|
||||
|
||||
const (
|
||||
sVpcMappedCidr = "100.64.0.0/17"
|
||||
VpcMappedIPMask = 17
|
||||
@@ -92,6 +120,10 @@ func init() {
|
||||
return v
|
||||
}
|
||||
|
||||
vpcInterCidr = mp(netutils.NewIPV4Prefix(sVpcInterCidr))
|
||||
vpcInterExtIP1 = mi(netutils.NewIPV4Addr(sVpcInterExtIP1))
|
||||
vpcInterExtIP2 = mi(netutils.NewIPV4Addr(sVpcInterExtIP2))
|
||||
|
||||
vpcMappedCidr = mp(netutils.NewIPV4Prefix(sVpcMappedCidr))
|
||||
vpcMappedGatewayIP = mi(netutils.NewIPV4Addr(sVpcMappedGatewayIP))
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ type IdentityProviderCreateInput struct {
|
||||
TargetDomain string `json:"target_domain"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
TargetDomainId string `json:"target_domain_id" "yunion:deprecated-by":"target_domain"`
|
||||
TargetDomainId string `json:"target_domain_id" yunion-deprecated-by:"target_domain"`
|
||||
|
||||
// 新建域的时候是否自动新建第一个项目
|
||||
AutoCreateProject *bool `json:"auto_create_project"`
|
||||
|
||||
@@ -49,22 +49,22 @@ type ProjectFilterListInput struct {
|
||||
ProjectDomain string `json:"project_domain"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
ProjectDomainId string `json:"project_domain_id" "yunion:deprecated-by":"project-domain"`
|
||||
ProjectDomainId string `json:"project_domain_id" yunion-deprecated-by:"project-domain"`
|
||||
|
||||
// 以项目(ID或Name)过滤列表结果
|
||||
Project string `json:"project"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by project_id
|
||||
ProjectId string `json:"project_id" "yunion:deprecated-by":"project"`
|
||||
ProjectId string `json:"project_id" yunion-deprecated-by:"project"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by tenant
|
||||
Tenant string `json:"tenant" "yunion:deprecated-by":"project"`
|
||||
Tenant string `json:"tenant" yunion-deprecated-by:"project"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by tenant_id
|
||||
TenantId string `json:"tenant_id" "yunion:deprecated-by":"project"`
|
||||
TenantId string `json:"tenant_id" yunion-deprecated-by:"project"`
|
||||
}
|
||||
|
||||
type UserFilterListInput struct {
|
||||
@@ -79,7 +79,7 @@ type UserFilterListInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by user_id
|
||||
UserId string `json:"user_id" "yunion:deprecated-by":"user"`
|
||||
UserId string `json:"user_id" yunion-deprecated-by:"user"`
|
||||
}
|
||||
|
||||
type GroupFilterListInput struct {
|
||||
@@ -94,7 +94,7 @@ type GroupFilterListInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by group_id
|
||||
GroupId string `json:"group_id" "yunion:deprecated-by":"group"`
|
||||
GroupId string `json:"group_id" yunion-deprecated-by:"group"`
|
||||
}
|
||||
|
||||
type RoleFilterListInput struct {
|
||||
@@ -109,7 +109,7 @@ type RoleFilterListInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by role_id
|
||||
RoleId string `json:"role_id" "yunion:deprecated-by":"role"`
|
||||
RoleId string `json:"role_id" yunion-deprecated-by:"role"`
|
||||
}
|
||||
|
||||
type ServiceFilterListInput struct {
|
||||
@@ -121,7 +121,7 @@ type ServiceFilterListInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// filter by service_id
|
||||
ServiceId string `json:"service_id" "yunion:deprecated-by":"service"`
|
||||
ServiceId string `json:"service_id" yunion-deprecated-by:"service"`
|
||||
|
||||
// 以服务名称排序
|
||||
OrderByService string `json:"order_by_service"`
|
||||
@@ -325,7 +325,7 @@ type RegionFilterListInput struct {
|
||||
Region string `json:"region"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
RegionId string `json:"region_id" "yunion:deprecated-by":"region"`
|
||||
RegionId string `json:"region_id" yunion-deprecated-by:"region"`
|
||||
}
|
||||
|
||||
type RegionListInput struct {
|
||||
|
||||
@@ -50,6 +50,7 @@ const (
|
||||
IMAGE_IS_READONLY = "is_readonly"
|
||||
IMAGE_PARTITION_TYPE = "partition_type"
|
||||
IMAGE_INSTALLED_CLOUDINIT = "installed_cloud_init"
|
||||
IMAGE_DISABLE_USB_KBD = "disable_usb_kbd"
|
||||
|
||||
IMAGE_STATUS_UPDATING = "updating"
|
||||
)
|
||||
|
||||
@@ -21,15 +21,15 @@ type DomainizedResourceInput struct {
|
||||
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
Domain string `json:"domain" "yunion:deprecated-by":"project_domain"`
|
||||
Domain string `json:"domain" yunion-deprecated-by:"project_domain"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// Project domain Id filter, alias for project_domain
|
||||
ProjectDomainId string `json:"project_domain_id" "yunion:deprecated-by":"project_domain"`
|
||||
ProjectDomainId string `json:"project_domain_id" yunion-deprecated-by:"project_domain"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// Domain Id filter, alias for project_domain
|
||||
DomainId string `json:"domain_id" "yunion:deprecated-by":"project_domain"`
|
||||
DomainId string `json:"domain_id" yunion-deprecated-by:"project_domain"`
|
||||
}
|
||||
|
||||
type ProjectizedResourceInput struct {
|
||||
@@ -39,15 +39,15 @@ type ProjectizedResourceInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// Filter by project_id, alias for project
|
||||
ProjectId string `json:"project_id" "yunion:deprecated-by":"project"`
|
||||
ProjectId string `json:"project_id" yunion-deprecated-by:"project"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// Filter by tenant ID or Name, alias for project
|
||||
Tenant string `json:"tenant" "yunion:deprecated-by":"project"`
|
||||
Tenant string `json:"tenant" yunion-deprecated-by:"project"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// Filter by tenant_id, alias for project
|
||||
TenantId string `json:"tenant_id" "yunion:deprecated-by":"project"`
|
||||
TenantId string `json:"tenant_id" yunion-deprecated-by:"project"`
|
||||
}
|
||||
|
||||
type DomainizedResourceCreateInput struct {
|
||||
@@ -75,6 +75,13 @@ type SharableVirtualResourceCreateInput struct {
|
||||
SharableResourceBaseCreateInput
|
||||
}
|
||||
|
||||
type AdminSharableVirtualResourceBaseCreateInput struct {
|
||||
SharableVirtualResourceCreateInput
|
||||
|
||||
// 记录
|
||||
Records string `json:"records"`
|
||||
}
|
||||
|
||||
type StatusDomainLevelUserResourceCreateInput struct {
|
||||
StatusDomainLevelResourceCreateInput
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ type ProjectizedResourceListInput struct {
|
||||
OrderByProject string `json:"order_by_project"`
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
OrderByTenant string `json:"order_by_tenant" "yunion:deprecated-by":"order_by_project"`
|
||||
OrderByTenant string `json:"order_by_tenant" yunion-deprecated-by:"order_by_project"`
|
||||
}
|
||||
|
||||
type StatusDomainLevelUserResourceListInput struct {
|
||||
@@ -61,7 +61,7 @@ type StatusDomainLevelUserResourceListInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// Filter by userId
|
||||
UserId string `json:"user_id" "yunion:deprecated-by":"user"`
|
||||
UserId string `json:"user_id" yunion-deprecated-by:"user"`
|
||||
}
|
||||
|
||||
type UserResourceListInput struct {
|
||||
@@ -78,7 +78,7 @@ type UserResourceListInput struct {
|
||||
// swagger:ignore
|
||||
// Deprecated
|
||||
// Filter by userId
|
||||
UserId string `json:"user_id" "yunion:deprecated-by":"user"`
|
||||
UserId string `json:"user_id" yunion-deprecated-by:"user"`
|
||||
}
|
||||
|
||||
type ModelBaseListInput struct {
|
||||
|
||||
@@ -155,11 +155,11 @@ type ProjectizedResourceInfo struct {
|
||||
|
||||
// 资源归属项目的ID(向后兼容别名)
|
||||
// Deprecated
|
||||
TenantId string `json:"project_id" "yunion:deprecated-by":"tenant_id"`
|
||||
TenantId string `json:"project_id" yunion-deprecated-by:"tenant_id"`
|
||||
|
||||
// 资源归属项目的名称(向后兼容别名)
|
||||
// Deprecated
|
||||
Tenant string `json:"project" "yunion:deprecated-by":"tenant"`
|
||||
Tenant string `json:"project" yunion-deprecated-by:"tenant"`
|
||||
}
|
||||
|
||||
type ScopedResourceBaseInfo struct {
|
||||
|
||||
@@ -28,14 +28,14 @@ type ParameterListInput struct {
|
||||
|
||||
// Deprecated
|
||||
// swagger:ignore
|
||||
ServiceId string `json:"service_id" "yunion:deprecated-by":"service"`
|
||||
ServiceId string `json:"service_id" yunion-deprecated-by:"service"`
|
||||
|
||||
// 用户名称或ID
|
||||
User string `json:"user"`
|
||||
|
||||
// Deprecated
|
||||
// swagger:ignore
|
||||
UserId string `json:"user_id" "yunion:deprecated-by":"user"`
|
||||
UserId string `json:"user_id" yunion-deprecated-by:"user"`
|
||||
|
||||
// filter by name
|
||||
Name []string `json:"name"`
|
||||
|
||||
@@ -51,7 +51,22 @@ func (manager *SAdminSharableVirtualResourceBaseManager) GetIAdminSharableVirtua
|
||||
return manager.GetVirtualObject().(IAdminSharableVirtualModelManager)
|
||||
}
|
||||
|
||||
func (manager *SAdminSharableVirtualResourceBaseManager) ValidateCreateData(man IAdminSharableVirtualModelManager, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
|
||||
func (manager *SAdminSharableVirtualResourceBaseManager) ValidateCreateData(
|
||||
ctx context.Context,
|
||||
userCred mcclient.TokenCredential,
|
||||
ownerId mcclient.IIdentityProvider,
|
||||
query jsonutils.JSONObject,
|
||||
input apis.AdminSharableVirtualResourceBaseCreateInput,
|
||||
) (apis.AdminSharableVirtualResourceBaseCreateInput, error) {
|
||||
var err error
|
||||
input.SharableVirtualResourceCreateInput, err = manager.SSharableVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input.SharableVirtualResourceCreateInput)
|
||||
if err != nil {
|
||||
return input, errors.Wrap(err, "SSharableVirtualResourceBaseManager.ValidateCreateData")
|
||||
}
|
||||
return input, nil
|
||||
}
|
||||
|
||||
func (manager *SAdminSharableVirtualResourceBaseManager) ValidateRecordsData(man IAdminSharableVirtualModelManager, data *jsonutils.JSONDict) (*jsonutils.JSONDict, error) {
|
||||
records, err := man.ParseInputInfo(data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -16,6 +16,7 @@ package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -464,28 +465,7 @@ func (manager *SOpsLogManager) ListItemFilter(
|
||||
userCred mcclient.TokenCredential,
|
||||
query jsonutils.JSONObject,
|
||||
) (*sqlchemy.SQuery, error) {
|
||||
/*userStrs := jsonutils.GetQueryStringArray(query, "user")
|
||||
if len(userStrs) > 0 {
|
||||
for i := range userStrs {
|
||||
usrObj, err := DefaultUserFetcher(ctx, userStrs[i])
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, httperrors.NewResourceNotFoundError2("user", userStrs[i])
|
||||
} else if err == sqlchemy.ErrDuplicateEntry {
|
||||
return nil, httperrors.NewDuplicateNameError("user", userStrs[i])
|
||||
} else {
|
||||
return nil, httperrors.NewGeneralError(err)
|
||||
}
|
||||
}
|
||||
userStrs[i] = usrObj.GetId()
|
||||
}
|
||||
if len(userStrs) == 1 {
|
||||
q = q.Filter(sqlchemy.Equals(q.Field("user_id"), userStrs[0]))
|
||||
} else {
|
||||
q = q.Filter(sqlchemy.In(q.Field("user_id"), userStrs))
|
||||
}
|
||||
}
|
||||
projStrs := jsonutils.GetQueryStringArray(query, "project")
|
||||
projStrs := jsonutils.GetQueryStringArray(query, "owner_project_ids")
|
||||
if len(projStrs) > 0 {
|
||||
for i := range projStrs {
|
||||
projObj, err := DefaultProjectFetcher(ctx, projStrs[i])
|
||||
@@ -498,12 +478,23 @@ func (manager *SOpsLogManager) ListItemFilter(
|
||||
}
|
||||
projStrs[i] = projObj.GetId()
|
||||
}
|
||||
if len(projStrs) == 1 {
|
||||
q = q.Filter(sqlchemy.Equals(q.Field("owner_tenant_id"), projStrs[0]))
|
||||
} else {
|
||||
q = q.Filter(sqlchemy.In(q.Field("owner_tenant_id"), projStrs))
|
||||
q = q.Filter(sqlchemy.In(q.Field("owner_tenant_id"), projStrs))
|
||||
}
|
||||
domainStrs := jsonutils.GetQueryStringArray(query, "owner_domain_ids")
|
||||
if len(domainStrs) > 0 {
|
||||
for i := range domainStrs {
|
||||
domainObj, err := DefaultDomainFetcher(ctx, domainStrs[i])
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return nil, httperrors.NewResourceNotFoundError2("domain", domainStrs[i])
|
||||
} else {
|
||||
return nil, httperrors.NewGeneralError(err)
|
||||
}
|
||||
}
|
||||
domainStrs[i] = domainObj.GetId()
|
||||
}
|
||||
}*/
|
||||
q = q.Filter(sqlchemy.In(q.Field("owner_domain_id"), domainStrs))
|
||||
}
|
||||
objTypes := jsonutils.GetQueryStringArray(query, "obj_type")
|
||||
if len(objTypes) > 0 {
|
||||
if len(objTypes) == 1 {
|
||||
|
||||
@@ -43,7 +43,7 @@ func isObjectRbacAllowed(model IModel, userCred mcclient.TokenCredential, action
|
||||
case rbacutils.ScopeSystem:
|
||||
requireScope = rbacutils.ScopeSystem
|
||||
case rbacutils.ScopeDomain:
|
||||
if ownerId != nil && objOwnerId != nil && (ownerId.GetUserId() == objOwnerId.GetUserId()) {
|
||||
if ownerId != nil && objOwnerId != nil && (ownerId.GetUserId() == objOwnerId.GetUserId() && action == policy.PolicyActionGet) {
|
||||
requireScope = rbacutils.ScopeUser
|
||||
} else if ownerId != nil && objOwnerId != nil && (ownerId.GetProjectDomainId() == objOwnerId.GetProjectDomainId() || objOwnerId.GetProjectDomainId() == "" || (model.IsSharable(ownerId) && action == policy.PolicyActionGet)) {
|
||||
requireScope = rbacutils.ScopeDomain
|
||||
|
||||
@@ -615,20 +615,6 @@ func getNetworkCountByFilter(region *SCloudregion, zone *SZone, domainId string,
|
||||
region = zone.GetRegion()
|
||||
}
|
||||
|
||||
/*vpcQuery := VpcManager.Query()
|
||||
if len(domainId) > 0 {
|
||||
ownerId := &db.SOwnerId{DomainId: domainId}
|
||||
vpcQuery = VpcManager.FilterByOwner(vpcQuery, ownerId, rbacutils.ScopeDomain)
|
||||
}
|
||||
vpcs := vpcQuery.SubQuery()*/
|
||||
|
||||
wireQuery := WireManager.Query().Equals("vpc_id", api.DEFAULT_VPC_ID)
|
||||
if len(domainId) > 0 {
|
||||
ownerId := &db.SOwnerId{DomainId: domainId}
|
||||
wireQuery = WireManager.FilterByOwner(wireQuery, ownerId, rbacutils.ScopeDomain)
|
||||
}
|
||||
wires := wireQuery.SubQuery()
|
||||
|
||||
networks := NetworkManager.Query().SubQuery()
|
||||
|
||||
q := networks.Query()
|
||||
@@ -639,9 +625,11 @@ func getNetworkCountByFilter(region *SCloudregion, zone *SZone, domainId string,
|
||||
q = q.IsFalse("is_public")
|
||||
}
|
||||
}
|
||||
q = q.Join(wires, sqlchemy.Equals(networks.Field("wire_id"), wires.Field("id")))
|
||||
|
||||
if region != nil {
|
||||
if zone != nil && !utils.IsInStringArray(region.Provider, api.REGIONAL_NETWORK_PROVIDERS) {
|
||||
wires := WireManager.Query("id").Equals("zone_id", zone.Id)
|
||||
q = q.In("wire_id", wires.SubQuery())
|
||||
} else if region != nil {
|
||||
if utils.IsInStringArray(region.Provider, api.REGIONAL_NETWORK_PROVIDERS) {
|
||||
wires := WireManager.Query().SubQuery()
|
||||
vpcs := VpcManager.Query().SubQuery()
|
||||
@@ -651,28 +639,14 @@ func getNetworkCountByFilter(region *SCloudregion, zone *SZone, domainId string,
|
||||
q = q.Filter(sqlchemy.In(q.Field("wire_id"), subq))
|
||||
} else {
|
||||
subq := getRegionZoneSubq(region)
|
||||
q = q.Filter(sqlchemy.In(wires.Field("zone_id"), subq))
|
||||
wires := WireManager.Query("id").In("zone_id", subq)
|
||||
q = q.In("wire_id", wires.SubQuery())
|
||||
}
|
||||
}
|
||||
if zone != nil && !utils.IsInStringArray(region.Provider, api.REGIONAL_NETWORK_PROVIDERS) {
|
||||
q = q.Filter(sqlchemy.Equals(wires.Field("zone_id"), zone.Id))
|
||||
}
|
||||
|
||||
if len(domainId) > 0 {
|
||||
ownerId := &db.SOwnerId{DomainId: domainId}
|
||||
q = NetworkManager.FilterByOwner(q, ownerId, rbacutils.ScopeDomain)
|
||||
/*subq := getDomainManagerSubq(domainId)
|
||||
q = q.Join(vpcs, sqlchemy.Equals(wires.Field("vpc_id"), vpcs.Field("id")))
|
||||
q = q.Filter(sqlchemy.OR(
|
||||
sqlchemy.In(vpcs.Field("manager_id"), subq),
|
||||
sqlchemy.IsNullOrEmpty(vpcs.Field("manager_id")),
|
||||
))
|
||||
if isPublic.Bool() {
|
||||
q = q.Filter(sqlchemy.OR(
|
||||
sqlchemy.Equals(q.Field("public_scope"), rbacutils.ScopeSystem),
|
||||
sqlchemy.AND(
|
||||
sqlchemy.Equals(q.Field("public_scope"), rbacutils.ScopeDomain),
|
||||
sqlchemy.Equals(q.Field("domain_id"), domainId))))
|
||||
}*/
|
||||
}
|
||||
if len(serverType) > 0 {
|
||||
q = q.Filter(sqlchemy.Equals(networks.Field("server_type"), serverType))
|
||||
|
||||
@@ -650,15 +650,19 @@ func (manager *SCloudaccountManager) fetchEsxiZoneIds() ([]string, error) {
|
||||
// The suggested network mask is 24 and the gateway is x.x.x.1.
|
||||
// The suggests network is the smallest network segment that meets the above conditions.
|
||||
func (manager *SCloudaccountManager) suggestHostNetworks(ips []netutils.IPV4Addr) []api.CASimpleNetConf {
|
||||
if len(ips) == 0 {
|
||||
return nil
|
||||
}
|
||||
sort.Slice(ips, func(i, j int) bool {
|
||||
return ips[i] < ips[j]
|
||||
})
|
||||
var (
|
||||
mask int8 = 24
|
||||
consequent []netutils.IPV4Addr
|
||||
ret []api.CASimpleNetConf
|
||||
mask int8 = 24
|
||||
lastnetAddr netutils.IPV4Addr
|
||||
consequent []netutils.IPV4Addr
|
||||
ret []api.CASimpleNetConf
|
||||
)
|
||||
lastnetAddr, _ := netutils.NewIPV4Addr("0.0.0.0")
|
||||
lastnetAddr = ips[0].NetAddr(mask)
|
||||
consequent = []netutils.IPV4Addr{ips[0]}
|
||||
for i := 1; i < len(ips); i++ {
|
||||
ip := ips[i]
|
||||
@@ -819,7 +823,7 @@ func (manager *SCloudaccountManager) ValidateCreateData(
|
||||
input.AutoCreateProject = &forceAutoCreateProject
|
||||
}
|
||||
|
||||
if len(input.ProjectId) > 0 {
|
||||
if len(input.Project) > 0 {
|
||||
var proj *db.STenant
|
||||
proj, input.ProjectizedResourceInput, err = db.ValidateProjectizedResourceInput(ctx, input.ProjectizedResourceInput)
|
||||
if err != nil {
|
||||
|
||||
@@ -71,6 +71,21 @@ func TestSCloudaccount_suggestHostNetworks(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
[]string{
|
||||
"10.155.50.103",
|
||||
"10.155.50.101",
|
||||
"10.155.50.102",
|
||||
},
|
||||
[]api.CASimpleNetConf{
|
||||
{
|
||||
GuestIpStart: "10.155.50.101",
|
||||
GuestIpEnd: "10.155.50.103",
|
||||
GuestIpMask: 24,
|
||||
GuestGateway: "10.155.50.1",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, c := range cases {
|
||||
ins := make([]netutils.IPV4Addr, len(c.in))
|
||||
|
||||
@@ -1229,7 +1229,7 @@ func SyncCloudProject(userCred mcclient.TokenCredential, model db.IVirtualModel,
|
||||
extProject, err := ExternalProjectManager.GetProject(extProjectId, managerId)
|
||||
if err != nil {
|
||||
log.Errorf("sync project for %s %s error: %v", model.Keyword(), model.GetName(), err)
|
||||
} else {
|
||||
} else if len(extProject.ProjectId) > 0 {
|
||||
newOwnerId = extProject.GetOwnerId()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -337,11 +337,26 @@ func (man *SDnsRecordManager) ValidateCreateData(
|
||||
query jsonutils.JSONObject,
|
||||
data *jsonutils.JSONDict,
|
||||
) (*jsonutils.JSONDict, error) {
|
||||
_, err := man.validateModelData(ctx, data, true)
|
||||
var err error
|
||||
|
||||
input := apis.AdminSharableVirtualResourceBaseCreateInput{}
|
||||
err = data.Unmarshal(&input)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "Unmarshal AdminSharableVirtualResourceBaseCreateInput")
|
||||
}
|
||||
|
||||
input, err = man.SAdminSharableVirtualResourceBaseManager.ValidateCreateData(ctx, userCred, ownerId, query, input)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "SAdminSharableVirtualResourceBaseManager.ValidateCreateData")
|
||||
}
|
||||
|
||||
data.Update(jsonutils.Marshal(input))
|
||||
|
||||
_, err = man.validateModelData(ctx, data, true)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return man.SAdminSharableVirtualResourceBaseManager.ValidateCreateData(man, data)
|
||||
return man.SAdminSharableVirtualResourceBaseManager.ValidateRecordsData(man, data)
|
||||
}
|
||||
|
||||
func (man *SDnsRecordManager) QueryDns(projectId, name string) *SDnsRecord {
|
||||
|
||||
@@ -3047,6 +3047,13 @@ func (self *SGuest) PerformSetQemuParams(ctx context.Context, userCred mcclient.
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
usbKbd, err := data.GetString("disable_usb_kbd")
|
||||
if err == nil {
|
||||
err = self.SetMetadata(ctx, "disable_usb_kbd", usbKbd, userCred)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -1149,6 +1149,7 @@ func (manager *SGuestManager) validateCreateData(
|
||||
if len(imgProperties) == 0 {
|
||||
imgProperties = map[string]string{"os_type": "Linux"}
|
||||
}
|
||||
input.DisableUsbKbd = imgProperties[imageapi.IMAGE_DISABLE_USB_KBD] == "true"
|
||||
|
||||
osType := input.OsType
|
||||
osProf, err = osprofile.GetOSProfileFromImageProperties(imgProperties, hypervisor)
|
||||
@@ -1707,6 +1708,9 @@ func (guest *SGuest) PostCreate(ctx context.Context, userCred mcclient.TokenCred
|
||||
if osProfileJson != nil {
|
||||
guest.setOSProfile(ctx, userCred, osProfileJson)
|
||||
}
|
||||
if jsonutils.QueryBoolean(data, imageapi.IMAGE_DISABLE_USB_KBD, false) {
|
||||
guest.SetMetadata(ctx, imageapi.IMAGE_DISABLE_USB_KBD, "true", userCred)
|
||||
}
|
||||
|
||||
userData, _ := data.GetString("user_data")
|
||||
if len(userData) > 0 {
|
||||
|
||||
@@ -829,16 +829,17 @@ func (manager *SNetworkManager) GetOnPremiseNetworkOfIP(ipAddr string, serverTyp
|
||||
|
||||
func (manager *SNetworkManager) allNetworksQ(providers []string, brands []string, cloudEnv string, rangeObjs []db.IStandaloneModel) *sqlchemy.SQuery {
|
||||
networks := manager.Query().SubQuery()
|
||||
hostwires := HostwireManager.Query().SubQuery()
|
||||
hosts := HostManager.Query().SubQuery()
|
||||
wires := WireManager.Query().SubQuery()
|
||||
vpcs := VpcManager.Query().SubQuery()
|
||||
|
||||
q := networks.Query(networks.Field("id"))
|
||||
q = q.Join(hostwires, sqlchemy.Equals(hostwires.Field("wire_id"), networks.Field("wire_id")))
|
||||
q = q.Join(hosts, sqlchemy.Equals(hosts.Field("id"), hostwires.Field("host_id")))
|
||||
q = q.Filter(sqlchemy.IsTrue(hosts.Field("enabled")))
|
||||
q = q.Filter(sqlchemy.OR(
|
||||
sqlchemy.Equals(hosts.Field("host_type"), api.HOST_TYPE_BAREMETAL),
|
||||
sqlchemy.Equals(hosts.Field("host_status"), api.HOST_ONLINE)))
|
||||
return AttachUsageQuery(q, hosts, nil, nil, providers, brands, cloudEnv, rangeObjs)
|
||||
q = q.Join(wires, sqlchemy.Equals(q.Field("wire_id"), wires.Field("id")))
|
||||
q = q.Join(vpcs, sqlchemy.Equals(wires.Field("vpc_id"), vpcs.Field("id")))
|
||||
|
||||
q = CloudProviderFilter(q, vpcs.Field("manager_id"), providers, brands, cloudEnv)
|
||||
q = RangeObjectsFilter(q, rangeObjs, vpcs.Field("cloudregion_id"), wires.Field("zone_id"), vpcs.Field("manager_id"), nil, nil)
|
||||
|
||||
return q
|
||||
}
|
||||
|
||||
func (manager *SNetworkManager) totalPortCountQ(
|
||||
|
||||
@@ -1142,10 +1142,15 @@ func (manager *SServerSkuManager) newFromCloudSku(ctx context.Context, userCred
|
||||
sku.Status = api.SkuStatusReady
|
||||
sku.constructSku(extSku)
|
||||
|
||||
sku.Name = extSku.GetName()
|
||||
var err error
|
||||
sku.Name, err = db.GenerateName(manager, userCred, extSku.GetName())
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "db.GenerateName")
|
||||
}
|
||||
|
||||
sku.CloudregionId = api.DEFAULT_REGION_ID
|
||||
sku.SetModelManager(manager, sku)
|
||||
err := manager.TableSpec().Insert(ctx, sku)
|
||||
err = manager.TableSpec().Insert(ctx, sku)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "newFromCloudSku.Insert")
|
||||
}
|
||||
|
||||
@@ -951,8 +951,6 @@ func (manager *SStorageManager) totalCapacityQ(
|
||||
q = RangeObjectsFilter(q, rangeObjs, nil, storages.Field("zone_id"), storages.Field("manager_id"), nil, storages.Field("id"))
|
||||
}
|
||||
|
||||
q = q.Distinct()
|
||||
|
||||
if storageOwnership {
|
||||
switch scope {
|
||||
case rbacutils.ScopeSystem:
|
||||
|
||||
@@ -1062,6 +1062,11 @@ func (self *SVpc) initWire(ctx context.Context, zone *SZone) (*SWire, error) {
|
||||
wire.ZoneId = zone.Id
|
||||
wire.IsEmulated = true
|
||||
wire.Name = fmt.Sprintf("vpc-%s", self.Name)
|
||||
|
||||
wire.DomainId = self.DomainId
|
||||
wire.IsPublic = self.IsPublic
|
||||
wire.PublicScope = self.PublicScope
|
||||
|
||||
wire.SetModelManager(WireManager, wire)
|
||||
err := WireManager.TableSpec().Insert(ctx, wire)
|
||||
if err != nil {
|
||||
@@ -1216,7 +1221,7 @@ func (manager *SVpcManager) ListItemExportKeys(ctx context.Context,
|
||||
}
|
||||
|
||||
func (vpc *SVpc) PerformPublic(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject, input apis.PerformPublicDomainInput) (jsonutils.JSONObject, error) {
|
||||
if rbacutils.String2ScopeDefault(input.Scope, rbacutils.ScopeSystem) != rbacutils.ScopeSystem {
|
||||
if vpc.Id == api.DEFAULT_VPC_ID && rbacutils.String2ScopeDefault(input.Scope, rbacutils.ScopeSystem) != rbacutils.ScopeSystem {
|
||||
return nil, httperrors.NewForbiddenError("For default vpc, only system level sharing can be set")
|
||||
}
|
||||
_, err := vpc.SEnabledStatusInfrasResourceBase.PerformPublic(ctx, userCred, query, input)
|
||||
|
||||
@@ -986,7 +986,7 @@ func (self *SAliyunRegionDriver) ValidateDBInstanceRecovery(ctx context.Context,
|
||||
if !((utils.IsInStringArray(instance.EngineVersion, []string{"8.0", "5.7"}) &&
|
||||
instance.StorageType == api.ALIYUN_DBINSTANCE_STORAGE_TYPE_LOCAL_SSD &&
|
||||
instance.Category == api.ALIYUN_DBINSTANCE_CATEGORY_HA) || (instance.EngineVersion == "5.6" && instance.Category == api.ALIYUN_DBINSTANCE_CATEGORY_HA)) {
|
||||
return httperrors.NewUnsupportOperationError("Aliyun %s only 8.0, 5.7 ha local_ssd or 5.6 ha support recovery from it self backups")
|
||||
return httperrors.NewUnsupportOperationError("Aliyun %s only 8.0 and 5.7 high_availability local_ssd or 5.6 high_availability support recovery from it self backups", instance.Engine)
|
||||
}
|
||||
}
|
||||
if len(input.Databases) == 0 {
|
||||
|
||||
@@ -99,7 +99,7 @@ func (self *GuestDetachDiskTask) OnDetachDiskComplete(ctx context.Context, guest
|
||||
return
|
||||
}
|
||||
}
|
||||
models.StartResourceSyncStatusTask(ctx, self.GetUserCred(), disk, "DiskSyncstatusTask", "")
|
||||
disk.SetStatus(self.UserCred, api.DISK_READY, "on detach disk complete")
|
||||
keepDisk := jsonutils.QueryBoolean(self.Params, "keep_disk", true)
|
||||
host := guest.GetHost()
|
||||
purge := false
|
||||
|
||||
@@ -103,7 +103,7 @@ func (p *SKVMGuestDiskPartition) MountPartReadOnly() bool {
|
||||
|
||||
func (p *SKVMGuestDiskPartition) Mount() bool {
|
||||
if len(p.fs) == 0 || utils.IsInStringArray(p.fs, []string{"swap", "btrfs"}) {
|
||||
log.Errorf("Mount fs failed: %s", p.fs)
|
||||
log.Errorf("Mount fs failed: unsupport fs %s on %s", p.fs, p.partDev)
|
||||
return false
|
||||
}
|
||||
err := p.fsck()
|
||||
@@ -127,6 +127,7 @@ func (p *SKVMGuestDiskPartition) Mount() bool {
|
||||
p.readonly = true
|
||||
}
|
||||
}
|
||||
log.Infof("mount fs %s on %s success", p.fs, p.partDev)
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -154,7 +155,21 @@ func (p *SKVMGuestDiskPartition) mount(readonly bool) error {
|
||||
cmds = append(cmds, "-o", opt)
|
||||
}
|
||||
cmds = append(cmds, p.partDev, p.mountPath)
|
||||
_, err := procutils.NewCommand(cmds[0], cmds[1:]...).Output()
|
||||
|
||||
var err error
|
||||
if fsType == "xfs" {
|
||||
uuids := fileutils2.GetDevUuid(p.partDev)
|
||||
uuid := uuids["UUID"]
|
||||
if len(uuid) > 0 {
|
||||
LockXfsPartition(uuid)
|
||||
defer func() {
|
||||
if err != nil {
|
||||
UnlockXfsPartition(uuid)
|
||||
}
|
||||
}()
|
||||
}
|
||||
}
|
||||
_, err = procutils.NewCommand(cmds[0], cmds[1:]...).Output()
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -217,6 +232,13 @@ func (p *SKVMGuestDiskPartition) Umount() bool {
|
||||
tries += 1
|
||||
_, err := procutils.NewCommand("umount", p.mountPath).Output()
|
||||
if err == nil {
|
||||
if p.fs == "xfs" {
|
||||
uuids := fileutils2.GetDevUuid(p.partDev)
|
||||
uuid := uuids["UUID"]
|
||||
if len(uuid) > 0 {
|
||||
UnlockXfsPartition(uuid)
|
||||
}
|
||||
}
|
||||
procutils.NewCommand("blockdev", "--flushbufs", p.partDev).Output()
|
||||
os.Remove(p.mountPath)
|
||||
return true
|
||||
|
||||
40
pkg/hostman/guestfs/utils.go
Normal file
40
pkg/hostman/guestfs/utils.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package guestfs
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"yunion.io/x/log"
|
||||
)
|
||||
|
||||
func LockXfsPartition(uuid string) {
|
||||
log.Infof("xfs lock %s", uuid)
|
||||
|
||||
var (
|
||||
xfsLock *sync.Mutex
|
||||
ok bool
|
||||
)
|
||||
|
||||
mapLock.Lock()
|
||||
xfsLock, ok = xfsMountUniqueTool[uuid]
|
||||
if !ok {
|
||||
xfsLock = new(sync.Mutex)
|
||||
xfsMountUniqueTool[uuid] = xfsLock
|
||||
}
|
||||
mapLock.Unlock()
|
||||
|
||||
xfsLock.Lock()
|
||||
}
|
||||
|
||||
func UnlockXfsPartition(uuid string) {
|
||||
log.Infof("xfs unlock %s", uuid)
|
||||
mapLock.Lock()
|
||||
xfsLock := xfsMountUniqueTool[uuid]
|
||||
mapLock.Unlock()
|
||||
|
||||
xfsLock.Unlock()
|
||||
}
|
||||
|
||||
var (
|
||||
mapLock = sync.Mutex{}
|
||||
xfsMountUniqueTool = map[string]*sync.Mutex{}
|
||||
)
|
||||
@@ -79,6 +79,11 @@ func (s *SKVMGuestInstance) getOsname() string {
|
||||
return osName
|
||||
}
|
||||
|
||||
func (s *SKVMGuestInstance) disableUsbKbd() bool {
|
||||
val, _ := s.Desc.GetString("metadata", "disable_usb_kbd")
|
||||
return val == "true"
|
||||
}
|
||||
|
||||
func (s *SKVMGuestInstance) getOsDistribution() string {
|
||||
osDis, _ := s.Desc.GetString("metadata", "os_distribution")
|
||||
return osDis
|
||||
@@ -499,7 +504,7 @@ func (s *SKVMGuestInstance) _generateStartScript(data *jsonutils.JSONDict) (stri
|
||||
|
||||
cmd += " -device virtio-serial"
|
||||
cmd += " -usb"
|
||||
if !utils.IsInStringArray(s.getOsDistribution(), []string{OS_NAME_OPENWRT, OS_NAME_CIRROS}) {
|
||||
if !utils.IsInStringArray(s.getOsDistribution(), []string{OS_NAME_OPENWRT, OS_NAME_CIRROS}) && !s.disableUsbKbd() {
|
||||
cmd += " -device usb-kbd"
|
||||
}
|
||||
// # if osname == self.OS_NAME_ANDROID:
|
||||
|
||||
@@ -1383,7 +1383,7 @@ func (h *SHostInfo) deployAdminAuthorizedKeys() {
|
||||
}
|
||||
|
||||
query := jsonutils.NewDict()
|
||||
query.Add(jsonutils.NewString("system"), "scope")
|
||||
query.Set("admin", jsonutils.JSONTrue)
|
||||
ret, err := modules.Sshkeypairs.List(h.GetSession(), query)
|
||||
if err != nil {
|
||||
onErr("Get admin sshkey: %v", err)
|
||||
|
||||
@@ -263,9 +263,9 @@ func (policy *SPolicy) Delete(ctx context.Context, userCred mcclient.TokenCreden
|
||||
}
|
||||
|
||||
func (policy *SPolicy) ValidateDeleteCondition(ctx context.Context) error {
|
||||
if policy.IsShared() {
|
||||
return httperrors.NewInvalidStatusError("cannot delete shared policy")
|
||||
}
|
||||
// if policy.IsShared() {
|
||||
// return httperrors.NewInvalidStatusError("cannot delete shared policy")
|
||||
// }
|
||||
if policy.Enabled.IsTrue() {
|
||||
return httperrors.NewInvalidStatusError("cannot delete enabled policy")
|
||||
}
|
||||
|
||||
@@ -188,9 +188,9 @@ func (role *SRole) IsSystemRole() bool {
|
||||
}
|
||||
|
||||
func (role *SRole) ValidateDeleteCondition(ctx context.Context) error {
|
||||
if role.IsShared() {
|
||||
return httperrors.NewInvalidStatusError("cannot delete shared role")
|
||||
}
|
||||
// if role.IsShared() {
|
||||
// return httperrors.NewInvalidStatusError("cannot delete shared role")
|
||||
// }
|
||||
if role.IsSystemRole() {
|
||||
return httperrors.NewForbiddenError("cannot delete system role")
|
||||
}
|
||||
|
||||
@@ -136,6 +136,9 @@ func (man *SNodeAlertManager) genName(ownerId mcclient.IIdentityProvider, resTyp
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if name != nameHint {
|
||||
return "", httperrors.NewDuplicateNameError(man.Keyword(), metric)
|
||||
}
|
||||
return name, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ func (self *SClassicStorage) GetGlobalId() string {
|
||||
}
|
||||
|
||||
func (self *SClassicStorage) IsEmulated() bool {
|
||||
return false
|
||||
return true
|
||||
}
|
||||
|
||||
func (self *SClassicStorage) GetIZone() cloudprovider.ICloudZone {
|
||||
|
||||
@@ -21,6 +21,7 @@ import (
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
"yunion.io/x/pkg/errors"
|
||||
|
||||
"yunion.io/x/onecloud/pkg/cloudprovider"
|
||||
"yunion.io/x/onecloud/pkg/mcclient"
|
||||
@@ -77,15 +78,31 @@ func (self *SDatastoreImageCache) GetPath() string {
|
||||
|
||||
func (self *SDatastoreImageCache) GetIImages() ([]cloudprovider.ICloudImage, error) {
|
||||
ctx := context.Background()
|
||||
ret := make([]cloudprovider.ICloudImage, 0, 2)
|
||||
|
||||
// get vm template with only one disk
|
||||
tems, err := self.host.GetTemplateVMs()
|
||||
if err != nil {
|
||||
log.Errorf("fail to get templateVMs of host '%s' in SDatastoreImageCache.GetIImages", self.host.GetName())
|
||||
return ret, nil
|
||||
}
|
||||
for _, tem := range tems {
|
||||
// for now, add vm template with only one disk as cachedimage
|
||||
if len(tem.vdisks) != 1 {
|
||||
continue
|
||||
}
|
||||
ret = append(ret, NewVMTemplate(tem, self))
|
||||
}
|
||||
|
||||
files, err := self.datastore.ListDir(ctx, IMAGE_CACHE_DIR_NAME)
|
||||
if errors.Cause(err) == errors.ErrNotFound {
|
||||
return ret, nil
|
||||
}
|
||||
if err != nil {
|
||||
log.Errorf("GetIImages ListDir fail %s", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ret := make([]cloudprovider.ICloudImage, 0)
|
||||
|
||||
validFilenames := make(map[string]bool)
|
||||
|
||||
for i := 0; i < len(files); i += 1 {
|
||||
@@ -119,20 +136,6 @@ func (self *SDatastoreImageCache) GetIImages() ([]cloudprovider.ICloudImage, err
|
||||
}
|
||||
}
|
||||
|
||||
// get vm template with only one disk
|
||||
tems, err := self.host.GetTemplateVMs()
|
||||
if err != nil {
|
||||
log.Errorf("fail to get templateVMs of host '%s' in SDatastoreImageCache.GetIImages", self.host.GetName())
|
||||
return ret, nil
|
||||
}
|
||||
for _, tem := range tems {
|
||||
// for now, add vm template with only one disk as cachedimage
|
||||
if len(tem.vdisks) != 1 {
|
||||
continue
|
||||
}
|
||||
ret = append(ret, NewVMTemplate(tem, self))
|
||||
}
|
||||
|
||||
return ret, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -146,17 +146,13 @@ func (ce *HuaweiClientError) Error() string {
|
||||
}
|
||||
|
||||
func (ce *HuaweiClientError) ParseErrorFromJsonResponse(statusCode int, body jsonutils.JSONObject) error {
|
||||
err := body.Unmarshal(ce)
|
||||
if err != nil {
|
||||
ce.err = errors.Wrapf(err, "body.Unmarshal(%s)", body.String())
|
||||
ce.Code = statusCode
|
||||
ce.Details = body.String()
|
||||
return ce
|
||||
if body != nil {
|
||||
body.Unmarshal(ce)
|
||||
}
|
||||
if ce.Code == 0 {
|
||||
ce.Code = statusCode
|
||||
}
|
||||
if len(ce.Details) == 0 {
|
||||
if len(ce.Details) == 0 && body != nil {
|
||||
ce.Details = body.String()
|
||||
}
|
||||
return ce
|
||||
@@ -187,10 +183,6 @@ func (self *SBaseManager) jsonRequest(request requests.IRequest) (http.Header, j
|
||||
}
|
||||
}
|
||||
|
||||
if self.debug {
|
||||
log.Debugf("url: %s", request.BuildUrl())
|
||||
}
|
||||
|
||||
client := httputils.NewJsonClient(self.httpClient)
|
||||
req := httputils.NewJsonRequest(httputils.THttpMethod(request.GetMethod()), request.BuildUrl(), jsonBody)
|
||||
req.SetHeader(header)
|
||||
@@ -201,12 +193,11 @@ func (self *SBaseManager) jsonRequest(request requests.IRequest) (http.Header, j
|
||||
for {
|
||||
h, b, e := client.Send(ctx, req, resp, self.debug)
|
||||
if e == nil {
|
||||
if self.debug {
|
||||
log.Debugf("response: %s body: %s", h, b)
|
||||
}
|
||||
return h, b, e
|
||||
return h, b, nil
|
||||
}
|
||||
|
||||
log.Errorf("[%s] %s body: %v error: %v", req.GetHttpMethod(), req.GetUrl(), jsonBody, e)
|
||||
|
||||
switch err := e.(type) {
|
||||
case *HuaweiClientError:
|
||||
if (err.Code == 499 || err.Code == 429) && retry > 0 && request.GetMethod() == "GET" {
|
||||
|
||||
@@ -537,16 +537,19 @@ func (self *SRegion) CreateISecurityGroup(conf *cloudprovider.SecurityGroupCreat
|
||||
|
||||
// https://support.huaweicloud.com/api-vpc/zh-cn_topic_0020090608.html
|
||||
func (self *SRegion) CreateIVpc(name string, desc string, cidr string) (cloudprovider.ICloudVpc, error) {
|
||||
params := jsonutils.NewDict()
|
||||
vpcObj := jsonutils.NewDict()
|
||||
vpcObj.Add(jsonutils.NewString(name), "name")
|
||||
vpcObj.Add(jsonutils.NewString(cidr), "cidr")
|
||||
params.Add(vpcObj, "vpc")
|
||||
return self.CreateVpc(name, cidr, desc)
|
||||
}
|
||||
|
||||
vpc := SVpc{}
|
||||
err := DoCreate(self.ecsClient.Vpcs.Create, params, &vpc)
|
||||
vpc.region = self
|
||||
return &vpc, err
|
||||
func (self *SRegion) CreateVpc(name, cidr, desc string) (*SVpc, error) {
|
||||
params := map[string]interface{}{
|
||||
"vpc": map[string]string{
|
||||
"name": name,
|
||||
"cidr": cidr,
|
||||
"description": desc,
|
||||
},
|
||||
}
|
||||
vpc := &SVpc{region: self}
|
||||
return vpc, DoCreate(self.ecsClient.Vpcs.Create, jsonutils.Marshal(params), vpc)
|
||||
}
|
||||
|
||||
// https://support.huaweicloud.com/api-vpc/zh-cn_topic_0020090596.html
|
||||
|
||||
@@ -31,6 +31,7 @@ import (
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/pkg/errors"
|
||||
"yunion.io/x/pkg/util/secrules"
|
||||
"yunion.io/x/pkg/utils"
|
||||
|
||||
api "yunion.io/x/onecloud/pkg/apis/compute"
|
||||
"yunion.io/x/onecloud/pkg/cloudprovider"
|
||||
@@ -227,7 +228,7 @@ func (self *SRegion) GetSecurityGroupDetails(secGroupId string) (*SSecurityGroup
|
||||
// https://support.huaweicloud.com/api-vpc/zh-cn_topic_0020090617.html
|
||||
func (self *SRegion) GetSecurityGroups(vpcId string, name string) ([]SSecurityGroup, error) {
|
||||
querys := map[string]string{}
|
||||
if len(vpcId) > 0 {
|
||||
if len(vpcId) > 0 && !utils.IsInStringArray(vpcId, []string{"default", api.NORMAL_VPC_ID}) { // vpc_id = default or normal 时报错 '{"code":"VPC.0601","message":"Query security groups error vpcId is invalid."}'
|
||||
querys["vpc_id"] = vpcId
|
||||
}
|
||||
|
||||
|
||||
@@ -30,4 +30,28 @@ func init() {
|
||||
printList(vpcs, 0, 0, 0, nil)
|
||||
return nil
|
||||
})
|
||||
|
||||
type VpcCreateOptions struct {
|
||||
NAME string
|
||||
CIDR string
|
||||
Desc string
|
||||
}
|
||||
|
||||
shellutils.R(&VpcCreateOptions{}, "vpc-create", "Create vpc", func(cli *huawei.SRegion, args *VpcCreateOptions) error {
|
||||
vpc, err := cli.CreateVpc(args.NAME, args.CIDR, args.Desc)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
printObject(vpc)
|
||||
return nil
|
||||
})
|
||||
|
||||
type VpcIdOption struct {
|
||||
ID string
|
||||
}
|
||||
|
||||
shellutils.R(&VpcIdOption{}, "vpc-delete", "Delete vpc", func(cli *huawei.SRegion, args *VpcIdOption) error {
|
||||
return cli.DeleteVpc(args.ID)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
@@ -225,6 +225,18 @@ func (self *SRegion) getVpc(vpcId string) (*SVpc, error) {
|
||||
}
|
||||
|
||||
func (self *SRegion) DeleteVpc(vpcId string) error {
|
||||
if vpcId != "default" {
|
||||
secgroups, err := self.GetSecurityGroups(vpcId, "")
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "GetSecurityGroups")
|
||||
}
|
||||
for _, secgroup := range secgroups {
|
||||
err = self.DeleteSecurityGroup(secgroup.ID)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "DeleteSecurityGroup(%s)", secgroup.ID)
|
||||
}
|
||||
}
|
||||
}
|
||||
return DoDelete(self.ecsClient.Vpcs.Delete, vpcId, nil, nil)
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ package objectstore
|
||||
import (
|
||||
"net/url"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"yunion.io/x/jsonutils"
|
||||
"yunion.io/x/log"
|
||||
@@ -504,7 +505,12 @@ func (cli *SObjectStoreClient) SetIBucketAcl(name string, cannedAcl cloudprovide
|
||||
acl := s3cli.CannedAcl(cli.ownerId, cli.ownerName, string(cannedAcl))
|
||||
err := cli.client.SetBucketAcl(name, acl)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "SetBucketAcl")
|
||||
if strings.Contains(err.Error(), "not implemented") {
|
||||
// ignore not implemented error
|
||||
return nil // cloudprovider.ErrNotImplemented
|
||||
} else {
|
||||
return errors.Wrap(err, "SetBucketAcl")
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ func (host *SHypervisor) GetIWires() ([]cloudprovider.ICloudWire, error) {
|
||||
func (host *SHypervisor) GetIStorages() ([]cloudprovider.ICloudStorage, error) {
|
||||
istorages := []cloudprovider.ICloudStorage{}
|
||||
storages, err := host.zone.region.GetStorageTypes()
|
||||
if err != nil {
|
||||
if err != nil && errors.Cause(err) != ErrNoEndpoint {
|
||||
return nil, errors.Wrap(err, "GetStorageTypes")
|
||||
}
|
||||
for i := range storages {
|
||||
@@ -148,7 +148,12 @@ func (host *SHypervisor) CreateVM(desc *cloudprovider.SManagedVMCreateConfig) (c
|
||||
}
|
||||
|
||||
func (host *SHypervisor) GetEnabled() bool {
|
||||
return true
|
||||
switch host.Status {
|
||||
case "enabled", "":
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func (host *SHypervisor) GetAccessIp() string {
|
||||
@@ -266,9 +271,6 @@ func (host *SHypervisor) GetHostType() string {
|
||||
}
|
||||
|
||||
func (host *SHypervisor) GetHostStatus() string {
|
||||
if host.Status == "disabled" {
|
||||
return api.HOST_OFFLINE
|
||||
}
|
||||
switch host.State {
|
||||
case "up", "":
|
||||
return api.HOST_ONLINE
|
||||
@@ -282,12 +284,7 @@ func (host *SHypervisor) GetIHostNics() ([]cloudprovider.ICloudHostNetInterface,
|
||||
}
|
||||
|
||||
func (host *SHypervisor) GetIsMaintenance() bool {
|
||||
switch host.Status {
|
||||
case "enabled", "":
|
||||
return false
|
||||
default:
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (host *SHypervisor) GetVersion() string {
|
||||
|
||||
@@ -45,6 +45,8 @@ const (
|
||||
OPENSTACK_SERVICE_VOLUMEV2 = "volumev2"
|
||||
OPENSTACK_SERVICE_VOLUME = "volume"
|
||||
OPENSTACK_SERVICE_IMAGE = "image"
|
||||
|
||||
ErrNoEndpoint = errors.Error("no valid endpoint")
|
||||
)
|
||||
|
||||
type OpenstackClientConfig struct {
|
||||
@@ -159,11 +161,13 @@ type OpenstackError struct {
|
||||
}
|
||||
|
||||
func (ce *OpenstackError) ParseErrorFromJsonResponse(statusCode int, body jsonutils.JSONObject) error {
|
||||
body.Unmarshal(ce)
|
||||
if body != nil {
|
||||
body.Unmarshal(ce)
|
||||
}
|
||||
if ce.Code == 0 {
|
||||
ce.Code = statusCode
|
||||
}
|
||||
if len(ce.Details) == 0 {
|
||||
if len(ce.Details) == 0 && body != nil {
|
||||
ce.Details = body.String()
|
||||
}
|
||||
if len(ce.Class) == 0 {
|
||||
@@ -250,12 +254,20 @@ func jsonReuest(token mcclient.TokenCredential, service, region, endpointType st
|
||||
}
|
||||
}
|
||||
|
||||
requestUrl := resource
|
||||
if !strings.HasPrefix(resource, serviceUrl) {
|
||||
requestUrl = fmt.Sprintf("%s/%s", serviceUrl, resource)
|
||||
if service == OPENSTACK_SERVICE_IDENTITY {
|
||||
if strings.HasSuffix(serviceUrl, "/v3/") {
|
||||
serviceUrl = strings.TrimSuffix(serviceUrl, "/v3/")
|
||||
} else if strings.HasSuffix(serviceUrl, "/v3") {
|
||||
serviceUrl = strings.TrimSuffix(serviceUrl, "/v3")
|
||||
}
|
||||
}
|
||||
|
||||
if query != nil {
|
||||
requestUrl := resource
|
||||
if !strings.HasPrefix(resource, serviceUrl) {
|
||||
requestUrl = fmt.Sprintf("%s/%s", strings.TrimSuffix(serviceUrl, "/"), strings.TrimPrefix(resource, "/"))
|
||||
}
|
||||
|
||||
if query != nil && len(query) > 0 {
|
||||
requestUrl = fmt.Sprintf("%s?%s", requestUrl, query.Encode())
|
||||
}
|
||||
|
||||
@@ -327,7 +339,7 @@ func (cli *SOpenStackClient) bsRequest(region string, method httputils.THttpMeth
|
||||
return jsonReuest(cli.tokenCredential, service, region, cli.endpointType, method, resource, query, body, cli.debug)
|
||||
}
|
||||
}
|
||||
return nil, fmt.Errorf("no valid volume service endpoint")
|
||||
return nil, errors.Wrap(ErrNoEndpoint, "cinder service")
|
||||
}
|
||||
|
||||
func (cli *SOpenStackClient) bsCreate(projectId, region, resource string, body interface{}) (jsonutils.JSONObject, error) {
|
||||
@@ -345,7 +357,7 @@ func (cli *SOpenStackClient) bsCreate(projectId, region, resource string, body i
|
||||
return jsonReuest(token, service, region, cli.endpointType, httputils.POST, resource, nil, body, cli.debug)
|
||||
}
|
||||
}
|
||||
return nil, fmt.Errorf("no valid volume service endpoint")
|
||||
return nil, errors.Wrap(ErrNoEndpoint, "cinder service")
|
||||
}
|
||||
|
||||
func (cli *SOpenStackClient) imageUpload(region, url string, body io.Reader) (*http.Response, error) {
|
||||
|
||||
@@ -112,7 +112,7 @@ func (zone *SZone) getStorageByCategory(category, host string) (*SStorage, error
|
||||
|
||||
func (zone *SZone) GetIStorages() ([]cloudprovider.ICloudStorage, error) {
|
||||
storages, err := zone.region.GetStorageTypes()
|
||||
if err != nil {
|
||||
if err != nil && errors.Cause(err) != ErrNoEndpoint {
|
||||
return nil, errors.Wrap(err, "GetStorageTypes")
|
||||
}
|
||||
istorages := []cloudprovider.ICloudStorage{}
|
||||
|
||||
@@ -59,7 +59,7 @@ type ZstackClientConfig struct {
|
||||
|
||||
func NewZstackClientConfig(authURL, username, password string) *ZstackClientConfig {
|
||||
cfg := &ZstackClientConfig{
|
||||
authURL: authURL,
|
||||
authURL: strings.TrimSuffix(authURL, "/"),
|
||||
username: username,
|
||||
password: password,
|
||||
}
|
||||
|
||||
@@ -71,6 +71,10 @@ func DumpOVNNorthbound(ctx context.Context, cli *ovnutil.OvnNbCtl) (*OVNNorthbou
|
||||
return keeper, nil
|
||||
}
|
||||
|
||||
func ptr(s string) *string {
|
||||
return &s
|
||||
}
|
||||
|
||||
func ovnCreateArgs(irow types.IRow, idRef string) []string {
|
||||
args := append([]string{
|
||||
"--", "--id=@" + idRef, "create", irow.OvsdbTableName(),
|
||||
@@ -89,13 +93,85 @@ func (keeper *OVNNorthboundKeeper) ClaimVpc(ctx context.Context, vpc *agentmodel
|
||||
}
|
||||
irows := []types.IRow{vpcLr}
|
||||
|
||||
var (
|
||||
hasDistgw = vpcHasDistgw(vpc)
|
||||
hasEipgw = vpcHasEipgw(vpc)
|
||||
)
|
||||
|
||||
var (
|
||||
vpcExtLr *ovn_nb.LogicalRouter
|
||||
vpcExtLs *ovn_nb.LogicalSwitch
|
||||
vpcR1extp *ovn_nb.LogicalRouterPort
|
||||
vpcExtr1p *ovn_nb.LogicalSwitchPort
|
||||
vpcR2extp *ovn_nb.LogicalRouterPort
|
||||
vpcExtr2p *ovn_nb.LogicalSwitchPort
|
||||
vpcDefaultRoute *ovn_nb.LogicalRouterStaticRoute
|
||||
vpcExtDefaultRoute *ovn_nb.LogicalRouterStaticRoute
|
||||
)
|
||||
if hasDistgw || hasEipgw {
|
||||
vpcExtLr = &ovn_nb.LogicalRouter{
|
||||
Name: vpcExtLrName(vpc.Id),
|
||||
}
|
||||
vpcExtLs = &ovn_nb.LogicalSwitch{
|
||||
Name: vpcExtLsName(vpc.Id),
|
||||
}
|
||||
vpcR1extp = &ovn_nb.LogicalRouterPort{
|
||||
Name: vpcR1extpName(vpc.Id),
|
||||
Mac: apis.VpcInterExtMac1,
|
||||
Networks: []string{fmt.Sprintf("%s/%d", apis.VpcInterExtIP1(), apis.VpcInterExtMask)},
|
||||
}
|
||||
vpcExtr1p = &ovn_nb.LogicalSwitchPort{
|
||||
Name: vpcExtr1pName(vpc.Id),
|
||||
Type: "router",
|
||||
Addresses: []string{"router"},
|
||||
Options: map[string]string{
|
||||
"router-port": vpcR1extpName(vpc.Id),
|
||||
},
|
||||
}
|
||||
vpcR2extp = &ovn_nb.LogicalRouterPort{
|
||||
Name: vpcR2extpName(vpc.Id),
|
||||
Mac: apis.VpcInterExtMac2,
|
||||
Networks: []string{fmt.Sprintf("%s/%d", apis.VpcInterExtIP2(), apis.VpcInterExtMask)},
|
||||
}
|
||||
vpcExtr2p = &ovn_nb.LogicalSwitchPort{
|
||||
Name: vpcExtr2pName(vpc.Id),
|
||||
Type: "router",
|
||||
Addresses: []string{"router"},
|
||||
Options: map[string]string{
|
||||
"router-port": vpcR2extpName(vpc.Id),
|
||||
},
|
||||
}
|
||||
vpcDefaultRoute = &ovn_nb.LogicalRouterStaticRoute{
|
||||
Policy: ptr("dst-ip"),
|
||||
IpPrefix: "0.0.0.0/0",
|
||||
Nexthop: apis.VpcInterExtIP2().String(),
|
||||
OutputPort: ptr(vpcR1extpName(vpc.Id)),
|
||||
}
|
||||
vpcExtDefaultRoute = &ovn_nb.LogicalRouterStaticRoute{
|
||||
Policy: ptr("dst-ip"),
|
||||
IpPrefix: "0.0.0.0/0",
|
||||
Nexthop: apis.VpcInterExtIP1().String(),
|
||||
OutputPort: ptr(vpcR2extpName(vpc.Id)),
|
||||
}
|
||||
irows = append(irows,
|
||||
vpcExtLr,
|
||||
vpcExtLs,
|
||||
vpcR1extp,
|
||||
vpcExtr1p,
|
||||
vpcR2extp,
|
||||
vpcExtr2p,
|
||||
vpcDefaultRoute,
|
||||
vpcExtDefaultRoute,
|
||||
)
|
||||
}
|
||||
|
||||
// distgw
|
||||
var (
|
||||
vpcHostLs *ovn_nb.LogicalSwitch
|
||||
vpcRhp *ovn_nb.LogicalRouterPort
|
||||
vpcHrp *ovn_nb.LogicalSwitchPort
|
||||
)
|
||||
if vpcHasDistgw(vpc) {
|
||||
if hasDistgw {
|
||||
vpcHostLs = &ovn_nb.LogicalSwitch{
|
||||
Name: vpcHostLsName(vpc.Id),
|
||||
}
|
||||
@@ -125,7 +201,7 @@ func (keeper *OVNNorthboundKeeper) ClaimVpc(ctx context.Context, vpc *agentmodel
|
||||
vpcRep *ovn_nb.LogicalRouterPort
|
||||
vpcErp *ovn_nb.LogicalSwitchPort
|
||||
)
|
||||
if vpcHasEipgw(vpc) {
|
||||
if hasEipgw {
|
||||
vpcEipLs = &ovn_nb.LogicalSwitch{
|
||||
Name: vpcEipLsName(vpc.Id),
|
||||
}
|
||||
@@ -154,19 +230,35 @@ func (keeper *OVNNorthboundKeeper) ClaimVpc(ctx context.Context, vpc *agentmodel
|
||||
return nil
|
||||
}
|
||||
args = append(args, ovnCreateArgs(vpcLr, vpcLr.Name)...)
|
||||
if vpcHasDistgw(vpc) {
|
||||
if hasDistgw || hasEipgw {
|
||||
args = append(args, ovnCreateArgs(vpcExtLr, vpcExtLr.Name)...)
|
||||
args = append(args, ovnCreateArgs(vpcExtLs, vpcExtLs.Name)...)
|
||||
args = append(args, ovnCreateArgs(vpcR1extp, vpcR1extp.Name)...)
|
||||
args = append(args, ovnCreateArgs(vpcExtr1p, vpcExtr1p.Name)...)
|
||||
args = append(args, ovnCreateArgs(vpcR2extp, vpcR2extp.Name)...)
|
||||
args = append(args, ovnCreateArgs(vpcExtr2p, vpcExtr2p.Name)...)
|
||||
args = append(args, ovnCreateArgs(vpcDefaultRoute, "vpcDefaultRoute")...)
|
||||
args = append(args, ovnCreateArgs(vpcExtDefaultRoute, "vpcExtDefaultRoute")...)
|
||||
args = append(args, "--", "add", "Logical_Router", vpcLrName(vpc.Id), "static_routes", "@vpcDefaultRoute")
|
||||
args = append(args, "--", "add", "Logical_Router", vpcExtLrName(vpc.Id), "static_routes", "@vpcExtDefaultRoute")
|
||||
args = append(args, "--", "add", "Logical_Switch", vpcExtLs.Name, "ports", "@"+vpcExtr1p.Name)
|
||||
args = append(args, "--", "add", "Logical_Router", vpcLr.Name, "ports", "@"+vpcR1extp.Name)
|
||||
args = append(args, "--", "add", "Logical_Switch", vpcExtLs.Name, "ports", "@"+vpcExtr2p.Name)
|
||||
args = append(args, "--", "add", "Logical_Router", vpcExtLr.Name, "ports", "@"+vpcR2extp.Name)
|
||||
}
|
||||
if hasDistgw {
|
||||
args = append(args, ovnCreateArgs(vpcHostLs, vpcHostLs.Name)...)
|
||||
args = append(args, ovnCreateArgs(vpcRhp, vpcRhp.Name)...)
|
||||
args = append(args, ovnCreateArgs(vpcHrp, vpcHrp.Name)...)
|
||||
args = append(args, "--", "add", "Logical_Switch", vpcHostLs.Name, "ports", "@"+vpcHrp.Name)
|
||||
args = append(args, "--", "add", "Logical_Router", vpcLr.Name, "ports", "@"+vpcRhp.Name)
|
||||
args = append(args, "--", "add", "Logical_Router", vpcExtLr.Name, "ports", "@"+vpcRhp.Name)
|
||||
}
|
||||
if vpcHasEipgw(vpc) {
|
||||
if hasEipgw {
|
||||
args = append(args, ovnCreateArgs(vpcEipLs, vpcEipLs.Name)...)
|
||||
args = append(args, ovnCreateArgs(vpcRep, vpcRep.Name)...)
|
||||
args = append(args, ovnCreateArgs(vpcErp, vpcErp.Name)...)
|
||||
args = append(args, "--", "add", "Logical_Switch", vpcEipLs.Name, "ports", "@"+vpcErp.Name)
|
||||
args = append(args, "--", "add", "Logical_Router", vpcLr.Name, "ports", "@"+vpcRep.Name)
|
||||
args = append(args, "--", "add", "Logical_Router", vpcExtLr.Name, "ports", "@"+vpcRep.Name)
|
||||
}
|
||||
return keeper.cli.Must(ctx, "ClaimVpc", args)
|
||||
}
|
||||
@@ -392,9 +484,6 @@ func (keeper *OVNNorthboundKeeper) ClaimGuestnetwork(ctx context.Context, guestn
|
||||
)
|
||||
{
|
||||
gnrDefaultPolicy := "src-ip"
|
||||
ptr := func(s string) *string {
|
||||
return &s
|
||||
}
|
||||
if eip != nil && vpcHasEipgw(vpc) {
|
||||
gnrDefault = &ovn_nb.LogicalRouterStaticRoute{
|
||||
Policy: &gnrDefaultPolicy,
|
||||
@@ -492,7 +581,7 @@ func (keeper *OVNNorthboundKeeper) ClaimGuestnetwork(ctx context.Context, guestn
|
||||
args = append(args, "--", "add", "Logical_Switch", netLsName(guestnetwork.NetworkId), "ports", "@"+gnp.Name)
|
||||
if gnrDefault != nil {
|
||||
args = append(args, ovnCreateArgs(gnrDefault, "gnrDefault")...)
|
||||
args = append(args, "--", "add", "Logical_Router", vpcLrName(vpc.Id), "static_routes", "@gnrDefault")
|
||||
args = append(args, "--", "add", "Logical_Router", vpcExtLrName(vpc.Id), "static_routes", "@gnrDefault")
|
||||
}
|
||||
for i, acl := range acls {
|
||||
ref := fmt.Sprintf("acl%d", i)
|
||||
|
||||
@@ -8,6 +8,31 @@ func vpcLrName(vpcId string) string {
|
||||
return fmt.Sprintf("vpc-r/%s", vpcId)
|
||||
}
|
||||
|
||||
// ext
|
||||
func vpcExtLrName(vpcId string) string {
|
||||
return fmt.Sprintf("vpc-ext-r/%s", vpcId)
|
||||
}
|
||||
|
||||
func vpcExtLsName(vpcId string) string {
|
||||
return fmt.Sprintf("vpc-ext/%s", vpcId)
|
||||
}
|
||||
|
||||
func vpcR1extpName(vpcId string) string {
|
||||
return fmt.Sprintf("vpc-r1ext/%s", vpcId)
|
||||
}
|
||||
|
||||
func vpcExtr1pName(vpcId string) string {
|
||||
return fmt.Sprintf("vpc-extr1/%s", vpcId)
|
||||
}
|
||||
|
||||
func vpcR2extpName(vpcId string) string {
|
||||
return fmt.Sprintf("vpc-r2ext/%s", vpcId)
|
||||
}
|
||||
|
||||
func vpcExtr2pName(vpcId string) string {
|
||||
return fmt.Sprintf("vpc-extr2/%s", vpcId)
|
||||
}
|
||||
|
||||
// distgw
|
||||
func vpcHostLsName(vpcId string) string {
|
||||
return fmt.Sprintf("vpc-h/%s", vpcId)
|
||||
|
||||
8
vendor/modules.txt
vendored
8
vendor/modules.txt
vendored
@@ -1007,7 +1007,7 @@ sigs.k8s.io/yaml
|
||||
yunion.io/x/executor/apis
|
||||
yunion.io/x/executor/client
|
||||
yunion.io/x/executor/server
|
||||
# yunion.io/x/jsonutils v0.0.0-20200710080709-7ca71cdb9383
|
||||
# yunion.io/x/jsonutils v0.0.0-20200814075449-927b118adbd8
|
||||
yunion.io/x/jsonutils
|
||||
# yunion.io/x/log v0.0.0-20200313080802-57a4ce5966b3
|
||||
yunion.io/x/log
|
||||
@@ -1016,7 +1016,7 @@ yunion.io/x/log/hooks
|
||||
yunion.io/x/ovsdb/cli_util
|
||||
yunion.io/x/ovsdb/schema/ovn_nb
|
||||
yunion.io/x/ovsdb/types
|
||||
# yunion.io/x/pkg v0.0.0-20200713121502-18154120c49b
|
||||
# yunion.io/x/pkg v0.0.0-20200814072949-4f1b541857d6
|
||||
yunion.io/x/pkg/errors
|
||||
yunion.io/x/pkg/gotypes
|
||||
yunion.io/x/pkg/prettytable
|
||||
@@ -1049,7 +1049,7 @@ yunion.io/x/pkg/util/workqueue
|
||||
yunion.io/x/pkg/utils
|
||||
# yunion.io/x/s3cli v0.0.0-20190917004522-13ac36d8687e
|
||||
yunion.io/x/s3cli
|
||||
# yunion.io/x/sqlchemy v0.0.0-20200702064124-195445bc4b11
|
||||
# yunion.io/x/sqlchemy v0.0.0-20200814052348-164f1f20f8a6
|
||||
yunion.io/x/sqlchemy
|
||||
# yunion.io/x/structarg v0.0.0-20200708124353-ea9a441ecaf8
|
||||
# yunion.io/x/structarg v0.0.0-20200720093445-9f850fa222ce
|
||||
yunion.io/x/structarg
|
||||
|
||||
2
vendor/yunion.io/x/jsonutils/.gitignore
generated
vendored
2
vendor/yunion.io/x/jsonutils/.gitignore
generated
vendored
@@ -11,3 +11,5 @@
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
.idea
|
||||
|
||||
out.gotext.json
|
||||
|
||||
6
vendor/yunion.io/x/jsonutils/errors.go
generated
vendored
6
vendor/yunion.io/x/jsonutils/errors.go
generated
vendored
@@ -6,7 +6,7 @@ import (
|
||||
"yunion.io/x/pkg/errors"
|
||||
)
|
||||
|
||||
var (
|
||||
const (
|
||||
ErrJsonDictFailInsert = errors.Error("fail to insert object")
|
||||
|
||||
ErrInvalidJsonDict = errors.Error("not a valid JSONDict")
|
||||
@@ -31,8 +31,8 @@ var (
|
||||
ErrInterfaceUnsupported = errors.Error("do not known how to deserialize json into this interface type")
|
||||
ErrMapKeyMustString = errors.Error("map key must be string")
|
||||
|
||||
ErrMisingInputField = errors.Error("missing input field")
|
||||
ErrNilInputField = errors.Error("nil input field")
|
||||
ErrMissingInputField = errors.Error("missing input field")
|
||||
ErrNilInputField = errors.Error("nil input field")
|
||||
|
||||
ErrYamlMissingDictKey = errors.Error("Cannot find JSONDict key")
|
||||
ErrYamlIllFormat = errors.Error("Illformat")
|
||||
|
||||
3
vendor/yunion.io/x/jsonutils/go.mod
generated
vendored
3
vendor/yunion.io/x/jsonutils/go.mod
generated
vendored
@@ -9,7 +9,8 @@ require (
|
||||
github.com/pkg/errors v0.8.1 // indirect
|
||||
github.com/sirupsen/logrus v1.4.2 // indirect
|
||||
golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4 // indirect
|
||||
golang.org/x/text v0.3.0
|
||||
gopkg.in/yaml.v2 v2.2.2 // indirect
|
||||
yunion.io/x/log v0.0.0-20190514041436-04ce53b17c6b
|
||||
yunion.io/x/pkg v0.0.0-20200708071451-a663dc94e16b
|
||||
yunion.io/x/pkg v0.0.0-20200814072949-4f1b541857d6
|
||||
)
|
||||
|
||||
5
vendor/yunion.io/x/jsonutils/go.sum
generated
vendored
5
vendor/yunion.io/x/jsonutils/go.sum
generated
vendored
@@ -28,6 +28,7 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
@@ -39,3 +40,7 @@ yunion.io/x/pkg v0.0.0-20200302034534-fdf44d54b070 h1:rKnYgtvMHKmzPEUTkyNjyKOG7w
|
||||
yunion.io/x/pkg v0.0.0-20200302034534-fdf44d54b070/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
|
||||
yunion.io/x/pkg v0.0.0-20200708071451-a663dc94e16b h1:wwPzH8iMRYjtaSM2pBN7nOqeZxR4XW5wdz2VE1KH/Ug=
|
||||
yunion.io/x/pkg v0.0.0-20200708071451-a663dc94e16b/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
|
||||
yunion.io/x/pkg v0.0.0-20200713121502-18154120c49b h1:Ov/eKwwNeQje7SggkopExzcCW/GfaUouvXkcY6RUEcM=
|
||||
yunion.io/x/pkg v0.0.0-20200713121502-18154120c49b/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
|
||||
yunion.io/x/pkg v0.0.0-20200814072949-4f1b541857d6 h1:UarEDTBGkgcgc+nc+PZ75uo9M9+jiOGd5P2B90TxDNw=
|
||||
yunion.io/x/pkg v0.0.0-20200814072949-4f1b541857d6/go.mod h1:t6rEGG2sQ4J7DhFxSZVOTjNd0YO/KlfWQyK1W4tog+E=
|
||||
|
||||
3
vendor/yunion.io/x/jsonutils/string.go
generated
vendored
3
vendor/yunion.io/x/jsonutils/string.go
generated
vendored
@@ -2,6 +2,7 @@ package jsonutils
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -18,7 +19,7 @@ func (this *JSONInt) String() string {
|
||||
}
|
||||
|
||||
func (this *JSONFloat) String() string {
|
||||
return fmt.Sprintf("%f", this.data)
|
||||
return strconv.FormatFloat(this.data, 'g', -1, 64)
|
||||
}
|
||||
|
||||
func (this *JSONBool) String() string {
|
||||
|
||||
4
vendor/yunion.io/x/jsonutils/utils.go
generated
vendored
4
vendor/yunion.io/x/jsonutils/utils.go
generated
vendored
@@ -60,7 +60,7 @@ func GetStringArray(o JSONObject, key ...string) ([]string, error) {
|
||||
}
|
||||
|
||||
func NewTimeString(tm time.Time) *JSONString {
|
||||
return NewString(tm.Format("2006-01-02T15:04:05Z"))
|
||||
return NewString(tm.UTC().Format("2006-01-02T15:04:05Z"))
|
||||
}
|
||||
|
||||
func GetQueryStringArray(query JSONObject, key string) []string {
|
||||
@@ -102,7 +102,7 @@ func CheckRequiredFields(data JSONObject, fields []string) error {
|
||||
for _, f := range fields {
|
||||
jsonVal, ok := jsonMap[f]
|
||||
if !ok {
|
||||
return errors.Wrap(ErrMisingInputField, f)
|
||||
return errors.Wrap(ErrMissingInputField, f)
|
||||
}
|
||||
if jsonVal == JSONNull {
|
||||
return errors.Wrap(ErrNilInputField, f)
|
||||
|
||||
4
vendor/yunion.io/x/pkg/util/reflectutils/ambiguous.go
generated
vendored
4
vendor/yunion.io/x/pkg/util/reflectutils/ambiguous.go
generated
vendored
@@ -19,8 +19,8 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
TAG_AMBIGUOUS_PREFIX = "yunion:ambiguous-prefix"
|
||||
TAG_DEPRECATED_BY = "yunion:deprecated-by"
|
||||
TAG_AMBIGUOUS_PREFIX = "yunion-ambiguous-prefix"
|
||||
TAG_DEPRECATED_BY = "yunion-deprecated-by"
|
||||
TAG_OLD_DEPRECATED_BY = "deprecated-by"
|
||||
)
|
||||
|
||||
|
||||
15
vendor/yunion.io/x/sqlchemy/.gitignore
generated
vendored
Normal file
15
vendor/yunion.io/x/sqlchemy/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
# Test binary, build with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
.idea
|
||||
|
||||
out.gotext.json
|
||||
68
vendor/yunion.io/x/sqlchemy/case.go
generated
vendored
Normal file
68
vendor/yunion.io/x/sqlchemy/case.go
generated
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
// Copyright 2019 Yunion
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package sqlchemy
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
)
|
||||
|
||||
type sCaseFieldBranch struct {
|
||||
whenCondition ICondition
|
||||
thenField IQueryField
|
||||
}
|
||||
|
||||
type SCaseFunction struct {
|
||||
branches []sCaseFieldBranch
|
||||
elseField IQueryField
|
||||
}
|
||||
|
||||
func NewFunction(ifunc IFunction, name string) IQueryField {
|
||||
return &SFunctionFieldBase{
|
||||
IFunction: ifunc,
|
||||
alias: name,
|
||||
}
|
||||
}
|
||||
|
||||
func (cf *SCaseFunction) Else(field IQueryField) *SCaseFunction {
|
||||
cf.elseField = field
|
||||
return cf
|
||||
}
|
||||
|
||||
func (cf *SCaseFunction) When(when ICondition, then IQueryField) *SCaseFunction {
|
||||
cf.branches = append(cf.branches, sCaseFieldBranch{
|
||||
whenCondition: when,
|
||||
thenField: then,
|
||||
})
|
||||
return cf
|
||||
}
|
||||
|
||||
func NewCase() *SCaseFunction {
|
||||
return &SCaseFunction{}
|
||||
}
|
||||
|
||||
func (cf *SCaseFunction) expression() string {
|
||||
var buf bytes.Buffer
|
||||
buf.WriteString("CASE ")
|
||||
for i := range cf.branches {
|
||||
buf.WriteString("WHEN ")
|
||||
buf.WriteString(cf.branches[i].whenCondition.WhereClause())
|
||||
buf.WriteString(" THEN ")
|
||||
buf.WriteString(cf.branches[i].thenField.Reference())
|
||||
}
|
||||
buf.WriteString(" ELSE ")
|
||||
buf.WriteString(cf.elseField.Reference())
|
||||
buf.WriteString(" END")
|
||||
return buf.String()
|
||||
}
|
||||
2
vendor/yunion.io/x/sqlchemy/field_update.go
generated
vendored
2
vendor/yunion.io/x/sqlchemy/field_update.go
generated
vendored
@@ -20,8 +20,8 @@ import (
|
||||
"reflect"
|
||||
|
||||
"yunion.io/x/log"
|
||||
"yunion.io/x/pkg/util/reflectutils"
|
||||
"yunion.io/x/pkg/errors"
|
||||
"yunion.io/x/pkg/util/reflectutils"
|
||||
)
|
||||
|
||||
/*
|
||||
|
||||
74
vendor/yunion.io/x/sqlchemy/functions.go
generated
vendored
74
vendor/yunion.io/x/sqlchemy/functions.go
generated
vendored
@@ -18,43 +18,59 @@ import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"yunion.io/x/log"
|
||||
)
|
||||
|
||||
type SFunctionField struct {
|
||||
fields []IQueryField
|
||||
function string
|
||||
alias string
|
||||
type IFunction interface {
|
||||
expression() string
|
||||
}
|
||||
|
||||
func (ff *SFunctionField) Expression() string {
|
||||
fieldRefs := make([]interface{}, 0)
|
||||
for _, f := range ff.fields {
|
||||
fieldRefs = append(fieldRefs, f.Reference())
|
||||
type SFunctionFieldBase struct {
|
||||
IFunction
|
||||
alias string
|
||||
}
|
||||
|
||||
func (ff *SFunctionFieldBase) Reference() string {
|
||||
if len(ff.alias) == 0 {
|
||||
log.Warningf("reference a function field without alias! %s", ff.expression())
|
||||
return ff.expression()
|
||||
} else {
|
||||
return fmt.Sprintf("`%s`", ff.alias)
|
||||
}
|
||||
return fmt.Sprintf("%s AS `%s`", fmt.Sprintf(ff.function, fieldRefs...), ff.Name())
|
||||
}
|
||||
|
||||
func (ff *SFunctionField) Name() string {
|
||||
return ff.alias
|
||||
func (ff *SFunctionFieldBase) Expression() string {
|
||||
if len(ff.alias) > 0 {
|
||||
// add alias
|
||||
return fmt.Sprintf("%s AS `%s`", ff.expression(), ff.alias)
|
||||
} else {
|
||||
// no alias
|
||||
return ff.expression()
|
||||
}
|
||||
}
|
||||
|
||||
func (ff *SFunctionField) Reference() string {
|
||||
return ff.alias
|
||||
func (ff *SFunctionFieldBase) Name() string {
|
||||
if len(ff.alias) > 0 {
|
||||
return ff.alias
|
||||
} else {
|
||||
return ff.expression()
|
||||
}
|
||||
}
|
||||
|
||||
func (ff *SFunctionField) Label(label string) IQueryField {
|
||||
func (ff *SFunctionFieldBase) Label(label string) IQueryField {
|
||||
if len(label) > 0 && label != ff.alias {
|
||||
ff.alias = label
|
||||
}
|
||||
return ff
|
||||
}
|
||||
|
||||
type SFunctionFieldWithoutAlias struct {
|
||||
type SExprFunction struct {
|
||||
fields []IQueryField
|
||||
function string
|
||||
}
|
||||
|
||||
func (ff *SFunctionFieldWithoutAlias) Expression() string {
|
||||
func (ff *SExprFunction) expression() string {
|
||||
fieldRefs := make([]interface{}, 0)
|
||||
for _, f := range ff.fields {
|
||||
fieldRefs = append(fieldRefs, f.Reference())
|
||||
@@ -62,26 +78,14 @@ func (ff *SFunctionFieldWithoutAlias) Expression() string {
|
||||
return fmt.Sprintf(ff.function, fieldRefs...)
|
||||
}
|
||||
|
||||
func (ff *SFunctionFieldWithoutAlias) Name() string {
|
||||
return ff.Expression()
|
||||
}
|
||||
|
||||
func (ff *SFunctionFieldWithoutAlias) Reference() string {
|
||||
return ff.Expression()
|
||||
}
|
||||
|
||||
func (ff *SFunctionFieldWithoutAlias) Label(label string) IQueryField {
|
||||
if len(label) > 0 {
|
||||
return &SFunctionField{ff.fields, ff.function, label}
|
||||
}
|
||||
return ff
|
||||
}
|
||||
|
||||
func NewFunctionField(name string, funcexp string, fields ...IQueryField) IQueryField {
|
||||
if len(name) > 0 {
|
||||
return &SFunctionField{function: funcexp, alias: name, fields: fields}
|
||||
} else {
|
||||
return &SFunctionFieldWithoutAlias{fields: fields, function: funcexp}
|
||||
funcBase := &SExprFunction{
|
||||
fields: fields,
|
||||
function: funcexp,
|
||||
}
|
||||
return &SFunctionFieldBase{
|
||||
IFunction: funcBase,
|
||||
alias: name,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
4
vendor/yunion.io/x/sqlchemy/query.go
generated
vendored
4
vendor/yunion.io/x/sqlchemy/query.go
generated
vendored
@@ -516,6 +516,10 @@ func (tq *SQuery) findField(name string) IQueryField {
|
||||
func (tq *SQuery) internalFindField(name string) IQueryField {
|
||||
for _, f := range tq.fields {
|
||||
if f.Name() == name {
|
||||
// switch f.(type) {
|
||||
// case *SFunctionFieldBase:
|
||||
// log.Warningf("cannot directly reference a function alias, should use Subquery() to enclose the query")
|
||||
// }
|
||||
return f
|
||||
}
|
||||
}
|
||||
|
||||
10
vendor/yunion.io/x/structarg/structarg.go
generated
vendored
10
vendor/yunion.io/x/structarg/structarg.go
generated
vendored
@@ -192,6 +192,10 @@ const (
|
||||
Token for negative value, applicable to boolean values
|
||||
*/
|
||||
TAG_NEGATIVE_TOKEN = "negative"
|
||||
/*
|
||||
Token for ignore
|
||||
*/
|
||||
TAG_IGNORE = "ignore"
|
||||
)
|
||||
|
||||
func (this *ArgumentParser) addStructArgument(prefix string, tpVal reflect.Value) error {
|
||||
@@ -228,6 +232,10 @@ func (this *ArgumentParser) addArgument(prefix string, fv reflect.Value, info *r
|
||||
// deprecated field, ignore
|
||||
return nil
|
||||
}
|
||||
if val, ok := tagMap[TAG_IGNORE]; ok && val == "true" {
|
||||
// ignore field
|
||||
return nil
|
||||
}
|
||||
help := tagMap[TAG_HELP]
|
||||
token, ok := tagMap[TAG_TOKEN]
|
||||
if !ok {
|
||||
@@ -507,7 +515,7 @@ func (this *SingleArgument) ShortToken() string {
|
||||
}
|
||||
|
||||
func (this *SingleArgument) NegativeToken() string {
|
||||
return this.negaToken
|
||||
return strings.ReplaceAll(this.negaToken, "_", "-")
|
||||
}
|
||||
|
||||
func (this *SingleArgument) String() string {
|
||||
|
||||
Reference in New Issue
Block a user