diff --git a/cmd/climc/shell/metadata.go b/cmd/climc/shell/metadata.go index 4e38187d4b..3409346b29 100644 --- a/cmd/climc/shell/metadata.go +++ b/cmd/climc/shell/metadata.go @@ -33,4 +33,17 @@ func init() { printList(result, []string{}) return nil }) + + R(&options.TagListOptions{}, "tag-list", "List tags", func(s *mcclient.ClientSession, opts *options.TagListOptions) error { + params, err := options.ListStructToParams(opts) + if err != nil { + return err + } + result, err := modules.Metadatas.Get(s, "tag-value-pairs", params) + if err != nil { + return err + } + printObject(result) + return nil + }) } diff --git a/pkg/cloudcommon/db/metadata.go b/pkg/cloudcommon/db/metadata.go index e91f3169d0..9e714f2347 100644 --- a/pkg/cloudcommon/db/metadata.go +++ b/pkg/cloudcommon/db/metadata.go @@ -102,6 +102,32 @@ func (m *SMetadata) Delete(ctx context.Context, userCred mcclient.TokenCredentia return DeleteModel(ctx, userCred, m) } +func (manager *SMetadataManager) AllowGetPropertyTagValuePairs(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) bool { + return true +} + +func (manager *SMetadataManager) GetPropertyTagValuePairs(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (jsonutils.JSONObject, error) { + q := manager.Query("key", "value").Distinct() + sql, err := manager.ListItemFilter(ctx, q, userCred, query) + if err != nil { + return nil, err + } + metadatas := []SMetadata{} + err = sql.All(&metadatas) + if err != nil { + return nil, err + } + result := map[string][]string{} + for i := 0; i < len(metadatas); i++ { + key, value := metadatas[i].Key, metadatas[i].Value + if _, ok := result[key]; !ok { + result[key] = []string{} + } + result[key] = append(result[key], value) + } + return jsonutils.Marshal(result), nil +} + func (manager *SMetadataManager) AllowListItems(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) bool { return true } diff --git a/pkg/mcclient/options/metadata.go b/pkg/mcclient/options/metadata.go index 6c1f03cd7f..0e4d1f6286 100644 --- a/pkg/mcclient/options/metadata.go +++ b/pkg/mcclient/options/metadata.go @@ -21,3 +21,5 @@ type MetadataListOptions struct { UserMeta *bool `help:"Show user metadata olny"` Admin *bool `help:"Show all metadata"` } + +type TagListOptions MetadataListOptions