diff --git a/provider/internal/core/client.go b/provider/internal/core/client.go index def6adb..bba7e66 100644 --- a/provider/internal/core/client.go +++ b/provider/internal/core/client.go @@ -568,6 +568,14 @@ type InstanceStateResponse struct { // FindInstanceByDisplayName finds an instance by display_name for a given serviceId. // Если найдено больше одного non-deleted инстанса — возвращает ошибку. func (c *UniversalClient) FindInstanceByDisplayName(ctx context.Context, serviceId int, displayName string) (*InstanceStateResponse, error) { + debug := func(format string, args ...interface{}) { + f, err := os.OpenFile("/tmp/nubes_find_debug.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + return + } + defer f.Close() + fmt.Fprintf(f, format+"\n", args...) + } var found []InstanceStateResponse // Быстрый поиск через search API @@ -583,7 +591,7 @@ func (c *UniversalClient) FindInstanceByDisplayName(ctx context.Context, service } respBody, _, err := c.doRequest(ctx, "GET", "/instances?"+searchQuery.Encode(), nil) if err != nil { - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] search doRequest err: %v (serviceId=%d, name=%q)\n", err, serviceId, displayName) + debug("[FIND-DEBUG] search doRequest err: %v (serviceId=%d, name=%q)", err, serviceId, displayName) } else { var res struct { Results []struct { @@ -593,26 +601,26 @@ func (c *UniversalClient) FindInstanceByDisplayName(ctx context.Context, service } `json:"results"` } if err := json.Unmarshal(respBody, &res); err != nil { - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] search json.Unmarshal err: %v (serviceId=%d, name=%q)\n", err, serviceId, displayName) + debug("[FIND-DEBUG] search json.Unmarshal err: %v (serviceId=%d, name=%q)", err, serviceId, displayName) } else { - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] search returned %d results (serviceId=%d, name=%q)\n", len(res.Results), serviceId, displayName) + debug("[FIND-DEBUG] search returned %d results (serviceId=%d, name=%q)", len(res.Results), serviceId, displayName) for _, item := range res.Results { matchSvc := item.ServiceId == serviceId matchName := strings.EqualFold(item.DisplayName, displayName) - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] search item uid=%s name=%q svcId=%d matchSvc=%v matchName=%v\n", + debug("[FIND-DEBUG] search item uid=%s name=%q svcId=%d matchSvc=%v matchName=%v", item.InstanceUid, item.DisplayName, item.ServiceId, matchSvc, matchName) if matchSvc && matchName { state, err := c.GetInstanceStateRaw(ctx, item.InstanceUid) if err != nil { - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] GetInstanceStateRaw err for uid=%s: %v\n", item.InstanceUid, err) + debug("[FIND-DEBUG] GetInstanceStateRaw err for uid=%s: %v", item.InstanceUid, err) continue } if state == nil { - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] GetInstanceStateRaw returned nil for uid=%s\n", item.InstanceUid) + debug("[FIND-DEBUG] GetInstanceStateRaw returned nil for uid=%s", item.InstanceUid) continue } if isInstanceDeleted(state) { - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] GetInstanceStateRaw returned deleted for uid=%s (status=%q)\n", item.InstanceUid, state.ExplainedStatus) + debug("[FIND-DEBUG] GetInstanceStateRaw returned deleted for uid=%s (status=%q)", item.InstanceUid, state.ExplainedStatus) continue } found = append(found, *state) @@ -623,7 +631,7 @@ func (c *UniversalClient) FindInstanceByDisplayName(ctx context.Context, service // Если быстрый поиск не дал результатов — пагинированный fallback if len(found) == 0 { - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] search path failed, entering fallback (serviceId=%d, name=%q)\n", serviceId, displayName) + debug("[FIND-DEBUG] search path failed, entering fallback (serviceId=%d, name=%q)", serviceId, displayName) page := 1 for { reqURL := c.buildURL(fmt.Sprintf("/instances?page=%d&size=100", page)) @@ -638,7 +646,7 @@ func (c *UniversalClient) FindInstanceByDisplayName(ctx context.Context, service resp, err := c.HttpClient.Do(req) if err != nil { - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] fallback page=%d HttpClient.Do err: %v\n", page, err) + debug("[FIND-DEBUG] fallback page=%d HttpClient.Do err: %v", page, err) return nil, err } if resp.Body != nil { @@ -646,7 +654,7 @@ func (c *UniversalClient) FindInstanceByDisplayName(ctx context.Context, service } if resp.StatusCode != 200 { - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] fallback page=%d HTTP %d\n", page, resp.StatusCode) + debug("[FIND-DEBUG] fallback page=%d HTTP %d", page, resp.StatusCode) return nil, fmt.Errorf("HTTP статус %d", resp.StatusCode) } @@ -658,7 +666,7 @@ func (c *UniversalClient) FindInstanceByDisplayName(ctx context.Context, service } `json:"results"` } if err := json.NewDecoder(resp.Body).Decode(&res); err != nil { - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] fallback page=%d json.Decode err: %v\n", page, err) + debug("[FIND-DEBUG] fallback page=%d json.Decode err: %v", page, err) return nil, err } @@ -666,26 +674,26 @@ func (c *UniversalClient) FindInstanceByDisplayName(ctx context.Context, service break } - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] fallback page=%d has %d results\n", page, len(res.Results)) + debug("[FIND-DEBUG] fallback page=%d has %d results", page, len(res.Results)) for _, item := range res.Results { matchSvc := item.ServiceId == serviceId matchName := strings.EqualFold(item.DisplayName, displayName) if matchSvc || matchName { - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] fallback item uid=%s name=%q svcId=%d matchSvc=%v matchName=%v\n", + debug("[FIND-DEBUG] fallback item uid=%s name=%q svcId=%d matchSvc=%v matchName=%v", item.InstanceUid, item.DisplayName, item.ServiceId, matchSvc, matchName) } if matchSvc && matchName { state, err := c.GetInstanceStateRaw(ctx, item.InstanceUid) if err != nil { - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] fallback GetInstanceStateRaw err for uid=%s: %v\n", item.InstanceUid, err) + debug("[FIND-DEBUG] fallback GetInstanceStateRaw err for uid=%s: %v", item.InstanceUid, err) continue } if state == nil { - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] fallback GetInstanceStateRaw returned nil for uid=%s\n", item.InstanceUid) + debug("[FIND-DEBUG] fallback GetInstanceStateRaw returned nil for uid=%s", item.InstanceUid) continue } if isInstanceDeleted(state) { - fmt.Fprintf(os.Stderr, "[FIND-DEBUG] fallback GetInstanceStateRaw returned deleted for uid=%s (status=%q)\n", item.InstanceUid, state.ExplainedStatus) + debug("[FIND-DEBUG] fallback GetInstanceStateRaw returned deleted for uid=%s (status=%q)", item.InstanceUid, state.ExplainedStatus) continue } found = append(found, *state)