github.com/qiniu/go-sdk/v7@v7.27.0/sandbox/types.go (about)

     1  package sandbox
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/qiniu/go-sdk/v7/sandbox/internal/apis"
     7  )
     8  
     9  // ---------------------------------------------------------------------------
    10  // SDK 自有类型 — 沙箱相关
    11  // ---------------------------------------------------------------------------
    12  
    13  // Metadata 沙箱自定义元数据(key-value)。
    14  type Metadata map[string]string
    15  
    16  // NetworkConfig 沙箱网络配置。
    17  type NetworkConfig struct {
    18  	// AllowOut 允许的出站流量 CIDR 列表。
    19  	AllowOut *[]string
    20  
    21  	// AllowPublicTraffic 是否允许公共流量访问沙箱 URL。
    22  	AllowPublicTraffic *bool
    23  
    24  	// DenyOut 拒绝的出站流量 CIDR 列表。
    25  	DenyOut *[]string
    26  
    27  	// MaskRequestHost 用于沙箱请求的 host 掩码。
    28  	MaskRequestHost *string
    29  }
    30  
    31  // SandboxState 沙箱状态。
    32  type SandboxState string
    33  
    34  // 沙箱状态常量。
    35  const (
    36  	StateRunning SandboxState = "running"
    37  	StatePaused  SandboxState = "paused"
    38  )
    39  
    40  // CreateParams 创建沙箱的请求参数。
    41  type CreateParams struct {
    42  	// TemplateID 模板 ID(必填)。
    43  	TemplateID string
    44  
    45  	// Timeout 沙箱超时时间(秒),可选。
    46  	Timeout *int32
    47  
    48  	// AutoPause 超时后自动暂停,可选。
    49  	AutoPause *bool
    50  
    51  	// AllowInternetAccess 允许沙箱访问互联网,可选。
    52  	AllowInternetAccess *bool
    53  
    54  	// Secure 安全通信模式,可选。
    55  	Secure *bool
    56  
    57  	// EnvVars 环境变量,可选。
    58  	EnvVars *map[string]string
    59  
    60  	// Metadata 自定义元数据,可选。
    61  	Metadata *Metadata
    62  
    63  	// Network 网络配置,可选。
    64  	Network *NetworkConfig
    65  
    66  	// Injections 针对出站 HTTPS 请求的注入规则列表,可选。
    67  	// 每项可引用已保存的注入规则 ID,或直接指定注入配置。
    68  	Injections *[]SandboxInjectionSpec
    69  
    70  	// Resources 沙箱启动前需挂载的资源列表,可选。
    71  	// 平台会在沙箱启动前完成资源物化(如 GitHub 仓库克隆)。
    72  	Resources *[]SandboxResourceSpec
    73  
    74  	// IdempotencyKey 幂等键,可选。默认自动生成。
    75  	// 同一团队内重试不确定的请求时使用相同的 Key 和请求体,
    76  	// 可保证不会重复创建沙箱。
    77  	IdempotencyKey string
    78  }
    79  
    80  func (p CreateParams) hasKodoResource() bool {
    81  	if p.Resources == nil {
    82  		return false
    83  	}
    84  	for _, resource := range *p.Resources {
    85  		if resource.Kodo != nil {
    86  			return true
    87  		}
    88  	}
    89  	return false
    90  }
    91  
    92  // ConnectParams 连接沙箱的请求参数。
    93  type ConnectParams struct {
    94  	// Timeout 超时时间(秒)。
    95  	Timeout int32
    96  }
    97  
    98  // RefreshParams 延长沙箱存活时间的请求参数。
    99  type RefreshParams struct {
   100  	// Duration 延长的秒数,可选。
   101  	Duration *int
   102  }
   103  
   104  // ListParams 列出沙箱的查询参数,支持分页和状态过滤。
   105  type ListParams struct {
   106  	// Metadata 用于过滤沙箱的元数据查询(如 "user=abc&app=prod")。
   107  	Metadata *string
   108  
   109  	// Template 按一个或多个模板 ID 或名称过滤沙箱,最多 20 个值。
   110  	Template *[]string
   111  
   112  	// State 按一个或多个状态过滤沙箱。
   113  	State *[]SandboxState
   114  
   115  	// NextToken 分页游标。
   116  	NextToken *string
   117  
   118  	// Limit 每页最大返回数。
   119  	Limit *int32
   120  }
   121  
   122  // GetMetricsParams 获取沙箱指标的查询参数。
   123  type GetMetricsParams struct {
   124  	// Start 起始时间的 Unix 时间戳(秒)。
   125  	Start *int64
   126  
   127  	// End 结束时间的 Unix 时间戳(秒)。
   128  	End *int64
   129  }
   130  
   131  func (p *GetMetricsParams) toAPI() *apis.GetSandboxMetricsParams {
   132  	if p == nil {
   133  		return nil
   134  	}
   135  	return &apis.GetSandboxMetricsParams{
   136  		Start: p.Start,
   137  		End:   p.End,
   138  	}
   139  }
   140  
   141  // GetLogsParams 获取沙箱日志的查询参数。
   142  type GetLogsParams struct {
   143  	// Start 日志起始时间的毫秒级时间戳。
   144  	Start *int64
   145  
   146  	// Limit 返回的最大日志条数。
   147  	Limit *int32
   148  }
   149  
   150  func (p *GetLogsParams) toAPI() *apis.GetSandboxLogsParams {
   151  	if p == nil {
   152  		return nil
   153  	}
   154  	return &apis.GetSandboxLogsParams{
   155  		Start: p.Start,
   156  		Limit: p.Limit,
   157  	}
   158  }
   159  
   160  // GetSandboxesMetricsParams 批量获取沙箱指标的查询参数。
   161  type GetSandboxesMetricsParams struct {
   162  	// SandboxIds 要获取指标的沙箱 ID 列表。
   163  	SandboxIds []string
   164  }
   165  
   166  func (p *GetSandboxesMetricsParams) toAPI() *apis.GetSandboxesMetricsParams {
   167  	if p == nil {
   168  		return nil
   169  	}
   170  	return &apis.GetSandboxesMetricsParams{
   171  		SandboxIds: p.SandboxIds,
   172  	}
   173  }
   174  
   175  // SandboxInfo 沙箱详细信息。
   176  type SandboxInfo struct {
   177  	SandboxID   string
   178  	TemplateID  string
   179  	ClientID    string
   180  	Alias       *string
   181  	Domain      *string
   182  	State       SandboxState
   183  	CPUCount    int32
   184  	MemoryMB    int32
   185  	DiskSizeMB  int32
   186  	EnvdVersion string
   187  	StartedAt   time.Time
   188  	EndAt       time.Time
   189  	Metadata    *Metadata
   190  }
   191  
   192  // ListedSandbox 沙箱列表中的条目。
   193  type ListedSandbox struct {
   194  	SandboxID   string
   195  	TemplateID  string
   196  	ClientID    string
   197  	Alias       *string
   198  	State       SandboxState
   199  	CPUCount    int32
   200  	MemoryMB    int32
   201  	DiskSizeMB  int32
   202  	EnvdVersion string
   203  	StartedAt   time.Time
   204  	EndAt       time.Time
   205  	Metadata    *Metadata
   206  }
   207  
   208  // SandboxMetric 沙箱资源指标。
   209  type SandboxMetric struct {
   210  	CPUCount      int32
   211  	CPUUsedPct    float32
   212  	MemTotal      int64
   213  	MemUsed       int64
   214  	DiskTotal     int64
   215  	DiskUsed      int64
   216  	Timestamp     time.Time
   217  	TimestampUnix int64
   218  }
   219  
   220  // SandboxLogs 沙箱日志。
   221  type SandboxLogs struct {
   222  	Logs       []SandboxLog
   223  	LogEntries []SandboxLogEntry
   224  }
   225  
   226  // SandboxLog 沙箱日志条目。
   227  type SandboxLog struct {
   228  	Line      string
   229  	Timestamp time.Time
   230  }
   231  
   232  // SandboxLogEntry 结构化沙箱日志条目。
   233  type SandboxLogEntry struct {
   234  	Level     LogLevel
   235  	Message   string
   236  	Fields    map[string]string
   237  	Timestamp time.Time
   238  }
   239  
   240  // SandboxesWithMetrics 批量沙箱指标数据。
   241  type SandboxesWithMetrics struct {
   242  	Sandboxes map[string]SandboxMetric
   243  }
   244  
   245  // ---------------------------------------------------------------------------
   246  // 转换函数 — apis → SDK
   247  // ---------------------------------------------------------------------------
   248  
   249  func sandboxInfoFromAPI(d *apis.SandboxDetail) *SandboxInfo {
   250  	if d == nil {
   251  		return nil
   252  	}
   253  	info := &SandboxInfo{
   254  		SandboxID:   d.SandboxID,
   255  		TemplateID:  d.TemplateID,
   256  		ClientID:    d.ClientID,
   257  		Alias:       d.Alias,
   258  		Domain:      d.Domain,
   259  		State:       SandboxState(d.State),
   260  		CPUCount:    d.CPUCount,
   261  		MemoryMB:    d.MemoryMB,
   262  		DiskSizeMB:  d.DiskSizeMB,
   263  		EnvdVersion: d.EnvdVersion,
   264  		StartedAt:   d.StartedAt,
   265  		EndAt:       d.EndAt,
   266  	}
   267  	if d.Metadata != nil {
   268  		m := Metadata(*d.Metadata)
   269  		info.Metadata = &m
   270  	}
   271  	return info
   272  }
   273  
   274  func listedSandboxFromAPI(a apis.ListedSandbox) ListedSandbox {
   275  	ls := ListedSandbox{
   276  		SandboxID:   a.SandboxID,
   277  		TemplateID:  a.TemplateID,
   278  		ClientID:    a.ClientID,
   279  		Alias:       a.Alias,
   280  		State:       SandboxState(a.State),
   281  		CPUCount:    a.CPUCount,
   282  		MemoryMB:    a.MemoryMB,
   283  		DiskSizeMB:  a.DiskSizeMB,
   284  		EnvdVersion: a.EnvdVersion,
   285  		StartedAt:   a.StartedAt,
   286  		EndAt:       a.EndAt,
   287  	}
   288  	if a.Metadata != nil {
   289  		m := Metadata(*a.Metadata)
   290  		ls.Metadata = &m
   291  	}
   292  	return ls
   293  }
   294  
   295  func listedSandboxesFromAPI(a []apis.ListedSandbox) []ListedSandbox {
   296  	if a == nil {
   297  		return nil
   298  	}
   299  	result := make([]ListedSandbox, len(a))
   300  	for i, s := range a {
   301  		result[i] = listedSandboxFromAPI(s)
   302  	}
   303  	return result
   304  }
   305  
   306  func sandboxMetricFromAPI(a apis.SandboxMetric) SandboxMetric {
   307  	return SandboxMetric{
   308  		CPUCount:      a.CPUCount,
   309  		CPUUsedPct:    a.CPUUsedPct,
   310  		MemTotal:      a.MemTotal,
   311  		MemUsed:       a.MemUsed,
   312  		DiskTotal:     a.DiskTotal,
   313  		DiskUsed:      a.DiskUsed,
   314  		Timestamp:     a.Timestamp,
   315  		TimestampUnix: a.TimestampUnix,
   316  	}
   317  }
   318  
   319  func sandboxMetricsFromAPI(a []apis.SandboxMetric) []SandboxMetric {
   320  	if a == nil {
   321  		return nil
   322  	}
   323  	result := make([]SandboxMetric, len(a))
   324  	for i, m := range a {
   325  		result[i] = sandboxMetricFromAPI(m)
   326  	}
   327  	return result
   328  }
   329  
   330  func sandboxLogsFromAPI(a *apis.SandboxLogs) *SandboxLogs {
   331  	if a == nil {
   332  		return nil
   333  	}
   334  	result := &SandboxLogs{
   335  		Logs:       make([]SandboxLog, 0, len(a.Logs)),
   336  		LogEntries: make([]SandboxLogEntry, 0, len(a.LogEntries)),
   337  	}
   338  	for _, l := range a.Logs {
   339  		result.Logs = append(result.Logs, SandboxLog{Line: l.Line, Timestamp: l.Timestamp})
   340  	}
   341  	for _, e := range a.LogEntries {
   342  		result.LogEntries = append(result.LogEntries, SandboxLogEntry{
   343  			Level:     LogLevel(e.Level),
   344  			Message:   e.Message,
   345  			Fields:    e.Fields,
   346  			Timestamp: e.Timestamp,
   347  		})
   348  	}
   349  	return result
   350  }
   351  
   352  func sandboxesWithMetricsFromAPI(a *apis.SandboxesWithMetrics) *SandboxesWithMetrics {
   353  	if a == nil {
   354  		return nil
   355  	}
   356  	result := &SandboxesWithMetrics{Sandboxes: make(map[string]SandboxMetric, len(a.Sandboxes))}
   357  	for k, v := range a.Sandboxes {
   358  		result.Sandboxes[k] = sandboxMetricFromAPI(v)
   359  	}
   360  	return result
   361  }
   362  
   363  // ---------------------------------------------------------------------------
   364  // 转换函数 — SDK → apis
   365  // ---------------------------------------------------------------------------
   366  
   367  func (p *CreateParams) toAPI() (apis.CreateSandboxJSONRequestBody, error) {
   368  	body := apis.CreateSandboxJSONRequestBody{
   369  		TemplateID:          p.TemplateID,
   370  		Timeout:             p.Timeout,
   371  		AutoPause:           p.AutoPause,
   372  		AllowInternetAccess: p.AllowInternetAccess,
   373  		Secure:              p.Secure,
   374  	}
   375  	if p.EnvVars != nil {
   376  		ev := apis.EnvVars(*p.EnvVars)
   377  		body.EnvVars = &ev
   378  	}
   379  	if p.Metadata != nil {
   380  		m := apis.SandboxMetadata(*p.Metadata)
   381  		body.Metadata = &m
   382  	}
   383  	if p.Network != nil {
   384  		body.Network = &apis.SandboxNetworkConfig{
   385  			AllowOut:           p.Network.AllowOut,
   386  			AllowPublicTraffic: p.Network.AllowPublicTraffic,
   387  			DenyOut:            p.Network.DenyOut,
   388  			MaskRequestHost:    p.Network.MaskRequestHost,
   389  		}
   390  	}
   391  	if p.Injections != nil {
   392  		siList := make([]apis.SandboxInjection, len(*p.Injections))
   393  		for i, spec := range *p.Injections {
   394  			si, err := sandboxInjectionSpecToAPI(spec)
   395  			if err != nil {
   396  				return body, err
   397  			}
   398  			siList[i] = si
   399  		}
   400  		body.Injections = &siList
   401  	}
   402  	if p.Resources != nil {
   403  		list := make([]apis.SandboxResource, len(*p.Resources))
   404  		for i, spec := range *p.Resources {
   405  			r, err := sandboxResourceSpecToAPI(spec)
   406  			if err != nil {
   407  				return body, err
   408  			}
   409  			list[i] = r
   410  		}
   411  		body.Resources = &list
   412  	}
   413  	return body, nil
   414  }
   415  
   416  func (p *ConnectParams) toAPI() apis.ConnectSandboxJSONRequestBody {
   417  	return apis.ConnectSandboxJSONRequestBody{
   418  		Timeout: p.Timeout,
   419  	}
   420  }
   421  
   422  func (p *RefreshParams) toAPI() apis.RefreshSandboxJSONRequestBody {
   423  	return apis.RefreshSandboxJSONRequestBody{
   424  		Duration: p.Duration,
   425  	}
   426  }
   427  
   428  func (p *ListParams) toAPI() *apis.ListSandboxesV2Params {
   429  	if p == nil {
   430  		return nil
   431  	}
   432  	params := &apis.ListSandboxesV2Params{
   433  		Metadata:  p.Metadata,
   434  		NextToken: p.NextToken,
   435  		Limit:     p.Limit,
   436  		Template:  p.Template,
   437  	}
   438  	if p.State != nil {
   439  		states := make([]apis.SandboxState, len(*p.State))
   440  		for i, s := range *p.State {
   441  			states[i] = apis.SandboxState(s)
   442  		}
   443  		params.State = &states
   444  	}
   445  	return params
   446  }