Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cmd/products.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

152 changes: 152 additions & 0 deletions products/umodelverse/internal/umodelverse/api.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
package umodelverse

import (
"encoding/json"
"fmt"
"sort"

uai "github.com/ucloud/ucloud-sdk-go/services/uai_modelverse"
"github.com/ucloud/ucloud-sdk-go/ucloud/request"
"github.com/ucloud/ucloud-sdk-go/ucloud/response"

"github.com/ucloud/ucloud-cli/pkg/cli"
)

const productName = "umodelverse"

type apiResponse struct {
response.BaseGenericResponse
}

func newClient(ctx *cli.Context) *uai.UAI_ModelverseClient {
return cli.NewServiceClient(ctx, uai.NewClient)
}

func newRequest(client *uai.UAI_ModelverseClient, req request.Common, retryable bool) {
client.Client.SetupRequest(req)
req.SetRetryable(retryable)
}

func invokeUMAction(client *uai.UAI_ModelverseClient, action string, req request.Common) (*apiResponse, error) {
var resp apiResponse
err := client.Client.InvokeAction(action, req, &resp)
return &resp, err
}

func printResponse(ctx *cli.Context, resp *apiResponse) {
payload := resp.GetPayload()
if ctx.Format() != cli.OutputTable {
ctx.PrintList(payload)
return
}

keys := make([]string, 0, len(payload))
for key := range payload {
keys = append(keys, key)
}
sort.Strings(keys)

rows := make([]fieldRow, 0, len(keys))
for _, key := range keys {
rows = append(rows, fieldRow{Field: key, Value: renderValue(payload[key])})
}
ctx.PrintList(rows)
}

func renderValue(v interface{}) string {
switch val := v.(type) {
case nil:
return ""
case string:
return val
case float64, bool:
return fmt.Sprintf("%v", val)
default:
b, err := json.Marshal(val)
if err != nil {
return fmt.Sprintf("%v", val)
}
return string(b)
}
}

type apiKeyRequest struct {
request.CommonBase

KeyId *string `required:"false"`
Name *string `required:"false"`
Status *int `required:"false"`
ModelverseDisabled *int `required:"false"`
SandBoxDisabled *int `required:"false"`
DailyLimitAmount *string `required:"false"`
MonthlyLimitAmount *string `required:"false"`
ExpireTime *int64 `required:"false"`
GrantAllModels *bool `required:"false"`
GrantedModels *string `required:"false"`
IPWhitelist *string `required:"false"`
DailyQuotaAlertThreshold *int `required:"false"`
MonthlyQuotaAlertThreshold *int `required:"false"`
QuotaAlertChannels *string `required:"false"`
QuotaAlertEmail *string `required:"false"`
QuotaAlertPhone *string `required:"false"`
QuotaAlertEmailVerificationToken *string `required:"false"`
QuotaAlertPhoneVerificationToken *string `required:"false"`
Offset *int `required:"false"`
Limit *int `required:"false"`
}

type squareModelRequest struct {
request.CommonBase

ModelType *string `required:"false"`
KeyWord *string `required:"false"`
Offset *int `required:"false"`
Limit *int `required:"false"`
OrderBy *string `required:"false"`
Order *string `required:"false"`
MaxModelLen *string `required:"false"`
Language *string `required:"false"`
}

type requestLogRequest struct {
request.CommonBase

StartTime *int64 `required:"false"`
EndTime *int64 `required:"false"`
Email *string `required:"false"`
RequestId *string `required:"false"`
ModelNames *string `required:"false"`
ApiKeyIds *string `required:"false"`
Offset *int `required:"false"`
Limit *int `required:"false"`
}

type logDetailRequest struct {
request.CommonBase

RequestId *string `required:"true"`
}

type orderRequest struct {
request.CommonBase

StartTime *int64 `required:"false"`
EndTime *int64 `required:"false"`
Page *int `required:"false"`
PageSize *int `required:"false"`
ResourceIds []string `required:"false"`
ModelIds []string `required:"false"`
PricingUnits []int `required:"false"`
PricingSkus []string `required:"false"`
OrderTypes []int `required:"false"`
ChargeTypes []int `required:"false"`
OrganizationIds []int `required:"false"`
Regions []string `required:"false"`
ProductCodes []string `required:"false"`
}

type filterOptionsRequest struct {
request.CommonBase

ProductCode *string `required:"false"`
}
21 changes: 21 additions & 0 deletions products/umodelverse/internal/umodelverse/apikey.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package umodelverse

import (
"github.com/spf13/cobra"

"github.com/ucloud/ucloud-cli/pkg/cli"
)

