From e306a4e23fac22d2e28aa12bafd1f675bacef660 Mon Sep 17 00:00:00 2001 From: Qu Xuan Date: Mon, 18 May 2020 15:29:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E8=BF=87=E6=BB=A4=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/mcclient/modules/mod_metadatas.go | 45 ++++++++++++++++++++++----- pkg/mcclient/options/metadata.go | 2 +- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/pkg/mcclient/modules/mod_metadatas.go b/pkg/mcclient/modules/mod_metadatas.go index 0cc203028f..87a6a55c1d 100644 --- a/pkg/mcclient/modules/mod_metadatas.go +++ b/pkg/mcclient/modules/mod_metadatas.go @@ -15,6 +15,8 @@ package modules import ( + "strings" + "yunion.io/x/jsonutils" "yunion.io/x/onecloud/pkg/httperrors" @@ -37,16 +39,43 @@ func init() { registerCompute(&Metadatas) } -func (this *MetadataManager) getModule(session *mcclient.ClientSession, params jsonutils.JSONObject) (*modulebase.ResourceManager, error) { - service, _ := params.GetString("service") - if len(service) > 0 { - _, err := session.GetServiceURL(service, "") - if err != nil { - return nil, httperrors.NewNotFoundError("service %s not found error: %v", service, err) - } +func (this *MetadataManager) getModule(session *mcclient.ClientSession, params jsonutils.JSONObject) (modulebase.Manager, error) { + service := "compute_v2" + if params.Contains("service") { + service, _ = params.GetString("service") } else { - service = "compute" + // 若参数有resources,可根据资源类型自动判断服务类型 + resources := []string{} + if params.Contains("resources") { // yunionapi + err := params.Unmarshal(&resources, "resources") + if err != nil { + return nil, httperrors.NewInputParameterError("invalid resources format") + } + } else if params.Contains("resources.0") { // climc + resource, _ := params.GetString("resources.0") + if len(resource) > 0 { + resources = append(resources, resource) + } + } + if len(resources) >= 1 { + resource := resources[0] + keyString := resource + "s" + if strings.HasSuffix(resource, "y") { + keyString = resource[:len(resource)-1] + "ies" + } + mod, err := modulebase.GetModule(session, keyString) + if err != nil { + return nil, err + } + service = mod.ServiceType() + } } + + _, err := session.GetServiceURL(service, "") + if err != nil { + return nil, httperrors.NewNotFoundError("service %s not found error: %v", service, err) + } + return &modulebase.ResourceManager{ BaseManager: *modulebase.NewBaseManager(service, "", "", []string{}, []string{}), Keyword: "metadata", KeywordPlural: "metadatas", diff --git a/pkg/mcclient/options/metadata.go b/pkg/mcclient/options/metadata.go index 10b387922a..ed8af79754 100644 --- a/pkg/mcclient/options/metadata.go +++ b/pkg/mcclient/options/metadata.go @@ -16,7 +16,7 @@ package options type MetadataListOptions struct { Resources []string `help:"list of resource e.g server、disk、eip、snapshot, empty will show all metadata"` - Service string `help:"service type" default:"compute"` + Service string `help:"service type"` SysMeta *bool `help:"Show sys metadata only"` CloudMeta *bool `help:"Show cloud metadata olny"`