Skip to content

Commit fa6ed11

Browse files
committed
feat(volcengine): add IAM useradd and ECS exec commands
1 parent 566910f commit fa6ed11

16 files changed

Lines changed: 1148 additions & 15 deletions

File tree

pkg/providers/alibaba/alibaba.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ func (p *Provider) DBManagement(action, instanceID string) {
257257

258258
func (p *Provider) lookupHost(instanceID string) (schema.Host, bool) {
259259
for _, host := range _ecs.GetCacheHostList() {
260-
if host.ID == instanceID {
260+
if host.ID == instanceID || host.HostName == instanceID {
261261
return host, true
262262
}
263263
}

pkg/providers/alibaba/ecs/exec.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ func (d *Driver) pollLimit() int {
117117
if d.maxPolls > 0 {
118118
return d.maxPolls
119119
}
120-
return 5
120+
return 20
121121
}
122122

123123
func (d *Driver) sleepFor(delay time.Duration) {

pkg/providers/tencent/tat/exec.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ func (d *Driver) pollLimit() int {
166166
if d.maxPollAttempts > 0 {
167167
return d.maxPollAttempts
168168
}
169-
return 5
169+
return 20
170170
}
171171

172172
func (d *Driver) sleepFor(delay time.Duration) {

pkg/providers/tencent/tencent.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ func (p *Provider) ExecuteCloudVMCommand(instanceID, cmd string) {
211211

212212
func (p *Provider) lookupHost(instanceID string) (schema.Host, bool) {
213213
for _, host := range tat.GetCacheHostList() {
214-
if host.ID == instanceID {
214+
if host.ID == instanceID || host.HostName == instanceID {
215215
return host, true
216216
}
217217
}

pkg/providers/volcengine/api/types_ecs.go

Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"net/http"
66
"net/url"
77
"strconv"
8+
"strings"
89
)
910

1011
const ecsAPIVersion = "2020-04-01"
@@ -46,6 +47,84 @@ type ECSNetworkInterface struct {
4647
PrimaryIPAddress string `json:"PrimaryIpAddress"`
4748
}
4849

50+
type CreateCommandResponse struct {
51+
ResponseMetadata ResponseMetadata `json:"ResponseMetadata"`
52+
Result struct {
53+
CommandID string `json:"CommandId"`
54+
} `json:"Result"`
55+
}
56+
57+
type InvokeCommandResponse struct {
58+
ResponseMetadata ResponseMetadata `json:"ResponseMetadata"`
59+
Result struct {
60+
InvocationID string `json:"InvocationId"`
61+
} `json:"Result"`
62+
}
63+
64+
type DeleteCommandResponse struct {
65+
ResponseMetadata ResponseMetadata `json:"ResponseMetadata"`
66+
Result struct {
67+
CommandID string `json:"CommandId"`
68+
} `json:"Result"`
69+
}
70+
71+
type DescribeCloudAssistantStatusResponse struct {
72+
ResponseMetadata ResponseMetadata `json:"ResponseMetadata"`
73+
Result struct {
74+
Instances []ECSCloudAssistantInstance `json:"Instances"`
75+
PageNumber int32 `json:"PageNumber"`
76+
PageSize int32 `json:"PageSize"`
77+
TotalCount int32 `json:"TotalCount"`
78+
} `json:"Result"`
79+
}
80+
81+
type ECSCloudAssistantInstance struct {
82+
ClientVersion string `json:"ClientVersion"`
83+
HostName string `json:"HostName"`
84+
InstanceID string `json:"InstanceId"`
85+
InstanceName string `json:"InstanceName"`
86+
LastHeartbeatTime string `json:"LastHeartbeatTime"`
87+
OSType string `json:"OsType"`
88+
OSVersion string `json:"OsVersion"`
89+
Status string `json:"Status"`
90+
}
91+
92+
type DescribeInvocationResultsResponse struct {
93+
ResponseMetadata ResponseMetadata `json:"ResponseMetadata"`
94+
Result struct {
95+
InvocationResults []ECSInvocationResult `json:"InvocationResults"`
96+
PageNumber int32 `json:"PageNumber"`
97+
PageSize int32 `json:"PageSize"`
98+
TotalCount int32 `json:"TotalCount"`
99+
} `json:"Result"`
100+
}
101+
102+
type ECSInvocationResult struct {
103+
CommandID string `json:"CommandId"`
104+
InvocationID string `json:"InvocationId"`
105+
InstanceID string `json:"InstanceId"`
106+
InvocationStatus string `json:"InvocationStatus"`
107+
InvocationResultStatus string `json:"InvocationResultStatus"`
108+
Output string `json:"Output"`
109+
ErrorInfo string `json:"ErrorInfo"`
110+
ErrorMessage string `json:"ErrorMessage"`
111+
ErrorCode string `json:"ErrorCode"`
112+
}
113+
114+
func (r ECSInvocationResult) Status() string {
115+
if status := strings.TrimSpace(r.InvocationStatus); status != "" {
116+
return status
117+
}
118+
return strings.TrimSpace(r.InvocationResultStatus)
119+
}
120+
121+
func (r ECSInvocationResult) Message() string {
122+
if msg := strings.TrimSpace(r.ErrorMessage); msg != "" {
123+
return msg
124+
}
125+
return strings.TrimSpace(r.ErrorInfo)
126+
}
127+
49128
func (c *Client) DescribeRegions(ctx context.Context, region string, maxResults int32) (DescribeRegionsResponse, error) {
50129
query := url.Values{}
51130
query.Set("MaxResults", strconv.FormatInt(int64(maxResults), 10))
@@ -80,3 +159,127 @@ func (c *Client) DescribeInstances(ctx context.Context, region string, maxResult
80159
}, &out)
81160
return out, err
82161
}
162+
163+
func (c *Client) CreateCommand(ctx context.Context, region, name, commandType, commandContent, contentEncoding string) (CreateCommandResponse, error) {
164+
query := url.Values{}
165+
query.Set("Name", strings.TrimSpace(name))
166+
query.Set("Type", strings.TrimSpace(commandType))
167+
query.Set("CommandContent", commandContent)
168+
if encoding := strings.TrimSpace(contentEncoding); encoding != "" {
169+
query.Set("ContentEncoding", encoding)
170+
}
171+
var out CreateCommandResponse
172+
err := c.DoOpenAPI(ctx, Request{
173+
Service: "ecs",
174+
Version: ecsAPIVersion,
175+
Action: "CreateCommand",
176+
Method: http.MethodGet,
177+
Region: region,
178+
Path: "/",
179+
Query: query,
180+
Idempotent: true,
181+
}, &out)
182+
return out, err
183+
}
184+
185+
func (c *Client) InvokeCommand(ctx context.Context, region, commandID, invocationName string, instanceIDs []string) (InvokeCommandResponse, error) {
186+
query := url.Values{}
187+
query.Set("CommandId", strings.TrimSpace(commandID))
188+
query.Set("InvocationName", strings.TrimSpace(invocationName))
189+
for i, instanceID := range instanceIDs {
190+
instanceID = strings.TrimSpace(instanceID)
191+
if instanceID == "" {
192+
continue
193+
}
194+
query.Set("InstanceIds."+strconv.Itoa(i+1), instanceID)
195+
}
196+
var out InvokeCommandResponse
197+
err := c.DoOpenAPI(ctx, Request{
198+
Service: "ecs",
199+
Version: ecsAPIVersion,
200+
Action: "InvokeCommand",
201+
Method: http.MethodGet,
202+
Region: region,
203+
Path: "/",
204+
Query: query,
205+
Idempotent: true,
206+
}, &out)
207+
return out, err
208+
}
209+
210+
func (c *Client) DeleteCommand(ctx context.Context, region, commandID string) (DeleteCommandResponse, error) {
211+
query := url.Values{}
212+
query.Set("CommandId", strings.TrimSpace(commandID))
213+
var out DeleteCommandResponse
214+
err := c.DoOpenAPI(ctx, Request{
215+
Service: "ecs",
216+
Version: ecsAPIVersion,
217+
Action: "DeleteCommand",
218+
Method: http.MethodGet,
219+
Region: region,
220+
Path: "/",
221+
Query: query,
222+
Idempotent: true,
223+
}, &out)
224+
return out, err
225+
}
226+
227+
func (c *Client) DescribeCloudAssistantStatus(ctx context.Context, region string, instanceIDs []string, osType string, pageSize int32) (DescribeCloudAssistantStatusResponse, error) {
228+
query := url.Values{}
229+
for i, instanceID := range instanceIDs {
230+
instanceID = strings.TrimSpace(instanceID)
231+
if instanceID == "" {
232+
continue
233+
}
234+
query.Set("InstanceIds."+strconv.Itoa(i+1), instanceID)
235+
}
236+
if osType = strings.TrimSpace(osType); osType != "" {
237+
query.Set("OSType", osType)
238+
}
239+
query.Set("PageNumber", "1")
240+
if pageSize > 0 {
241+
query.Set("PageSize", strconv.FormatInt(int64(pageSize), 10))
242+
}
243+
244+
var out DescribeCloudAssistantStatusResponse
245+
err := c.DoOpenAPI(ctx, Request{
246+
Service: "ecs",
247+
Version: ecsAPIVersion,
248+
Action: "DescribeCloudAssistantStatus",
249+
Method: http.MethodGet,
250+
Region: region,
251+
Path: "/",
252+
Query: query,
253+
Idempotent: true,
254+
}, &out)
255+
return out, err
256+
}
257+
258+
func (c *Client) DescribeInvocationResults(ctx context.Context, region, invocationID, commandID, instanceID string, maxResults int32) (DescribeInvocationResultsResponse, error) {
259+
query := url.Values{}
260+
if invocationID = strings.TrimSpace(invocationID); invocationID != "" {
261+
query.Set("InvocationId", invocationID)
262+
}
263+
if commandID = strings.TrimSpace(commandID); commandID != "" {
264+
query.Set("CommandId", commandID)
265+
}
266+
if instanceID = strings.TrimSpace(instanceID); instanceID != "" {
267+
query.Set("InstanceId", instanceID)
268+
}
269+
if maxResults > 0 {
270+
query.Set("PageNumber", "1")
271+
query.Set("PageSize", strconv.FormatInt(int64(maxResults), 10))
272+
}
273+
var out DescribeInvocationResultsResponse
274+
err := c.DoOpenAPI(ctx, Request{
275+
Service: "ecs",
276+
Version: ecsAPIVersion,
277+
Action: "DescribeInvocationResults",
278+
Method: http.MethodGet,
279+
Region: region,
280+
Path: "/",
281+
Query: query,
282+
Idempotent: true,
283+
}, &out)
284+
return out, err
285+
}

0 commit comments

Comments
 (0)