func newAPIKey(ctx *cli.Context) *cobra.Command {
cmd := &cobra.Command{
Use: "apikey",
Short: "Manage uModelVerse API keys",
Long: "Manage uModelVerse API keys.",
Args: cobra.NoArgs,
}
cmd.AddCommand(newAPIKeyCreate(ctx))
cmd.AddCommand(newAPIKeyDelete(ctx))
cmd.AddCommand(newAPIKeyUpdate(ctx))
cmd.AddCommand(newAPIKeyList(ctx))
return cmd
}
75 changes: 75 additions & 0 deletions products/umodelverse/internal/umodelverse/apikey_create.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package umodelverse

import (
"fmt"

"github.com/spf13/cobra"
sdk "github.com/ucloud/ucloud-sdk-go/ucloud"

"github.com/ucloud/ucloud-cli/pkg/cli"
)

func newAPIKeyCreate(ctx *cli.Context) *cobra.Command {
client := newClient(ctx)
req := &apiKeyRequest{}
newRequest(client, req, false)
var grantedModels []string
var quotaAlertChannels []string

cmd := &cobra.Command{
Use: "create",
Short: "Create a uModelVerse API key",
Long: "Create a uModelVerse API key.",
Run: func(c *cobra.Command, args []string) {
flags := c.Flags()
clearIntIfUnchanged(flags, "modelverse-disabled", &req.ModelverseDisabled)
clearIntIfUnchanged(flags, "sandbox-disabled", &req.SandBoxDisabled)
clearStringIfUnchanged(flags, "daily-limit-amount", &req.DailyLimitAmount)
clearStringIfUnchanged(flags, "monthly-limit-amount", &req.MonthlyLimitAmount)
clearInt64IfUnchanged(flags, "expire-time", &req.ExpireTime)
clearBoolIfUnchanged(flags, "grant-all-models", &req.GrantAllModels)
req.GrantedModels = stringSliceJSONRef(grantedModels)
clearStringIfUnchanged(flags, "ip-whitelist", &req.IPWhitelist)
clearIntIfUnchanged(flags, "daily-quota-alert-threshold", &req.DailyQuotaAlertThreshold)
clearIntIfUnchanged(flags, "monthly-quota-alert-threshold", &req.MonthlyQuotaAlertThreshold)
req.QuotaAlertChannels = stringSliceJSONRef(quotaAlertChannels)
clearStringIfUnchanged(flags, "quota-alert-email", &req.QuotaAlertEmail)
clearStringIfUnchanged(flags, "quota-alert-phone", &req.QuotaAlertPhone)
clearStringIfUnchanged(flags, "quota-alert-email-verification-token", &req.QuotaAlertEmailVerificationToken)
clearStringIfUnchanged(flags, "quota-alert-phone-verification-token", &req.QuotaAlertPhoneVerificationToken)
if req.IPWhitelist != nil {
req.IPWhitelist = sdk.String(cleanMultilineFlag(*req.IPWhitelist))
}
resp, err := invokeUMAction(client, "CreateUMInferAPIKey", req)
if err != nil {
ctx.HandleError(err)
return
}
fmt.Fprintln(ctx.ProgressWriter(), "umodelverse apikey created")
printResponse(ctx, resp)
},
}

flags := cmd.Flags()
flags.SortFlags = false
req.Name = flags.String("name", "", "Required. API key name.")
req.ModelverseDisabled = flags.Int("modelverse-disabled", 0, "Optional. Whether ModelVerse is disabled: 0 enabled, 1 disabled.")
req.SandBoxDisabled = flags.Int("sandbox-disabled", 0, "Optional. Whether sandbox is disabled: 0 enabled, 1 disabled.")
req.DailyLimitAmount = flags.String("daily-limit-amount", "", "Optional. Daily limit amount.")
req.MonthlyLimitAmount = flags.String("monthly-limit-amount", "", "Optional. Monthly limit amount.")
req.ExpireTime = flags.Int64("expire-time", 0, "Optional. API key expire time, Unix timestamp. Use -1 for never expire.")
req.GrantAllModels = flags.Bool("grant-all-models", true, "Optional. Grant access to all models.")
flags.StringSliceVar(&grantedModels, "granted-models", nil, "Optional. Granted model IDs when --grant-all-models=false. Can be repeated, comma-separated, or a JSON array string.")
req.IPWhitelist = flags.String("ip-whitelist", "", "Optional. IP whitelist, newline-separated; literal \\n is also accepted.")
req.DailyQuotaAlertThreshold = flags.Int("daily-quota-alert-threshold", 0, "Optional. Daily quota alert threshold.")
req.MonthlyQuotaAlertThreshold = flags.Int("monthly-quota-alert-threshold", 0, "Optional. Monthly quota alert threshold.")
flags.StringSliceVar(&quotaAlertChannels, "quota-alert-channel", nil, "Optional. Quota alert channel, e.g. email or sms. Can be repeated or comma-separated.")
req.QuotaAlertEmail = flags.String("quota-alert-email", "", "Optional. Email address for quota alerts.")
req.QuotaAlertPhone = flags.String("quota-alert-phone", "", "Optional. Phone number for quota alerts.")
req.QuotaAlertEmailVerificationToken = flags.String("quota-alert-email-verification-token", "", "Optional. Email verification token for quota alerts.")
req.QuotaAlertPhoneVerificationToken = flags.String("quota-alert-phone-verification-token", "", "Optional. Phone verification token for quota alerts.")
bindProject(cmd, req, ctx.DefaultProjectID())

cmd.MarkFlagRequired("name")
return cmd
}
51 changes: 51 additions & 0 deletions products/umodelverse/internal/umodelverse/apikey_delete.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package umodelverse

