فهرست منبع

修复未知错误导致的终止

Lemoe 4 سال پیش
والد
کامیت
4b50a8597e
1فایلهای تغییر یافته به همراه38 افزوده شده و 32 حذف شده
  1. 38 32
      main.go

+ 38 - 32
main.go

@@ -256,16 +256,18 @@ func LaunchInstances(ads []identity.AvailabilityDomain) (sum, num int32) {
 			SUCCESS = true
 			num++ //成功个数+1
 
-			printf("\033[1;32m[%s] 第 %d 个实例创建成功, 实例名称: %s\033[0m\n", providerName, pos+1, *createResp.Instance.DisplayName)
-			if EACH {
-				sendMessage(providerName, "创建成功,实例名称: "+*createResp.DisplayName)
+			// 获取实例公共IP
+			ips, err := getInstancePublicIps(ctx, computeClient, networkClient, createResp.Instance.Id)
+			var strIps string
+			if err != nil {
+				strIps = err.Error()
+			} else {
+				strIps = strings.Join(ips, ",")
 			}
 
-			ips := getInstancePublicIps(ctx, computeClient, networkClient, createResp.Instance.Id)
-			strIps := strings.Join(ips, ",")
-			printf("\033[1;32m[%s] 实例名称: %s, IP: %s\033[0m\n", providerName, *createResp.Instance.DisplayName, strIps)
+			printf("\033[1;32m[%s] 第 %d 个实例创建成功. 实例名称: %s, 公网IP: %s\033[0m\n", providerName, pos+1, *createResp.Instance.DisplayName, strIps)
 			if EACH {
-				sendMessage(providerName, "实例名称: "+*createResp.DisplayName+", IP: "+strIps)
+				sendMessage(providerName, fmt.Sprintf("第 %d 个实例创建成功\n实例名称: %s\n公网IP: %s", pos+1, *createResp.Instance.DisplayName, strIps))
 			}
 
 			sleepRandomSecond(minTime, maxTime)
@@ -282,34 +284,39 @@ func LaunchInstances(ads []identity.AvailabilityDomain) (sum, num int32) {
 			SKIP_RETRY := false
 
 			//isRetryable := common.IsErrorRetryableByDefault(err)
-			//fmt.Println("IsErrorRetryableByDefault", isRetryable)
-			isNetErr := common.IsNetworkError(err)
+			//isNetErr := common.IsNetworkError(err)
 			servErr, isServErr := common.IsServiceError(err)
-			if isNetErr || (isServErr && (servErr.GetHTTPStatusCode() == 409 || servErr.GetHTTPStatusCode() == 429 || (500 <= servErr.GetHTTPStatusCode() && servErr.GetHTTPStatusCode() < 505))) {
-				// 可重试
+
+			// API Errors: https://docs.cloud.oracle.com/Content/API/References/apierrors.htm
+
+			if isServErr && (400 <= servErr.GetHTTPStatusCode() && servErr.GetHTTPStatusCode() <= 405) ||
+				(servErr.GetHTTPStatusCode() == 409 && !strings.EqualFold(servErr.GetCode(), "IncorrectState")) ||
+				servErr.GetHTTPStatusCode() == 412 || servErr.GetHTTPStatusCode() == 413 || servErr.GetHTTPStatusCode() == 422 ||
+				servErr.GetHTTPStatusCode() == 431 || servErr.GetHTTPStatusCode() == 501 {
+				// 不可重试
 				if isServErr {
 					errInfo = servErr.GetMessage()
 				}
-				printf("\033[1;31m[%s] 第 %d 个实例创建失败, Error: \033[0m%s\n", providerName, pos+1, errInfo)
+				printf("\033[1;31m[%s] 创建失败, Error: \033[0m%s\n", providerName, errInfo)
+				if EACH {
+					sendMessage(providerName, "创建失败,Error: "+errInfo)
+				}
 
-				SKIP_RETRY = false
+				SKIP_RETRY = true
 				if AD_NOT_FIXED && !EACH_AD {
-					SKIP_RETRY_MAP[adIndex-1] = false
+					SKIP_RETRY_MAP[adIndex-1] = true
 				}
 
 			} else {
-				// 无需重试
+				// 重试
 				if isServErr {
 					errInfo = servErr.GetMessage()
 				}
-				printf("\033[1;31m[%s] 第 %d 个实例创建失败, Error: \033[0m%s\n", providerName, pos+1, errInfo)
-				if EACH {
-					sendMessage(providerName, "创建失败,Error: "+errInfo)
-				}
+				printf("\033[1;31m[%s] 创建失败, Error: \033[0m%s\n", providerName, errInfo)
 
-				SKIP_RETRY = true
+				SKIP_RETRY = false
 				if AD_NOT_FIXED && !EACH_AD {
-					SKIP_RETRY_MAP[adIndex-1] = true
+					SKIP_RETRY_MAP[adIndex-1] = false
 				}
 			}
 
@@ -918,7 +925,9 @@ func ListInstances(ctx context.Context, c core.ComputeClient) []core.Instance {
 
 func ListVnicAttachments(ctx context.Context, c core.ComputeClient, instanceId *string) ([]core.VnicAttachment, error) {
 	compartmentID, err := provider.TenancyOCID()
-	helpers.FatalIfError(err)
+	if err != nil {
+		return nil, err
+	}
 	req := core.ListVnicAttachmentsRequest{CompartmentId: &compartmentID}
 	if instanceId != nil && *instanceId != "" {
 		req.InstanceId = instanceId
@@ -1068,19 +1077,16 @@ func printf(format string, a ...interface{}) {
 }
 
 // 根据实例OCID获取公共IP
-func getInstancePublicIps(ctx context.Context, computeClient core.ComputeClient, networkClient core.VirtualNetworkClient, instanceId *string) (ips []string) {
-	var err error
-	var vnicAttachments []core.VnicAttachment
-	var vnic core.Vnic
-	vnicAttachments, err = ListVnicAttachments(ctx, computeClient, instanceId)
-	if err != nil {
-		printf("ListVnicAttachments error: %s\n", err.Error())
+func getInstancePublicIps(ctx context.Context, computeClient core.ComputeClient, networkClient core.VirtualNetworkClient, instanceId *string) (ips []string, err error) {
+	vnicAttachments, attachmentsErr := ListVnicAttachments(ctx, computeClient, instanceId)
+	if attachmentsErr != nil {
+		err = errors.New("获取失败")
 		return
 	}
 	for _, vnicAttachment := range vnicAttachments {
-		vnic, err = GetVnic(ctx, networkClient, vnicAttachment.VnicId)
-		if err != nil {
-			printf("GetVnic error: %s\n", err.Error())
+		vnic, vnicErr := GetVnic(ctx, networkClient, vnicAttachment.VnicId)
+		if vnicErr != nil {
+			printf("GetVnic error: %s\n", vnicErr.Error())
 			continue
 		}
 		ips = append(ips, *vnic.PublicIp)