|
5 | 5 | "net/http" |
6 | 6 | "net/url" |
7 | 7 | "strconv" |
| 8 | + "strings" |
8 | 9 | ) |
9 | 10 |
|
10 | 11 | const ecsAPIVersion = "2020-04-01" |
@@ -46,6 +47,84 @@ type ECSNetworkInterface struct { |
46 | 47 | PrimaryIPAddress string `json:"PrimaryIpAddress"` |
47 | 48 | } |
48 | 49 |
|
| 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 | + |
49 | 128 | func (c *Client) DescribeRegions(ctx context.Context, region string, maxResults int32) (DescribeRegionsResponse, error) { |
50 | 129 | query := url.Values{} |
51 | 130 | query.Set("MaxResults", strconv.FormatInt(int64(maxResults), 10)) |
@@ -80,3 +159,127 @@ func (c *Client) DescribeInstances(ctx context.Context, region string, maxResult |
80 | 159 | }, &out) |
81 | 160 | return out, err |
82 | 161 | } |
| 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