import (
"fmt"

"github.com/spf13/cobra"
sdk "github.com/ucloud/ucloud-sdk-go/ucloud"

"github.com/ucloud/ucloud-cli/pkg/cli"
)

func newAPIKeyDelete(ctx *cli.Context) *cobra.Command {
client := newClient(ctx)
req := &apiKeyRequest{}
newRequest(client, req, true)

var yes bool

cmd := &cobra.Command{
Use: "delete",
Short: "Delete a uModelVerse API key",
Long: "Delete a uModelVerse API key by key ID.",
Run: func(c *cobra.Command, args []string) {
id := ctx.PickResourceID(*req.KeyId)
ok, err := ctx.Confirm(yes, fmt.Sprintf("Are you sure you want to delete API key %s?", id))
if err != nil {
ctx.HandleError(err)
return
}
if !ok {
return
}
req.KeyId = sdk.String(id)
if _, err := invokeUMAction(client, "DeleteUMInferAPIKey", req); err != nil {
ctx.HandleError(err)
return
}
fmt.Fprintf(ctx.ProgressWriter(), "umodelverse apikey[%s] deleted\n", id)
ctx.EmitResult(cli.OpResultRow{ResourceID: id, Action: "delete", Status: "Deleted"})
},
}

flags := cmd.Flags()
flags.SortFlags = false
req.KeyId = flags.String("key-id", "", "Required. API key ID to delete.")
flags.BoolVarP(&yes, "yes", "y", false, "Optional. Skip the confirmation prompt.")
bindProject(cmd, req, ctx.DefaultProjectID())

cmd.MarkFlagRequired("key-id")
return cmd
}
41 changes: 41 additions & 0 deletions products/umodelverse/internal/umodelverse/apikey_list.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package umodelverse

import (
"github.com/spf13/cobra"

"github.com/ucloud/ucloud-cli/pkg/cli"
)

func newAPIKeyList(ctx *cli.Context) *cobra.Command {
client := newClient(ctx)
req := &apiKeyRequest{}
newRequest(client, req, true)

cmd := &cobra.Command{
Use: "list",
Short: "List uModelVerse API keys",
Long: "List uModelVerse API keys.",
Run: func(c *cobra.Command, args []string) {
flags := c.Flags()
clearStringIfUnchanged(flags, "key-id", &req.KeyId)
clearIntIfUnchanged(flags, "modelverse-disabled", &req.ModelverseDisabled)
clearIntIfUnchanged(flags, "sandbox-disabled", &req.SandBoxDisabled)
resp, err := invokeUMAction(client, "ListUMInferAPIKey", req)
if err != nil {
ctx.HandleError(err)
return
}
printResponse(ctx, resp)
},
}

flags := cmd.Flags()
flags.SortFlags = false
req.KeyId = flags.String("key-id", "", "Optional. API key ID filter.")
req.Offset = flags.Int("offset", 0, "Optional. The index of API key which start to list.")
req.Limit = flags.Int("limit", 20, "Optional. The maximum number of API keys per page.")
req.ModelverseDisabled = flags.Int("modelverse-disabled", 0, "Optional. Whether ModelVerse is disabled: 0 enabled, 1 disabled.")
req.SandBoxDisabled = flags.Int("sandbox-disabled", 0, "Optional. Whether sandbox is disabled: 0 enabled, 1 disabled.")
bindProject(cmd, req, ctx.DefaultProjectID())
return cmd
}
Loading
Loading